Build latest book artifacts / build (push) Canceled after 0s
dependency resolution / resolve (3.11) (push) Canceled after 0s
dependency resolution / resolve (3.13) (push) Canceled after 0s
deploy-pages / build (push) Canceled after 0s
deploy-pages / deploy (push) Canceled after 0s
i18n consistency check / check (push) Canceled after 0s
provider adoption tests / test (chapter2/context-compression) (push) Canceled after 0s
provider adoption tests / test (chapter2/prompt-injection) (push) Canceled after 0s
provider adoption tests / test (chapter2/system-hint) (push) Canceled after 0s
provider adoption tests / test (chapter3/log-sanitization) (push) Canceled after 0s
web-search-agent tests / test (push) Canceled after 0s
web-search-agent tests / agentbook (push) Canceled after 0s
84 lines
5.2 KiB
Markdown
84 lines
5.2 KiB
Markdown
# 实验 6-5:本地运行 MiniCPM-o 4.5 端到端全模态语音
|
||
|
||
运行器、验证器与 canonical 证据目录均使用实验 6-5 的统一标识 `exp6-5-*`。
|
||
|
||
本实验属于正文的“**范式二 · 端到端全模态模型(Omni)**”,不属于后文的“边想边说”方案。它用同一个开放权重模型 MiniCPM-o 4.5 比较两条路径:
|
||
|
||
- **端到端路径**:WAV 直接进入模型的音频编码器与隐空间,模型直接回答;
|
||
- **自级联路径**:同一模型先把 WAV 转成纯文字,再只依据文字回答,主动丢弃语速等副语言信息。
|
||
|
||
另加一条 audio-to-audio 检查,确认模型不仅能听,还能在本地生成 24kHz 语音。实验关闭 `enable_thinking`,因此结果不能用来声称复现 Step-Audio R1 的 MPS、Speak-First、Think-First 或“边想边说”。
|
||
|
||
## 实验设计
|
||
|
||
`fixtures/cases.json` 固定四条小型合成语音:两道只依赖语义的口述算术题,以及文字完全相同、语速分别为快和慢的两条副语言题。每条都运行端到端与自级联两臂。小样本只用于验证机制与本地可运行性,不是模型排行榜;合成音也不能替代真人、多口音与噪声数据集。
|
||
|
||
| 维度 | 端到端臂 | 自级联臂 |
|
||
| --- | --- | --- |
|
||
| 输入 | 单声道 WAV(读取时重采样为模型要求的 16kHz) | MiniCPM-o 生成的纯文字转录 |
|
||
| 回答模型 | MiniCPM-o 4.5 | 同一个 MiniCPM-o 4.5 |
|
||
| 是否保留语速 | 是 | 否(转录提示明确只保留说出的文字) |
|
||
| 采样 | 关闭 | 关闭 |
|
||
| 思考模式 | 关闭 | 关闭 |
|
||
|
||
固定模型为 `openbmb/MiniCPM-o-4_5@1f761131fa83f5ed3cd6f2f22b225c4501d154fa`。官方实现由 SigLip2、Whisper-medium、CosyVoice2 与 Qwen3-8B 组成,总计约 9B 参数;本实验只初始化音频与 TTS 分支,不初始化视觉分支。
|
||
|
||
## 安装
|
||
|
||
上游明确测试 Python 3.10、`transformers==4.51.0`、PyTorch 2.3–2.8。该组合与仓库共享环境里的其他实验可能冲突,因此这里有意使用独立虚拟环境:
|
||
|
||
```bash
|
||
cd chapter6/end-to-end-speech
|
||
uv venv .venv --python 3.10
|
||
uv pip install --python .venv/bin/python -r requirements.txt
|
||
source .venv/bin/activate
|
||
|
||
hf download openbmb/MiniCPM-o-4_5 \
|
||
--revision 1f761131fa83f5ed3cd6f2f22b225c4501d154fa
|
||
```
|
||
|
||
需要 Linux、NVIDIA CUDA GPU 和约 21GB 可用显存。只有扩展到视频输入/输出时才需要 FFmpeg;本次 WAV→文本/语音 campaign 不调用 FFmpeg。模型权重与上游 Python 自定义代码会被下载到 Hugging Face cache,运行前应按自己的供应链策略审查并固定 revision。
|
||
|
||
## 运行
|
||
|
||
```bash
|
||
python demo.py \
|
||
--local-files-only \
|
||
--evidence validation/runs/exp6-5-minicpmo45-20260801-v1/evidence.json \
|
||
--output-dir validation/runs/exp6-5-minicpmo45-20260801-v1/outputs
|
||
|
||
python validate_evidence.py \
|
||
validation/runs/exp6-5-minicpmo45-20260801-v1/evidence.json
|
||
```
|
||
|
||
`demo.py` 一次加载模型,随后保存每条输入的 SHA-256、两臂原始回复、模型自产转录、分阶段延迟、模型 revision、软件版本、GPU 信息,以及语音输出的 SHA-256/采样率/时长。验收只要求真实本地路径完整且证据闭环,**不要求假设必须为正**。
|
||
|
||
没有 GPU 时可运行离线单元测试,但不能据此宣称完成真实实验:
|
||
|
||
```bash
|
||
python -m pytest -q tests
|
||
python demo.py --help
|
||
```
|
||
|
||
合成输入可用 `python prepare_fixtures.py` 重建(需要 `espeak`);正式证据以仓库中 WAV 的 hash 为准。
|
||
|
||
## 本地结果
|
||
|
||
2026-08-01 的[本地 canonical run](validation/runs/exp6-5-minicpmo45-20260801-v1/evidence.json)已通过[全部 11 项验收](validation/runs/exp6-5-minicpmo45-20260801-v1/acceptance.json)。硬件是单张 96GB RTX PRO 6000 Blackwell,PyTorch 2.8.0+cu128、Transformers 4.51.0、BF16/SDPA;模型加载 6.154 秒,峰值分配显存 20.269GiB。
|
||
|
||
| 任务 | 端到端 | 自级联 |
|
||
| --- | ---: | ---: |
|
||
| 语义算术(2 条) | 1/2 | 2/2 |
|
||
| 副语言语速(2 条) | 2/2 | 1/2 |
|
||
| 合计 | 3/4 | 3/4 |
|
||
|
||
总分相同但错误互补。端到端在第一题把 “twelve boxes” 感知成 8,算出 47;自级联先正确转录出 12,再算出 79。相反,快/慢两条音频在自级联中都被压成完全相同的 `Please send the report before lunch.`,于是它把 fast 样本也猜成 slow;端到端保留了速度信息,两条都正确。
|
||
|
||
加载完成后的平均整次调用为端到端 0.686 秒、自级联 0.551 秒。由于端到端固定先跑、回复长度不同且只有四条,这不是可推广的延迟排名。audio-to-audio 臂另生成了[11.56 秒、24kHz 单声道 WAV](validation/runs/exp6-5-minicpmo45-20260801-v1/outputs/spoken-math-boxes-response.wav),但它继承了第一题的感知错误。这是有价值的负结果:路径真实跑通不等于答案正确。
|
||
|
||
---
|
||
|
||
## English
|
||
|
||
Experiment 6-5 belongs to Paradigm 2, end-to-end omni models. Historical canonical paths retain the `exp6-5-*` identifier. It runs the pinned MiniCPM-o 4.5 checkpoint locally and compares native audio-to-answer inference against a self-cascade that first flattens the same audio to text. A separate audio-output arm retains a real 24kHz waveform. Thinking is deliberately disabled; this experiment makes no MPS or “thinking while speaking” claim.
|