
前段时间做了一件以前从没做过的事,采访。
找了认识多年的朋友 Nicole,打了一个半小时的电话。
录音完成后,面对的是一个.m4a文件和一个现实问题:怎么把 90 分钟的对话,变成一篇可以发出来的采访稿?
如果手动听写,估计至少需要一整天。但借助开源工具链+Claude Code 的协助,整个过程大约两个小时完成。包括环境搭建、转录、断句、润色。
以下是完整的技术流程复盘。
技术栈一览
01
WhisperX + 环境搭建
做语音转文字的开源工具不少,但我的需求比较具体:
- 普通话为主,夹杂少量英文
- 两个人对话,需要区分说话人
- 输出要能标注"你一句我一句"
调研之后,WhisperX是最合适的选择。它把三个能力整合在了一起:
- Whisper large-v3
OpenAI 的语音识别模型,支持 99+ 语言,中文识别准确率很高 - pyannote
目前最好的开源说话人分离模型 - 词级时间戳对齐
每个字都有精确的起止时间
一行pip install whisperx就能装好,不需要分别去折腾多个库。
坑一:PyTorch 默认装的是 CPU 版
conda create -n nicole python=3.10 -yconda activate nicolepip install whisperx跑起来直接报错:
AssertionError: Torch not compiled with CUDA enabled原因是pip install whisperx拉下来的 PyTorch 是 CPU 版本,不带 CUDA 支持。需要手动换装:
pip uninstall torch torchaudio -ypip install torch torchaudio --index-url https://download.pytorch.org/whl/cu128验证一下:
import torchprint(torch.cuda.is_available()) # Trueprint(torch.cuda.get_device_name(0)) # NVIDIA GeForce RTX 5090坑二:pyannote 模型需要 HuggingFace 授权
pyannote 的说话人分离模型是 gated model,免费,但需要在 HuggingFace 网页上手动点一下"同意用户协议":
点完之后,本地登录一下:
huggingface-cli login03
转录 + 说话人分离
核心脚本大约 100 行,流程分四步:
[1/4] 加载 Whisper large-v3 模型[2/4] 转录音频(识别到 218 个语音片段)[3/4] 对齐时间戳[4/4] 说话人分离(diarization)关键代码片段:
import whisperxfrom whisperx.diarize import DiarizationPipeline# 转录model = whisperx.load_model("large-v3", device="cuda", compute_type="float16", language="zh")audio = whisperx.load_audio("recording1.m4a")result = model.transcribe(audio, batch_size=16, language="zh")# 时间戳对齐align_model, metadata = whisperx.load_align_model(language_code="zh", device="cuda")result = whisperx.align(result["segments"], align_model, metadata, audio, "cuda")# 说话人分离diarize_model = DiarizationPipeline(token=HF_TOKEN, device="cuda")diarize_segments = diarize_model(audio, min_speakers=2, max_speakers=2)result = whisperx.assign_word_speakers(diarize_segments, result)注意:WhisperX 3.8.x 版本中,
DiarizationPipeline不再暴露在顶层模块,需要从whisperx.diarize导入。参数也从use_auth_token改成了token。
输出
转录完成后生成两个文件:
- JSON 文件
每个片段的文字、时间戳、说话人标签 - TXT 文件
格式化的对话稿
说话人会被标记为SPEAKER_00和SPEAKER_01,跑完之后看一眼内容,手动映射到真实姓名就行。
效果
90 分钟录音,RTX 5090 上大约跑了3-4 分钟。识别准确率相当高,中文基本没有明显错字,中英混合(比如说话中夹杂的 "design""engineering""well-being")也能正确识别。
说话人分离整体准确,偶尔在两人接话很快的地方会归错人,但占比很小。
04
最难的部分是断句
转录出来的文字有一个大问题:没有标点。
Whisper 对英文会自动加标点,但对中文经常输出一整段没有任何逗号句号的文字。90 分钟的录音,出来的就是一大坨文字墙,根本没法读。
尝试一:基于时间戳的停顿检测
第一反应是利用词级时间戳,如果两个字之间有明显停顿(比如 0.5 秒),那就是一个句子的边界。
结果发现 WhisperX 对中文的词级时间戳间隔全部为零。每个字的start紧接上一个字的end,没有任何停顿信息。这条路走不通。
尝试二:多语言标点恢复模型
试了deepmultilingualpunctuation这个库,它基于 transformer 模型预测标点位置。
效果很差,它主要是为欧洲语言设计的,对中文的标点预测几乎是随机的,甚至会把标点插在一个汉字的中间(比如把"情感"断成"情.感")。
最终方案:基于中文口语规则的启发式断句
最后写了一个规则引擎,基于中文口语的语法特征来断句:
# 句末语气词 → 后面加句号SINGLE_ENDERS = ["吧", "吗", "呢", "啊", "哈", "嗯"]# 连接词/转折词 → 前面加逗号CLAUSE_STARTERS = ["然后", "但是", "因为", "所以", "其实","比如说", "就是说", "怎么说呢", ...]# 最大无标点长度 → 强制断句MAX_CHARS_NO_PUNCT = 45逻辑很简单:
遇到语气词(吗、吧、呢、啊),且当前句子已经足够长 → 加句号 遇到连接词(然后、但是、因为),且前面已经积累了足够的文字 → 加逗号 句子超过 45 个字还没有标点 → 强制加逗号
效果不完美,但比没有标点好太多了。口语本身就没有严格的句子边界,启发式规则能覆盖大部分情况,剩下的交给人工润色。
05
从口语记录到可发布文稿
自动断句之后的文稿大约 12000 字,可以读了,但还是充满口语痕迹。这一步我借助 Claude Code 做了以下处理:
1. 精简口语重复
原文:
然后就是说那个因为我自己的那个爱好比较广就是说我一方面就是说我是那个程序员然后另一方面就是我还愿意去做一些跟艺术这样3D建模啊画画这些这些这些艺术相关的创作工具吧然后
整理后:
因为我自己的爱好比较广,一方面我是程序员,另一方面我还愿意去做一些跟艺术相关的创作,比如3D建模、画画。
"然后""就是说""那个""呃"这些口语填充词,在正式文稿中需要大量删减。
2. 统一语言
- 简繁混杂
Whisper 有时会输出繁体字(可能是说话人语调触发了繁体模型),需要统一为简体 - 中英夹杂
Nicole 说话时经常夹杂英文专业术语,需要根据上下文判断。常用的保留(AI、Logo、ChatGPT),专业但有对应中文的替换(background → 背景,brainstorming → 头脑风暴,critical creative thinking → 批判性创造思维)
3. 结构化
把一个半小时的对话按话题分成了 11 个段落,每段加小标题。去掉了与采访主题无关的私人闲聊。加了导言(介绍背景)和后记(总结观点)。
最终成稿约 5000 字,从 12000 字的原始记录精简了一半以上。
最终产出
recording1.m4a → 90分钟录音 ↓ WhisperX + pyannote采访稿_Nicole.json → 218个语音片段,含时间戳和说话人 ↓ 规则断句采访稿_Nicole.txt → 自动断句版(~12000字) ↓ 人工润色采访稿_Nicole_整理版.txt → 最终发布版(~5000字)06
经验总结
什么效果好
- WhisperX 的中文识别质量
超出预期,错字率很低,中英混合也处理得很好 - 说话人分离
在两人对话场景下表现稳定,绝大部分片段归属正确 - RTX 5090 + CUDA
让 90 分钟音频的全流程处理只需要几分钟
什么效果不好
- 中文标点恢复
是整个流程中最弱的环节。Whisper 对中文几乎不加标点,词级时间戳也没有停顿信息,现有的多语言标点模型对中文支持很差。最终只能靠规则凑合 - 口语转书面语
目前还是需要大量人工介入。口语中的重复、断句、语序调整,AI 辅助能加速但替代不了人的判断
如果再做一次,我会改什么
转录时尝试给 Whisper 设置 initial_prompt,写一段带标点的中文引导文本,可能会让模型倾向于输出标点断句环节可以考虑用大语言模型(比如 Claude API)做后处理,给它一段无标点文本让它加标点,效果应该远好于规则引擎 如果采访更正式,会用两个独立麦克风分轨录制,这样说话人分离就不需要了。
夜雨聆风