音声技術の進化による外国語コンテンツ活用法:自動翻訳字幕とTTSを活用した自動吹き替え
音声技術の進化による外国語コンテンツの活用方法
最近では、音声技術が大幅に進歩してきており、ASR、MT、TTS の品質が向上しています。これらを組み合わせることで、外国語の動画や音声に字幕や吹き替えを付けることができるようになります。
YouTube には、一般的によく使われている自動翻訳字幕機能があります。この機能を使えば、海外の動画に日本語の字幕を簡単に追加できます。YouTube には、MIT や Stanford などの講義など、多くの外国語コンテンツがあります。この機能を活用することで、より多くの情報を収集することが可能になり、非常に便利です。
YouTube の自動翻訳字幕でも十分な人もいると思いますが、まだ改善の余地があると思われます。特に専門用語など、翻訳が難しい単語や表現が含まれる場合は、誤った翻訳がされる可能性があります。そこで、より正確な自動翻訳字幕を作成し、もっと外国語のコンテンツの利用をもっと快適にする方法を考えたいと思います。
SST(Speech-to-Speech Translation: 音声翻訳)
ある言語の音声を別の言語の音声に翻訳する技術です。
ASR、MT、TTS といった複数のシステムを組み合わせ行われることが多いです。
ASR(Automatic Speech Recognition: 自動音声認識)
機械が話し言葉をテキストに書き起こすことを可能にする技術です。
有名なものに、Whisper、Conformer-1 などがあります。
MT(Machine Translation: 機械翻訳)
ある言語から別の言語へ、機械が自動的にテキストを翻訳する技術です。
有名なものに、DeepL、Google翻訳 などがあります。
TTS(Text-To-Speech)
テキストを、合成音声を使って話し言葉に変換する技術です。
Siri や Alexa のような音声アシスタントなど、多くの用途に使用されています。
自動翻訳字幕の作成に必要なASRとMTの連携と重要性
自動翻訳字幕を正確に作成するには、ASR と MT の精度が重要です。まず、話し言葉を正確にテキストに変換するために ASR を使います。次に、そのテキストを MT で正確に別の言語に翻訳する必要があります。さらに、自動翻訳字幕を正確に作成するためには、ASR から得られるタイムスタンプを正確に保持する必要があります。なぜなら、元の音声のタイミングを正確に把握する必要があるからです。そのため、MTを利用しながらも、ASR から得られるタイムスタンプを維持する必要があります。これらの技術がどのように連携して最終的な出力を生成するかについて、以下に概要を示します:
外国語のコンテンツを要約したり内容を確認する場合、Whisper で作成した文字起こしを翻訳したり、ChatGPT に要約してもらうだけでよいです。自動翻訳字幕の品質にこだわらない場合は、Whisper で作成した文字起こしをタイムスタンプごとに翻訳するだけで済みます。今回は高精度の自動翻訳字幕を作成するため、Whisper で作成した文字起こしに後処理を加えて、タイムスタンプを維持しながら正確な翻訳を行いたいと考えています。
ASRとMTの選定について
汎用的な ASR である Whisper を採用しました。Whisper は、多様な音声の大規模データセットで学習されたマルチタスクモデルであり、多言語音声認識、音声翻訳、言語識別が可能です。MIT ライセンスで実装と訓練済みモデルが公開されているため、非常に利用しやすくなっています。
https://github.com/openai/whisper
Whisper には、処理速度と精度がトレードオフの関係にある5種類のモデルサイズがあります。今回は精度を重視するため、最も精度の高いモデルを使用することにしました。
Size | Parameters | English-only model | Multilingual model | Required VRAM | Relative speed |
---|---|---|---|---|---|
tiny | 39 M | tiny.en |
tiny |
~1 GB | ~32x |
base | 74 M | base.en |
base |
~1 GB | ~16x |
small | 244 M | small.en |
small |
~2 GB | ~6x |
medium | 769 M | medium.en |
medium |
~5 GB | ~2x |
large | 1550 M | N/A | large |
~10 GB | 1x |
精度の高いモデルには大量の RAM が必要になる問題や処理速度が遅くなってしまう問題がありますが、Whisper の公式実装を高速推論エンジンの CTranslate2 を使って再実装した faster-whisper を利用することで、これらの問題がかなり解消されます。
Large-v2 model on GPU
Implementation | Precision | Beam size | Time | Max. GPU memory | Max. CPU memory |
---|---|---|---|---|---|
openai/whisper | fp16 | 5 | 4m30s | 11.3 GB | 9.4 GB |
faster-whisper | fp16 | 5 | 54s | 4.8 GB | 3.2 GB |
faster-whisper | int8 | 5 | 59s | 3.1 GB | 3.1 GB |
また、MT としては、DeepL を採用しました。個人的には、Google 翻訳などよりも優れた翻訳を提供してくれると思います。なお、API には無料枠があり、現在の無料プランでは1ヶ月に50万文字まで翻訳が可能です。FuguMT もおすすめです。
Whisperの文字起こし翻訳での問題点
Whisper は、翻訳機能を備えていますが、現在は英語のみに対応しています。日本語に翻訳する場合は、文字起こしを翻訳するために MT を使用する必要があります。Whisper が生成する文字起こしにはタイムスタンプがあるので、これを使って字幕として利用できます。下記に、実際に出力された文字起こしを示します:
Sam Altman - How to Succeed with a Startup
start end text
0 4440 Okay, today I'm going to talk about how to succeed with a startup.
4440 9120 Obviously, more than can be said here in 20 minutes, but I will do the best I can.
9120 14440 The most important thing, the number one lesson we try to teach startups is that the degree
14440 18880 to which you're successful approximates the degree to which you build a product that is
18880 23120 so good people spontaneously tell their friends about it.
23120 25240 Startups always ask us for the secret to success.
25240 28600 They always want to believe it's something other than this because this is really hard
28600 31040 to do, but this is it.
タイムスタンプを維持したまま翻訳しようとすると、文章が途切れていることによる問題が発生することがあります。これは、Whisper が一度にすべての音声を処理できず、音声を分割して処理するため、文章が途中で途切れることがあるためです。そのため、一部の文章で翻訳が上手くいかない可能性があります。以下にその例を示します:
start end text
0 4440 さて、今日は「スタートアップで成功する方法」についてお話しします。
4440 9120 もちろん、20分では語り尽くせないほどですが、できる限りのことはさせていただきます。
9120 14440 最も重要なことは、私たちがスタートアップに教えようとしている第一の教訓は、度
14440 18880 成功の度合いというのは、その製品がどの程度のものであるかに比例します。
18880 23120 というように、良い人は自然と友達に話してしまうのです。
23120 25240 スタートアップ企業からは、いつも成功の秘訣を聞かれます。
25240 28600 彼らはいつも、これは本当に難しいことだから、これ以外の何かだと信じたいと思う。
28600 31040 をするのですが、これです。
文章が途切れているため、一部の文章で翻訳が上手くいかないことが分かります。この問題に対する解決策として、ピリオド(.)、クエスチョンマーク(?)、エクスクラメーションマーク(!)を利用して、文章が終わっていない場合に次の文章と結合するという方法があります。実際に例文で試してみると、以下のように翻訳が改善することがわかります:
25240 28600 They always want to believe it's something other than this because this is really hard
28600 31040 to do, but this is it.
25240 28600 彼らはいつも、これは本当に難しいことだから、これ以外の何かだと信じたいと思う。
28600 31040 をするのですが、これです。
25240 31040 They always want to believe it's something other than this because this is really hard to do, but this is it.
25240 31040 これは本当に難しいことだから、これ以外のものだと信じたいといつも思っているのですが、これなんです。
ただし、Whisper が生成する文字起こしには(.)や(?)が存在しない場合があります。No punctuation for the first 75 minutes of the video. What could be the error / bug? #194 で議論されていますが、Whisper は次の文字を文字起こしする際に、音声とそこまでの文字起こしを元に予測しているため、最初に(.)や(?)がない文章が生成されると、その影響を受けて(.)や(?)がないモードにはまってしまうことがあります。改善策としては、--initial_prompt
に(.)を含む文章を設定する方法が提案されていますが、音声が長い場合には途中で(.)や(?)がないモードにはまってしまうことがあるため、有効ではありません。
Let's build GPT: from scratch, in code, spelled out.
1482880 1487280 saw a lot of this in a lot more depth in the make more series and here if i just run this
1488000 1494400 then we currently get the predictions the scores the logits for every one of the four by eight
1494400 1498720 positions now that we've made predictions about what comes next we'd like to evaluate the loss
1498720 1504240 function and so in make more series we saw that a good way to measure a loss or like a quality of
1504240 1508960 the predictions is to use the negative log likelihood loss which is also implemented in
Whisperの文字起こしで(.)や(?)がない場合の解決策
ピリオド(.)、クエスチョンマーク(?)、エクスクラメーションマーク(!)を使用して、文章が終わっていない場合に次の文章と結合することが有効な解決策です。したがって、(.)や(?)がない文字起こしでも同様の方法を利用したいと思います。基本的には2つの方法があります。1つは、(.)や(?)以外の文字で分割する方法であり、もう1つは(.)や(?)を補正する方法です。また、コストはかかりますが、ChatGPT に手伝ってもらう方法や人手で行う方法もあります。
-
(.)や(?)以外の文字で分割する方法
文章を(.)や(?)以外の文字で分割する場合、前述したように特定の言葉を利用する方法があります。例えば、(and)や(but)や(or)などの接続詞や、(however)や(meanwhile)などの副詞を利用することができます。 -
(.)や(?)を補正する方法
(.)や(?)を補正する場合、AIモデルを利用することができます。AIモデルを使用する場合、モデルが学習するための十分なデータが必要であるため、コストがかかる場合があります。しかし、高い正確性で文章を分割することができるため、時間と手間を省くことができます。
解決策を実践して作成した自動翻訳字幕の紹介
今回は、Whisper の文字起こしで(.)や(?)がない場合の解決策として、(.)や(?)以外の文字で文章を分割する方法を Python
で実装しました。そして、実際にこの方法を適用して、クリエイティブ・コモンズ・ライセンス(表示)の動画に自動翻訳字幕を作成しました。
自動翻訳字幕とTTSを組み合わせた自動吹き替え
自動翻訳字幕と TTS を組み合わせた自動吹き替えは、タイムスタンプが維持されていることによるメリットを活かし、TTS(Text-to-Speech)を使用して実現することができます。TTS を使って吹き替え音声を生成し、タイムスタンプを利用してもとの動画と同期させることで、自動吹き替えを実現できます。
具体的には、文字起こしから TTS を利用して日本語の音声を作成し、タイムスタンプを利用して音声の長さを調整し、全ての合成音声を結合した吹き替え音声と元の動画を結合することで実現します。
しかし、外国語を日本語に翻訳する際には、発話時間の変化によってタイムスタンプに合わせることでスピードに違和感が生じることがあります。また、TTS では発音できない専門用語や英語などが含まれている場合、手動で文字起こしを修正する必要があります。これらの問題を解決することができれば、自動吹き替えが実現できます。
現状では、外国語の音声コンテンツで、元のコンテンツの長さを無視して、手動で修正した文字起こしを合成音声によって読み上げることで、外国語の音声コンテンツを日本語の音声コンテンツとして利用できるところまで進んでいます。
また、TTS には ESPnet2 から VITS を採用しました。ESPnet2 では、多様な事前学習モデルを簡単に試せるため、自然な TTS を気軽に試したいときに非常に便利です。参考資料: ESPnet2で始めるEnd-to-End音声処理
今後の展開と可能性
今後の展開として、Whisper の文字起こしで(.)や(?)がない場合の解決策として、(.)や(?)以外の文字で文章を分割する方法を採用しましたが、より高精度の翻訳を行うために、(.)や(?)が欠けている場合の補正方法を試していきたいと思います。
また、TTS におけるスピード調整の問題や、一部の単語や英語を正しく発音できない問題を解決することができれば、完全に自動で吹き替えを実現できると思います。そのためには、Whisper の文字起こしのタイムスタンプの調整や、正しく発音できない単語の読み方を教える方法が必要になると思います。
もし、これらに関する知見をお持ちの方がいらっしゃれば、教えていただけると幸いです。
注目の技術
注目すべき技術として、以下のものがあります。
- ASR(Automatic Speech Recognition: 自動音声認識)
- MT(Machine Translation: 機械翻訳)
- TTS(Text-To-Speech)
- SST(Speech-to-Speech Translation: 音声翻訳)
Discussion