簡単に始める音声合成とボイスクローニング

バックエンド技術

CRAIDでブリッジエンジニアをしているYoshimuraです。
普段ともに仕事しているセブ在住のRaymondさんが投稿したテック記事を翻訳(一部意訳)・加筆しましたので、当記事で紹介いたします。今回は、音声合成とボイスクローニングについてです。

英語を勉強されている方は、ぜひ当記事で日本語で理解した上で、英語記事を読んで頂くと分かり易いと思います。ご一緒にどうぞ。
翻訳元記事(オフショア子会社Full Speed Technologiesの技術ブログ)

なお、私もこの記事に沿って、ボイスクローニングを実際にやってみました。以下の音声ファイルで、上側が私のサンプル音源で、下側の音声が出力された音声です。家族に聞かせた所、結構似てると驚いていました。簡単に音声合成できる時代ですねw

はじめに

オープンソースソフトウェア(OSS)と公開されている言語コーパス(リンク先は例)のお陰で、音声合成(Text to Speech/TTSと略す)やボイスクローニングが、必要な知識を学ぶ意欲のある人々にとっては、非常に身近なものになりました。この記事を読み終えるまでに、TTSで遊び、音声のクローンを作成する為に何が必要か理解を深められるでしょう。

加筆: 言語コーパスとは、言語データを集めたもので、自然言語処理において始点となる大事なデータのことです。ボイスクローニングとは、特定の人物や話者の声の特徴やニュアンスに似せた音声を生成する音声合成技術の一種です。

商用利用について

この記事で紹介する特定のソフトウェアやモデルは、商用目的での使用はできない点にご注意ください。このモデルのライセンスは公開されていますが、商用利用は禁止されています。

早速始めましょう。

必要な環境

  • AppleシリコンのMacコンピューター
  • Python 3.9

セットアップ

ソースコードの取得

最初に、Coqui-TTSというオープンソースのソフトウェアを入手します。あらかじめ訓練された公開音声クローンモデルが準備されています。ターミナルで以下実行します。

git clone https://github.com/coqui-ai/tts

次に、以下のコマンドでディレクトリ内に移動します。

cd tts

シェルの確認

基本的にこの記事はbashシェル上で実行します。以下のコマンドを実行して、実行結果がbashか確認してください。

echo $0

もし標準のシェルがbashと違う場合は、bashシェルに切り替えてから続けてください。

加筆: Macをお使いの場合、-zshと表示されるかもしれません。MacのOSはbashですが、ユーザーが使うシェルはZ shellが採用されている為、-zshと表示されます。zshはbashの上位互換くらいに思って良いと思います。なお、当記事は-zshの私の環境でも動作しました。

Python仮想環境の構築

Coqui-TTSはPythonで書かれているため、Pythonが必要になります。依存関係がTTSに合うように準備しましょう。そのため、標準で内蔵されているvenvモジュールを使い、仮想環境を構築します。更に高機能なvirtualenvでも動きますが、当記事の目的では、venvで十分です。

python3.9 -m venv .tts

ここで作成する.ttsという名前は任意で、どの仮想環境で実行しているのかわかりやすくする為に名付けました。ご自身の環境に合うように名付けて頂き、呼ぶことができます。

仮想環境の有効化

以下コマンドで仮想環境を有効化することで、このプロジェクト専用の環境変数が設定されます。仮想環境があるディレクトリで以下を実行してください。

source .tts/bin/activate

実行後、ターミナルのプロンプトの前に環境名が表示されます。先ほど作成した環境の場合、(.tts)と表示されるはずです。

(.tts) ~/tts $

仮想環境の無効化

このプロジェクトの作業を止めたり、別のPythonプロジェクトに仕掛る場合、この環境を無効化する必要があります。これにより、他のPythonプロジェクトの要件がこの環境に影響を与えないようにする為です。

deactivate

上記のコマンドでttsの環境を無効化し、グローバルなPython環境に復元します。有効化は特定のディレクトリで実行しますが、無効化はどこからでも実行可能で、環境変数を元に戻すことができます。

TTSのインストール

仮想環境が有効化されている前提で話を進めます。

必要な依存関係のインストール

