CosyVoice3
Fun-CosyVoice3-0.5Bは9言語のストリーミング音声合成モデルです。3段階のパイプライン(LLMトークン生成、DiTフローマッチング、HiFi-GANボコーディング)を使用して、テキスト入力から自然な24 kHzの音声を生成します。このモデル — CosyVoice 3 とも表記 — は FunAudioLLM CosyVoice ファミリーの最新版です。
サポート言語
| 言語 | コード |
|---|---|
| 中国語 | 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 つの量子化バリアント — 4ビット、8ビット、8-bit-full(int8 LLM + int8 DiT)、bf16(量子化なし)— を提供し、--cosyvoice-variant で呼び出しごとに選択できます。
| パラメーター | 値 |
|---|---|
| レイヤー | 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 |
モデルウェイト
| バリアント | LLM | DiT | サイズ | HuggingFace |
|---|---|---|---|---|
4bit (デフォルト) | int4, group=64 | bf16 | ~1.2 GB | aufklarer/CosyVoice3-0.5B-MLX-4bit |
8bit | int8, group=64 | bf16 | ~1.4 GB | aufklarer/CosyVoice3-0.5B-MLX-8bit |
8bit-full | int8, group=64 | int8, group=64 | ~1.6 GB | aufklarer/CosyVoice3-0.5B-MLX-8bit-full |
bf16 | bf16 | bf16 | ~2.1 GB | aufklarer/CosyVoice3-0.5B-MLX-bf16 |
各バンドルには LLM、DiT フローマッチングデコーダー、HiFi-GAN ボコーダー、そしてゼロショット音声クローニングに必要な S3-Tokenizer リファレンスエンコーダーが含まれます。ダウンロード/ディスク容量を抑えたい場合は小さいバンドルを、LLM/DiT の量子化ノイズが問題になる場合(長文合成、ボイスクローンの忠実度)は bf16 を選んでください。
CLIの使用法
.build/release/speech speak "Hallo Welt" --engine cosyvoice --language german -o output.wav
例
# 英語
.build/release/speech speak "Hello, how are you?" --engine cosyvoice -o hello_en.wav
# 中国語
.build/release/speech speak "你好世界" --engine cosyvoice --language chinese -o hello_cn.wav
# スペイン語
.build/release/speech speak "Hola, buenos días" --engine cosyvoice --language spanish -o hello_es.wav
# フランス語
.build/release/speech speak "Bonjour le monde" --engine cosyvoice --language french -o hello_fr.wav
音声クローン
--voice-sampleフラグを使用して、短いリファレンス音声サンプルから任意の音声をクローンします。CosyVoice3はCAM++スピーカーエンコーダーを使用して、DiTフローモデルを条件付ける192次元の埋め込みを抽出します。
# 音声クローン
.build/release/speech speak "Hello in your voice" --engine cosyvoice --voice-sample reference.wav -o cloned.wav
# クロスランゲージ:音声をクローンしてドイツ語で話す
.build/release/speech 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/speech speak "[S1] Hello there! [S2] Hey, how are you?" \
--engine cosyvoice --speakers s1=alice.wav,s2=bob.wav -o dialogue.wav
# 3スピーカー
.build/release/speech 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/speech speak "(excited) Wow, amazing! (sad) But I have to go..." \
--engine cosyvoice -o emotion.wav
# スピーカーとの組み合わせ
.build/release/speech speak "[S1] (happy) Great news! [S2] (surprised) Really?" \
--engine cosyvoice --speakers s1=alice.wav,s2=bob.wav -o combined.wav
# タグとしての自由形式指示
.build/release/speech speak "(Speak like a pirate) Ahoy matey!" \
--engine cosyvoice -o pirate.wav
# グローバル指示(感情タグのないすべてのセグメントに適用)
.build/release/speech 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)はそのまま動作します。
モデル制御トークン(fl_ トークン)
内部的に、CosyVoice3 の LLM は fl_ をプレフィックスとする特別な制御トークンを使用して、モード(ゼロショットクローン、指示付き合成、話者保存など)を切り替えます。これらのトークンは上流の FunAudioLLM トークナイザーの一部であり、Soniqo ランタイムはあなたが使用する CLI フラグや Swift API 呼び出しに基づいて自動的に正しいものを発行するため、手動で書く必要はありません。
| 制御トークン | モード | Soniqo からの呼び出し方法 |
|---|---|---|
<|fl_speaker_clone|> | 参照オーディオサンプルからのゼロショットボイスクローン | CLI で --voice-sample reference.wav を渡すか、Swift API で voiceSample: を設定します。 |
<|fl_speaker_instruct|> | デフォルトボイスでの指示またはスタイル条件付き合成 | --voice-sample なしで --cosy-instruct "Speak cheerfully" を渡すか、インラインの (happy) タグを使用します。 |
<|fl_speaker_instruct2|> | クローンされた参照ボイスと組み合わせた指示合成 | 同じ呼び出しで --voice-sample reference.wav と --cosy-instruct "..."(またはインラインの感情タグ)を組み合わせます。 |
<|fl_save_speaker|> | 話者の埋め込みを永続化し、呼び出しごとに参照オーディオを再エンコードする必要をなくす | Soniqo CLI には直接公開されていません — 埋め込みは呼び出しごとに計算されます。キャッシュするには、話者埋め込み モジュールを介して 192 次元の CAM++ ベクトルを自分で抽出し、転送します。 |
<|fl_speaker_clone_zh|>, <|fl_speaker_clone_en|>, … | 上流のトークナイザーが使用する言語固有のゼロショットクローンヒント | --voice-sample を --language german|spanish|chinese|... と組み合わせます。Soniqo は --language フラグから正しい言語ヒントを選択します。 |
上の表は、各上流 fl_ 制御トークンを Soniqo の同等物にマッピングします。fl_ トークンをプロンプトに自分で挿入する必要はありません — 高レベルの CLI フラグまたは Swift API 引数を渡すだけで、ランタイムが正しいシーケンス(clone → instruct → instruct2 → save_speaker)を発行します。
サンプリング
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に半減します。