複数の参照音声からローカルTTS(Text-to-Speech、文章読み上げ)/VC(Voice Change、音声変換)ツールを作る

目次

複数の参照音声からローカルTTS/VCツールを作る: Voice Blend TTS

はじめに

音声合成にはTTS(Text-to-Speech、入力した文章を音声として読み上げる技術)を使います。一方、VC(Voice Change)は、入力 された音声そのものを別の声質に変換する技術です。

音声合成というと、あらかじめ用意された一人分の声で文章を読み上げるもの、という印象があります。

しかし実際に試してみたいことは、もう少し複雑です。たとえば複数の参照音声を用意し、それらの声質の特徴をもとに、ひとつの話者条件として合成音声を作れないか。さらに、テキストを読み上げるだけでなく、入力した音声をその声に変換できないか。

そこで、ローカル環境で動く実験ツールとして Voice Blend TTS を作りました。

GitHubで公開しています。

GitHub - dataclock-jp/voice-blend-tts: Voice blending, TTS, and real-time voice conversion tool.
Voice blending, TTS, and real-time voice conversion tool. - dataclock-jp/voice-blend-tts

何をするツールか

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.loadweights_only の既定値が変わった影響を受けました。XTTS v2の古いチェックポイントを読み込む際に、設定クラスを安全なグローバルとして登録する必要がありました。

さらに、TorchCodecではWindows上でFFmpegの共有DLLが必要でした。単に ffmpeg.exe があるだけでは足りず、avcodec-*.dllavformat-*.dll を含むshared buildが必要です。今回はScoopの ffmpeg-shared を使って解決しました。

日本語入力では、XTTS v2のテキスト前処理に cutletunidic-lite が必要でした。これも依存関係に追加しています。

こうした問題は、実際にローカルで音声AIを動かしてみないとなかなか見えてきません。モデルそのものの使い方だけでなく、PyTorch、CUDA、音声デコード、言語ごとのテキスト処理まで含めて環境を整える必要があります。

ローカルで動かす意味

このツールはローカル実行を前提にしています。

音声データは個人性が高い情報です。クラウドサービスにアップロードするよりも、手元のPCで処理できる方が安心できる場面があります。また、モデルや処理の流れを自分で確認しながら試せる点も、実験ツールとしては重要です。

もちろん、ローカルで動くから何をしてもよい、ということではありません。

このツールは、利用権限があり、本人同意のある音声だけに使うべきです。他人の声を無断で再現したり、なりすましに使ったりする用途は避ける必要があります。生成物を公開する場合も、参照音声、モデル、生成内容の権利条件を確認する必要があります。

今後やりたいこと

現時点で、テキスト読み上げ、参照音声の重み付け、音声アップロードからの置換、リアルタイムVCまで一通り動くようになりました。

今後改善するなら、次のような点が考えられます。

  • VCの遅延を小さくする
  • 参照音声と重みのプリセットを保存できるようにする
  • 生成履歴を画面上で管理できるようにする
  • 依存関係やGPU状態をより詳しく診断できるようにする
  • 参照音声の品質チェックを追加する

特に、リアルタイムVCはまだ改善の余地が大きい部分です。チャンク長、変換処理、再生キューの扱いを調整すれば、体感はかなり変わると思います。

おわりに

Voice Blend TTSは、完成品の音声サービスというより、ローカル環境で音声合成と音声変換を実験するためのツールです。

複数の参照音声から話者条件を作り、その条件でテキストを読み上げる。さらに、入力音声をその声質へ変換する。こうした流れを自分のPC上で試せるようにしたことで、音声AIの仕組みや難しさがかなり具体的に見えるようになりました。

音声は人の個性に強く結びついています。だからこそ、技術的な面白さだけでなく、使い方の慎重さも同時に考える必要があります。

その前提を守りながら、ローカルAIツールとして少しずつ改善していきたいと思います。

コメント

タイトルとURLをコピーしました