CosyVoice3
Fun-CosyVoice3-0.5Bは9言語のストリーミング音声合成モデルです。3段階のパイプライン(LLMトークン生成、DiTフローマッチング、HiFi-GANボコーディング)を使用して、テキスト入力から自然な24 kHzの音声を生成します。
サポート言語
| 言語 | コード |
|---|---|
| 中国語 | chinese |
| 英語 | english |
| 日本語 | japanese |
| 韓国語 | korean |
| ドイツ語 | german |
| スペイン語 | spanish |
| フランス語 | french |
| イタリア語 | italian |
| ロシア語 | russian |
パイプライン
CosyVoice3は3段階で音声を合成します:
- LLM — Qwen2.5-0.5Bバックボーンがテキストから FSQ(Finite Scalar Quantization)音声トークンを生成します
- DiTフローマッチング — 22レイヤーのDiffusion Transformerが音声トークンをEuler ODE積分によりメルスペクトログラムに変換します
- HiFi-GAN — Neural Source Filterボコーダーがメルスペクトログラムを24 kHzの波形に変換します
アーキテクチャ
LLM (Qwen2.5-0.5B)
言語モデルは4ビット量子化され、離散的な音声トークンを自己回帰的に生成します。
| パラメーター | 値 |
|---|---|
| レイヤー | 24 |
| 隠れ次元 | 896 |
| クエリヘッド | 14 |
| キー/バリューヘッド | 2 (GQA) |
| FSQ 語彙 | 6561 |
| 量子化 | 4ビット |
DiT フローマッチング
Diffusion Transformerは、classifier-freeガイダンスを伴う条件付きフローマッチングを使用して、音声トークンをメルスペクトログラムに精密化します。
| パラメーター | 値 |
|---|---|
| レイヤー | 22 |
| 次元 | 1024 |
| アテンションヘッド | 16 |
| 条件付け | AdaLN (Adaptive Layer Norm) |
| ODE ソルバー | Euler、10ステップ |
| CFG レート | 0.7 |
HiFi-GAN ボコーダー
メルスペクトログラムを波形に変換するNeural Source Filter (NSF) ボコーダー。
| パラメーター | 値 |
|---|---|
| 高調波 | 8 |
| アップサンプル比 | 480x (8 x 5 x 3 x ISTFT 4) |
| ISTFT | n_fft=16, hop=4 |
| 出力サンプリングレート | 24 kHz |
モデルウェイト
| モデル | サイズ | HuggingFace |
|---|---|---|
| CosyVoice3-0.5B (4ビット LLM) | 1.2 GB | aufklarer/CosyVoice3-0.5B-MLX-4bit |
LLM(4ビット量子化)、DiTフローマッチング、HiFi-GANボコーダーのウェイトが含まれます。
CLIの使用法
.build/release/audio speak "Hallo Welt" --engine cosyvoice --language german -o output.wav
例
# 英語
.build/release/audio speak "Hello, how are you?" --engine cosyvoice -o hello_en.wav
# 中国語
.build/release/audio speak "你好世界" --engine cosyvoice --language chinese -o hello_cn.wav
# スペイン語
.build/release/audio speak "Hola, buenos días" --engine cosyvoice --language spanish -o hello_es.wav
# フランス語
.build/release/audio speak "Bonjour le monde" --engine cosyvoice --language french -o hello_fr.wav
音声クローン
--voice-sampleフラグを使用して、短いリファレンス音声サンプルから任意の音声をクローンします。CosyVoice3はCAM++スピーカーエンコーダーを使用して、DiTフローモデルを条件付ける192次元の埋め込みを抽出します。
# 音声クローン
.build/release/audio speak "Hello in your voice" --engine cosyvoice --voice-sample reference.wav -o cloned.wav
# クロスランゲージ:音声をクローンしてドイツ語で話す
.build/release/audio speak "Guten Tag" --engine cosyvoice --voice-sample reference.wav --language german -o german.wav
仕組み
- CAM++スピーカーエンコーダーはCoreML(Neural Engine)経由でリファレンス音声から192次元の埋め込みを抽出します
- アフィン射影(192 → 80)がDiTフローマッチングデコーダーをターゲット音声に条件付けます
- HiFi-GANボコーダーがスピーカー条件付きメルスペクトログラムを24kHz音声に変換します
スピーカーエンコーダー
| プロパティ | 値 |
|---|---|
| モデル | CAM++ (Context-Aware Masking++) |
| embedding | 192次元 |
| バックエンド | CoreML (Neural Engine、FP16) |
| サイズ | 約14 MB |
| HuggingFace | aufklarer/CamPlusPlus-Speaker-CoreML |
CAM++モデルは--voice-sampleの初回使用時に自動ダウンロードされます。リファレンス音声のヒントとSwift APIについては音声クローンガイドを参照してください。
マルチスピーカー対話
インラインのスピーカータグを使用して、複数のスピーカー間の会話を合成します。各スピーカーは--speakersフラグを介してリファレンス音声ファイルから音声が割り当てられます。
# 音声クローンを伴う2スピーカー対話
.build/release/audio speak "[S1] Hello there! [S2] Hey, how are you?" \
--engine cosyvoice --speakers s1=alice.wav,s2=bob.wav -o dialogue.wav
# 3スピーカー
.build/release/audio speak "[A] Welcome. [B] Thanks! [C] Glad to be here." \
--engine cosyvoice --speakers a=host.wav,b=guest1.wav,c=guest2.wav -o panel.wav
タグ内のスピーカー名は大文字小文字を区別せず、マッピングキーと照合されます。設定可能な無音ギャップ(デフォルト0.2秒)がターン間に挿入されます。
| オプション | デフォルト | 説明 |
|---|---|---|
--speakers | スピーカーマッピング: s1=file.wav,s2=file.wav | |
--turn-gap | 0.2 | ターン間の無音(秒) |
--crossfade | 0.0 | ターン間のクロスフェードオーバーラップ(秒) |
感情とスタイルタグ
インラインの感情タグを使用してセグメントごとに発話スタイルを制御します。CosyVoice3は<|endofprompt|>トークンの前のテキストプレフィックスをスタイル指示として使用します。感情タグはこのプレフィックスを置き換える自然言語の指示にマッピングされます。
# 感情タグ
.build/release/audio speak "(excited) Wow, amazing! (sad) But I have to go..." \
--engine cosyvoice -o emotion.wav
# スピーカーとの組み合わせ
.build/release/audio speak "[S1] (happy) Great news! [S2] (surprised) Really?" \
--engine cosyvoice --speakers s1=alice.wav,s2=bob.wav -o combined.wav
# タグとしての自由形式指示
.build/release/audio speak "(Speak like a pirate) Ahoy matey!" \
--engine cosyvoice -o pirate.wav
# グローバル指示(感情タグのないすべてのセグメントに適用)
.build/release/audio speak "Hello world" \
--engine cosyvoice --cosy-instruct "Speak cheerfully" -o cheerful.wav
組み込み感情タグ
| タグ | 指示 |
|---|---|
happy / excited | 楽しく、興奮気味に話す。 |
sad | 悲しげに、憂鬱な調子で話す。 |
angry | 怒りと強さをもって話す。 |
whispers / whispering | やわらかく、優しいささやきで話す。 |
laughs / laughing | 笑いながら話す。 |
calm | 穏やかに、平和に話す。 |
surprised | 驚きと驚愕をもって話す。 |
serious | 真剣で、形式的な調子で話す。 |
未知のタグは自由形式の指示として通過するので、(Speak in a slow, dramatic voice)はそのまま動作します。
サンプリング
LLMステージは以下のサンプリング設定を使用します:
| パラメーター | 値 |
|---|---|
| Top-k | 25 |
| Top-p | 0.8 |
| Repetition Aware Sampling | 有効 (window=10, tau_r=0.1) |
Repetition Aware Sampling (RAS)は、VALL-E 2から取り入れられたもので、最後の10個の生成トークンで出現したトークンにペナルティを課します。これにより、反復的な音声アーティファクトが防止され、出力の安定性が向上します。
パフォーマンス
M2 Max上で、CosyVoice3は約0.5のRTFを達成します — リアルタイムより高速です。
| ステージ | レイテンシー |
|---|---|
| LLM (コンパイル済み) | 約13 ms/トークン |
| DiT フローマッチング | 370 - 520 ms |
| HiFi-GAN | 50 - 170 ms |
LLMステージは自己回帰ループにcompile(shapeless: true)を使用し、さまざまなシーケンス長にわたる再コンパイルのオーバーヘッドを排除します。バッチ倍増CFGは、DiTフォワードパスの数を20から10に半減します。