Speech Swift: Apple Silicon向けオンデバイスAI音声ツールキット
MLXとCoreMLを使用してApple Silicon上でASR、TTS、音声間翻訳、VAD、話者ダイアライゼーションを実現するオープンソースツールキットSpeech Swiftを探る。
Speech Swiftとは?
Speech Swiftは、Apple Silicon(MシリーズチップとNeural Engine)向けに特別に設計されたオープンソースのAI音声ツールキットです。自動音声認識(ASR)、テキスト読み上げ(TTS)、音声間翻訳、音声アクティビティ検出(VAD)、話者ダイアライゼーションなど、包括的な音声機能スイートをMacやiOSデバイスに直接提供します。すべての処理はローカルで行われ、クラウド依存、APIキー、デバイス外へのデータ送信は一切ありません。
オンデバイス音声が重要な理由
デバイス上で音声モデルを実行することには、いくつかの重要な利点があります:
- プライバシー: 音声データがデバイスから出ることはなく、クラウドベースの録音や文字起こしに関する懸念がなくなります。
- レイテンシ: ローカル推論によりネットワークの往復が不要になり、リアルタイムストリーミングやインタラクティブな音声エージェントが可能になります。
- オフライン機能: インターネット接続なしで動作するため、旅行、遠隔地、またはセキュアな環境に最適です。
- コスト: API使用料やクラウドコンピューティングコストがかかりません。
主要な機能とモデル
Speech Swiftはモジュール式のSwift Package Manager(SPM)ターゲットに整理されているため、必要なものだけをインポートできます。以下は主要な機能グループの内訳です:
音声認識(ASR)
- Qwen3-ASR: 52言語をサポートする音声認識。ハイブリッドMLXおよびCoreMLバックエンド。0.6Bおよび1.7Bパラメータサイズで利用可能。
- WhisperASR: OpenAIのWhisper Large-v3 TurboのネイティブCoreML実装。Neural Engine向けに最適化。
- Parakeet TDT: NVIDIAのFastConformerとTDTデコーダ。CoreMLを介して25のヨーロッパ言語をサポート。
- Omnilingual ASR: Metaのwav2vec2ベースモデル。32のスクリプトで1,672言語をカバー。CoreML(300M)およびMLX(300M/1B/3B/7B)バリアント。iPhone 16 Proで0.28 RTFを達成。
- Streaming Dictation: 部分結果と発話終了検出(Parakeet-EOU-120M)を備えたリアルタイムディクテーション。iPhone 16 Proで0.04 RTFを達成。
- Nemotron Streaming: NVIDIAの低レイテンシストリーミングASR。ネイティブの句読点と大文字小文字をサポート。多言語(40言語ロケール)および英語専用バリアントで利用可能。
テキスト読み上げ(TTS)
- Qwen3-TTS: カスタムスピーカーをサポートする高品質ストリーミングTTS。10言語。
- CosyVoice TTS: ボイスクローン、マルチスピーカーダイアログ、感情タグを備えたストリーミングTTS(9言語)。
- VoxCPM2: 48 kHzスタジオ品質のTTS。ボイスクローンと指示駆動型音声デザイン(2Bパラメータ、MLX bf16/int8、30言語)。
- IndexTTS2: 参照音声からのネイティブMLXボイスクローン(1.5Bクラス、英語と中国語)。
- F5-TTS: 短い参照クリップからのゼロショットボイスクローン(DiTフローマッチング+Vocos、MLX fp16、24 kHz)。
- Higgs TTS 3: ゼロショットボイスクローンとインライン感情/スタイル/SFX/韻律タグを備えた会話型TTS(Boson Higgs TTS 3、Qwen3-4Bバックボーン、MLX bf16、100+言語)。
- Kokoro TTS: 軽量オンデバイスTTS(82Mパラメータ、CoreML/Neural Engine、54の音声、iOS対応、10言語)。iPhone 16 Proで0.08 RTF。
- VibeVoice TTS: 最大90分のポッドキャスト/オーディオブック合成のための長文/マルチスピーカーTTS(Microsoft VibeVoice Realtime-0.5B + 1.5B、MLX、英語と中国語)。
- Magpie TTS: NVIDIAの多言語TTS(357Mパラメータ、MLX INT8またはCoreML INT8、9言語、5つの内蔵スピーカー)。
- Supertonic TTS: オンデバイスフローマッチングTTS(99Mパラメータ、CoreML/Neural Engine、31言語、10の音声、44.1 kHz)。iPhone 16 Proで0.15 RTF。
- Chatterbox TTS: ゼロショットボイスクローンを備えた多言語TTS(Resemble AI、MLX fp16、23ランタイム言語)。
- OmniVoice TTS: ゼロショットボイスクローンを備えた非自己回帰拡散TTS(k2-fsa、Qwen3バックボーン、MLX、600+言語、Apache-2.0)。
- Indic-Mio: インライン感情マーカーとオプションの参照音声クローンを備えたヒンディー語/インド言語TTS(MLX、24 kHz)。
LLMと翻訳
- Qwen3Chat: ストリーミングトークンによるオンデバイスLLMチャット(Qwen3.5-0.8B MLX/CoreML、さらにQwen3 4BおよびGemma 4 E2B/E4B MLXバックエンド)。
- FunctionGemma: 構造化関数/ツール呼び出しのためのオンデバイスLLM(Gemma 3 270M、CoreML 8ビットパレタイズ、Neural Engine、M5 Proで約252 tok/s、iPhone 16 Proで128 tok/s)。
- MADLAD-400: 400以上の言語間の多対多翻訳(3B、MLX INT4 + INT8、T5 v1.1、Apache 2.0)。
音声間翻訳と音声エージェント
- Hibiki Zero-3B: ストリーミング音声間翻訳(フランス語/スペイン語/ポルトガル語/ドイツ語から英語へ、MLX INT4 + INT8、Kyutai Moshi/Mimiスタック)。
- PersonaPlex: 全二重音声間翻訳(7Bパラメータ、音声入力→音声出力、18の音声プリセット)。
- Audio2Face-3D: アバター向け音声駆動フェイシャルアニメーション(NVIDIA Audio2Face-3D v2.3 Mark、301の顔係数、MLX)。
強調、分離、および音声生成
- DeepFilterNet3: リアルタイムノイズ抑制(2.1Mパラメータ、48 kHz)。
- Source Separation: HTDemucs(Demucs v4)およびOpen-Unmixによる音楽ソース分離(4ステム:ボーカル、ドラム、ベース、その他)。
- MAGNeT: テキストから音楽生成(Meta MAGNeT Small 300M / Medium 1.5B、MLX INT8、30秒クリップ、32 kHz)。
- Stable Audio 3: テキストからオーディオ/音楽生成(Stable Audio 3 Medium、MLX INT8/INT4、44.1 kHzステレオ、可変長)。
- FlashSR: オーディオ超解像(FlashSR ICASSP 2025、MLX、48 kHzモノラル、1ステップ蒸留拡散)。
ターン検出、ダイアライゼーション、および話者識別
- Wake-word: オンデバイスキーワードスポッティング(KWS Zipformer 3M、CoreML、26倍リアルタイム、設定可能なキーワードリスト)。
- VAD: 音声アクティビティ検出(Sileroストリーミング、Pyannoteオフライン、FireRedVAD 100+言語)。
- Speaker Diarization: 誰がいつ話したか(Pyannoteパイプライン、Neural Engine上のSortformerエンドツーエンド)。
- Speaker Embeddings: WeSpeaker ResNet34(256次元)、CAM++(192次元)。
はじめに
Swift Package Managerによるインストール
Package.swiftにパッケージを追加します:
.package(url: "https://github.com/soniqo/speech-swift", branch: "main")
次に、必要なモジュールのみをインポートします:
.product(name: "ParakeetStreamingASR", package: "speech-swift"),
.product(name: "SpeechUI", package: "speech-swift"), // オプションのSwiftUIビュー
3行でオーディオを文字起こし
import ParakeetStreamingASR
let model = try await ParakeetStreamingASRModel.fromPretrained()
let text = try model.transcribeAudio(audioSamples, sampleRate: 16000)
部分結果を含むライブストリーミング
for await partial in model.transcribeStream(audio: samples, sampleRate: 16000) {
print(partial.isFinal ? "FINAL: \(partial.text)" : "... \(partial.text)")
}
SwiftUIディクテーションビュー
import SwiftUI
import ParakeetStreamingASR
import SpeechUI
@MainActor
struct DictateView: View {
@State private var store = TranscriptionStore()
var body: some View {
TranscriptionView(finals: store.finalLines, currentPartial: store.currentPartial)
.task {
let model = try? await ParakeetStreamingASRModel.fromPretrained()
guard let model else { return }
for await p in model.transcribeStream(audio: samples, sampleRate: 16000) {
store.apply(text: p.text, isFinal: p.isFinal)
}
}
}
}
テキスト読み上げ
import Qwen3TTS
import AudioCommon
let model = try await Qwen3TTSModel.fromPretrained()
let audio = model.synthesize(text: "Hello world", language: "english")
try WAVWriter.write(samples: audio, sampleRate: 24000, to: outputURL)
音声アクティビティ検出
import SpeechVAD
let vad = try await SileroVADModel.fromPretrained()
let segments = vad.detectSpeech(audio: samples, sampleRate: 16000)
for s in segments { print("\(s.startTime)s → \(s.endTime)s") }
話者ダイアライゼーション
import SpeechVAD
let diarizer = try await DiarizationPipeline.fromPretrained()
let segments = diarizer.diarize(audio: samples, sampleRate: 16000)
for s in segments { print("Speaker \(s.speakerId): \(s.startTime)s - \(s.endTime)s") }
アーキテクチャと設計
Speech Swiftはモデルごとに1つのSPMターゲットに分割されているため、利用者はインポートしたものだけに対してコストを支払います。共有インフラストラクチャはAudioCommon(プロトコル、オーディオI/O、HuggingFaceダウンローダー、SentencePieceModel)とMLXCommon(重み読み込み、QuantizedLinearヘルパー、SDPAマルチヘッドアテンションヘルパー)にあります。
モデルの重みとキャッシュ
モデルの重みは初回使用時にHuggingFaceからダウンロードされ、~/Library/Caches/qwen3-speech/にキャッシュされます。QWEN3_CACHE_DIR(CLI)またはcacheDir:(Swift API)で上書きできます。すべてのfromPretrained()エントリポイントは、重みがすでにキャッシュされている場合にネットワークをスキップするofflineMode: trueも受け入れます。
中国本土(またはhuggingface.coが遅い/ブロックされている場所)のユーザーは、HF_ENDPOINTを設定してミラーから取得できます。例:export HF_ENDPOINT=https://hf-mirror.com。
要件
- Swift 6+、Xcode 16+(Metal Toolchain付き)
- macOS 15+(Sequoia)またはiOS 18+
- Apple Silicon(M1/M2/M3/M4)
macOS 15 / iOS 18の最小要件は、CoreMLパイプライン(Qwen3-ASR、Qwen3-Chat、Qwen3-TTS)がトークンステップ間でKVキャッシュをNeural Engine上に保持するために使用するAppleの永続的なANE状態APIであるMLStateに由来します。
パフォーマンスベンチマーク
Speech Swiftには、docs/benchmarks/ios-coreml.mdにオンデバイスiPhone 16 Pro CoreMLベンチマーク(RTF、トークン/秒、ピークメモリ)が含まれています。主なハイライト:
- Parakeet-EOU-120M: iPhone 16 Proで0.04 RTF(ストリーミングディクテーション)
- Omnilingual ASR(300M): iPhone 16 Proで0.28 RTF
- Kokoro-82M: iPhone 16 Proで0.08 RTF(TTS)
- Supertonic-3(99M): iPhone 16 Proで0.15 RTF(TTS)
- FunctionGemma(270M): M5 Proで約252 tok/s、iPhone 16 Proで128 tok/s
ユースケース
- 音声エージェント: リアルタイムの音声間翻訳機能を備え、完全にデバイス上で動作する会話型AIアシスタントを構築します。
- 文字起こし: 会議、講義、メディアコンテンツ向けの高精度で多言語対応の文字起こし。
- 音声生成: アクセシビリティ、コンテンツ作成、またはボイスクローンアプリケーション向けに自然な音声を生成します。
- オーディオ強調: ノイズの多い録音をクリーンアップし、オーディオソースを分離し、劣化した音声を復元します。
コミュニティとリソース
- 完全なドキュメント: soniqo.audio
- HuggingFaceモデル: soniqo on HuggingFace
- ブログ: アーキテクチャとベンチマークに関する技術的な詳細
- Discord: コミュニティディスカッションとサポート
ライセンス
Apache 2.0
結論
Speech Swiftは、Apple Silicon上のオンデバイスAI音声処理における重要なマイルストーンです。MLXとCoreMLのパワーをモジュール式で開発者フレンドリーなSwiftパッケージと組み合わせることで、プライバシーを保護し、低レイテンシな音声アプリケーションの新しいクラスを可能にします。音声アシスタント、文字起こしツール、クリエイティブなオーディオアプリケーションのいずれを構築している場合でも、Speech Swiftは必要な構成要素を提供します。すべてMacまたはiPhone上でローカルに実行されます。