# WhisperX 说话人分离教程：两人录音、匿名标签与重叠检查

WhisperX 说话人分离教程通过独立输入、具体脚本和逐项回听完成。本页准备了真实音频输入与官方接口对应脚本，WhisperX/CosyVoice 模型本次未执行。

## 1. 确认录音中的已知两人结构

输入是左右分轨的两段系统合成练习，并提供人工已知 speaker-reference.csv。用它检查说话人标签，不声称模型认识真实人名；实际多人同轨须另外回听。

## 2. 核对 diarization 模型权限

当前官方 DiarizationPipeline 默认模型是 pyannote/speaker-diarization-community-1，需要在 Hugging Face 接受访问条件并准备有读取权限的 token。token 只从环境读，不写进下载文件、脚本、截图或输出。没有访问权限时把此阶段留为未执行，不替换成伪造标签。

## 3. 保留文字转录与对齐结果

说话人流程与 ASR/forced alignment 分开。先生成并核对 aligned.json，再以相同音频运行分离；本页有真实双轨 ASR 参考，没有未执行的说话人模型输出。 本素材包也附针对同一 input.wav 与 expected.txt 的 align.py，先运行它获得本录音 aligned.json；不能直接拿另一页短句的对齐结果。 diarize.py 在加载模型前检查 aligned.json 的源 hash 与当前 input.wav 完全一致，并拒绝缺失或空 HF_TOKEN；不会覆盖错误来源 hash 后继续执行。

```sh
ffmpeg -version
python3.11 -m venv .venv-whisperx
.venv-whisperx/bin/pip install whisperx
.venv-whisperx/bin/python align.py
export HF_TOKEN=你自己的模型访问凭证
.venv-whisperx/bin/python diarize.py aligned.json
python3 check.py --result diarized.json
```

## 4. 设置已知人数，保持匿名标签

本例 min_speakers=max_speakers=2 只表达练习已知两人，不适用于未知会议。使用 SPEAKER_00/01，真实姓名由人工映射；第一次标签编号变化也不意味着换人。

## 5. 按词关联并抽听切换边界

调用 assign_word_speakers 后保留无 speaker 或重叠项。不要强行把同时讲话归到一个人；核对提问结尾和回答起点，用 review.csv 记录。

## 6. 保存权限与推理边界

素材包含 diarize.py 与结构样例。实际分离未在本机执行；下载后需用户满足模型协议并运行，只有实际 diarized.json 才用于下游字幕。

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

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


模型推理本次未执行。输入音频来源见 PROVENANCE.md。

官方来源：
- https://github.com/m-bain/whisperX
- https://github.com/m-bain/whisperX/blob/main/whisperx/diarize.py
- https://huggingface.co/pyannote/speaker-diarization-community-1
