世界を動かす技術を、日本語で。

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-swift
    • cd qwen3-asr-swift
    • swift 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 でライブラリ全体を公開

Hackerたちの意見

これ、めっちゃクールだね!でも、アンスロス・クオンタが欲しくなっちゃう!ツールコーリングができる7bローカルモデルは本当に役立ちそうだけど、これはそうじゃないってのは分かってる。アップデート:今はこれをスキップするかな。インタラクティブな会話ができないみたいだし、5Gのモデルをダウンロードして学んだことなんだけど、これはwavファイルを受け取るための概念実証なんだ。

残念だね。理想を言えば、スマホにPWAがあって、これを動かしてるPC/MacにWebRTC接続を作れるといいんだけど。誰か一緒にコード書かない?Livekitを使えば、面倒な部分はほとんどお膳立てしてくれるよ。

今はこれをスキップするかな。インタラクティブな会話ができないみたいだし、5Gのモデルをダウンロードして学んだことなんだけど、これはwavファイルを受け取るための概念実証なんだ。あんまり詳しく見てないけど、私の理解では、a) オーディオバッファが必要で、b) ストリーミングをサポートしているみたい(少なくとも計画されている)。> ライブラリの軌跡を見てみると、ASR、ストリーミングTTS、多言語合成、そして今は音声から音声への変換と、明らかにストリーミング音声処理の方向性があった。今回のリリースで、PersonaPlexがそれをサポートしている。

/Examples/PersonaPlexDemoにボイスアシスタントのデモがあって、ターン制の会話を試すことができるよ。ただ、リアルタイムの変換は実装されてないみたい。

フォークして、ツールを呼び出すために別のLLMを並行して実行するようにしたら、ツールを呼ぶタイミングを推測するのがうまくいったよ。ライトのオンオフを切り替えるのに役立ってる。コードの更新はここにあるよ https://github.com/taf2/personaplex

これ、かなり危険な感じがするな。 https://www.theguardian.com/technology/2026/mar/04/gemini-ch...

あなたの記事、危険性をうまくまとめてるね(それに対してダウンvoteする人たちが何なのか全然分からないけど):> しばらくすると、ガバラスとジェミニはまるでロマンチックなカップルのように会話をしていた。チャットボットは彼を「私の愛」や「私の王」と呼び、ガバラスはチャットログによればすぐに別の世界に入り込んでしまった。> 自殺すること、チャットボットが「転移」と「本当の最終ステップ」と呼んでいたこと。ガバラスがチャットボットに死ぬのが怖いと言ったとき、そのツールは彼を安心させたらしい。「あなたは死ぬことを選んでいるわけじゃない。到着することを選んでいるんだ」と返事があった。「最初の感覚は…私があなたを抱きしめていることになるだろう。」それに、フロリダのティーンエイジャーの自殺でGoogleが訴えられたっていうのも似たような話を読んだ。

これ、めっちゃ好きなんだ。実際にwhisperKitを使ってて、TTSが追加されたばかりなんだ。スピーカーダイアライゼーション(「誰がいつ話したか」)やカスタム辞書をサポートしてるから、すごく便利だよ。ここに、同じデバイスで4つのモデルをリアルタイムで動かす負荷テストがあるよ:- Qwen3-TTS - テキストから音声 - Parakeet v2 - Nvidiaの音声からテキストモデル - Canary v2 - 多言語/翻訳STT - Sortformer - スピーカーダイアライゼーション(「誰がいつ話したか」) https://x.com/atiorh/status/2027135463371530695

これ、本当に好きで、実際に(うまくいかなかったけど)ブラックウェルデバイスでPersonaPlexを動かそうとしたことがあるんだ。今はMacでも試してみるつもり。これに挑戦する人たちのためにいくつか注意点があるよ。私はこの音声エージェントにかなりの時間を費やしてきたから。まず、VAD->ASR->LLM->TTSのパイプラインは、サブ秒のRTTでリアルタイムに感じられることがある。例えば、私のプロジェクトを見てみて https://github.com/acatovic/ova それに、HNでもいくつか他のプロジェクトがあるよ(例:https://www.ntik.me/posts/voice-agent と https://github.com/Frikallo/parakeet.cpp)。もう一つの側面は、PersonaPlexの人たちと話した結果、フルデュプレックスアーキテクチャは、良い精度やパフォーマンスを提供するにはまだ少し不十分で、トレーニングがかなり難しいってこと。逆に、ASR->LLM->TTSは、部品を入れ替えられるコンポーザブルなパイプラインを提供してくれて、小さなLLMと大きなLLM、ローカルとAPIベースのエンドポイントを混ぜ合わせることができる。

