最先端のオープンソースTTSモデル『Chatterbox』とは!?〜使い方から技術詳細まで〜
はじめに
こんにちは、Parakeet株式会社リサーチャーの今井(X: Nuts)です。
2025年5月29日に、Resemble AIからオープンソースText-to-Speech(TTS)モデル、Chatterboxが公開されました。
state-of-the-art TTS model that just beat ElevenLabs in blind evaluations
ブラインド評価でElevenLabsに勝利したSoTA TTSモデル
本記事でわかること
本記事では、以下の流れでChatterboxについて掘り下げていきたいと思います。
- Chatterboxの何がスゴいのか ― READMEから差別化ポイントを読み解く
- インストールから推論まで ― 最速5分で動かす手順
- 技術詳細を深掘り ― ベース技術と独自の改良点を解説
- 実際の音をチェック ― 生成サンプルをレビュー ※
※ Zennには音声サンプルを直接貼れないため、弊社のesaに生成音声をアップしています。耳で確かめたい方はこちら!↓
こんな方におすすめ
- 音声合成の研究者:コードまで踏み込んで最新TTSの内部構造を理解したい
- 音声合成に興味のあるエンジニア: 推論の仕方や生成された音声の品質について知りたい
- 音声合成技術に興味がある人:最先端の音声合成技術の性能やその仕組みについて知りたい
Chatterboxの特徴
(以下、GitHubのREADMEから引用。)
- SoTA zeroshot TTS(SoTAのZero-shot TTS)
- 0.5B Llama backbone(5億パラメータのLlamaベースのモデル)
- Unique exaggeration/intensity control(独自の発音の誇張や強度のコントロール)
- Ultra-stable with alignment-informed inference(アラインメント情報に基づく推論により非常に安定した生成が可能)
- Trained on 0.5M hours of cleaned data(50万時間のクリーンなデータで学習)
- Watermarked outputs(生成音声には電子透かし付き)
- Easy voice conversion script(簡単に音声変換可能なスクリプト付き)
- Outperforms ElevenLabs(ElevenLabsの品質を超えた)
ここから、ElevenLabsのTTSを超えるような品質のSoTAのTTSモデルで、独自の誇張などの制御が可能なことがわかります。
使い方
インストール方法
ChatterboxはPyPIに登録されているため、pipで簡単にインストールすることが可能です。
$ pip install chatterbox-tts
Text-to-Speech(TTS)
インストール後、以下のコードを実行すると./test_tts.wav
にTTSで生成された音声が保存されます。
import torchaudio
from chatterbox.tts import ChatterboxTTS
# モデル読み込み
# cuda,mps,cpuに対応
model = ChatterboxTTS.from_pretrained(device="cuda")
# 推論
# 24kHzの音声が生成されます
text = "Hello, world!"
wav = model.generate(text)
# 保存
torchaudio.save("./test_tts.wav", wav, model.sr)
なお、現在の対応言語は英語のみです。
日本語で推論することや、その他言語を推論時に指定することはできません。
generateメソッドの実行時に音声のプロンプトを与えることで、プロンプト音声の話者性・発話スタイルで合成することも可能です。
AUDIO_PROMPT_PATH="./prompt.wav"
wav = model.generate(text, audio_prompt_path=AUDIO_PROMPT_PATH)
torchaudio.save("./test_tts_2.wav", wav, model.sr)
また、exaggerationの値を制御することで音声の誇張の度合いを制御することも可能です。
AUDIO_PROMPT_PATH="./prompt.wav"
wav = model.generate(text, audio_prompt_path=AUDIO_PROMPT_PATH, exaggeration=1.0, cfg_weight=0.2)
torchaudio.save("./test_tts_3.wav", wav, model.sr)
exaggerationのデフォルト値は0.5で、小さくするほど平坦に、大きくするほど誇張した表現になります。
なお、cfg_weightは自己回帰モデルのClassifier Free Guidanceのスケールで、小さくするほど話速がゆっくりになる傾向にあるようです(おそらく平均的な話速に近くなる)。
また、exaggerationを上げるほど早口になる傾向にあるため、exaggerationを0.7以上に上げる場合はcfg_weightを0.3以下にするとうまく制御できるようです(なお、exaggerationの効きも悪くなるのでは?という気がしますが)。
Voice Conversion(VC)
また、Chatterboxは音声変換(Voice Conversion, VC)にも対応しています。
import torchaudio
from chatterbox.vc import ChatterboxVC
# モデル読み込み
model = ChatterboxVC.from_pretrained(device="cuda")
# デフォルト音声に変換する場合
wav = model.generate("./test.wav")
torchaudio.save("./test_vc.wav", wav, model.sr)
VCの場合でも、目標となる音声を用意することで、その音声の話者の声に変換することが可能です。
TARGET_VOICE_PATH="./target.wav"
wav = model.generate("./test.wav", target_voice_path=TARGET_VOICE_PATH)
torchaudio.save("./test_vc_2.wav", wav, model.sr)
技術詳細
ChatterboxはCosyVoice2というTTS手法をベースに作成されています。
まずは、CosyVoice2のベース技術であるCosyVoice、その後にCosyVoice2について解説した後にChatterboxの詳細について見ていきます。
ベースライン技術①:CosyVoice
CosyVoiceは中国のアリババが2024年7月に公開した手法です。
CosyVoiceは自己回帰型のTTS手法で、自己回帰的に音声の情報が埋め込まれたトークンを予測することで音声を生成します。
Speech Tokenizerは、ASR(音声認識)モデルを学習する際にEncoderを2つに分け、1段階目の出力をVQすることで離散的なトークンを得ます。
自己回帰モデルでは、話者情報が埋め込まれたX-Vector(埋め込みモデルとしてはCAM++を使用)・Text Encoderで埋め込まれたテキスト埋め込み情報・プロンプト音声のトークンをもとに、対応する話者性・発話内容の音声トークンを自己回帰的に予測します。
その後、得られた音声トークン(上図(c)における
最後に、メルスペクトログラムからHiFi-GANにより波形を生成することで、合成音声を得ることができます。
なお、論文中ではHiFi-GANを使用したと記載されていますが、コードを確認する限りメルスペクトログラムから波形を生成するニューラルボコーダとしてHiFi-GANではなくHiFTNetが使われています。
HiFTNetは以下のようなアーキテクチャで、明示的に求めたF0から生成した周期信号駆動で音声を生成するNeural Source FilterとiSTFTを用いて周波数ドメインから音声ドメインに戻すiSTFTNetに基づいた手法です。
HiFi-GANでは周期信号を使用しないために、非自己回帰型のモデルであることも影響し、基本周波数やその倍音成分の位相の破綻が発生することがあり、生成された音声が不安定になってしまう問題がありました。
VALL-Eに代表されるようなTTS手法では、SoundStreamやEnCodecに代表されるニューラルコーデック手法を音声の圧縮・復元に使用しており、これらはトークンに位相情報まで含まれているためトークンから音声への復元時にこの問題は発生しにくい傾向にあります。
しかしながら、CosyVoiceでは位相情報が含まれていないメルスペクトログラムからの音声復元が必要なことから、周期信号駆動で音声を生成するHiFTNetが採用されていると思われます。
ベースライン技術②:CosyVoice2
CosyVoice2もCosyVoice同様、中国のアリババが公開した手法です。
CosyVoiceの公開から5ヶ月後の2024年12月にarxivに投稿されています。
CosyVoice2のSpeech Tokenizerは、ベクトル量子化をCosyVoiceで使用していた通常のVQからFSQ(Finite Scalar Quantization)に変更しています。
FSQは量子化時のコードブック崩壊が起きにくく安定した学習が可能です。
なお、Speech Tokenizerの出力に対してPitch Loss(声の高さに関するロス)を適用することで、音声トークンに声の高さ情報が残るように学習されます(EnCodecのようなVQ-GANベースの手法と異なり再構成タスクを解いていないため、Pitch Lossを適用しないと潜在特徴量に再構成に必要なピッチ情報が残らない可能性があります)。
自己回帰モデル部分には以下の改良を施しています。
- 事前学習されたLLM(Qwen2.5-0.5B)を初期値として利用
- X-Vectorによる条件付けを廃止(X-Vectorには言語情報・パラ言語情報がリークしており、韻律の自然さやクロスリンガル性能に悪影響を及ぼしていたため)
- Text Encoderを廃止(Qwenが十分強いため)
また、以下のようなストリーミング推論をサポートするためのFilling tokenを用いた学習時の工夫も行われています。
ストリーミング推論は自己回帰部分だけでなく、Flow Matching部分でも工夫が必要です。
ここでは、maskをかけることで対処します。
学習時から上記のようなストリーミング推論を考慮した学習を実施することで、難読文以外では品質劣化せずにストリーミング推論を行うことが可能になります。
これらの改善により、CosyVoiceと比べて大幅に品質が向上しています。
また他の最先端のTTSモデルと比較すると、比較的品質が良いことが確認できます。
余談: CosyVoice3
アリババはChatterboxが公開されるおよそ1週間前(2025年5月23日)にCosyVoice3も公開しています。
CosyVoice3では、CosyVoice2からさらに
- モデルサイズの増加 ― 0.5B → 1.5B
- 学習データ量の増加 ― 約17万時間 → 100万時間、4言語 → 9言語対応
- Speech Tokenizerの改善 ― EncoderをMinMoのVoice Encoderベースに変更、学習時にASRタスクだけでなくマルチタスクを解く
- DiffRO(強化学習)の導入
など(他にも色々あり)の改善を施しています。
その結果、CosyVoice2やその他のTTS手法と比べて大幅な品質改善が報告されています。
Chatterbox
(※論文やテクニカルレポートは公開されていないため、2025/06/09時点でのコードに基づいています)
Chatterboxは大部分がCosyVoice2に基づいて作成されていますが、いくつかの点が変更されています。
- 自己回帰モデルのアーキテクチャを変更 ― Qwen2.5からLlamaベースに
- 自己回帰モデルへのClassifier Free Guidanceの適用 ― プロンプト音声の反映や誇張の度合いを柔軟に制御
- X-Vectorによる自己回帰モデルへの条件付けを復活 ― 自社技術であるResemblyzerの活用
- アラインメント情報に基づく安定した推論 ― Attention mapに基づくEOSトークン排出制御
- 合成音声への電子透かしの適用 ― 自社技術であるPerthの適用
以下では、それぞれの点についてコードを参照しながら確認していきます。
TTS部分の処理
まず最初に、TTS部分でどのような処理が行われているのか確認していきましょう。
ChatterboxTTSクラスは、こちらで定義されています。
ここで重要なモデルは以下の3つです。
- T3(self.t3): テキスト埋め込みから音声トークンを自己回帰生成するLM
- VoiceEncoder(self.ve): 独自の話者情報埋め込み器
- S3Gen(self.s3gen): 音声トークンから波形を生成
続いて、実際にTTSする際に呼び出されるgenerateメソッドを確認します。
処理の流れは以下のようになっています。
- 条件付けに生成する特徴量の前処理
- テキストの正規化やトークナイズ(割愛)
- 自己回帰モデルによりトークン系列を推論
- FlowMatchingとニューラルボコーダにより音声を合成
まず、1の前処理はprepare_conditionalsメソッドで行っています。
ここで、自己回帰モデルへの条件付け特徴量として
- 独自の話者埋め込み器(Resemblyzer)による音声埋め込み
- プロンプト音声のトークン列
- exaggeration(誇張度合いの調整パラメータ)
を、FlowMatchingモデルへの条件付け特徴量として
- CAM++によるX-Vector
- プロンプト音声のトークン列
- プロンプト音声のメルスペクトログラム
を得ます(後者についてはS3Token2Melクラスのembed_refメソッドを確認してください)。
続いて、3の自己回帰モデルによるトークン系列予測については、T3クラスのinferenceメソッドで行われます。
最後に、予測されたトークン系列からの音声の予測はS3Token2Wavクラスのinferenceメソッドで実行されます(なお、S3Token2Wavクラスはtts.pyにてS3Genクラスとしてimportされているものです)。
FlowMatchingの詳細な処理を行っているのはConditionalCFMクラスです(なお、これはS3Token2Wavクラスが継承しているS3Token2Melでインスタンス化されているCausalMaskedDiffWithXvecクラスにおいて、インスタンス化時の引数として与えられているCausalConditionalCFMが継承しているクラスで、依存関係がちょっと複雑です)。
10回のFlowMatchingのステップにてメルスペクトログラムを得ることができるため、最後にここからHiFTNetにより音声を合成します。
Llamaベースの自己回帰モデル
0.5B Llama backbone(5億パラメータのLlamaベースのモデル)
自己回帰モデル部分はT3クラスで定義されています。
ここで、LlamaConfigに渡されているconfig情報は以下です。
このconfigを確認する限り、Llama3.1を全体的に小さくして0.5B(520M)になるよう調整したモデルに見受けられます。
ただし、何かしらの事前学習済み言語モデルの重みもロードし、それを初期値としてTTSモデルを学習したのかどうかは分かりませんでした(READMEでも特に言及されていません)。
自己回帰モデルへのClassifier Free Guidanceの適用
Classifier Free Guidance(CFG)は、Diffusionベースの生成手法でよく条件付き生成のために使用される手法です(例:Stable Diffusion)。
近年では自己回帰モデルにおける生成時にも使用されてきており、例えば自己回帰系の画像生成手法であるLlamaGenでも導入されており、優れた結果を残しています。
仕組みとしては、条件付きで予測された
※なお、Chatterboxでは
その後、調整されたlogitにSoftmaxを適用し、得られた分布からサンプリングすることで次のトークンを得ます。
Chatterboxでは、自己回帰モデルの推論時にバッチサイズを2とし、条件付きでのlogit予測と無条件でのlogit予測を同時に行います。
その後、CFGのスケール(コード中のcfg_weight)を用いてlogitを調整しています。
これにより、プロンプト音声の反映や誇張の度合いを柔軟に制御することが可能となっています。
Resemblyzerによる自己回帰モデルへの条件付け
VoiceEncoderの推論コードを確認すると、40次元のメルスペクトログラムを入力として受け取り、3層256chの単方向LSTMで処理した後に全結合層とReLUに通し、最後にL2正規化を適用して256次元の話者埋め込みを得ていることが確認できます(モデルのconfig)。
これは、Resemble AIが2019年から公開しているResemblyzerと同様のアーキテクチャです(モデルのconfig)。
配布されているモデルの重みまでは比較をしていないため分からないですが、最近の学習データを増大させるトレンドに合わせてResemblyzerを以前よりも大量のデータで学習し直したものをChatterboxに使用しているのではないかな?と思います。
このResemblyzerの埋め込みを自己回帰モデルへの条件付けとして使用しています。
アラインメント情報に基づく安定した推論
Ultra-stable with alignment-informed inference
アラインメント情報に基づく推論により非常に安定した生成が可能
この機能は
で実装されています。
このAlignmentStreamAnalyzerクラスでは、9層目のAttention mapから得たアラインメント情報を逐次監視し、それに基づいてlogitsのEOSトークンの出力確率を適切に制御することで、自己回帰モデルに起こりがちな不安定な生成を抑制しています。
しかしながら、自己回帰モデルの推論部分を確認すると何故かコメントアウトされているため、現時点では機能していないようです。
合成音声への電子透かしの適用
生成された音声には、悪用されないための電子透かしが適用されます。
これには、Resemble AIがChatterboxと同様にオープンソースとして公開しているPerthを使用しています。
Perthでは、最大で32kHzの音声へのWatermarkingに対応しています。
少し試した限りでは、若干耳で聞いて劣化に気づく人もいるかも?という程度の電子透かしの適用で、100%の検出性能になりました。
適用前後でスペクトログラムを比較すると、特に低周波部分にWatermarkが埋め込まれているようです。
Perthについてはまた別の機会に掘り下げてみたいと思います。
おまけ:VCの処理
VC時に呼び出されるChatterboxVCクラスはここで定義されています。
音声を変換する際に呼び出されるgenerateメソッドはこちらです。
ここから確認できるように、VC時には以下の手順で変換が実施されます。
- 変換元音声から音声トークンに変換
- 元話者の音声トークン・目標話者音声のX-Vecotor・目標話者のプロンプト音声のメルスペクトログラムで条件付けながらFlow Matchingにより目標話者のメルスペクトログラムに変換
- 得られたメルスペクトログラムからHiFTNetで音声を生成
なお、VCの推論時には自己回帰モデルによる推論を行いません。
そのため、元音声の発話タイミングを反映した音声が変換音声として得られます。
生成音声レビュー
TTS音声
プロンプトに英語音声を指定した場合
VCTKコーパスの音声をプロンプトに指定して合成した結果がこちらです。
今回使用したのがVCTKコーパスのため、もしかしたら学習データに含まれている可能性がありますが、かなり品質よくプロンプト音声を反映したZero-shot合成ができているのではないかなと思います。
プロンプトに日本語話者の日本語音声を指定した場合
日本語のJVSコーパスの音声をプロンプトに指定して合成した結果がこちらです。
日本語話者の日本語音声をプロンプトとして指定しても、それなりの品質でクロスリンガルTTSができていることがわかります。
特に話者性に関してはかなりプロンプト音声に準拠できているように感じます。
ただ、男性の音声に関しては、若干訛りのようなものを感じます(日本語訛りというよりインドとかそっちに近い?)。
また、女性の音声に関しては、特に文頭部分で声が震えてしまっており、品質の劣化を感じる結果となりました。
exaggerationの値による音声の変化
exaggerationの値を変化させて合成した結果がこちらです。
なお、exaggerationの値を大きくする際はcfg_weightを0.3以下にすると良い、とREADMEに記載されているため、ここでは全て0.2に設定しています。
値が小さい場合は全体的に落ち着いたトーンになっていることが確認できます。
一方で、0.7以上に上げると、特に冒頭の「Hello, world!」の部分の強調具合が強くなり、さらに上げていくと強調度合いが大きくなる上に発話内容がプロンプト通りにならなくなるように見受けられました。
cfg_weightによる音声の変化
cfg_weightの値を変化させて合成した結果がこちらです。
なお、exaggerationの値はデフォルトの0.5に設定しています。
全体的に、値を変化させても話者性はほとんど変わっていないように見受けられます。
一方で、値が小さいほど話速が遅く、値が大きいほどプロンプト音声の発話のように話速が早くなっていることが確認できます。
cfg_weightにより、話速のようなスタイル情報を制御することができているようです。
VC音声
JVSデータセットを用いてVCして生成された音声はこちらです。
ここから、元話者の特にスタイル情報が必要以上に変換音声に残ってしまっており、品質としては物足りない結果となりました。
前述したように、ChatterboxにおけるVCの手順は
- 変換元音声から音声トークンに変換
- 音声トークンを元に、目標話者音声で条件付けながらFlow Matchingにより目標話者のメルスペクトログラムに変換
- 得られたメルスペクトログラムからHiFTNetで音声を生成
という流れです。
音声トークンから話者性やスタイル情報が十分に除去されているのであればこの手順でうまく変換できる可能性がありますが、実際には音声トークンに話者性・スタイル情報がリッチに残っているため、適切に変換できなかったのかなと考えられます。
Flow MatchingにおけるClassifier Free GuidanceのスケールやFlow Matchingのstep数を増やすことで多少改善する可能性がありますが、これらのパラメータはハードコーディングされてしまっているため、今回は試しませんでした。
おまけ: Perth適用音声
Perthの適用前後の音声を用意しました。
適用前後でほぼ聴覚的に違いがないことが確認できます。
スペクトログラムを比較すると、特に低域部分に若干変化があるように見えます。
この部分にWatermarkを埋め込んでいるのかなと思います。
おわりに
本記事では、Resemble AIが公開したChatterboxについて、使い方から内部技術、生成音声サンプルまでを一通りご紹介しました。
技術詳細の章では、ベースラインとなるCosyVoice2に対して多くの工夫が加えられている点をご確認いただけたと思います。
ただし、実際に試してみると以下のような課題も見えてきました。
- 多言語非対応
「ElevenLabs を超えた」と謳ってはいるものの、Chatterbox が対応するのは現状英語のみで、ElevenLabs のような多言語対応には至っていません。 - サンプリングレートが24kHzに限定
32kHzや44.1kHz、48kHz以上での高解像度合成は行えず、音質を重視するユースケースでは物足りなさが残ります。 - ストリーミング推論に未対応
CosyVoice2のリポジトリに実装例があるリアルタイム生成機能は、まだサポートされていません。
この辺りの点については今後に期待です。
今後も定期的に音声合成技術の最新動向を発信してまいりますので、ぜひご期待ください!
Discussion