生成AIを活用して動画の吹き替えをやってみた!

 2023.11.20 XIMIX Google Cloud チーム

 

H2を使用すると自動的にここに目次が入ります        

はじめに

本内容は2023年8月22日に開催されたGoogle主催の「Generative AI Summit」のLT枠で発表したものです。このブログでは、その発表内容を改めてお伝えします。

生成AIを活用して日本語の動画を英語に吹き替えができるかやってみました。
動画の吹き替えについて音声認識や翻訳等を行うことである程度自動化が可能ではないかと考え、実際に試してみました。
また、動画の吹き替えと音声の尺がなるべくずれないような工夫をGoogleの生成AIであるVertexAI text-bisonモデルを利用して実行しました。

吹き替えした動画

吹き替え元の動画は下記になります。


実際に吹き替えた動画は下記になります。

 

音声認識や生成AIを活用して文章の一部を自動生成しています。そのため誤認識している部分も存在します。
しかし、生成AIを活用して発話内容を調整しているため、映像と音声が大きくずれることはないと思います。

全体の処理内容

処理フローは下記になります。

  1. FFmpegで音声と映像に分離
  2. Demucsでの人の声とBGMを分離
  3. pyannoteでの話者分離と音声区間検出
  4. 音声認識と日本語から英語への翻訳
  5. 尺合わせの実施
  6. ①で分離した映像と②で分離したBGMと⑤で調整した音声を合成し吹き替えした動画を作成

それぞれで実施した内容について説明していきます。

FFmpegで音声と映像を分離

これは、動画や音声をエンコードしたり、変換したり、再生したり、ストリーミングしたりするためのフリーのソフトウェアです。

動画から音声を抽出するためには次のコマンドを実行します。
ffmpeg -i {音声を抽出する動画のファイルパス} -vn -acodec pcm_s16le {抽出する音声のファイルパス}
次に映像のみ抽出するため次のコマンドを実行します。
ffmpeg -i {音声を抽出する動画のファイルパス} -an -vcodec copy {抽出する映像のファイルパス}
これで元の動画から吹き替えに必要な音声と映像を分離ことができました。

Demucsでの人の声とBGMを分離

「Demucs」は、AI技術を利用して複数の楽器で演奏・ミックスされた音楽を、ボーカル・ドラム・ベース・その他の楽器に分離して出力します。
今回の場合では、話者の声とそれ以外のBGMに分離することを目指しました。
話者の音声は後続処理の音声認識や翻訳で利用します。
BGMは吹き替えされた音声と映像とマージする際に利用します。

pyannoteでの話者分離と音声区間検出

pyannoteを利用して発話者を分離します。
pyannoteは、音声データから「誰が何時に話している」といった情報を識別するためのPythonライブラリです。今回は発話者の識別(話者分離)、話が終わるタイミングを検出するためにpyannoteを利用しました。
特に発話が終わるタイミングは後続処理の尺合わせで必要になってきます。

実際の出力結果をまとめたものが下記になります。

{'speaker': 'SPEAKER_00', 'start_time': 5008.532423208191, 'end_time': 8008.532423208191}
{'speaker': 'SPEAKER_00', 'start_time': 9028.532423208191, 'end_time': 11968.532423208191}
{'speaker': 'SPEAKER_00', 'start_time': 13148.532423208191, 'end_time': 17768.53242320819}
{'speaker': 'SPEAKER_00', 'start_time': 31688.53242320819, 'end_time': 35188.53242320819}
{'speaker': 'SPEAKER_00', 'start_time': 36548.53242320819, 'end_time': 42168.5324232082}
{'speaker': 'SPEAKER_00', 'start_time': 43387.37201365188, 'end_time': 48567.37201365188}

各パラメータは下記の通りとなっております。
  • speaker:発話者の識別子
  • start_time:発話開始時刻(ミリ秒)
  • end_time:発話終了時刻(ミリ秒)

1行ごとに誰が発話したのか、発話の開始時刻と終了時刻を取得することができました。

音声認識と日本語から英語への翻訳

