アーキテクチャ
speech-swiftは、共有プロトコル、独立したモデルモジュール、統一されたCLIを備えたモジュール化されたSwiftパッケージとして構成されています。すべての推論はMLX(Metal GPU)またはCoreML(Neural Engine)を使用してオンデバイスで実行されます。
モジュール依存関係グラフ
┌──────────┐
│ AudioCLI │ (エントリポイント)
└────┬─────┘
│
┌──────┴──────┐
│ AudioCLILib │ (コマンド)
└──────┬──────┘
│
┌─────────┬───────┼───────┬──────────┬──────────────┐
│ │ │ │ │ │
┌────┴───┐ ┌──┴──┐ ┌──┴──┐ ┌─┴────┐ ┌───┴────┐ ┌──────┴───────┐
│Qwen3ASR│ │Qwen3│ │Cosy │ │Perso-│ │Speech- │ │ Speech- │
│Parakeet│ │ TTS │ │Voice│ │naPlex│ │ VAD │ │Enhancement │
└────┬───┘ └──┬──┘ └──┬──┘ └──┬───┘ └───┬───┘ └──────┬───────┘
│ │ │ │ │ │
└────────┴───────┼───────┴─────────┘ │
│ │
┌──────┴──────┐ │
│ Qwen3Common │ (共有レイヤー) │
└──────┬──────┘ │
│ │
┌──────┴──────┐ │
│ AudioCommon │ ◄──────────────────────┘
└─────────────┘ (プロトコル、音声I/O)MOSS Transcribe Diarize
MossTranscribe はネイティブ CoreML と MLX の両バックエンドで話者付きタイムスタンプ区間を返します。CoreML は短い録音向けの固定 1,024-token 状態、MLX は動的 131,072-token コンテキスト、アフィン INT5/INT8 デコーダー重み、任意の FP16/INT8 KV キャッシュを使用します。どちらもストリーミングではなく、オフラインの自己回帰ランタイムです。
VoiceChat 11B
タスクと参照:全二重 speech-to-speech。SALM-Duplex: Efficient and Direct Duplex Modeling for Speech-to-Speech Language Model(Interspeech 2025)を NVIDIA の上流 VoiceChat モデルカードが引用しています。
完全ランタイム、M5 Pro 48 GB、Release、80 ms ライブ周期:保護ヘッド INT5 のピーク RSS は約 8.69 GB、3 回の制御済みパイプライン全体 RTF は 0.96、0.96、0.99 でした。最適化後の INT8 性能はまだ再測定していません。
VoiceChat は、因果 FastConformer 知覚、Nemotron-H の全二重テキスト/関数チャンネル、8 回の MaskGIT 反復を行う独立したテキスト条件付き EAR-TTS デコーダー、22.05 kHz ニューラルコーデックからなる完全なネイティブ MLX 音声間パスを実装します。ストリーミングは層ごとの有界な注意機構と因果畳み込みキャッシュを保持し、定常状態の 8 フレームライブコーデックウィンドウはコンパイル済みグラフを使います。各 80 ms 入力フレームから言語判断、31 個の RVQ コード、正確に 1,764 個の出力サンプルを生成します。ローダーは完全な encoder/ + llm/ + tts/ bundle を要求し、旧来の理解専用エクスポートを拒否します。INT5 はテストした M5 Pro で平均 RTF 1 未満を維持しますが、フレームごとの p95 余裕はまだ小さいです。
推論バックエンド
| バックエンド | ハードウェア | モデル |
|---|---|---|
| MLX | Metal GPU | Qwen3-ASR、Qwen3-TTS、CosyVoice3、Qwen3.5-Chat、PersonaPlex、VoiceChat 11B、Omnilingual ASR (300M / 1B / 3B / 7B)、Cohere Transcribe 2B, Voxtral Mini 3B, Pyannote、Silero VAD、WeSpeaker, MOSS Transcribe Diarize, SpeechBrain ECAPA LID |
| CoreML | Neural Engine | Qwen3-ASRエンコーダー(ハイブリッド)、Parakeet TDT、Parakeet EOUストリーミング、Omnilingual ASR 300M、Kokoro-82M、Qwen3.5-Chat(オプション)、Sortformerダイアライゼーション、DeepFilterNet3、Silero VAD(オプション)、WeSpeaker(オプション), MOSS Transcribe Diarize, SpeechBrain ECAPA LID |
| Accelerate | CPU (SIMD) | 音声前処理(STFT、mel、FFT)、信号処理 |
モデルウェイト形式
MLXモデルは4ビットまたは8ビット量子化(グループサイズ64)のsafetensors形式を使用します。CoreMLモデルは.mlmodelcコンパイル済み形式を使用します。scripts/内の変換スクリプトがPyTorchチェックポイントから変換します。
Cohere と Voxtral では MLX のアフィン INT5 バンドルも使用できます。MLX はアフィン INT7 をサポートしていないため、より高品質な選択肢は INT8 です。
| モデル | パラメーター | 量子化 | ディスク上のサイズ |
|---|---|---|---|
| Qwen3-ASR 0.6B (MLX) | 約600M | 4ビット / 8ビット | 680 MB / 1.0 GB |
| Qwen3-ASR 0.6B (CoreML) | 約186M(エンコーダー) | INT8 | 約180 MB |
| Qwen3-ASR 1.7B (MLX) | 約1.7B | 4ビット / 8ビット | 2.1 GB / 3.2 GB |
| Parakeet-TDT 0.6B (CoreML) | 約600M | INT8 | 500 MB |
| Whisper Large-v3 Turbo (CoreML) | 809M | FP16 | 1.6 GB |
| MOSS Transcribe Diarize 0.9B (MLX) | 908.5M | FP16 audio + INT5 / INT8 decoder | 987.0 MiB / 1,200.1 MiB |
| MOSS Transcribe Diarize 0.9B (CoreML) | ~900M | FP16 / INT8 block-32 | 1.7 GB / 1.2 GB |
| Parakeet-EOU 120M (CoreML) | 約120M | INT8 | 約120 MB |
| Omnilingual-ASR-CTC 300M (CoreML) | 326M | INT8 | 312 MB |
| Omnilingual-ASR-CTC 300M (MLX) | 326M | 4ビット / 8ビット | 193 MB / 342 MB |
| Omnilingual-ASR-CTC 1B (MLX) | 1.01B | 4ビット / 8ビット | 549 MB / 1006 MB |
| Omnilingual-ASR-CTC 3B (MLX) | 約3B | 4ビット / 8ビット | 1.71 GB / 3.16 GB |
| Omnilingual-ASR-CTC 7B (MLX) | 約7B | 4ビット / 8ビット | 3.55 GB / 6.63 GB |
| Cohere Transcribe 2B (MLX) | 2B | FP16 / INT5 / INT8 | 3.85 / 1.62 / 2.25 GiB |
| Voxtral Mini 3B 2507 (MLX) | 3B | FP16 / INT5 / INT8 | 8.71 / 3.77 / 5.18 GiB |
| Qwen3-ForcedAligner 0.6B (MLX) | 約600M | 4ビット / 8ビット | 979 MB / 1.4 GB |
| Qwen3-ForcedAligner 0.6B (CoreML) | 約600M | INT4 / INT8 | 630 MB / 1.0 GB |
| Qwen3-TTS 0.6B (MLX) | 約600M | 4ビット / 8ビット | 1.7 GB / 2.4 GB |
| Qwen3-TTS 1.7B (MLX) | 約1.7B | 4ビット / 8ビット | 3.2 GB / 4.8 GB |
| CosyVoice3 0.5B (MLX) | 約500M | 4ビットLLM | 約1.2 GB |
| IndexTTS2 expanded bundle (MLX) | 1.5B-class | FP16 + auxiliary models | ~4.8 GB |
| Kokoro-82M (CoreML) | 82M | INT8(1バケット) | 約89 MB |
| Qwen3.5-Chat 0.8B (MLX) | 約800M | INT4 | 418 MB |
| Qwen3.5-Chat 0.8B (CoreML) | 約800M | INT8 | 981 MB |
| PersonaPlex 7B (MLX) | 約7B | 4ビット / 8ビット | 4.9 GB / 9.1 GB |
| VoiceChat 11B (MLX) | ~11B | INT5 / INT8 | 8.56 GB / 12.11 GB |
| Pyannote VAD (MLX) | 約1.49M | float32 | 約5.7 MB |
| Silero VAD v5 | 約309K | float32 | 約1.2 MB (MLX & CoreML) |
| WeSpeaker ResNet34 | 約6.6M | float32 | 約25 MB (MLX & CoreML) |
| SpeechBrain ECAPA VoxLingua107 | 21.25M | FP16 | ~40.6 MiB (MLX) / ~40.8 MiB (CoreML) |
| ReDimNet2-B6 | 12.3M | float16 | 約25 MiB (CoreML) |
| Pyannote Community-1 (CoreML) | 8.35M | float32 + native VBx | ~32 MB |
| Sortformer (CoreML) | — | float16 | 約50 MB |
| DeepFilterNet3 (CoreML) | 約2.1M | FP16 | 約4.2 MB |
| LocalVQE v1.4-AEC (CoreML + C++) | 200K + 2,742 | FP16 + FP32 | 約732 KB |
パフォーマンス最適化
- MLX compile() — 自己回帰ループでのカーネル融合。Talkerは
compile(shapeless: true)、Code Predictorは固定キャッシュサイズのcompile(shapeless: false)を使用します。 - Metalシェーダーライブラリ — プリコンパイルされたmetallibにより、約5倍のJITコンパイルオーバーヘッドを回避します。
scripts/build_mlx_metallib.shでビルドします。 - チャンク化コーデックデコード — TTSデコーダーは、GPUタイムアウトを回避するために、10フレームのコンテキストオーバーラップで25フレームのチャンクで音声を処理します。
- バッチ倍増CFG — CosyVoice3 DiTは、条件付きと非条件付きを一緒にバッチ化することで、フローマッチングのパス数を半減します。
- 融合RoPE — 手動回転の代わりに、Metalカーネルに支えられた
MLXNN.RoPEを使用します。 - BN融合 — WeSpeakerのバッチ正規化は、変換時にConv2dの重みに融合されます。
音声処理
すべての音声I/OはFloat32 PCMを使用します。内部リサンプリングによって形式変換が処理されます。
| モデル | 想定サンプリングレート | 形式 |
|---|---|---|
| Qwen3-ASR | 16 kHz | モノラル Float32 |
| Cohere Transcribe 2B | 16 kHz | Mono Float32 |
| Voxtral Mini 3B | 16 kHz | Mono Float32 |
| Qwen3-TTS | 24 kHz出力 | モノラル Float32 |
| CosyVoice3 | 24 kHz出力 | モノラル Float32 |
| Kokoro-82M | 24 kHz出力 | モノラル Float32 |
| PersonaPlex | 24 kHz I/O | モノラル Float32 |
| Pyannote VAD | 16 kHz | モノラル Float32 |
| Silero VAD | 16 kHz | モノラル Float32 |
| WeSpeaker | 16 kHz | モノラル Float32 |
| SpeechBrain ECAPA LID | 16 kHz | Mono Float32 |
| ReDimNet2-B6 | 16 kHz | モノラル Float32 |
| DeepFilterNet3 | 48 kHz | モノラル Float32 |
ソース構造
Sources/
AudioCommon/ 共有プロトコル、オーディオ
I/O、システム出力キャプチャ(SystemAudioTap)、HuggingFace
ダウンローダー、SentencePieceModel(protobuf リーダー)
MLXCommon/ MLXユーティリティ:ウェイトローディング、QuantizedLinearヘルパー、
SDPAマルチヘッドアテンションヘルパー、metalバジェット
Qwen3Common/ 共有モデルコンポーネント(KVキャッシュ、RoPE、量子化)
Qwen3ASR/ Qwen3-ASR 音声認識
ParakeetASR/ Parakeet TDT 音声認識 (CoreML)
ParakeetStreamingASR/ Parakeet EOU 120M ストリーミングディクテーション (CoreML)
OmnilingualASR/ Meta wav2vec2 + CTC、1,672言語
(CoreML 300M + MLX 300M / 1B / 3B / 7B)
CohereTranscribeASR/ Cohere Transcribe 2B speech-to-text (MLX)
VoxtralASR/ Voxtral Mini 3B speech-to-text (MLX)
Qwen3TTS/ Qwen3-TTS 音声合成
CosyVoiceTTS/ CosyVoice3 音声合成
KokoroTTS/ Kokoro-82M 音声合成 (CoreML)
Qwen3Chat/ Qwen3.5-0.8B オンデバイスLLMチャット (MLX + CoreML)
PersonaPlex/ PersonaPlex 音声間変換
SpeechVAD/ VAD (Silero + Pyannote)、ダイアライゼーション、話者embedding
SpeechLanguageID/ 話し言葉の言語識別(SpeechBrain ECAPA、MLX + CoreML、107 ラベル)
SpeechEnhancement/ DeepFilterNet3 ノイズ抑制 (CoreML)
SourceSeparation/ Open-Unmix HQ / UMX-L + HTDemucs (Demucs v4) music source separation (MLX, 4 stems)
MAGNeTMusicGen/ MAGNeT text-to-music generation (MLX, 30 s @ 32 kHz, INT4/INT8)
VoxCPM2TTS/ VoxCPM2 text-to-speech (MLX, 48 kHz, voice cloning + voice design)
IndexTTS2TTS/ IndexTTS2 voice cloning (MLX, semantic GPT + emotion/tempo/pause control + S2Mel + BigVGAN)
VibeVoiceTTS/ VibeVoice long-form / multi-speaker TTS (MLX, EN/ZH)
MADLADTranslation/ MADLAD-400 many-to-many translation (MLX, 400+ languages)
AudioCLILib/ CLIコマンド実装
AudioCLI/ CLIエントリポイント
scripts/ モデル変換 (PyTorch → MLX/CoreML)、ベンチマーク
Tests/ ユニットと統合テスト
Examples/ デモアプリ (PersonaPlexDemo, SpeechDemo)