🤖

マルチモーダルLLMを活用した音声文字起こしの精度改善

2024/07/11に公開

こんにちは、inadyです。

マルチモーダルなLLM(大規模言語モデル)を活用した音声文字起こし精度の改善について検証をおこなったので、その内容をこの記事で説明します。

講義動画 再利用の課題

atama+が提供しているコンテンツの中に、「講義動画」というものがあります。
講義動画は、各教科の単元(例えば、2次関数など)を解説する動画のことで、講師がスライドを使いながら解説します。

講義動画のキャプチャ

各教科の単元の解説について非常に有益な情報がつまっている情報源である、とも言い換えることもできます。
単に講義動画として活用するだけでなく、他の用途でも再利用し価値を創造できる可能性があります。

しかしながら、動画のままだと、検索の困難さやデータ解析の難しさがあります。

そこで、講義動画を文字起こししてテキストデータ化する必要が出てきます。テキストデータであれば、検索も容易ですし、再利用もしやすくなります。

文字起こし精度の低さ

過去にも、同僚のエンジニアが「講義動画の文字起こし」に挑戦したことがあります。
しかしながら、文字起こしの間違いが多く、有益なデータとして使うにはまだまだハードルがありました。

試しに、Amazon Transcribeを使って、講義動画を文字起こししたテキストをご覧ください。

もう少し難しいものを考えましょう
XY引く二X引く三Yイコール七えニュースではこういう形が普通ですね
え
これを満たす自然数自然数というのは正の整数のことですXYの組を全て求めましょう
この左辺はえー次のように変形してくださいXうー!
なんとかえかっこY何とえこのような形にしますが
え?
ここでですねえーここにマイナス三を書きますなぜマイナス三を書くかというと
え?
ここのマイナス三Yここに注目してください
え?
この式を展開してマイナス三Yという形を作りたいんですね
したがってこのマイナス三をここに書いてくださいえ?

(読みやすくするために、筆者にて改行を入れています。)

見ていただいたとおり、文字起こしデータとして活用するには、精度が低いです。
とりわけ、数学の場合は、数式が文字起こしの精度を下げます。

もちろん、文字起こしのモデルをファインチューニングをすれば、多少改善する可能性はあります。
しかし、教科(国語、数学、社会など)が複数あり、講師も複数存在するため、それぞれに対してチューニングを行うには、膨大なコストと時間がかかるため現実的ではありません。

マルチモーダルLLMの活用

そこで検討をしたのが、マルチモーダルLLMを使って文字起こし精度を向上させる案です。

構成図

アーキテクチャの全体像は次のとおりです。次の章で、順に説明をします。

アーキテクチャ図

音声の処理

まず、講義動画を音声と画像に分離をします。

そして、音声はAmazon Transcribeを使い、文字起こしします。

特に工夫はしておらず、言語を日本語に指定し、mp3ファイルをAmazon Transcribeに渡しているだけです。
文字起こしされたテキストは、次の通りとなります。

もう少し難しいものを考えましょう
XY引く二X引く三Yイコール七えニュースではこういう形が普通ですね
え
これを満たす自然数自然数というのは正の整数のことですXYの組を全て求めましょう
この左辺はえー次のように変形してください
Xうー!なんとかえかっこY何とえこのような形にしますが

画像の処理

講義動画から分離した画像は次のとおりです。

講義動画から分離した画像

画像は、まずはスライドに書いてある内容をマルチモーダルLLMで文字起こししてもらいます。

Amazon Bedrockを使い、モデルはAnthropicのClaude 3.5 Sonnetを使用しました。

Python3とLangChain(langchain-aws==0.1.8)で実装しましたコードの一部抜粋は次の通りです。

chat = ChatBedrock(
   model_id="anthropic.claude-3-5-sonnet-20240620-v1:0",
   client=bedrock_runtime,
)

PROMPT = """あなたは画像のOCRをするAIシステムとして機能します。
添付の画像は、講義動画のスライドです。
あなたは、画像に書かれてある文字を文字起こしします。
数式がある場合は、$でかこってTeX形式で表現してください。
出力形式は次のようにしてください。
<output>
方程式の整数解を求める典型的な方法を確認しましょう。ここでは $xy=3$ という方程式を例に取ります。これを満たす整数 $(x, y)$ の組は、$(1, 3)$、$(3, 1)$、$(-1, -3)$、$(-3, -1)$ となります
</output>
"""

