イノベーションセンターの加藤です。この記事ではWhisperによる音声認識の前処理と後処理にLLMとOCRを組み込むことで、映像の文字起こし精度の向上を図った際の検証結果を紹介します。
Whisperとは
Whisper1はOpenAIによって提供されているオープンソースの音声認識モデルです。 色々なサイズのモデルが提供されており、最も大きいモデルであるlarge-v3は日本語を含む多言語に対応し高い認識精度を誇ります。 しかしもちろん完璧ではなく、Whisper(large-v3)で日本語の音声を書き起こしてみるとそれなりに誤認識が見られます。また、専門用語や人名など、あらかじめ知っていないと正しく書けない単語についてもうまく書き起こせないという音声認識共通の問題もあります。
そこで本稿では、Whisperに日本語やドメイン知識に関する事前知識をうまく盛り込み音声認識の精度を向上させる2つの手法を実験してみました。 できればオープンなデータで実験したかったのですが、スライドを映しながら喋る形式で、専門用語を含み、正解データとして読み上げ原稿がある動画を見つけられなかったため、社内勉強会の録画を使って2つの手法を試してみました(そのため評価指標しか出せません🙇)。約8分の映像に対して単語単位の誤り率(Word Error Rate, WER)を測定し、それぞれの手法を比較します。
OCRの結果を盛り込み専門用語を認識させる
Whisperのプロンプトには直前に認識した文章やキーワードなどを埋め込める領域が存在し、ここに専門用語や人名を埋め込むと書き起こしの語彙をコントロールできます。
あくまで言語モデルの出力を誘導する程度の機能であり、専門用語の読みを明示的に指定できるわけではありませんが、以下の例のように常識的な読み方であればWhisperが正しく書き起こしてくれます。
さらに、文字起こしの対象が映像であるとき、映像に映っている文章が文字起こしの際のヒントになることがあります。特に講演などでスライドを画面に映しているときは発話内の専門用語が画面に表示されていることが多いのではないかと思います。 そこで発話を検出したタイミングの映像フレームをEasyOCR2で文字認識し、拾えた単語をWhisperプロンプトに埋め込む処理を追加しました。
その結果、Whisperに標準で実装されているビームサーチと比較して、WERが0.059から0.056に少し改善しました。
大規模言語モデルで全体の文章を調整する
Whisperは一般的な大規模言語モデル(LLM)と同様に、入力と現時点の出力から次の単語(トークン)
としてあり得るものを確率
の形で予測します。
普通は最も確率の高いトークン
を選択するか、確率に沿ってランダムに選択するかのどちらかですが、確率の高い候補を複数確保して文章全体でもっともらしいトークン列
を探索するビームサーチと呼ばれる手法も存在します。
このビームサーチで得られる複数の候補に対して、Whisperよりも大きなLLMを使ってより信頼度の高いもっともらしさを算出すれば、音声認識の結果を修正できそうです。
そこで、検出された各発話区間に対して上位5件の認識結果をWhisperのビームサーチから取得し、Sarashina2-7B3を用いて文章全体のもっともらしさ(Perplexity)が最適になるような認識結果の組み合わせを探索しました。
その結果、WERは0.059から0.048に改善しました。
各アプローチの融合
それぞれのアプローチは一長一短です。LLMによるアプローチではそもそもWhisperが専門用語を聞き取れなかったら修正は困難ですし、特に会話中に現れる人名は単なる日本語の一般知識だけではカバーできません。一方でOCRによるアプローチでは、Whisperが音声をチャンク分けして独立に認識する仕組みを採用しているために、単語単位では正しくても文章としてはおかしいことがよくあります。 そのため、両方を組み合わせることでこれらの弱点を補うことができそうです。
しかしながら、それぞれの手法を単独で使用した時は認識精度が向上したにもかかわらず、併用するとWERが0.059から0.077に悪化するという結果になってしまいました。
結果の考察
以上の結果を表にまとめました。
- naive: ビームサーチのみ
- ocr: OCRによって取得した単語をWhisperのプロンプトに注入してビームサーチ
- llm: ビームサーチした結果の候補からLLMが選択
- both: ocrとllmの併用
naive | ocr | llm | both | |
---|---|---|---|---|
WER | 0.059 | 0.056 | 0.048 | 0.077 |
併用による精度劣化の原因を考察するために、認識結果が悪化した典型的なサンプルを紹介します。
このようなスライドを映しながら話している場面で、認識結果は次のようになりました。
原稿(Ground Truth) | 次に文法制約付き生成の既存手法のLimitationとして、 |
naive | 次に文法制約付き生成の既存手法のリミテーションとして |
ocr | 次に文法制約付き生成の既存手法のリミテーションとして、 |
llm | 次に、文法制約付き生成の既存手法のリミテーションとして、 |
both | 5.、6.、7. |
併用(both)した時に出力がおかしくなっています。そこでこの時点で画面をOCRした時の結果と、OCRによって得たキーワードをプロンプトに注入したか否かでビームサーチの候補がどう変化したかをみてみます。
OCRによって得られたキーワード
背景、文法制約付き生成手法、2.、3、提案手法、4.、5.、まとめ
キーワード注入なしでのビームサーチ結果(5候補)
候補 | スコア(自信度) |
---|---|
次に文法制約付き生成の既存手法のリミテーションとして | -0.062 |
次に文法制約付き生成の既存手法のリミテーションとして、 | -0.069 |
次に、文法制約付き生成の既存手法のリミテーションとして、 | -0.081 |
次に文法制約付き生成の既存手法の リミテーションとして | -0.114 |
次に、文法制約付き生成の既存手法のリミテーションとして | -0.136 |
キーワード注入ありでのビームサーチ結果(5候補)
候補 | スコア(自信度) |
---|---|
次に文法制約付き生成の既存手法のリミテーションとして | -0.245 |
5.、6.、7。 | -0.914 |
5.、6.、7. | -0.985 |
5.、6。 | -1.068 |
5.、 | -1.395 |
OCRがいくつかの文章を見落としているのは一旦無視して、箇条書き用の数字がキーワードとして抽出されていることがわかります。そしてビームサーチの結果がこのようなキーワードに引っ張られてしまい、自信度は低いもののまるで箇条書きの続きを出力するような「5.、6.、7」という候補を出力してしまっています。 このようにWhisperのプロンプト機能はコントロールが難しく、音声とは全く関係のない文章がプロンプトに引きずられる形で出力されてしまうことがあります。さらに後処理のLLMは音声認識の自信度を考慮していないので、このような変な文章を選択してしまうリスクが発生します。 この問題はLLMの文章選択の際にWhisperの自信度を考慮しながら文章全体のもっともらしさを最適化することで回避できますが、Whisperの出力する自信度とLLMの出力するもっともらしさのバランスは慎重に設定する必要がありそうです。
まとめ
本稿ではオープンソースの音声認識モデルであるWhisperの性能を向上させるために、OCRで抽出した専門用語のプロンプト注入と、LLMによる自然な出力文章の探索という2つのアプローチを紹介しました。いずれの方法も性能向上に寄与しましたが、プロンプト注入のアプローチは認識候補の品質を下げる傾向にあり、LLMによるアプローチと併用するためには別の工夫が必要そうでした。
- OpenAI, Whisper (https://github.com/openai/whisper)↩
- Jaided AI, EasyOCR (https://github.com/JaidedAI/EasyOCR)↩
- SB Intuitions, Sarashina2-7B (https://huggingface.co/sbintuitions/sarashina2-7b)↩