大体のアプリケーションには、要件と依存関係があります。これらのインストールを始めましょう。Pythonプロジェクトにはrequirements.txtというファイルがあり、開発、ステージング、本番環境が適切に作成できるようになっています。他のプロジェクトでは、環境毎に接尾辞で名付けられたrequirementsファイルがある場合もあります。

TTSプロジェクトを開発したり、機能追加を行っている訳ではないので、requimentsファイルを元にアプリケーションがローカルで動けば問題ないです。

pip install -r requirements.txt

(冗長なので意訳)この手順を省略すると、後でエラーが発生する可能性があるため、必ず実行してください。

アプリケーションのインストール

以下のコマンドで、TTSを仮想環境にインストールします。(一部翻訳省略)

make install

この処理が完了すると、ttsコマンドが使用可能になります。

コマンドオプション・フラグ

タイトルで「簡単」と書きましたが、仮想環境とアプリケーションが正しく設定され、ttsコマンドが実行できるはずです。

tts

このコマンドを実行すると、利用可能なオプション・フラグが列挙されます。特に以下が今回関係してきます。

  • --model_name: 使用する音声合成モデル名
  • --language_idx: 言語コード(例: enja
  • --text: 音声に変換するテキスト
  • --use_cuda: CUDA付きのGPUがない場合はfalse
  • --speaker_wav: クローンしたい人の音声の録音ファイル(6秒以上推奨)
  • --out_path: 出力ファイルの保存先(例: output.wav

モデルの一覧表示と指定

記事のタイトルで謳ったように、ボイスクローニングを行います。今回使用するモデルはxtts_v2です。このモデルは、2024年の第1四半期末にSNSで話題となったもので、6秒の音声でクローンを作成できるのが特徴です。(一部翻訳省略)

まず、使用するモデルの一覧を表示します。

tts --list_models

今回使うモデルは、tts_models/multilingual/multi-dataset/xtts_v2 ですので、–model_nameオプションで指定します。

言語の指定

以下のコマンドでxtts_v2モデルの対応言語を確認します。

tts --model_name tts_models/multilingual/multi-dataset/xtts_v2 --list_language_idxs

利用したい言語が対応されている事が確認できれば、(例えば、ja(日本語))、–language_idxオプションで指定します。

クローンするテキストの作成

次のコマンドのようにクローンするテキストを–textオプションで指定します。

tts --model_name tts_models/multilingual/multi-dataset/xtts_v2 --language_idx ja --text "チュートリアルに従っていただきありがとうございます!"

[補足]
SSML(Speech Synthesis Markup Language)には対応していないため、音声の抑揚、音量、音程、速度、イントネーションなどの詳細な調整はできません。

CUDAオプション

音声合成の難しさの1つは、グラフィックカードにおけるCUDAまたはROCmが利用できるかです。グラフィックカードの価格に加え、消費電力および運用コストが関係しています。

AppleシリコンのMacでは、--use_cuda false を指定するか、デフォルトでこのフラグが false になっているため、特に指定せずに音声合成を行うことが可能です。

AppleシリコンのMac以外、またはGPUの搭載がないPCでは、TTSが実行できない可能性があります。

音声ファイルの準備

この準備はボイスクローニングにおいて重要です。このアプリケーションのソースコードやドキュメントでは、1つのファイルのみを参照して音声をクローン化できはしますが、私の経験では、少なくとも3つの高品質な音声ファイル(wavファイル)を収集することで、より良い音声にクローンする事ができました。

元の録音には、単語の間に極力少ない間隔を開けないようにするべきです。私は、単語間の長い間隔があれば、手動で編集して取り除きました。これをしないと、合成された音声が非常にロボットのように聞こえてしまいます。Audacityなどのツールを使用するか、単語間のポーズのみをプログラムで自動的に削減できるプログラムを見つけると良いでしょう(文章間の間隔はそのままにします)。

また、ステレオの音声ファイルは、時にエコーや残響がある音声合成を引き起こすこともわかりました。

--speaker_wavオプションで、音声ファイルを指定します。複数の音声wavファイルを参照するには、ワイルドカード *.wav を使用します。例: training/speaker_name/*.wav

tts --model_name tts_models/multilingual/multi-dataset/xtts_v2 --language_idx ja --speaker_wav training/speaker_name/*.wav --text "チュートリアルに従っていただきありがとうございます!" 

加筆: 私はMacでwavファイルを作成しました。「ボイスメモ」アプリで録音し、デスクトップにドラッグ&ドロップするとm4aファイルが作成されます。そのファイルを「ミュージック」アプリでwav変換する事で、wavファイルを作成しました。wav変換については、こちらの記事を参照ください。

出力パスの指定

–out_pathオプションで出力するディレクトリを指定します。相対パス、絶対パスのどちらでもよく、ファイル名も指定できます。

tts --model_name tts_models/multilingual/multi-dataset/xtts_v2 --language_idx ja --speaker_wav training/speaker_name/*.wav --text "チュートリアルに従っていただきありがとうございます!"  --out_path thank-you.wav

出力されるファイル形式はWAVEファイルです。必要あれば、ffmpegなどで別形式に変換して下さい。

初回実行時のライセンス確認

コマンドが出来上がりました。初めて実行すると、各モデルで以下のような確認が表示されます。

 > You must confirm the following:
| > "I have purchased a commercial license from Coqui: licensing@coqui.ai"
| > "Otherwise, I agree to the terms of the non-commercial CPML: https://coqui.ai/cpml" - [y/n]

冒頭で確認したように、商用利用ライセンスでしか使えない旨に合意しないと、モデルを使うことはできません。但し、商用利用ライセンスについての問い合わせ先も記載してあります。

xtts_v2モデルは、1.87GBのサイズです。合意の意味の y と記入し、Enterキーを押すと、必要な音声モデルのダウンロードが始まります。

> Downloading model to /Users/[user]/Library/Application Support/tts/tts_models--multilingual--multi-dataset--xtts_v2
 100%|████████████████████████████████| 1.87G/1.87G
 100%|████████████████████████████████| 4.37k/4.37k
 100%|████████████████████████████████| 361k/361k
 100%|████████████████████████████████| 32.0/32.0
 100%|████████████████████████████████| 7.60M/7.75M

実行結果の確認

最後に、クローンされた合成音声がどの程度元の音声に似ているか評価してみてください。

ファイルは、–out_pathオプションで指定したパスに出力されているはずです。

簡単でしょ?

簡単でしたよね?ボイスクローニングを楽しみましょう! まだ納得してない?以下コマンドを実行してみて下さい。

pip3.9 install tts

このコマンドでttsを早く簡単にインストールする事もできました。でも、それの何が面白いっていうんでしょうか?

ソースにアクセスして、自然言語処理(NLP)のコンポーネントを学べるべきです。そして、将来の活用の為に学び、カスタムの音声モデルを作成してトレーニングを始めましょう!

利用ケースの提案

  • 誕生日メッセージ
  • ホームアシスタントの音声
  • 大切な人からの挨拶
  • ファン向けのメッセージ

免責事項

著者、(翻訳者)、Fullspeed Technologies Inc.,、(CRAID)、coqui.aiは、本記事で紹介するツールや技術の誤用に関して一切の責任を負いません。



オフショア開発ならCRAID!

オフショア開発とは、システム開発業務などを海外の開発会社や海外子会社に委託することです。

CRAIDは東証プライム上場のフリービット株式会社の子会社です。CRAIDのオフショア開発拠点「フルスピードテクノロジーズ」は、当初は月間3000億ものリクエスト処理にも対応できる自社システム開発を行うためのオフショア開発部門として始まりました。各グループ会社の開発やクライアント様の受託開発やラボ型開発も多く手掛けております。

CRAIDやオフショア開発に関して、お気軽にお問い合わせください。

この記事を書いた人

米国の大学を卒業。インド財閥系IT企業でブリッジSEとして3年間勤務後、
半導体メーカーの社内SEとして、6年間システムの海外展開や運用を担当。
子供の英語教育を念頭にフィリピン移住を目指し、2022年CRAIDに入社。
現在セブ島でオフショア開発子会社の開発組織マネージャーとして勤務中。

Yoshimuraをフォローする
バックエンド技術
CRAID オフショア開発ブログ
タイトルとURLをコピーしました