原始记录
来源、收到日期和原话
E001 · 深入分析
部分借鉴:Mac 做在 AgentEar 上,补语音打断。64GB 级联可做一路
返回概览 · 深入分析
来源、收到日期和原话
证据、对比和深入分析
可落地的方案、流程和基础设施
结论、工作量和建议的第一步
阅读日:2026-11-12(UTC)。数字只来自当天打开的 GitHub API、Hugging Face API 和下列原文。没有在 64GB 机器上跑过这些模型。凡是「估计」都单独标出。
agent24 对照提交仍是 阅读快照 的 bc923205。这次没有因为语音材料去改基线。
用户要的是学校里、本机、中英、可打断的语音 Agent,并且后台能调用同一台机器上的 API。内存档是 Mac 统一内存 64 / 128 / 256GB,以及同级 Windows,外加服务器对照。
这里把两件事分开:
学校第一版要的「可以被打断」用第二类就能满足。「边听边说」才需要第一类。
GitHub stargazers_count、pushed_at、license.spdx_id 取自 2026-11-12 的 REST API。Hugging Face downloads 与 lastModified 取自同一天的 https://huggingface.co/api/models/<repo>。OpenMOSS 的模型 API 返回 401,下载量记为未知,不估计。
| 对象 | Stars | 最近 push (UTC) | SPDX | 和本题的关系 |
|---|---|---|---|---|
| OpenBMB/VoxCPM | 42359 | 2026-11-09 | Apache-2.0 | TTS。VoxCPM2,2B,30 种语言含中英 |
| OpenMOSS/MOSS-TTS | 4321 | 2026-09-06 | Apache-2.0 | TTS 家族,含 Realtime 与 TTSD |
| OpenMOSS/MOSS-TTSD | 1420 | 2026-09-06 | Apache-2.0 | 长对话合成,不是实时打断对话 |
| OpenMOSS/MOSS-Speech | 148 | 2026-02-13 | Apache-2.0 | 端到端语音,基座权重未发布 |
| OpenMOSS/MOSS-Live | 101 | 2026-11-11 | API 未返回 SPDX | 全双工系统说明,入口是线上 playground |
| QwenLM/Qwen3-TTS | 14372 | 2026-03-17 | Apache-2.0 | 0.6B / 1.7B,流式,中英等 10 种语言 |
| QwenLM/Qwen3-ASR | 3881 | 2026-06-26 | Apache-2.0 | 0.6B / 1.7B,流式,52 种语言和方言 |
| QwenLM/Qwen3-Omni | 4099 | 2026-04-23 | Apache-2.0 | 全模态。服务文档把它标成轮次式 |
| QwenAudio/SenseVoice | 9744 | 2026-09-30 | MIT | 小 ASR。论文里的测量是整段,不是流式 |
| QwenAudio/CosyVoice | 24369 | 2026-05-25 | Apache-2.0 | 中文 TTS 主力之一。CosyVoice 2 官网写首包 150ms |
| kyutai-labs/moshi | 11491 | 2026-09-09 | Apache-2.0 | 原生全双工,有 MLX |
| OpenBMB/MiniCPM-V | 27136 | 2026-11-09 | Apache-2.0 | MiniCPM-o 文档所在仓库 |
| fishaudio/fish-speech | 33691 | 2026-11-12 | NOASSERTION | 热度高。许可未在本次读完,不进学校默认 |
| index-tts/index-tts | 25052 | 2026-09-29 | NOASSERTION | 同上 |
| hexgrad/kokoro | 10061 | 2025-08-06 | Apache-2.0 | 82M。MLX 有中文前端,活跃度更早 |
| pipecat-ai/pipecat | 17211 | 2026-11-12 | BSD-2-Clause | 编排 |
| livekit/agents | 15191 | 2026-11-12 | Apache-2.0 | 编排,WebRTC |
| TEN-framework/ten-framework | 11230 | 2026-11-11 | NOASSERTION | 编排。README 写 Apache-2.0 另有附加限制 |
| Neywa-Labs/mlx-audio(由 Blaizzy/mlx-audio 指向) | 8251 | 2026-11-11 | MIT | Apple 上的 ASR/TTS 运行库 |
Hugging Face downloads(API 字段,不另分时间窗):
| 模型 | downloads | lastModified |
|---|---|---|
| hexgrad/Kokoro-82M | 12541810 | 2025-04-10 |
| Qwen/Qwen3-ASR-1.7B | 1667507 | 2026-01-30 |
| Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice | 1298088 | 2026-01-29 |
| openbmb/VoxCPM2 | 989117 | 2026-11-09 |
| Qwen/Qwen3-TTS-12Hz-0.6B-CustomVoice | 739268 | 2026-01-29 |
| Qwen/Qwen3-ASR-0.6B | 584234 | 2026-01-30 |
| Qwen/Qwen3-Omni-30B-A3B-Instruct | 403894 | 2025-09-22 |
| nvidia/parakeet-tdt-0.6b-v2 | 167950 | 2026-06-29 |
| openbmb/MiniCPM-o-2_6 | 41124 | 2026-11-09 |
| FunAudioLLM/SenseVoiceSmall | 26756 | 2026-06-20 |
| FunAudioLLM/CosyVoice2-0.5B | 14656 | 2026-05-31 |
| mlx-community/VoxCPM2-4bit | 1753 | 2026-04-08 |
| kyutai/moshika-mlx-q4 | 803 | 2024-09-18 |
下载量高不等于适合教室。Kokoro 最高,但仓库最后 push 停在 2025-08-06,中文要额外装 misaki[zh],本次没有找到官方中文音质表。
官方 README(2026-11-12 读取)写明:2B,30 种语言,含中文和英文,以及一批汉语方言。48 kHz。流式 API 是 generate_streaming。Apache-2.0。RTX 4090 上 RTF 约 0.30,Nano-vLLM 或 vLLM-Omni 约 0.13。这里 RTF 小于 1 表示快于实时,是 TTS 论文里的常见定义。见 https://github.com/OpenBMB/VoxCPM
MLX 社区卡 mlx-community/VoxCPM2-bf16 写权重体积:bf16 4.96 GB、8-bit 3.23 GB、4-bit 2.30 GB。同一张卡把 RTF 定义成大于 1 才快于实时,并给出 0.48 / 0.85 / 0.90。机型没有写。因此不能把这三行当成 M 系列 Max 64GB 的实测。第三方 VoxWeft(stars 16,push 2026-09-22)报告他们自己的流式解码器首包:M5 约 169 ms,M2 16GB 约 303 ms,M3 Ultra 约 124 到 168 ms。这是移植作者的数字,不是 OpenBMB 的承诺。
结论:VoxCPM2 是学校中英音质的优先候选,CUDA 上有官方实时系数。Apple 上能装,但是否快于实时要在目标 Mac 上重测。它是 TTS,不是全双工对话模型。
MOSS-TTS README 把家族分成长期合成、对话合成、声音设计和实时 TTS。Apache-2.0。
streamer.py 的块大约 20 秒,见仓库 legacy 文档。MOSS-Speech 的 README 写它不先出文本、直接出语音,骨干是 Qwen3-8B。Next Steps 仍勾着两件未完成的事:开放 base 模型,以及 Gradio 流式输出。不能当作今天可部署的全双工。
MOSS-Live 和 Hugging Face 博客(2026-11-07)描述的是全双工、可打断、能区分「嗯」和抢话,后台工具和前台说话并行。开始方式是线上 playground 和 realtime API。README 没有本地权重和显存表。他们自己的表里,用户打断后的响应延迟是 1.38 秒,Candor 接话延迟 1.14 秒。这些是他们的评测,不是本校网络。学校要求音频留在本机,所以 MOSS-Live 只作能力对照,不进部署排序。
stream_transcribe。MLX 文档列出的语言比官方短,以运行库 get_supported_languages() 为准。torch.compile 和 CUDA Graph。见 https://github.com/QwenLM/Qwen3-TTS 与 https://arxiv.org/html/2601.15621 。mlx-audio 有 8-bit 和 --stream。Apple 上的毫秒数本次没有官方数字。chunk_ms 是 1000。打断靠客户端继续送音频,或调用 set_break()。见 https://openbmb.github.io/MiniCPM-o-Demo/site/en/api/duplex.html 。SGLang-Omni 指南写 MiniCPM-o 需要一张至少 80GB 的 GPU,并把它标成 native_full_duplex。见 https://sgl-project.github.io/sglang-omni/developer_reference/full_duplex_guide.html 。64GB 与 128GB 统一内存都低于这个门槛。256GB Mac 在容量上有机会,但是本次没有找到该 duplex 模式的 MLX 实现。/stop 可以打断。那是可打断,不是 4.5 的 duplex 循环。本次不把它升为全双工。response.cancel 会停掉回答。两张 H100 或一张 H200。H100 配置的短对话 max_sessions 是 4,一张 H200 的 KV 池按 32768 去除得到 16。这是服务槽位,不是实测学生数。_interrupt() 冲掉 LLM 和 TTS。见 https://theten.ai/docs/ten_agent_examples/customize_agent/modify-main/main_python_cascade 。框架许可带附加限制,学校法务未看过之前,不作为第一名框架。VAD 模型本身可以以后再替换进 Pipecat。每个方案都是「模型组合 + 编排」,不是单颗模型。排序看的是:中英、可打断、本机、许可清楚、目标内存放得下、能调用本机 agent24。不按 stars 排序。
| 名次 | 方案 | 组合 | 双工 | 中英 | Apple | 许可与缺口 |
|---|---|---|---|---|---|---|
| 1 | S1 教室级联 | Pipecat,Silero 或以后替换的 TEN VAD,Qwen3-ASR,MLX/llama.cpp 上的 Qwen 文本模型,Qwen3-TTS-0.6B。VoxCPM2 作音质 A/B | 可打断,非原生 | 官方都覆盖 | ASR 与两种 TTS 都有 MLX 端口 | 全部 Apache-2.0 或 BSD。Apple 首包延迟未由原厂公布 |
| 2 | S2 CUDA 音质级联 | 同 S1,TTS 主选 VoxCPM2,跑在 RTX 4090 级 GPU | 可打断 | 是 | MLX 有端口但 RTF 机型不明 | 4090 RTF 是官方数字 |
| 3 | S3 低延迟 TTS 级联 | 同 S2,TTS 换成 MOSS-TTS-Realtime | 可打断 | 20 种语言含中英 | Realtime 的 MLX 未证实 | L20 上 180 ms TTFB 是官方数字。codec 另占约 8 GB |
| 4 | S4 服务器级联 | SGLang-Omni 的 cascaded:Qwen3-ASR、文本 LLM、Qwen3-TTS | 可打断 | 是 | 不是这条路径 | 指南要求级联一张或两张大 GPU。并发见下节 |
| 5 | S5 Omni 轮次 | SGLang-Omni 上的 Qwen3-Omni-30B-A3B-Instruct | 说话时可掐断,模型不边听边说 | 是 | 无 MLX 证据,BF16 门槛高于 64GB | 2x H100 或 1x H200 |
| 6 | S6 传输升级 | S1 的模型不变,编排换成自建 LiveKit Agents,媒体走 WebRTC | 与 S1 相同 | 同 S1 | 同 S1 | 要 TURN。自适应打断的默认条件含云 |
| 7 | S7 Moshi 旁路 | Moshi MLX q4 或 q8,只接英语陪练,不接工具 | 原生全双工 | 官方材料未证明中文 | MLX,M3 测过 | CLI 无回声消除 |
| 8 | S8 原生双工实验 | MiniCPM-o 4.5 duplex,一台独占 GPU | 原生,默认 1 秒一块 | 模型家族支持中英,本次未引用教室指标 | 无 MLX duplex 证据 | 指南写至少 80GB GPU |
不进入这八名的:
并发一栏没有本校测量。估计只写设计目标。
| 档 | 第一名 | 为什么不是更大的模型 | 打断 | 并发 |
|---|---|---|---|---|
| Mac 64GB 统一内存 | S1。ASR 用 mlx-community/Qwen3-ASR-0.6B-8bit。TTS 先用 Qwen3-TTS-0.6B-8bit。LLM 用 MLX 上能与这两颗同时常驻的 Qwen3 量化,具体 id 等第一刀量内存再定。VoxCPM2-4bit(2.30 GB)或 8bit(3.23 GB)做 A/B |
Qwen3-Omni 的 15 秒视频 BF16 表是 78.85 GB。MiniCPM-o duplex 的服务指南是 80GB GPU。两者都超过 64GB 的可用余量 | 级联可打断 | 设计目标 1 路 |
| Mac 128GB | 仍是 S1。ASR 可升到 1.7B。VoxCPM2-8bit 可以常驻。LLM 用余量,不把三颗都顶到最大 | 128GB 仍低于 78.85 GB 与 80GB 这两条官方门槛之上的安全余量,系统和其他进程还要占内存 | 同上 | 设计目标仍是 1 路。多出来的内存给上下文,不先分给学生 |
| Mac 256GB | 产品路径仍是 S1。可选旁路 S7,只给英语会话 | 256GB 容量上可能装下 Omni 或 MiniCPM-o,但没有 MLX duplex 实现,也没有本校延迟 | S1 可打断。S7 才是原生全双工 | 未测 |
| Windows,64GB 内存 + 24GB 级 GPU(RTX 4090 这一类) | S2。VoxCPM2 用官方 4090 RTF。ASR 0.6B。LLM 放在剩余显存,放不下就放系统内存里的 llama.cpp | 24GB 装不下 Qwen3-Omni 的 78GB 级 BF16,也装不下「6+8 GB Realtime」再加一个大 LLM 还同时保持余量。Realtime 留给下一档 | 级联可打断 | 设计目标 1 路 |
| Windows,128GB 内存 + 48GB 级 GPU | S3。MOSS-TTS-Realtime 的 180 ms 是为语音代理测的。VoxCPM2 留作音质开关 | 48GB 仍不是 SGLang 为 Omni 写的 2x H100 或 1x H200 | 级联可打断 | 未测 |
| Windows,256GB 内存 + 80GB 级 GPU | S4 的级联,TTS 仍可用 VoxCPM2 或 Qwen3-TTS。S8 只作实验进程 | 单张 80GB 刚好碰到 Omni 15 秒视频的理论下限,不把第一名押在这条下限上 | 级联可打断。S8 是原生 | 未测 |
| 服务器,1 张 H200 | S4 | 作者博客写级联在准入上限上每卡 16 个会话,MiniCPM-o 8 个,单卡 Qwen3-Omni 布局 2 个(https://edwingao.com/posts/sglang-omni-interactive-runtime)。这是作者自己的服务测量,不是本校 | 级联可打断 | 只引用上述上限,不换算成班级人数 |
| 服务器,2 张 H100 | S5,若目标是单模型轮次语音。若目标是工具和人数,仍用 S4 | SGLang 写短对话 max_sessions 为 4 |
可掐断,非原生全双工 | 槽位 4,见指南 |
64GB 能不能用:能。指的是一路中英、可打断、模型和 API 都在本机的级联对话。不能指原生全双工,也不能指未经测量的多学生同时说话。
更大的显存会更好的部分,只在官方材料里出现过的范围:4090 上 VoxCPM2 有 RTF,H200 / 双 H100 才能按 SGLang 的配置跑 Omni 或原生 duplex。它不自动让 64GB 上的中文对话变得不可用。
基线见 agent24 架构基线。和语音直接相关的代码是:
RunManager::start_run 先把 run 写成 Queued 再在后台 execute。run_loop 最多 10 轮。最终回答在工具调用为空时,先写记忆,再把整段文本放进一次 ModelDelta。字段注释写的是 streaming increment,这个调用点送出的是完整答案。见 rust/crates/agent24-agent/src/lib.rs 第 62、1459、2923、3017-3026 行。cancel_run 对非终态发取消令牌,终态则原样返回。见第 1684-1703 行。模型调用和记忆写入都和取消赛跑。所以「停掉这一轮文字生成」已经有入口。/api/v1/events 的客户端。Origin 头存在就 403。见 rust/apps/agent24d/src/events.rs 第 72-79 行。127.0.0.1。见 rust/apps/agent24d/src/serve_steps.rs 第 974-982 行。教室里的浏览器必须打到网关,不能打到 daemon。ApprovalBroker。语音里等人点卡片,打断体验不成立。agent24-worker 有转写契约,Cargo 注释写没有产品调用方。不能把「内核已经会听」当成现状。run_loop 里。见 AgentEar 基线。因此语音时钟应留在 AgentEar。agent24d 继续通过已有的 _a24/model/complete 回答,而不是再为语音开一条 /api/v1/runs。闲聊如果要边出边合成,仍走 AgentEar 本机边车的流式。附着路径今天是整句。
阅读提交 17e911b。对照表:
| E001 需要 | AgentEar 现状 | 缺口 |
|---|---|---|
| 采集 | src/audio.rs 的 cpal,16 kHz |
播放时没有第二条监听流 |
| 传输 | 本机进程,没有浏览器 | 多学生浏览器不在这个仓库 |
| VAD | fsmn-vad.gguf 只切已经录完的 wav(src/asr.rs 第 181-187 行) |
不是 barge-in |
| ASR | 松键后整段转写。中英 SenseVoice,另有 Qwen3 后端 | 没有边说边出字 |
| 轮次 | 按键开始和结束 | 没有语义轮次 |
| 叫 agent24 | A3 _a24/model/complete(src/a3.rs 第 515 行) |
非流式,HostLlm 第 584-618 行 |
| 取消 | 超时发 $/cancelRequest(src/a3.rs 第 451-455 行)。按键走 stop_playback |
开口不会取消还在飞的模型调用 |
| TTS | 默认 VoxCPM2-4bit,POST /speak 整段 wav。句子级重叠 |
不是音频 token 流。播放期间不听用户 |
| 打断 | 推键半双工。README 第 38 行写自动打断未做 | 没有全双工 |
结论:Mac 上的语音网关应做在 AgentEar 里面,不从 Pipecat 重写采集、识别和 VoxCPM2。Windows 档 AgentEar 跑不了,仍用原来的 S2 到 S5,那是另一条以后的移植,不是第一刀。
事实是第 2 到第 4 节里带链接的句子。推断是:64GB 同时装下 ASR 0.6B 8-bit、TTS 0.6B 8-bit 和一个中小 LLM 后仍有余量。权重体积支持这个方向,进程开销和 KV 缓存没有测。
未验证:任何一档的端到端毫秒、同时学生数、VoxCPM2 在 M 系列 Max 上的 RTF、MOSS-TTS-Realtime 的中文主观音质、教室扬声器下的误打断率、MiniCPM-o 4.5 在 Apple 上能否跑。AgentEar README 里的 2.80 秒中位数是他们自己的句子级流水线,这次没有重测,也不能当成语音打断之后的数字。