「オープンソースツールを使用して、プロのように音声をクローンし、リップシンク動画を作る方法」
「オープンソースツールを使ってプロ並みの音声クローンを作り、リップシンク動画を作る方法」
紹介
AI音声クローンはソーシャルメディアで大流行しています。これにより、創造的な可能性が広がりました。ソーシャルメディアで有名人のミームやAI声の上書きを見たことがあるかもしれません。それがどのように行われているのか疑問に思ったことはありませんか?Eleven Labsなど、多くのプラットフォームがAPIを提供していますが、オープンソースソフトウェアを使用して無料で行うことはできるのでしょうか?短い答えは「YES」です。オープンソースには音声合成を実現するためのTTSモデルとリップシンクツールがあります。したがって、この記事では、音声クローンとリップシンクのためのオープンソースのツールとモデルを探求してみましょう。
学習目標
- AI音声クローンとリップシンクのためのオープンソースツールを探求する。
- FFmpegとWhisperを使用してビデオを転写する。
- Coqui-AIのxTTSモデルを使用して声をクローンする。
- Wav2Lipを使用してビデオのリップシンクを行う。
- この技術の実世界での使用例を探求する。
この記事はData Science Blogathonの一環として公開されました。
オープンソーススタック
既にご存じのように、私たちはOpenAIのWhisper、FFmpeg、Coqui-aiのxTTSモデル、およびWav2lipを私たちの技術スタックとして使用します。しかし、コードに入る前に、これらのツールについて簡単に説明しましょう。そして、これらのプロジェクトの作者に感謝します。
Whisper: WhisperはOpenAIのASR(自動音声認識)モデルです。これは、多様なオーディオデータと対応するトランスクリプトを用いて、650,000時間以上のトレーニングを受けたエンコーダ-デコーダトランスフォーマーモデルです。そのため、オーディオからの多言語の転写に非常に適しています。
- 「Forza Horizon」がGeForce NOWにレースを展開」
- 商品化されたサービス101:フリーランサーを殺す一人ビジネス(次は従業員)
- 「デジタル時代のユーザーセントリックデザイン:ウェブデザインとUI/UX体験に影響を与えるトレンド」
エンコーダは、30秒のオーディオチャンクのログメルスペクトログラムを受け取ります。各エンコーダブロックは、オーディオ信号の異なる部分を理解するためにセルフアテンションを使用します。デコーダは、エンコーダからの隠れ状態情報と学習済みの位置エンコーディングを受け取ります。デコーダはセルフアテンションとクロスアテンションを使用して次のトークンを予測します。プロセスの最後に、認識されたテキストを表すトークンのシーケンスを出力します。Whisperの詳細については、公式リポジトリを参照してください。
Coqui TTS: TTSはCoqui-aiのオープンソースライブラリです。これは複数のテキスト読み上げモデルをホストしています。Bark、Tortoise、xTTSなどのエンドツーエンドモデル、FastSpeechなどのスペクトログラムモデル、Hifi-GAN、MelGANなどのボコーダなどがあります。さらに、テキスト読み上げモデルの推論、調整、トレーニングのための統一されたAPIを提供しています。このプロジェクトでは、xTTSというエンドツーエンドの多言語音声クローニングモデルを使用します。これは英語、日本語、ヒンディー語、中国語などを含む16の言語をサポートしています。TTSについての詳細情報は、公式のTTSリポジトリを参照してください。
Wav2Lip: Wav2Lipは、「A Lip Sync Expert Is All You Need for Speech to Lip Generation In the Wild」という論文のためのPythonリポジトリです。これは、リップシンクの鑑別モデルを使用して顔と唇の動きを認識します。これは声の吹き替えに非常に適しています。詳細については、公式リポジトリを参照してください。私たちは、Wav2lipのこのフォークリポジトリを使用します。
ワークフロー
今や使用するツールとモデルについては理解しているので、ワークフローについて理解しましょう。これはシンプルなワークフローです。以下が私たちが行うことです。
- ビデオをColabランタイムにアップロードし、リップシンクに向けて720p形式にリサイズします。
- FFmpegを使用してビデオから24ビットのオーディオを抽出し、Whisperを使用してオーディオファイルを転写します。
- Google翻訳またはLLMを使用して転写されたスクリプトを別の言語に翻訳します。
- TTSライブラリで多言語xTTSモデルをロードし、スクリプトとリファレンスオーディオモデルを声の合成に使用します。
- Wav2lipリポジトリをクローンし、モデルのチェックポイントをダウンロードします。inference.pyファイルを実行して、元のビデオと合成されたオーディオを同期させます。
さあ、コードについて詳しく見ていきましょう。
ステップ1:依存関係のインストール
このプロジェクトでは、大量のRAMとGPUの消費が必要ですので、Colabランタイムを使用することが賢明です。無料のColabには、12GBのCPUと15GBのT4 GPUが提供されています。このプロジェクトには十分です。ですので、Colabに移動してGPUランタイムに接続しましょう。
いま、TTSとWhisperをインストールしましょう。
!pip install TTS!pip install git+https://github.com/openai/whisper.git
ステップ2:ビデオをColabにアップロード
いま、ビデオをアップロードして720p形式にリサイズします。Wav2lipは、ビデオが720p形式の場合にもっともよく機能します。これはFFmpegを使用して行うことができます。
#@title Google.colabからビデオをアップロードしますimport filesimport osimport subprocessuploaded = Noneresize_to_720p = Falsedef upload_video(): global uploaded global video_path # video_pathを変更するためにglobalで宣言 uploaded = files.upload() for filename in uploaded.keys(): print(f'アップロードされたのは {filename}') if resize_to_720p: filename = resize_video(filename) # リサイズされたビデオの名前を取得 video_path = filename # video_pathを元のファイル名またはリサイズされたファイル名で更新 return filenamedef resize_video(filename): output_filename = f"resized_{filename}" cmd = f"ffmpeg -i {filename} -vf 'scale=-1:720' {output_filename}" subprocess.run(cmd, shell=True) print(f'リサイズされたビデオが {output_filename} として保存されました') return output_filename# ローカルデバイスからビデオをアップロードするためのフォームボタンと720pへのリサイズ用のチェックボックスを作成import ipywidgets as widgetsfrom IPython.display import displaybutton = widgets.Button(description="ビデオをアップロード")checkbox = widgets.Checkbox(value=False, description='720pにリサイズする(より良い結果)')output = widgets.Output()def on_button_clicked(b): with output: global video_path global resize_to_720p resize_to_720p = checkbox.value video_path = upload_video()button.on_click(on_button_clicked)display(checkbox, button, output)
これにより、ローカルデバイスからビデオをアップロードするためのフォームボタンと、720pへのリサイズを有効にするためのチェックボックスが表示されます。また、現在のColabセッションに手動でビデオをアップロードし、サブプロセスを使用してリサイズすることもできます。
ステップ3:オーディオの抽出とWhisperの転記
ビデオが用意できたので、次にやることはFFmpegを使用してオーディオを抽出し、Whisperを使用して転記することです。
# @title オーディオの抽出(24ビット)およびWhisperへの変換import subprocess# video_pathの変数が存在し、Noneでないことを確認するif 'video_path' in globals() and video_path is not None: ffmpeg_command = f"ffmpeg -i '{video_path}' -acodec pcm_s24le -ar 48000 -q:a 0 -map a\ -y 'output_audio.wav'" subprocess.run(ffmpeg_command, shell=True)else: print("ビデオがアップロードされていません。まず、ビデオをアップロードしてください。")import whispermodel = whisper.load_model("base")result = model.transcribe("output_audio.wav")whisper_text = result["text"]whisper_language = result['language']print("Whisperのテキスト:", whisper_text)
これにより、ビデオからオーディオが24ビット形式で抽出され、Whisper Baseを使用して転記されます。より良い転写のためには、Whisper smallまたはVoAGIのモデルを使用してください。
ステップ4:音声合成
さて、音声クローン化の部分に入りましょう。前述したように、Coqui-aiのxTTSモデルを使用します。これは音声合成のための、最高のオープンソースモデルの一つです。Coqui-aiはまた、さまざまな目的のために多くのTTSモデルも提供していますので、ぜひご確認ください。私たちのユースケースである音声クローン化には、xTTS v2モデルを使用します。
xTTSモデルをロードします。これは1.87GBの大きなモデルですので、時間がかかります。
# @title 音声合成from TTS.api import TTSimport torchfrom IPython.display import Audio, display # Audioとdisplayモジュールをインポートしますdevice = "cuda" if torch.cuda.is_available() else "cpu"# TTSttsを初期化tts = TTS("tts_models/multilingual/multi-dataset/xtts_v2").to(device)
XTTSは現在16言語に対応しています。以下はxTTSモデルがサポートする言語のISOコードです。
print(tts.languages)['en','es','fr','de','it','pt','pl','tr','ru','nl','cs','ar','zh-cn','hu','ko','ja','hi']
注意:英語やフランス語などの言語は文字数制限がありませんが、ヒンディー語の場合は最大250文字の制限があります。他の言語にも制限がある場合があります。
このプロジェクトでは、ヒンディー語を使用しますが、他の言語でも試すことができます。
したがって、今必要な最初のことは、書き起こされたテキストをヒンディー語に翻訳することです。これはGoogle TranslateパッケージまたはLLMを使用して行うことができます。私の観察によると、GPT-3.5-TurboはGoogle Translateよりも優れた性能を発揮します。翻訳のためにOpenAI APIを使用できます。
import openaiclient = openai.OpenAI(api_key = "api_key")completion = client.chat.completions.create( model="gpt-3.5-turbo", messages=[ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": f"translate the texts to Hindi {whisper_text}"} ])translated_text = completion.choices[0].messageprint(translated_text)
ヒンディー語には文字制限があるため、TTSモデルに渡す前にテキストの前処理が必要です。テキストを250文字未満のチャンクに分割する必要があります。
text_chunks = translated_text.split(sep = "।")final_chunks = [""]for chunk in text_chunks: if not final_chunks[-1] or len(final_chunks[-1])+len(chunk)<250: chunk += "।" final_chunks[-1]+=chunk.strip() else: final_chunks.append(chunk+"।".strip())final_chunks
これは非常にシンプルな分割ツールです。別のものを作成するか、Langchainの再帰的なテキスト分割ツールを使用することもできます。それでは、それぞれのチャンクをTTSモデルに渡してみましょう。生成されたオーディオファイルは、FFmpegを使用してマージされます。
def audio_synthesis(text, file_name): tts.tts_to_file( text, speaker_wav='output_audio.wav', file_path=file_name, language="hi" ) return file_namefile_names = []for i in range(len(final_chunks)): file_name = audio_synthesis(final_chunks[i], f"output_synth_audio_{i}.wav") file_names.append(file_name)
すべてのファイルが同じコーデックを持っているため、FFmpegを使用して簡単にマージできます。これを行うには、Txtファイルを作成し、ファイルパスを追加します。
# this is a commentfile 'output_synth_audio_0.wav'file 'output_synth_audio_1.wav'file 'output_synth_audio_2.wav'
さて、以下のコードを実行してファイルをマージします。
import subprocesscmd = "ffmpeg -f concat -safe 0 -i my_files.txt -c copy final_output_synth_audio_hi.wav"subprocess.run(cmd, shell=True)
これにより、最終的な連結されたオーディオファイルが出力されます。Colabでオーディオを再生することもできます。
from IPython.display import Audio, displaydisplay(Audio(filename="final_output_synth_audio_hi.wav", autoplay=False))
ステップ5:リップシンク
それでは、リップシンクの部分に進みましょう。合成音声と元のビデオをリップシンクさせるには、Wav2lipリポジトリを使用します。Wav2lipを使用してオーディオを同期するには、モデルのチェックポイントをインストールする必要があります。ただし、それより前に、T4 GPUランタイムを使用している場合は、現在のColabセッションでxTTSとWhisperモデルを削除するか、セッションを再起動します。
import torchtry: del ttsexcept NameError: print("Voice model already deleted")try: del modelexcept NameError: print("Whisper model deleted")torch.cuda.empty_cache()
次に、Wav2lipリポジトリをクローンし、チェックポイントをインストールします。
# @title Dependencies%cd /content/!git clone https://github.com/justinjohn0306/Wav2Lip!cd Wav2Lip && pip install -r requirements_colab.txt%cd /content/Wav2Lip!wget 'https://github.com/justinjohn0306/Wav2Lip/releases \/download/models/wav2lip.pth' -O 'checkpoints/wav2lip.pth'!wget 'https://github.com/justinjohn0306/Wav2Lip/releases \/download/models/wav2lip_gan.pth' -O 'checkpoints/wav2lip_gan.pth'!wget 'https://github.com/justinjohn0306/Wav2Lip/releases \/download/models/mobilenet.pth' -O 'checkpoints/mobilenet.pth'!pip install batch-face
Wav2lipには2つのモデルがあります。wav2lipとwav2lip_ganです。モデルの作成者によると、GANモデルは顔の検出に少ない努力を必要としますが、やや劣った結果を生み出します。一方、GANを使用しないモデルは、検出ボックスの手動パディングと再スケーリングによりより良い結果を出すことができます。両方を試して、どちらがより良い結果を出すか試してみてください。
モデルのチェックポイントのパス、ビデオ、およびオーディオファイルを使用して推論を実行します。
%cd /content/Wav2Lip#これは検出ボックスのパディングです。結果が良くない場合は調整してください。通常、最も問題が多いのは下部のパディングであることがよくありますpad_top = 0pad_bottom = 15pad_left = 0pad_right = 0rescaleFactor = 1video_path_fix = f"'../{video_path}'"!python inference.py --checkpoint_path 'checkpoints/wav2lip_gan.pth' \--face $video_path_fix --audio "/content/final_output_synth_audio_hi.wav" \--pads $pad_top $pad_bottom $pad_left $pad_right --resize_factor $rescaleFactor --nosmooth \ --outfile '/content/output_video.mp4'
これにより、口パクのビデオが出力されます。ビデオがうまく見えない場合は、パラメータを調整して再試行してください。
ここには、ノートブックといくつかのサンプルのリポジトリがあります。
GitHubリポジトリ:sunilkumardash9/voice-clone-and-lip-sync
実世界での使用例
ビデオの声のクローン化と口パク技術には、さまざまな産業で多くの使用例があります。以下にいくつかの利点があるケースを示します。
エンターテイメント:エンターテイメント業界は、すべての業界の中でも最も影響を受けるでしょう。既に変化が見られています。現在の有名人や過去の有名人の声を合成して再利用することができます。しかし、これは倫理的な課題も提起します。合成音声の使用は責任を持って法の範囲内で行うべきです。
マーケティング:親しみやすく共感のある声でのパーソナライズされた広告キャンペーンは、ブランドの魅力を大幅に高めることができます。
コミュニケーション:言語は常にあらゆる活動の障壁でした。クロス言語コミュニケーションはまだ課題です。アクセントや声を保ちながらリアルタイムでエンドツーエンドの翻訳を行うことは、コミュニケーションの方法を革命的に変える可能性があります。これは数年以内に現実になるかもしれません。
コンテンツ作成:コンテンツ制作者はもはや大きな観客に到達するために翻訳者に依存する必要はありません。効率的な声のクローン化と口パクを使用することで、クロス言語のコンテンツ制作が容易になります。ボイスシンセシスにより、ポッドキャストやオーディオブックナレーションのエクスペリエンスを向上させることができます。
結論
声の合成は生成型AIの最も求められる使用例の一つです。これはコミュニケーション方法を革命化する可能性を秘めています。文明の創造以来、コミュニティ間の言語の壁は文化的および商業的な関係の築き上げにおいて障壁であり続けました。AIの声の合成により、このギャップを埋めることができます。したがって、この記事では、オープンソースのボイスクローニングと口パクの方法を探索しました。
要点
- TTS(Coqui-aiによるPythonライブラリ)は人気のあるテキスト読み上げモデルを提供およびメンテナンスしています。
- xTTSは、16の異なる言語に音声をクローン化できる多言語音声クローニングモデルです。
- WhisperはOpenAIのASRモデルで、効率的なトランスクリプションと英語の翻訳が可能です。
- Wav2lipは口パクのためのオープンソースのツールです。
- 音声クローニングはエンターテイメントからマーケティングまでの産業に大きな影響を与える、最も注目されている生成型AIのフロンティアの一つです。
よくある質問
この記事に表示されるメディアはAnalytics Vidhyaの所有物ではなく、著者の裁量で使用されています。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles