Gemini 3.1 Flash Live サポート + MiniCPM-o 4.5 vLLM 挑戦 — Naia OSのS2Sリアルタイム音声AI開発記 それ以来、しばらく記事の更新ができませんでした。
その間、多くのことがありました。Nextainは韓国のキリスト教ポータル(www.onmam.com)の運営を担当し、AI適用に関するサポートを話し合っており、韓国の政府課題に選定されたことでNaiaのサービスも弾みがつくことになりました。Vroid Hubの基本アバターではなく、本物のNaiaのアバターをお披露目できるようになると思います。
そして、以前の記事の最後に「来週にはグラフィックカードを借りて作業するので、状況は少し楽になると思います」と書きましたが、その約束をようやく果たすことができました。RTX 3090 2枚の環境でMiniCPM-o 4.5をvllm-omniにポーティングし、Naiaクライアントに接続、リアルタイム英語会話のオーディオレファレンス(voice cloning)まで1次動作検証を終えました。
ちなみに、MiniCPM-o 4.5 を vllm-omni に載せたのは私たちが初めてであり、海外でもどこまで進んだのかについて興味を持っている方もいるようです。。upstream の > #1182 に他の方の試み> はありますが、マージされたことはなく、私たちも別途トラックで進めてきました。ある程度動くレベル> まで来ており、現在はアップストリームのメンテナーが受け入れてくれるレベル に整理する段階です。
なぜMiniCPM-o 4.5を目標にしたのか?
以前の記事にも書きましたが、改めて整理すると、個人がRTX 3090 1枚のレベルで動作させることができ、かつオーディオレファレンス(voice cloning)とファインチューニングが同時に可能なオムニモデルは、現在MiniCPM-o 4.5が事実上唯一です。
- GPT-4o / Gemini Live — クラウド専用、重み非公開、ファインチューニング不可
- Moshi — オープンソースでフルデュプレックスに優れるが、英語/フランス語中心+コミュニティ非活性
- Qwen3-Omni-30B — 30Bなので量子化なしでは24 GB 1枚に収まらず、量子化すると音声出力が壊れる
- MiniCPM-o 4.5 — 9B (Whisper-medium + Qwen3-8B + CosyVoice2 + SigLip2 結合), 24 GB 1枚で動作し、オーディオレファレンスでvoice clone、そしてファインチューニング可能
しかし、まだ韓国語未対応が欠点であり、私たちが貢献できる点だと思います。そこで、今回のAIチャンピオンでは「君を記憶する」というチーム名で、vLLM-omniの韓国語ファインチューニング作業とNaia-Memoryを利用したバーチャルYouTuberサービスを試みると提出しました。独波模(ドクパモ)は、私たちが望むレベルのオムニモデルがなかったため、「国内」カテゴリで応募できませんでした。
「私のPCで私を記憶し、私だけの声で話すAIバーチャルYouTuberは誰もが欲しがるのではないでしょうか?」これを可能にするために、以下の技術が必要だと考え、以下の技術に集中しています。
- ローカルで動作するオムニモデル — STT/LLM/TTSパイプラインではなく、音声-音声のend-to-end。パイプライン方式は累積遅延とイントネーション損失が大きすぎます。 → MiniCPM-o 4.5
- オーディオレファレンス(voice cloning) — 「この声で話して」 と一度聞かせると、その音色で会話。 → CosyVoice2 のspk_embベースのクローニング
- 長期記憶 — セッションごとに初期化されない、ユーザーを記憶するメモリシステム。 → 私たちが別途作成している Naia Memory (4層脳科学インスパイア記憶システム)
- 韓国語 — 上記3つが韓国語で動作してこそ日常で使える。 → CosyVoice2 韓国語ファインチューニング (AIHubデータ確保完了、GPUサポート時に即時着手)
そして追加で、近日公開予定の別のトラックもあります。naia-sing — 名前から何となくお分かりいただけるかと思います。ご期待ください。以下に実際の動作デモと技術的な内容も追加共有します。
デモ 1 — Naiaクライアントでの会話
デモ映像で私が英語があまり得意でない点はご容赦ください。
vllm-omniにMiniCPM 4.5-oをポーティングし、Naiaデスクトップアプリに接続して会話をテストした映像です。ハードウェアはRTX-3090 ×2 (2-way)、量子化なしのbf16。オムニモデル(S2S, end-to-end speech-to-speech)の特徴通り、スムーズに流れる会話の流れと自然な感情表現がそのまま再現されます。 現在は英語と中国語をサポートしています。
デモ 2 — MiniCPM-o デモページ + オーディオレファレンス
MiniCPM-o 4.5 の公式デモページをvllm-omniバックエンドに接続したフォークです。オーディオレファレンス (voice cloning) の動作例を一緒に収めました。WAVファイルをアップロードすると、その声の音色・イントネーションで応答を合成します。サーバー側でSHA-256キーLRUキャッシュにより同一レファレンスの再計算を回避するため、最初の応答後には追加のオーバーヘッドはほとんどありません。
実装内容の要約
3つのリポジトリで作業しました。
| リポジトリ | 役割 |
|---|---|
nextain/vllm-omni | vllm-omniフォーク — MiniCPM-o 4.5モデルモジュール + Thinker→Talker→Code2Wav 3ステージパイプライン + voice clone (session.update.ref_audio) 追加 |
nextain/MiniCPM-o-Demo-forvLLM-omni | 公式PyTorchデモのフォーク — backend=vllm_omniモード追加、audio-duplexページでvllm-omni URL直接入力/検証可能 |
nextain/naia-os | Naiaデスクトップアプリ — MiniCpmOConfig.refAudioファーストクラスフィールド追加、ブラウザ(Tauriウェブビュー)でAudioContext → 16 kHz mono → base64 WAVエンコーダー |
Naiaクライアントはデモゲートウェイを経由せず、vllm-omniの/v1/realtime (OpenAI Realtime API互換) に直結します。WebSocketでPCM16 16 kHzオーディオを流し込み、24 kHz mono PCM16で応答を受け取ります。全作業はClaude Code で行われました。モデルコード、ステージ設定YAML、stage_input_processor、デモバックエンドプロキシ、NaiaのTypeScriptクライアント + WAVエンコーダー + vitestまで。
- Naiaは全面改編中です。Naia-osの一部はnaia-agentとして柔軟性を持つCLIをバックエンドに置く構造になりそうで、Naia-memoryとNaia-ADKと結合予定です。
しかしAI slopはまだ
以前の記事で*「この作業の目的は、AI-native Opensourceエコシステムの実現、AIがai slopなしでオープンソースに正しく貢献できることを可能にしたいという実験」* と書きましたが、現在もその部分が最も難しく、最終点検するとやはりまた問題点が見つかりました。しかし、一刻も早く共有したく、この問題を解決する前にまずこの投稿を書きました。
ここ数日間、別のAIエージェントを敵対的レビューアとして4回実行しました。1回目では2 BLOCKER + 13 MAJOR。そのうちの1つは*「サンプルクライアントが動作しない — バックエンドはオーディオ入力ベースなのにtext-drivenで書かれている」* といった明白な嘘。2回目では1 MAJOR (サンプルがPython 3.13で削除されたstdlib audioopを使用)。3・4回目ではクリーンパス。私たちのルール(2連続クリーン)を満たしました。しかし、そこで止まらず、vllm-projectメンテナーの視点 でもう一度実行したところ、やはり同じでした。
- 3 BLOCKER:
- 単一モデル機能のために
chunk_transfer_adapter.pyのcross-cutting invariant (whitelist→blacklist) 変更 prompt_len_overrideがMiniCPM-o専用なのにshared infraに配置chat_template_kwargs.ref_audioサイドチャネルはレイヤー違反 — 隣にファーストクラスフィールドの先行例あり
- 単一モデル機能のために
- 5 MAJOR + 8 MINOR
内部ルールは通過しますが、外部メンテナーの基準では最初のラウンドでマージされないだろうとのことです。それに加えて、upstream/main が私たちのforkのmerge-base以降も更新されており、マージ作業を追加で進めています。
次の作業
- アップストリームの観点からのBLOCKER/MAJOR修正 — 進行中
- upstream/main マージ + 衝突解消 — 近日中
- PR提出 — 上記2つが完了次第。単一PR vs 2PR分割(モデルモジュール / voice clone)の決定は保留中
- 韓国語ファインチューニング — モデル自体。CosyVoice2 (Code2Wavバックボーン) が韓国語で学習されていないのが最大の障壁。現在、韓国語テキスト生成は正常ですが、音声合成が壊れて聞こえます。
続く作業もまた整理して共有いたします。AIもオープンソースに貢献できることをお見せします。コメントやGitHub Issueを歓迎します。
Repos
Naia: https://naia.nextain.io