# CosyVoice 长旁白分段导出：段号、失败重做与整轨拼接

CosyVoice 长旁白分段导出通过独立输入、具体脚本和逐项回听完成。本页准备了真实音频输入与官方接口对应脚本，WhisperX/CosyVoice 模型本次未执行。

## 1. 按句意拆成三段旁白

jobs.json 保存三个独立 id 和对应旁白文字。语义拆段与模型流式音频块不是同一概念；先确定段级输入，人工试听发现问题时才知道需要重做哪段。

## 2. 固定参考音与模型目录

三段复用同一有权使用 reference.wav 与逐字稿。素材的 sample-segments 是系统语音朗读的原始输入演示，不是 CosyVoice 输出；模型生成本次未执行。 将 --repo-dir 设为已安装依赖的 CosyVoice 克隆目录；--model-dir 使用该目录中实际模型的绝对路径。运行脚本的数据文件仍从素材包所在目录读取。

## 3. 每段完整消费输出音频块

run-cosy.py 对每段 inference_zero_shot 迭代结果，先将所有 tts_speech 按顺序合并到该段，再保存段 WAV。不能只取第一块就标记整段完成。

```sh
python run-cosy.py --repo-dir /path/to/CosyVoice --model-dir /path/to/CosyVoice/pretrained_models/Fun-CosyVoice3-0.5B
python run-cosy.py --repo-dir /path/to/CosyVoice --model-dir /path/to/CosyVoice/pretrained_models/Fun-CosyVoice3-0.5B --only segment-002
python concat.py generated.json
python check.py --result generated.json
```

## 4. 按段号保存状态和实际参数

运行后 generated.json 记录每段 id、参考音频/文字组合的 inputSha256、实际文件 hash、采样率和 generated_pending_review 状态；这表示文件已生成但还需回听。本教程没有自动跳过或续跑，首次运行处理所有 jobs，重做时人工指定 --only segment-002。脚本按 id 合并先前输出清单，保留其他段记录。 尚未运行的段不会写生成完成条目；只有实际产生的 WAV 才进入 outputs，未生成状态只作为任务进度描述。

## 5. 试听段尾再按顺序拼接

先确认三个生成段都无漏字、重复或截尾，再用 concat.py 严格按清单拼接。采样率和声道不一致要明确报错，不静默拉伸音频。

## 6. 导出整轨与段落定位表

concat.py 要求 outputs 中存在 jobs.json 的全部三个段号，并从真实 WAV 帧数累计 offset，保存 combined.wav 和 segment-offsets.json。本次仅系统输入演示完成拼接；CosyVoice 实际生成整轨仍待用户运行。

## 7. 下载材料、检查负例与继续操作

解压素材包后先运行 python check.py，再运行 python check.py --self-test。前者读取真实 WAV / JSON / SRT 与源 hash；后者拒绝损坏 WAV、倒置时间、越界时间和缺失词时间。文件通过不代表文字、情绪或说话人判定已通过。

## 来源与范围

见 PROVENANCE.md。WhisperX/CosyVoice 推理本次未执行，系统音频为原创练习输入。

- https://github.com/QwenAudio/CosyVoice
- https://github.com/QwenAudio/CosyVoice/blob/main/example.py