音声認識にはCloud Speech-to-Textを活用しました。
日本語から英語への翻訳にはCloud Translation APIを使用して実施しました。
具体的な出力結果は以下に示します。
Cloud Speech-to-Textの出力結果とCloud Translation APIの出力結果を理解しやすくするため、一元化して表示しています。

{'speaker': 'SPEAKER_00', 'start_time': 5008.532423208191, 'end_time': 8008.532423208191, 'message': 'それでは処理フローについてご説明します', 'translation': 'Now, I will explain the processing flow.'}

{'speaker': 'SPEAKER_00', 'start_time': 9028.532423208191, 'end_time': 11968.532423208191, 'message': 'まずは音声と映像に分離します', 'translation': 'First, separate audio and video'}

{'speaker': 'SPEAKER_00', 'start_time': 13148.532423208191, 'end_time': 17768.53242320819, 'message': '分離された音声人の声と BGM にそれぞれ分離します', 'translation': 'Separated audio is separated into human voice and BGM.'}

{'speaker': 'SPEAKER_00', 'start_time': 19188.53242320819, 'end_time': 30008.53242320819, 'message': '釣りには処分良子なって行きますうちらは初場所を好みさせるのと発音が終わるタイミングを識別する目的で利用しています', 'translation': 'When it comes to fishing, I use it for the purpose of getting people to prefer the first place and identifying when the pronunciation ends.'}

{'speaker': 'SPEAKER_00', 'start_time': 31688.53242320819, 'end_time': 35188.53242320819, 'message': 'その後音声認識を抱く行います', 'translation': 'Then do the voice recognition hug'}

{'speaker': 'SPEAKER_00', 'start_time': 36548.53242320819, 'end_time': 42168.5324232082, 'message': '翻訳された文章をもとに音声合成としゃく合わせを行います', 'translation': 'Performs speech synthesis and matching based on the translated text'}

{'speaker': 'SPEAKER_00', 'start_time': 43387.37201365188, 'end_time': 48567.37201365188, 'message': '最後に映像と音声を合成して動画を作成します', 'translation': 'Finally, combine the video and audio to create a video.'}

各パラメータは下記の通りとなっております。

  • speaker:発話者の識別子
  • start_time:発話開始時刻(ミリ秒)
  • end_time:発話終了時刻(ミリ秒)
  • message:音声認識された文章
  • translation:翻訳された文章
speakerからend_timeまでは前回までの出力結果となります。
start_timeからend_time間で発話された文章を音声認識したものがmessageに格納されています。
音声認識については、完全には識別できていない箇所も何か所かあります(赤字箇所)、しかし、多くの部分は問題なく認識されていると思います。

尺合わせの実施

尺合わせとは、映像の発話の尺に合わせて翻訳文の長さを調整する作業となります。
日本語から英語への翻訳では、映像と発話がずれないようにするため、このような作業が必要になります。
この作業を助ける仕組みとして、翻訳結果をGoogleのVertexAI text-bisonを利用し、映像の尺に合わせて翻訳文の長さを調整します。

具体的な処理イメージは下記になります。

①ひとつ前の工程で翻訳した文章を元に音声合成を実施
最初の文章は「Now, I will explain the processing flow.」になります。

②音声認識後音声の秒数を計測
今回音声合成した「Now, I will explain the processing flow.」の時間は2.402秒でした。
実際の発話「それでは処理フローについてご説明します」の時間を計測すると、こちらは3秒となっています。
したがって、翻訳後の文章の発話時間と実際の発話時間を比較すると以下のようになります。

3.00秒(日本語での発話時間) - 2.402秒(翻訳後文章の発話時間) = 0.59799(差分の時間)

実際の発話時間より0.598秒短くなっています。
この状態で映像と音声との合成を行ってしまうと発話している映像と音声がずれてしまう可能性があります。
そのため、生成AIを用いて翻訳後の文章を伸縮させ、実際の発話時間に近づけます。

VertexAI text-bisonを活用して文章を増減させる
今回生成AIとしてVertexAI text-bison(latest)を利用しました。
プロンプト(命令)として以下のような内容を設定しました。
下記文章に1単語追加して文章を作成してください。

Now, I will explain the processing flow.

