Nvidia PersonaPlex 7BをApple Silicon上で:Swiftによるフルデュプレックス音声対音声
概要
- Apple Silicon上でリアルタイム音声対話を実現するqwen3-asr-swiftライブラリの紹介
- PersonaPlex 7Bによるフルデュプレックス音声対話を単一モデルで実現
- ASR、TTS、多言語合成を一つのSwift/MLXライブラリで統合
- 4ビット量子化によるモデル軽量化と高速化
- ストリーミング音声生成やE2E検証、細かな最適化手法も解説
Apple Siliconで実現するリアルタイム音声対話エンジン
- qwen3-asr-swiftはApple Silicon上で動作するSwift/MLX音声ライブラリ
- PersonaPlex 7Bを用いたフルデュプレックス音声対話を実現
- ASR(音声認識)、TTS(音声合成)、多言語合成を一つのライブラリで提供
- 音声入力→音声出力を、テキスト変換なしで高速処理
- 4ビット量子化モデル(約5.3GB)がaufklarer/PersonaPlex-7B-MLX-4bitで公開
開発の経緯:音声認識から会話へ
- 最初はApple Siliconの統合メモリとMLXのMetal高速化の検証が目的
- Pythonやサーバー不要、CPUとGPU間のテンソル転送なしの設計
- ASR(Qwen3-ASR 0.6B、4ビット量子化)でMLXパターン確立
- TTS(Qwen3-TTS 0.6B)でMimi音声コーデックや10言語対応のストリーミング音声生成を追加
- 多言語合成(CosyVoice3 0.5B)でDiTフローマッチングを9言語で実装
- 現在はPersonaPlex 7Bによる音声to音声を実現
PersonaPlex:三段階モデルから単一モデルへ
- 従来の音声アシスタントはASR→LLM→TTSの三段階
- 各段階で情報損失や遅延が発生
- PersonaPlexは音声入力→音声出力を単一モデルで処理
- **17並列ストリーム(12.5Hz)**で高速処理
- KyutaiのMoshiアーキテクチャを基盤に、NVIDIAが18種の音声プリセットやロールベースプロンプトを拡張
モデル量子化と最適化
- 元のPersonaPlexは16.7GBのPyTorchチェックポイント
- MLX最適化と4ビット量子化で5.3GBまで削減
- 変換スクリプト(scripts/convert_personaplex.py)で
- 重み分類、量子化、プリセット抽出、HuggingFaceアップロードを自動化
単一モデルによる音声会話処理の仕組み
- Mimiエンコーダで24kHz音声を16コードブックトークンに変換
- Temporal Transformer(32層、4096d、7Bパラメータ、4ビット)が17ストリームを統合
- Depformer(6層、1024d、4ビット)が16ステップでエージェント音声トークンを生成
- Mimiデコーダで最終音声を復元
- MimiコーデックはTTS実装から流用、追加開発不要
Depformer:ステップごとの重み切り替え
- MultiLinearパターンで各ステップごとに異なる重みを適用
- 4ビット量子化で2.4GB→650MBに削減
- 品質劣化なしをASRラウンドトリップで検証
システムプロンプトの重要性
- PersonaPlexはテキストプロンプトで会話の方向性を制御
- プロンプトなしでは脱線しやすい
- CLIやAPIで複数プリセット(一般アシスタント、カスタマーサービス、教師など)を選択可能
- カスタムプロンプトも事前トークン化して直接渡せる
性能とリアルタイム性
- **M2 Max(64GB)で、PersonaPlexはRTF 0.87(68ms/step)**を達成
- RTF(Real-Time Factor)が1.0未満=リアルタイムより高速
- 4ビット量子化で**80msフレーム予算(12.5Hz)**をクリア
ラウンドトリップ検証によるE2Eテスト
- ライブラリ内のASR、TTS、音声to音声を組み合わせてE2Eテストが容易
- PersonaPlex出力をASRで再認識し、キーワード一致で検証
ストリーミング処理の実装
- **respondStream()**で生成中に音声チャンクを逐次出力
- 各チャンクは約2秒の24kHz音声
- CLIからもストリーミング応答に対応
高速化のための最適化
- eval()統合でGPU同期バリアを削減
- 一括音声抽出でMimiデコードの高速化
- プリフィルバッチ化で初期化の高速化
- Temporal TransformerのMetalカーネルコンパイルでカーネル呼び出しを集約
- TTS移植時の最適化パターンを踏襲
導入方法・使い方
- GitHubからクローンしビルド
git clone https://github.com/ivan-digital/qwen3-asr-swiftcd qwen3-asr-swiftswift build -c release
- 音声to音声変換(初回5.3GBダウンロード)
.build/release/audio respond --input your_audio.wav --output response.wav --voice NATM0
- ストリーミング音声to音声
.build/release/audio respond --input your_audio.wav --stream --output response.wav
- Metalカーネルコンパイル併用
.build/release/audio respond --input your_audio.wav --compile --stream --output response.wav
- 他モデルも利用可能
.build/release/audio transcribe audio.wav(ASR).build/release/audio speak "Hello world" --output hello.wav(TTS).build/release/audio speak "Hallo Welt" --engine cosyvoice --language german(多言語TTS)
技術的基盤・クレジット
- **NVIDIA(PersonaPlex)、Kyutai(Moshi/Mimi)、Alibaba(Qwen ASR/TTS)、FunAudioLLM(CosyVoice)、Apple(MLX)**の技術を活用
- aufklarer/PersonaPlex-7B-MLX-4bitで量子化モデル公開
- ivan-digital/qwen3-asr-swiftでライブラリ全体を公開