messages = [
   HumanMessage(content=[
       {"type": "text", "text": PROMPT},
       {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{エンコードされた画像データ}"}}
   ])
]

response = chat.invoke(messages)

生成された文字列は次のとおりです。

例.          $xy - 2x - 3y = 7$
を満たす自然数(正の整数)$x, y$の組をすべて求めよう。
$(x-3)(y-2)= 7+(-3)(-2)= 13$
$x, y$は自然数なので, $x - 3 \geq -2, y - 2 \geq -1$となり
$(x - 3, y - 2) =(1, 13), (13, 1)$

精度上げ処理

最後に、音声の文字起こしテキストと、画像の文字起こしテキストを用いて、文字起こし精度を向上させます。

具体的は、次のように実装しています。

PRMOPT = f"""あなたはプロの校正家です。
私は、Amazon Transcribeを使い、数学の講義動画を文字起こししました。
講義動画の話者は添付の画像を元に数学の方程式の整数解の解説をしています。

<文字起こし>
もう少し難しいものを考えましょう
XY引く二X引く三Yイコール七えニュースではこういう形が普通ですね
え
これを満たす自然数自然数というのは正の整数のことですXYの組を全て求めましょう
この左辺はえー次のように変形してください
Xうー!なんとかえかっこY何とえこのような形にしますが
</文字起こし>

また、講義スライドに書いてある内容を書き起こしたものがあります。

<スライド内容>
例.          $xy - 2x - 3y = 7$
を満たす自然数(正の整数)$x, y$の組をすべて求めよう。
$(x-3)(y-2)= 7+(-3)(-2)= 13$
$x, y$は自然数なので, $x - 3 \geq -2, y - 2 \geq -1$となり
$(x - 3, y - 2) =(1, 13), (13, 1)$
</スライド内容>

あなたへの依頼は、スライド内容を参考にして、文字起こしの間違いを修正することです。

出力形式は次のようにしてください。
<output>
方程式の整数解を求める典型的な方法を確認しましょう。ここでは $xy=3$ という方程式を例に取ります。これを満たす整数 $(x, y)$ の組は、$(1, 3)$、$(3, 1)$、$(-1, -3)$、$(-3, -1)$ となります
</output>
"""
        messages = [
            HumanMessage(content=prompt),
            AIMessage(content=[{"type": "text", "text": "<output>"}])
        ]
        response = chat.invoke(messages)

出力された結果は次のとおりです。 最初の文字起こしから比べると、かなり精度が上がったように見えます。

もう少し難しいものを考えましょう。
$xy - 2x - 3y = 7$ という形が普通ですね。
これを満たす自然数、自然数というのは正の整数のこと、$x, y$の組を全て求めましょう。
この左辺は次のように変形してください。
$(x - 3)(y - 2)$このような形にします。

結果

それでは、今一度結果を確認してみましょう。

まず、こちらが音声データをAmazon Transcribeで文字起こししたものです。
あまり精度が高いとは言えませんね。

もう少し難しいものを考えましょう
XY引く二X引く三Yイコール七えニュースではこういう形が普通ですね
え
これを満たす自然数自然数というのは正の整数のことですXYの組を全て求めましょう
この左辺はえー次のように変形してください
Xうー!なんとかえかっこY何とえこのような形にしますが

次にこちらが、マルチモーダルLLMを使って精度を向上させた文字起こしです。
かなり精度が上がったように見えます。

もう少し難しいものを考えましょう。
$xy - 2x - 3y = 7$ という形が普通ですね。
これを満たす自然数、自然数というのは正の整数のこと、$x, y$の組を全て求めましょう。
この左辺は次のように変形してください。
$(x - 3)(y - 2)$このような形にします。

最後に、こちらが私の耳で聞いて書き起こしたものです。
(「えー」や「あー」などのフィラーは除外しています)

もう少し難しいものを考えましょう。
$xy - 2x - 3y = 7$、入試ではこういう形が普通ですね。
これを満たす自然数、自然数というのは正の整数のことです。$x, y$の組を全て求めましょう。
この左辺は次のように変形してください。
x、なんとか、かっこ、y、なんとか。このような形にしますが

「マルチモーダルLLMを使って精度を向上させた文字起こし」は非常に精度の高い文字起こしになっています。
これくらいの精度であれば、このテキストデータを他の用途でも再利用し、価値を創造できる可能性が見えてきました。

一方で、少しは間違いがあります。 間違っている部分に着目してみましょう。

Amazon Transcribeでは「ニュースではこういう形が普通ですね」となっているものが「という形が普通ですね」となっていますね。
正解は「入試ではこういう形が普通ですね」でした。
「ニュースでは」と文字起こしされているので、LLMは「これは関係ないな」と判断して消したのではないかと推察されます。

また、「Xうー!なんとかえかっこY何とえこのような形にしますが」は「(x - 3)(y - 2)このような形にします」となりました。
正解は「x、なんとか、かっこ、y、なんとか。このような形にしますが」でした。
LLMは画像の文字起こしデータに引っ張られて、勝手に -3-2を埋めていますね。

興味深い結果となりました。

今後の展望

今の状態でも十分使えるデータにはなっておりますが、データの前処理、プロンプトの改善、またLLMモデルの進化により、さらに精度向上が期待できそうです。

atama plus techblog

Discussion