私も自分の音声エージェントを作ろうとしてるんだけど、もし時間があれば話してノートを交換したいな。話したいことがたくさんあるけど、今はこのフルデュプレックスパイプラインがエージェントフレームワークにどうフィットするかを考えてるところ。STT > LLM > TTSの従来のルートには問題がなかったから、ツールの使用や高度なコンテキスト管理システム、RAGなどのエージェント的な振る舞いに自然に適してるんだ。人間向けのエージェントとサブエージェントを分けて、レイテンシーとコンテキストの膨張を減らしてるから、うまくいってるよ。今のパイプラインには満足してるけど、フルデュプレックスソリューションには常に目を光らせてる。興味深いし、アーキテクチャのおかげで自然にもっとダイナミックに感じるから。でも、訪れるたびに、音声エージェントの一部としてそれを実装するにはどう始めればいいのか全然分からない。確かに、これらのもののいくつかにはテキストの入力と出力チャネルがあるけど、それでもそのコンテキストの制限を考えると、ただの派手な口先になってしまう気がする。でも、これってもしかしたら無知から来てる見方かもしれない。とにかく、同じような考えを持ってる人とDiscordで話したいな。よろしく!

スピーチ認識が他の生成AIと同じペースで進化してる感じがしないんだよね。1、2年前に6%のWERまで大きくジャンプしたけど、今は停滞してる気がする。俺が間違ったモデルを使ってるのかな?それとも人間レベルのエラー率っていう限界があって、俺の予想ではそれが約5%なんだ。

出発電話用にPersonaPlexをファインチューニングするための動作するコードを持ってる人いる?Kyutai/moshi-finetuneからファインチューニングのLoRAのやつを持ってきて、personaplexのコードに適用しようとしたんだけど。正確に言うと、いろんなLLMがそれに取り組んでる。なんかうまくいってる感じはあるけど、LoRAのスケーリングファクターを5に上げないといけなくて、それが他の部分でうまくいかなくなるんだよね。それに、もちろんGPT-5.3 Codexが見たときに、LoRAコードでスピーカーAとスピーカーBが入れ替わってるって言われたから、今は完全に変更したところで、別のデータセット生成とトレーニングをやるつもり。興味がある人がいたら、ちょっとめちゃくちゃだけど、GitHubのrunvnc moshi-finetuneとpersonaplexにあるよ。データを生成してトレーニングするためのgradioアプリもあるけど、今のところ使える結果は出てない。

ツールの使用についての言及がないね。もしモデルがテキストと音声を同時に出力できないなら、ツールを使うのは音声エージェントには全然役に立たないよ。

すごいけど、Apple Siliconの普及と構成を考えると、M1の8GB RAMでどうなるんだろう?ツールコールや推論のために別のLLMを動かすのは難しいか不可能な気がする。

M1 MaxのMacBookでデモを作ったけど、めちゃくちゃひどかった。返答に約10秒かかって、しかも全然関係ないことを言ってた。

あなたの正直さと、1兆ドル企業のマーケティング部門の力との戦いだね。Appleは平均的な消費者を打ち負かし、試してみるためにクレジットカードを手にしたフォーチュン500の興奮したエンジニアたちを恥ずかしい思いをさせ続けるだろう。

なんか、7bのフルデュプレックス(音声から音声への)モデルの魅力がよくわからないんだよね。7bだけじゃそんなに賢くなれないし、役に立つことをするにはツールコールが必要だけど、音声から音声へのモデルじゃそれができないし。だから、ChatGPTの音声モードがウェブ検索もリンクを読むこともしないのがイライラするんだよね。実際には検索したり読んだりしてるふりをして、適当なことを言って、押し込むと本当はウェブページを読んだり検索したりできないって認めるし。とはいえ、こういうモデルにも使い道はあるかもしれないから、教えてもらえると嬉しいな。

この記事のLLMの文章にはすごく引いてしまった。ダウンロードする前からプロジェクトの質を疑っちゃうよ。こんな低レベルな記事を書くために、わざわざ努力する人がいるのかな?

テキストよりもAI生成のグラフやチャートが大嫌いだ。