目次
複数の参照音声からローカルTTS/VCツールを作る: Voice Blend TTS
はじめに
音声合成にはTTS(Text-to-Speech、入力した文章を音声として読み上げる技術)を使います。一方、VC(Voice Change)は、入力 された音声そのものを別の声質に変換する技術です。
音声合成というと、あらかじめ用意された一人分の声で文章を読み上げるもの、という印象があります。
しかし実際に試してみたいことは、もう少し複雑です。たとえば複数の参照音声を用意し、それらの声質の特徴をもとに、ひとつの話者条件として合成音声を作れないか。さらに、テキストを読み上げるだけでなく、入力した音声をその声に変換できないか。
そこで、ローカル環境で動く実験ツールとして Voice Blend TTS を作りました。
GitHubで公開しています。
何をするツールか
Voice Blend TTSは、複数の参照音声から話者条件を抽出し、その条件を使って入力テキストを読み上げる、または入力音声をボイスチェンジするローカルツールです。
主な機能は次のとおりです。
- 複数の参照音声をアップロードして音声合成する
- 参照音声ごとに重みを指定し、どの声に寄せるかを調整する
- 入力テキストを合成音声で読み上げる
- アップロードした音声を文字起こしし、合成音声で読み上げ直す
- マイク入力を使って発話単位で音声を置き換える
- FreeVC24を使ったリアルタイム寄りの音声変換を行う
- NVIDIA GPUがある環境ではCUDAで実行する
ここで重要なのは、単純に波形を混ぜているわけではない、という点です。
元になる複数の音声は、同じセリフを同じタイミングで話している必要はありません。各音声を参照音声としてモデルに渡し、モデル側で話者条件を抽出します。その条件を使って、新しいテキストを読み上げたり、入力音声を変換したりします。
なぜ作ったか
音声の「ミキシング」と聞くと、複数の音声波形を重ね合わせる処理を想像しやすいです。しかし、人の声を扱う場合、それだけでは目的に合いません。
たとえば、Aさん、Bさん、Cさんの音声があるとして、それぞれが別々の内容を話している場合、波形を重ねても聞き取りにくい音になるだけです。欲しいのは、音声波形そのものではなく、声質や話者性の条件です。
そこで、最初から「波形を混ぜるツール」ではなく、「複数の参照音声から話者条件を作り、それを使って発話を生成・変換するツール」として設計しました。
使っている技術
バックエンドはFastAPIで作りました。ブラウザから音声ファイルやテキストを送信し、サーバー側でモデルを呼び出してWAVを返す構成です。
音声合成にはCoqui XTTS v2を使っています。XTTS v2は、参照音声を指定して多言語の音声合成ができるモデルです。
音声変換にはCoqui FreeVC24を使っています。これはテキストを経由せず、入力音声を別の声質に変換するために使っています。
また、入力音声を文字起こししてから読み上げ直す機能にはWhisperを使っています。
大まかな構成は次のようになります。
ブラウザ
↓
FastAPI
↓
参照音声の保存
↓
XTTS v2 / FreeVC24 / Whisper
↓
WAVを生成してブラウザへ返す
参照音声の重み付け
このツールでは、複数の参照音声に重みを付けられるようにしました。
たとえば3つの参照音声がある場合、すべてを同じ強さで使うのではなく、「1番目の音声に強く寄せる」「2番目は少しだけ使う」「3番目は使わない」といった調整ができます。
内部的には、指定された重みに応じてXTTSへ渡す参照音声リストを展開しています。厳密な話者埋め込みの連続補間ではありませんが、ユーザーが直感的に「どの声に寄せるか」を調整するための実用的な方法として使えます。
リアルタイムVCについて
リアルタイムVCでは、まず参照音声群から混合声のターゲット参照WAVを作ります。その後、マイク音声を短いチャンクに分けてサーバーへ送り、FreeVC24で変換した音声を順番に再生します。
完全な低遅延リアルタイム処理というよりは、ブラウザとHTTPで動く「リアルタイム寄り」の構成です。CPUではかなり重くなるため、実用的に試すにはNVIDIA GPUとCUDA環境がほぼ前提になります。
実際にRTX 3070の環境では、CUDA版PyTorchを入れることで動作しました。
詰まったところ
今回、ツール本体よりも依存関係の調整に意外と時間がかかりました。
まず、Coqui TTSとTransformersの組み合わせで、BeamSearchScorer をimportできない問題がありました。これはTransformers 5系では互換性が合わなかったため、transformers==4.33.3 に固定しました。
次に、PyTorch 2.6以降で torch.load の weights_only の既定値が変わった影響を受けました。XTTS v2の古いチェックポイントを読み込む際に、設定クラスを安全なグローバルとして登録する必要がありました。
さらに、TorchCodecではWindows上でFFmpegの共有DLLが必要でした。単に ffmpeg.exe があるだけでは足りず、avcodec-*.dll や avformat-*.dll を含むshared buildが必要です。今回はScoopの ffmpeg-shared を使って解決しました。
日本語入力では、XTTS v2のテキスト前処理に cutlet と unidic-lite が必要でした。これも依存関係に追加しています。
こうした問題は、実際にローカルで音声AIを動かしてみないとなかなか見えてきません。モデルそのものの使い方だけでなく、PyTorch、CUDA、音声デコード、言語ごとのテキスト処理まで含めて環境を整える必要があります。
ローカルで動かす意味
このツールはローカル実行を前提にしています。
音声データは個人性が高い情報です。クラウドサービスにアップロードするよりも、手元のPCで処理できる方が安心できる場面があります。また、モデルや処理の流れを自分で確認しながら試せる点も、実験ツールとしては重要です。
もちろん、ローカルで動くから何をしてもよい、ということではありません。
このツールは、利用権限があり、本人同意のある音声だけに使うべきです。他人の声を無断で再現したり、なりすましに使ったりする用途は避ける必要があります。生成物を公開する場合も、参照音声、モデル、生成内容の権利条件を確認する必要があります。
今後やりたいこと
現時点で、テキスト読み上げ、参照音声の重み付け、音声アップロードからの置換、リアルタイムVCまで一通り動くようになりました。
今後改善するなら、次のような点が考えられます。
- VCの遅延を小さくする
- 参照音声と重みのプリセットを保存できるようにする
- 生成履歴を画面上で管理できるようにする
- 依存関係やGPU状態をより詳しく診断できるようにする
- 参照音声の品質チェックを追加する
特に、リアルタイムVCはまだ改善の余地が大きい部分です。チャンク長、変換処理、再生キューの扱いを調整すれば、体感はかなり変わると思います。
おわりに
Voice Blend TTSは、完成品の音声サービスというより、ローカル環境で音声合成と音声変換を実験するためのツールです。
複数の参照音声から話者条件を作り、その条件でテキストを読み上げる。さらに、入力音声をその声質へ変換する。こうした流れを自分のPC上で試せるようにしたことで、音声AIの仕組みや難しさがかなり具体的に見えるようになりました。
音声は人の個性に強く結びついています。だからこそ、技術的な面白さだけでなく、使い方の慎重さも同時に考える必要があります。
その前提を守りながら、ローカルAIツールとして少しずつ改善していきたいと思います。

コメント