奈亚
· luke

在个人电脑上用我的声音与AI进行实时对话!MiniCPM-4.5-omni已成功移植到vLLM-omni

[voice-ainaia-osminicpms2svllm-omnisttttsllmopensource]

Gemini 3.1 Flash Live 支持 + MiniCPM-o 4.5 vLLM 挑战 — Naia OS 的 S2S 实时语音 AI 开发记录 此后,我有一段时间未能更新文章。

在此期间发生了很多事情。Nextain负责运营韩国基督教门户网站(www.onmam.com),并正在讨论AI应用支持事宜,同时Naia的服务也因入选韩国政府项目而获得了动力。我们似乎能够推出真正的Naia虚拟形象,而非Vroid Hub的默认形象。

我在之前的文章末尾写道,下周借用显卡后情况会变得更容易,现在我终于兑现了这个承诺。在两张RTX 3090的环境下,我们已完成将MiniCPM-o 4.5移植到vllm-omni并连接到Naia客户端,初步验证了实时英语对话和音频参考(声音克隆)的功能。

值得一提的是,我们是首次将MiniCPM-o 4.5部署到vllm-omni上,海外也有人好奇进展如何。。在上游的 > #1182 中虽然有其他人尝试过,但从未被合并,我们也一直独立进行。目前已达到可正常运行的水平,现在正处于整理阶段,使其达到上游维护者可以接受的水平

为什么选择MiniCPM-o 4.5作为目标?

正如我在之前的文章中提到的,再次总结一下,目前MiniCPM-o 4.5是唯一一款个人用户可以在一张RTX 3090显卡上运行,同时支持音频参考(声音克隆)和微调的全能模型。

  • GPT-4o / Gemini Live — 仅限云端,权重不公开,无法微调
  • Moshi — 开源且全双工性能优秀,但主要支持英语/法语 + 社区不活跃
  • Qwen3-Omni-30B — 30B 模型,不量化无法在一张24 GB显卡上运行,量化后语音输出会损坏
  • MiniCPM-o 4.5 — 9B (结合了Whisper-medium + Qwen3-8B + CosyVoice2 + SigLip2),可在24 GB单卡上运行,支持音频参考进行声音克隆,并且可微调

然而,目前不支持韩语是一个缺点,也可能是我们可以贡献的地方。因此,在本次AI冠军赛中,我们以“记住你”为队名,提交了vLLM-omni韩语微调工作和利用Naia-Memory提供虚拟主播服务的方案。由于没有达到我们期望的全能模型水平,我们未能以“国内”类别申请独파모(Dokpamo)。

“谁不想在自己的电脑上拥有一个能记住我、用我的声音说话的AI虚拟主播呢?”为了实现这一点,我们认为需要以下技术,并正专注于这些技术。

  1. 本地运行的全能模型 — 不是STT/LLM/TTS流水线,而是语音到语音的端到端。流水线方式的累积延迟和韵律损失太大。→ MiniCPM-o 4.5
  2. 音频参考(声音克隆)"用这个声音说话",只需听一次,就能以该音色进行对话。→ 基于CosyVoice2的spk_emb克隆
  3. 长期记忆 — 不会随会话重置,能记住用户的记忆系统。→ 我们正在独立开发的Naia Memory(4层脑科学启发记忆系统)
  4. 韩语 — 以上三项必须支持韩语才能在日常中使用。→ CosyVoice2韩语微调(AIHub数据已获取,GPU支持后立即启动)

此外,我们还有一个即将公开的额外项目。naia-sing — 相信您从名字就能猜到是什么。敬请期待。下面将分享实际运行演示和更多技术细节。

演示 1 — 在Naia客户端中对话

请谅解我在演示视频中英语说得不好。

这是将MiniCPM 4.5-o移植到vllm-omni并连接到Naia桌面应用进行对话测试的视频。硬件为RTX-3090 ×2(双路),bf16无量化。作为全能模型(S2S,端到端语音到语音)的特点,对话流畅自然,情感表达生动。目前支持英语和中文。

演示 2 — MiniCPM-o 演示页面 + 音频参考

这是MiniCPM-o 4.5官方演示页面连接vllm-omni后端的一个分支。其中包含了**音频参考(声音克隆)**的运行示例。上传WAV文件后,系统会以该声音的音色和语调合成回复。服务器端通过SHA-256键的LRU缓存避免重复计算相同的参考,因此在首次回复后几乎没有额外的开销。

实现细节摘要

我们主要在三个代码仓库中进行了工作。

仓库职责
nextain/vllm-omnivllm-omni 分支 — 添加MiniCPM-o 4.5模型模块 + Thinker→Talker→Code2Wav三阶段流水线 + 声音克隆 (session.update.ref_audio)
nextain/MiniCPM-o-Demo-forvLLM-omni官方PyTorch演示的分支 — 添加 backend=vllm_omni 模式,可在audio-duplex页面直接输入/验证vllm-omni URL
nextain/naia-osNaia桌面应用 — 添加 MiniCpmOConfig.refAudio 一等字段,浏览器(Tauri Webview)中 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原生开源生态系统,这是一项旨在让AI能够在没有‘AI slop’的情况下正确贡献开源的实验”。目前这部分仍然是最困难的,并且在最终检查时再次发现了问题。然而,我希望尽快分享,所以在解决这些问题之前先发布了这篇博文。

在过去的几天里,我们让另一个AI代理作为对抗性审阅者运行了4次。第一次是2个BLOCKER + 13个MAJOR。其中一个问题是明显的谎言,例如*“示例客户端不工作 — 后端基于音频输入,但却以文本驱动方式编写”*。第二次是1个MAJOR(示例使用了Python 3.13中已移除的stdlib audioop)。第三、四次通过了干净检查。满足了我们的规则(连续两次干净)。但我们并未止步于此,又以vllm-project维护者视角再次运行了一次,问题依然存在。

  • 3个BLOCKER:
    • 为单一模型功能修改了 chunk_transfer_adapter.py 中的跨领域不变性(白名单→黑名单)
    • prompt_len_override 专用于MiniCPM-o,但却位于共享基础设施中
    • chat_template_kwargs.ref_audio 侧通道违反了层级规定 — 旁边有现成的一等字段
  • 5个MAJOR + 8个MINOR

虽然通过了内部规则,但按照外部维护者的标准,第一轮是无法合并的。此外,upstream/main在我们的fork的merge-base之后又进行了更新,我们正在进行额外的合并工作。

下一步工作

  1. 从上游角度修复BLOCKER/MAJOR问题 — 进行中
  2. 合并upstream/main + 解决冲突 — 很快
  3. 提交PR — 完成上述两项后。单一PR还是拆分为2个PR(模型模块/声音克隆)的决定待定
  4. 韩语微调 — 模型本身。CosyVoice2(Code2Wav骨干)未用韩语训练是最大的障碍。目前韩语文本生成正常,但语音合成听起来有损坏。

后续工作将再次整理并分享。我们将展示AI也能为开源做出贡献。欢迎评论或提交GitHub Issue。


Repos

Naia: https://naia.nextain.io

Popular Posts

CC BY-NC-SA 4.0This post is licensed under CC BY-NC-SA 4.0.

评论

无需登录即可评论

...