ハクソク

世界を動かす技術を、日本語で。

Sopro TTS: CPUで動作するゼロショット音声クローン機能を持つ169Mモデル

概要

  • Soproは軽量な英語テキスト読み上げ(TTS)モデル
  • WaveNet風の畳み込み軽量クロスアテンションを採用
  • ゼロショット音声クローンストリーミング生成に対応
  • 低予算・単一GPUで訓練されたプロジェクト
  • パラメータ調整や実行例も詳細に記載

Sopro TTS 概要

  • Soproはポルトガル語で「息・吹き」を意味する単語から命名された英語TTSモデル
  • WaveNet風のdilated convs軽量クロスアテンション層を採用、一般的なTransformerは不使用
  • パラメータ数169Mの軽量設計
  • ストリーミング生成ゼロショット音声クローン機能
  • CPU(M3ベースモデル)で0.25 RTF(30秒音声を7.5秒で生成)
  • 3〜12秒のリファレンス音声でクローン可能
  • 単一L40S GPUで訓練、今後データ改善で性能向上の余地あり

主な機能

  • ストリーミング生成によるリアルタイム応答
  • ゼロショット音声クローンによる多様な声質対応
  • 音声生成速度:CPUで0.25RTF
  • パラメータ調整:style_strength, stop_head, stop_threshold, stop_patience
  • 最大生成長:約32秒(400フレーム)、拡張可能だが幻覚発生リスクあり

インストール手順

  • PyPIからインストール
    • pip install sopro
  • リポジトリからインストール
    • git clone https://github.com/samuel-vitorino/sopro
    • cd sopro
    • pip install -e .
  • (オプション)conda環境作成
    • conda create -n soprotts python=3.10
    • conda activate soprotts
  • 推奨PyTorchバージョン:例 torch==2.6.0(CPU性能向上)

コマンドライン実行例

  • 基本コマンド
    • soprotts --text "テキスト" --ref_audio ref.wav --out out.wav
  • 主要オプション
    • --style_strength:声の類似度調整
    • --no_stop_head:早期停止無効化
    • --stop_threshold, --stop_patience:停止判定パラメータ
  • 短文や未完全文時:パラメータ値の調整推奨

Python API使用例

  • 非ストリーミング

    from sopro import SoproTTS
    tts = SoproTTS.from_pretrained("samuel-vitorino/sopro", device="cpu")
    wav = tts.synthesize("Hello! This is a non-streaming Sopro TTS example.", ref_audio_path="ref.wav")
    tts.save_wav("out.wav", wav)
    
  • ストリーミング

    import torch
    from sopro import SoproTTS
    tts = SoproTTS.from_pretrained("samuel-vitorino/sopro", device="cpu")
    chunks = []
    for chunk in tts.stream("Hello! This is a streaming Sopro TTS example.", ref_audio_path="ref.mp3"):
        chunks.append(chunk.cpu())
    wav = torch.cat(chunks, dim=-1)
    tts.save_wav("out_stream.wav", wav)
    

インタラクティブデモ

  • 依存パッケージインストール
    • pip install -r demo/requirements.txt
  • ローカルサーバ起動
    • uvicorn demo.server:app --host 0.0.0.0 --port 8000
  • Docker利用
    • docker build -t sopro-demo .
    • docker run --rm -p 8000:8000 sopro-demo
  • ブラウザアクセスhttp://localhost:8000

注意事項・推奨事項

  • 音声生成の一貫性:パラメータ調整で最適化推奨
  • 音声クローン精度:マイク品質や環境ノイズに依存
  • 略語や記号は発音表記推奨:「1 + 2」→「1 plus 2」
  • ストリーミング版と非ストリーミング版はビット単位で一致しない
  • 最高品質重視時:非ストリーミング版推奨
  • torchaudio利用時:ffmpegが必要な場合あり、soundfile推奨
  • 訓練コードは後日公開予定
  • 訓練データ:事前トークナイズ済み音声のみ使用(生音声は容量削減のため破棄)

改善余地・今後の展望

  • 畳み込み状態のキャッシュなど最適化余地あり
  • AI活用:Webデモ作成やコード整理、アブレーション解析に利用
  • 多言語対応やモデル改善を目指し継続開発予定
  • 支援募集中:開発支援は https://buymeacoffee.com/samuelvitorino

学習データセット

  • Emilia
  • YODAS
  • LibriTTS-R
  • Mozilla Common Voice 22
  • MLS

謝辞・参考技術

  • Mimi Codec (Kyutai)
  • WaveNet
  • Attentive Stats Pooling
  • AudioLM
  • CSM

Hackerたちの意見