上記プロンプトの通り1単語追加するようなプロンプトを追記しています。
プロンプト入力後の出力結果は下記になります。
Now, I will explain the processing flow in detail.
プロンプト前と後でどう変わったのか見比べてみましょう。
プロンプト実施前:Now, I will explain the processing flow.
プロンプト実施後:Now, I will explain the processing flow in detail.

一部文字が追加されているのがわかると思います。

④プロンプト出力後の文章を再度音声合成・秒数計測
プロンプト実施後の文章を再度音声合成し秒数を計測します。
計測した秒数と日本語で発話している元動画の秒数(3.0秒)と比較します。
3.00秒(日本語での発話時間) - 2.977秒(翻訳後文章の発話時間) = 0.0230(差分の時間)
差分が0.023秒となり、かなり差が縮まりました。
今回は差分が0.1秒以内となった場合、終了として次の文章に進むように設定しています。
さらに時間の差異があった場合には、再度単語を追加する形でVertexAI text-bisonを実行します。

また、今回の動画では発生しませんでしたが、翻訳後の文章の発話時間が実際の発話時間に比べて長かった場合には、単語を削除するようなプロンプトを実行させます。
プロンプトは下記になります。
下記文章に1単語減らして文章を作成してください。

{翻訳後文章}

このように「音声合成→秒数計測→発話時間との差分確認→VertexAI text-bisonでの文章生成」というサイクルを繰り返すことで、実際の映像と音声のズレを最小限にし、合成時の違和感を減らすように工夫しています。

文章生成での失敗例

音声認識や生成AIを利用して文章を生成するため、出力結果に間違いが混じる可能性があります。
音声認識での間違いは、「音声認識と日本語から英語への翻訳」の節で述べた通り、いくつかの箇所で間違いが見られました。
また、生成AIによる文章生成でも、期待通りの結果が得られない例があります。以下にその一例を示します。

下記文章に1単語追加して文章を作成してください。

Separated audio is separated into human voice and BGM.

この場合、生成AIが出力した文章は以下の通りです。
プロンプト実施前:Separated audio is separated into human voice and BGM.
プロンプト実施後:Separated audio is separated into human voice and BGM by AI.

プロンプト実行前の文章には「AI」に関する記述がないにも関わらず、プロンプト実行後に「by AI」が追加され、意味が変わってしまっています。そのため、このような結果も生成されてしまう可能性があることに注意が必要です。

音声と映像の合成

最後に今までの工程で翻訳された音声と映像を合成することで吹き替え動画を作成しています。

まとめ

VertexAI text-bisonを活用して動画の吹き替えを自動で行ってみました。
現状ある課題点は下記かと思っています。

  1. すべての処理が完了するのに時間がかかる
  2. 音声認識や生成AIを活用して文章を作成しているため出力された文章に間違いが混在する可能性がある

それぞれの対応策について検討します。

①すべての処理が完了するのに時間がかかる
これは音声認識、音声合成、尺合わせでのVertexAI text-bisonの利用等時間がかかる処理を直列で行っているためすべての処理が完了するのに時間がかかってしまっています。
対策としては並列処理等で処理速度の向上は見込めるのではないかと考えています。

②音声認識や生成AIを活用して文章を作成しているため出力された文章に間違いが混在する可能性がある
おかしな文章が出力されることはAIの特性上しょうがない部分もあるかと思います。
現状の対策としては音声認識、生成AIで出力された文章を手動で修正し、その後映像と合成させるような手動での修正作業は必要になるかと思われます。

応用例

今回考えた動画の自動吹き替えを利用すれば、以下のようなサービスが実現可能だと考えています。

  1. 映画やドラマの吹き替え
  2. ニュース番組の吹き替え
  3. オンライン講義の吹き替え

さらにAIの精度が進化することにより、一つの言語で説明された動画を多言語に変換する作業がより簡単になる可能性があります。

Google Cloud、Google Workspace に関するご相談はXIMIXへ!

Google Cloud、Google Workspaceに関する お問い合わせはこちら
XIMIX(サイミクス)は商標登録出願中で2 


生成AIを活用して動画の吹き替えをやってみた!

BACK TO LIST