Files
ai-agent-book/chapter6/end-to-end-speech/README.md
T
liqiang b119135836
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
ai-agent-book 精选快照(<2MB 代码与文档,来自 github.com/bojieli/ai-agent-book)
2026-08-20 13:12:50 +00:00

84 lines
5.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 实验 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 BlackwellPyTorch 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.