不烧显卡!MiniMind-O如何在纯CPU上实现快速实时语音推理
【免费下载链接】minimind-o🎙️ A 0.1B Omni model trained from scratch, capable of listening, speaking, and seeing!项目地址: https://gitcode.com/gh_mirrors/mi/minimind-o
MiniMind-O 是一个从 0 训练的 ~0.1B 完整 Omni 模型,单一权重同时支持文 / 音 / 图三模态输入与文本 / 流式语音输出。得益于极小的主干参数和流式解码架构,它不仅能在普通 GPU 上训练,更能在纯 CPU上完成快速、可打断的实时语音推理。本文用尽量少的代码,带你看懂它为什么快、快在哪里,以及如何三步跑通语音问答 Demo。
一、为什么 0.1B Omni 模型敢跑在 CPU 上
很多人对"语音大模型"的第一印象是:参数动辄几十 B,不配一张 24G 显卡根本跑不动。MiniMind-O 的思路正好相反——把参数压到 CPU 能轻松吞吐的量级。
它的参数预算非常克制:
| 模块 | 实现 | 状态 | 参数 |
|---|---|---|---|
| Thinker(理解) | MiniMind Transformer,8 层 / hidden 768 | 可训练 | 63.91M |
| Talker(发声) | 独立 4 层 blocks + 8 个 codebook head | 可训练 | 47.05M |
| Audio / Vision projector | 两层 MLP | 可训练 | ~2.2M |
| SenseVoice-Small 语音编码器 | 16 kHz 语音特征 | 冻结 | 234M |
| SigLIP2 视觉编码器 | 256×256 图像 | 冻结 | 94.55M |
| Mimi 音频编解码器 | 8 codebook,12.5 Hz,24 kHz | 冻结 | 96.15M |
也就是说,minimind-3o真正需要"算"的可训练主体只有约113M(MoE 版 active 参数同样约 115M),运行时总加载约 538M。对 CPU 而言,这意味着每生成一个 token 的矩阵运算量极小,几十 GB 内存的普通 PC 完全装得下、算得动。
另一个关键细节是12.5 Hz 的音频 code 帧率:Mimi 编解码器把语音压成每秒仅 12.5 帧的离散 code 序列,CPU 只要以比这快得多的速度产出 code,语音流就不会断。这就是"快速实时语音推理"的数学基础。
整体架构上,MiniMind-O 由Thinker–Talker 双路径构成:Thinker 负责理解文本、语音和图像并给出语义回复,Talker 在 Thinker 的中间层 hidden state 条件下,通过 MTP(Multi-Token Prediction)一次预测 8 层 Mimi codebook,再交给 Mimi 解码器还原成 24 kHz 流式语音。
二、实时语音不卡顿的关键:流式解码 + 增量波形合成
"实时"不等于"算得快",更等于边算边播。MiniMind-O 的推理循环(见 stream_generate)是这样工作的:
- 逐 token 流式产出:
stream_generate以生成器方式逐个 yield 文本 token,同时用 KV cache(use_cache=True)避免重复计算前文,CPU 上尤其受益; - 延迟调度补齐音频:Talker 侧 8 层 code 按固定延迟逐层跟上,每满一组 8 路 code 就产出一帧音频 code;
- 增量解码波形:Mimi 解码器可以增量恢复 24 kHz 波形——语音播放不必等待完整回答结束,首帧音频的延迟只取决于前几个 token 的生成速度。
训练与推理共用同一条序列格式:文本 token 与 8 路 audio-code stream 放在同一个序列里,语音、图像和音色条件通过占位符或 reference codes 注入,参考 sequence_format 说明。
在实时通话链路里(webui/web_demo.py),解码出的波形还被切成小 chunk 叠加 overlap 去缝,通过 SSE / WebSocket 逐块推给浏览器,做到"模型每生成一点,耳朵就听到一点"。
三、设备自适应:零配置切换到 CPU 推理
MiniMind-O 的推理脚本都做了设备自适应,没有显卡时会自动落到 CPU,无需改任何配置:
- 命令行入口 eval_omni.py 中
--device默认值就是'cuda' if torch.cuda.is_available() else 'cpu'; - Web 端 web_demo.py 的
default_device()按cuda → mps → cpu依次探测; - 音频解码器会按设备智能选精度:GPU 上用 fp16,CPU 上自动退回 float32(scripts/web_demo_omni.py),避免在 CPU 上硬跑半精度反而更慢。
此外还有两个"减负"设计:
- ASR 并行化:实时模式下,用户语音的转写(用于显示对话历史)被丢到后台线程异步执行,不阻塞主模型的语音生成;
- VAD 走 ONNX:端点检测使用 silero_vad.onnx,由 onnxruntime 执行,CPU 占用极低,保证"边听边判"不掉帧。
四、边说边听:VAD 打断与近似双工交互
纯 CPU 跑完"能说话"只是及格线,MiniMind-O 还做了一件事:能在模型说话时听出你在插话并立刻打断(barge-in)。
实时会话由 RealtimeSession 驱动:VAD 持续监听麦克风,用户停止说话后 Thinker 完成 prefill,Talker 开始逐步产出 code,Mimi 边收边播;当用户在模型说话过程中再次开口,系统中断当前生成、退回 listening 状态,重新进入新一轮 prefill–reply。虽然中断检测目前还是简单的 VAD 阈值,但从工程闭环看,这套"近似双工"对话已经完整跑通——而且全流程可以落在 CPU 上。
五、快速上手:3 步在 CPU 上跑通语音问答
第 1 步:克隆仓库并安装依赖
git clone --depth 1 https://gitcode.com/gh_mirrors/mi/minimind-o cd minimind-o pip install -r requirements.txt第 2 步:下载推理所需的模型资源
modelscope download --model gongjy/SenseVoiceSmall --local_dir ./model/SenseVoiceSmall modelscope download --model gongjy/siglip2-base-p32-256-ve --local_dir ./model/siglip2-base-p32-256-ve modelscope download --model gongjy/mimi --local_dir ./model/mimi modelscope download --model gongjy/campplus --local_dir ./model/campplus modelscope download --model gongjy/minimind-3o-pytorch --local_dir ./out第 3 步:启动推理
# 无 GPU 时自动使用 CPU;也可显式指定 --device cpu python eval_omni.py --load_from model --weight sft_omni跑起来后,终端会流式打印 Thinker 的文本回复,并调用 Mimi 解码出 24 kHz 语音写入./output_audio/。想体验电话模式实时通话,可用 webui/web_demo.py 启动 Web 实时 Demo;不想动命令行也可以参考 web_demo_omni.py 的 Gradio 演示。
六、实用建议与边界
- CPU 推理体验最好的场景是短回答:官方评估显示短语音回复最稳,较长的英文回答更容易出现读音漂移;
- 内存预算:运行时总加载约 538M 参数,float32 权重加推理开销,建议 8 GB 以上内存;
- 想要更快:有 GPU 时脚本会自动用 cuda + fp16,速度再上一个台阶;
- 想从零复现:训练链路同样开源,trainer/train.sh 给出了 mini 数据集的完整流程,单卡 RTX 3090 约 2 小时可跑通:
MiniMind-O 证明了完整 Omni 闭环并不需要"大参数 + 大显卡":把可训练主体压到 0.1B、用流式解码和增量合成换取低延迟,一套能听、能看、能说的语音模型就能稳稳落在你的 CPU 上。
【免费下载链接】minimind-o🎙️ A 0.1B Omni model trained from scratch, capable of listening, speaking, and seeing!项目地址: https://gitcode.com/gh_mirrors/mi/minimind-o
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考