Qwen3-TTS
Qwen3-TTSは、高品質な音声合成のためのMimiデコーダーを備えた12Hzコーデック言語モデルです。モデルは4ビット量子化されており、Apple Silicon上でリアルタイムより高速に動作します。
パイプライン
音声合成は3段階のパイプラインに従います:
- Talker — 入力テキストを12.5 Hzで最初のコードブックトークンに変換する28レイヤーのトランスフォーマー
- Code Predictor — 最初のコードブック隠れ状態から残り15個のコードブックを予測する5レイヤーのトランスフォーマー
- Mimi Codec Decoder — 全16個のコードブックトークンを24 kHz音声波形に変換します
アーキテクチャ
Talker
Talkerは、テキスト入力からコーデックトークンを生成するコア自己回帰モデルです。
| パラメーター | 値 |
|---|---|
| レイヤー | 28 |
| 隠れ次元 | 1024 |
| クエリヘッド | 16 |
| キー/バリューヘッド | 8 (GQA) |
| MLP | SwiGLU |
| 位置エンコーディング | RoPE |
Code Predictor
最初のコードブックから隠れ状態を取り、残りの15個のコードブックを並列で予測する軽量な5レイヤーのトランスフォーマー。これにより、ステップあたり16回の完全なTalkerの実行を回避します。
Mimi Codec Decoder
Mimiデコーダーは量子化されたコーデックトークンを音声に変換します:
- RVQデコード(16コードブック)
- プレ畳み込み(512から1024チャネル)
- プレトランスフォーマー(1024から512ボトルネック、8レイヤー、SwiGLU + LayerScale)
- アップサンプル(2x、2x)
- SEANetデコーダー(8x、5x、4x、3xアップサンプルステージ)
- 24 kHz波形出力
モデルバリアント
| モデル | サイズ | HuggingFace |
|---|---|---|
| Qwen3-TTS-0.6B Base (4ビット) | 1.7 GB | aufklarer/Qwen3-TTS-12Hz-0.6B-Base-MLX-4bit |
| Qwen3-TTS-0.6B Base (8ビット) | 2.4 GB | aufklarer/Qwen3-TTS-12Hz-0.6B-Base-MLX-8bit |
| Qwen3-TTS-0.6B CustomVoice (4ビット) | 1.7 GB | aufklarer/Qwen3-TTS-12Hz-0.6B-CustomVoice-MLX-4bit |
| Qwen3-TTS-1.7B Base (4ビット) | 3.2 GB | aufklarer/Qwen3-TTS-12Hz-1.7B-Base-MLX-4bit |
| Qwen3-TTS-1.7B Base (8ビット) | 4.8 GB | aufklarer/Qwen3-TTS-12Hz-1.7B-Base-MLX-8bit |
| Qwen3-TTS CoreML (FP16) | 2.1 GB | aufklarer/Qwen3-TTS-CoreML |
CoreMLバックエンド
CoreMLバックエンドは、Core ML経由でGPU上で完全なQwen3-TTSパイプラインを実行し、MLX依存関係なしでiOSとmacOSへのデプロイメントを可能にします。モデルはAppleのコンピュートスタック向けに最適化された6つの特殊なサブモデルに分割されています:
- TextProjector — テキストトークン埋め込みを共有隠れ空間に投影
- CodeEmbedder — 最初のコードブックトークンと制御トークンを埋め込む
- MultiCodeEmbedder — コードブック1〜15のトークンを埋め込む
- CodeDecoder — ステートレスKVキャッシュ(最大256位置)を備えた28レイヤー自己回帰トランスフォーマー
- MultiCodeDecoder — コードブック1〜15用の5レイヤーコードプレディクター
- SpeechDecoder — Mimiコーデックデコーダー、16コードブックトークンを24 kHz音声に変換
# CoreML合成
.build/release/audio speak "Hello, world!" --engine coreml -o hello.wav
# CoreMLはデフォルトで温度0.8を使用(品質出力に必要)
.build/release/audio speak "Long text here." --engine coreml --temperature 0.9 -o out.wav
CoreML CodeDecoderは固定256位置のKVキャッシュを使用します。より長いパッセージは個々の文に分割する必要があります。デコードトークンは、プレフィル後に残りのキャッシュスロットに収まるように自動的にキャップされます。
CLIの使用法
テキストから音声を生成します:
.build/release/audio speak "Hello, world!" --output hello.wav
オプション
| フラグ | 説明 |
|---|---|
--engine | TTSエンジン:qwen3(MLX、デフォルト)、coreml(CoreML/GPU)、またはcosyvoice |
--output, -o | 出力WAVファイルパス |
--language | 言語(デフォルト:english)。スピーカーのネイティブ方言を使用するには省略。 |
--model | モデルバリアント:baseまたはcustomVoice |
--speaker | スピーカーボイス(--model customVoiceが必要) |
--temperature | サンプリング温度(デフォルト:0.3) |
--top-k | Top-kサンプリングパラメーター |
--max-tokens | 生成する最大トークン数(デフォルト:500) |
--stream | ストリーミングを有効化 — 生成中に音声チャンクを出力 |
--first-chunk-frames | 最初のストリームチャンク内のフレーム数 |
--chunk-frames | 後続の各ストリームチャンクのフレーム数 |
--batch-file | バッチ合成用の1行に1発話のテキストファイルへのパス |
--batch-size | バッチモードでの並列発話数 |
例
# 基本的な合成
.build/release/audio speak "The quick brown fox." -o fox.wav
# ストリーミング出力
.build/release/audio speak "Long passage of text..." --stream -o stream.wav
# ファイルからのバッチ合成
.build/release/audio speak --batch-file sentences.txt --batch-size 4 -o output_dir/
ストリーミング
--streamフラグは、生成中のチャンク化された音声出力を有効にします。発話全体が完了するのを待つ代わりに、トークンが生成されるにつれて音声がチャンクで出力されます。--first-chunk-framesと--chunk-framesを使用して各チャンクのサイズを制御します。
バッチモード
複数の発話を合成するには、1行に1発話を含むテキストファイルを指定して--batch-fileを使用します。--batch-sizeフラグは、並列処理される発話の数を制御します。
パフォーマンス
M2 Max上で、Qwen3-TTSは約0.55のRTF(リアルタイム係数)を達成し、リアルタイムより高速に音声を生成することを意味します。compile()のウォームアップで、各ステップは約37 msかかります。
デフォルトの最大は500トークンで、12.5 Hzで約40秒の音声を生成します。より高い値を設定すると、Metal GPUウォッチドッグタイムアウトを超えるリスクがあり、GPUがコンポジターと共有されているため、Apple Silicon上でシステムリブートを引き起こす可能性があります。
言語
Qwen3-TTSは多言語音声合成をサポートします。モデルは入力言語を自動的に検出し、それに応じて音声を生成します。
Swift API
import Qwen3TTS
let model = try await Qwen3TTSModel.loadFromHub()
let audio = try await model.speak("Hello, world!")
try audio.write(to: "hello.wav")