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上でローカルに実行されます。

ソース

soniqo/speech-swift: AI speech toolkit for Apple Silicon — ASR, TTS, speech-to-speech, VAD, and diarization powered by MLX and CoreML