それ、クールで役に立つね。個人的には、Chatterbox-TTS-Server [0] が一番の代替案だと思うよ(遅いけど、かなり高品質)。 [0] https://github.com/devnen/Chatterbox-TTS-Server
長いコンパイル時間なしでミッションインポッシブルなクローン技術。 「バズビーと一緒にいるのが一番楽しい。彼はヤンシーさんの椅子に画鋲を置いた…」 https://www.youtube.com/watch?v=H2kIN9PgvNo https://literalminded.wordpress.com/2006/05/05/a-panphonic-p...
制約がある中でこれはすごいね!もっとアーティファクトが少ない高性能なバージョンをリリースすることを考えてくれない?Chatterboxは私のお気に入りだから、もし高忠実度の結果が出せるなら、いい代替案になると思う!
これは私のサイド「趣味」なんだ。でも、コンピュータのコストはかなり高いよね。コミュニティの反応が良ければ、ぜひ考えてみるよ!ちなみに、Chatterboxは素晴らしいモデルで、インスピレーションを与えてくれる。
この文脈で「ゼロショット」ってどういう意味?
> ゼロショット学習(ZSL)は、深層学習における問題設定で、テスト時に学習者が訓練中に観察されなかったクラスのサンプルを観察し、それらが属するクラスを予測する必要がある。名前は、分類が一つまたは少数の例から学習できるという以前の概念であるワンショット学習に基づいた言葉遊びだ。 https://en.wikipedia.org/wiki/Zero-shot_learning 編集: この定義について混乱があるようなので、もっとシンプルに説明するね。私たちは条件付き確率P(Audio|Voice)をモデル化している。もしモデルが訓練中に観察されなかったVoiceクラスのためにこの分布からサンプリングした場合、それは定義上ゼロショットだ。「予測」とは単純な分類ではなく、訓練中に観察されなかったVoiceクラスのためのこの条件付き確率分布の推定だ。推論時にモデルに参照音声を提供することは、LLMとやり取りする際にAGENTS.mdを含めるのと何も変わらない。文脈を提供しているだけで、モデルの重みを更新しているわけではない。
こういうモデルってまだあるの?「スピーチプラススピーチトゥスピーチ」ボイスモジュレーターとして機能するやつ。つまり、固定された音声サンプル(プロンプト)と、連続した音声ストリーム(入力)を使って、入力のスピーチ部分をプロンプトの声のトーンと音色に変換して、連続した音声出力ストリームを作るやつ。理想的には、入力音声ストリームの非スピーチ部分を通過させながらだけど、伝統的なソース分離技術やマイクアレイなどで他の方法でも処理できるかも。私が考えているユースケース(Vtuber)では、プロンプトを動的に変更する必要はないから、連続したシングルストリームの「スピーチトゥスピーチ」モデルに簡略化できるかも。ターゲットの声の音色は、高コストだけど一度きりのファインチューニングで焼き込む感じで。
オープンモデルについてはわからないけど、ElevenLabsはしばらくの間、イントネーションや感情、抑揚を指定されたTTSボイスにマッピングするアイデアを持ってるよ。 https://elevenlabs.io/blog/speech-to-speech
Chatterbox TTSは「ボイスクローン」モードでこれをやってるけど、ストリーミング部分は自分で実装しないといけないよ。入力は2つあって、音声A(「スタイル」)とB(「コンテンツ」)。音色はAから取って、内容や発音、抑揚、アクセントなんかはBから取るんだ。厳密に言うと、こういうボイスクローンモデルやChatterboxは「TTS」じゃなくて、「S+STS」、つまりスピーチ+スタイルからスピーチって考えた方がいいね。
これを信頼性高くやってるものがどこかにあるはず。Vチューバーがやってるのをよく見るし、聞くからね。
そうだね、RVC(リトリーバルボイスコンバーサーション)をチェックしてみて。これが唯一の良いオープンソースのボイスチェンジャーだと思う。今、元のクリエイターと現在の開発者の間でちょっとした対立があるから、メインのフォークは使わない方がいいよ。もっと最新の英語のフォークが見つかると思う。
169Mには、Mimiコーデックの約90Mパラメータも含まれてるのかな?スピーカーの条件付けにFiLMを使うのは面白いアプローチだね。
いや、そうじゃないよ。
ここでのコメントが全然理解できない。音声を再生したけど、めちゃくちゃひどい音だよ。15年前のコンピューターボイスよりもずっと悪い。最も頭の悪い人でも、これを人間だとは思わないだろう。みんなが聞いてるのと同じものを聞いてないのかな?俺には完全に壊れてるように聞こえる。いろんなブラウザで試したけど、違いはなかった。
言った通り、いくつかのリファレンスボイスは悪い音質につながることがある。でも、そんなにひどい音なら、多分それじゃないよ。興味があれば、もっと掘り下げてみたいな。
俺もRFKだと思ってた。
同じく、いくつかの声を試してみたけど、子供の声や自分の声も含めて、生成された音声は全然似てないし、ちゃんとした声じゃないね。
たくさんの感嘆符を使って、温度を上げてみたら、面白い結果が出たよ。楽しかった!
英語も試してみたけど、似てるところがあるね。こんなに安いのにすごく印象的だし、使いやすい!ありがとう!
「ゼロショット」って何を意味するの?
この場合、他の声のサンプルを提供しなくても、いいクローンが得られるってことだと思うよ。