WhisperX:实时语音转录与多说话人识别解决方案
原文链接:GitHub - whisperX/README.md
作者:Max Bain
译者:倔强青铜三
前言
大家好,我是倔强青铜三。是一名热情的软件工程师,我热衷于分享和传播IT技术,致力于通过我的知识和技能推动技术交流与创新,欢迎关注我,微信公众号:倔强青铜三。欢迎点赞、收藏、关注,一键三连!!!
WhisperX:加速语音转录与精准说话人识别
WhisperX是一个快速自动语音识别(ASR)解决方案,支持70倍实时转录(使用large-v2模型),提供逐词时间戳和说话人日志功能。以下是其主要特性:
- 高速批量推理:使用whisper large-v2模型实现70倍实时转录轻量级后端:基于faster-whisper,large-v2模型在beam_size=5时仅需<8GB GPU内存精准逐词时间戳:通过wav2vec2对齐技术实现多说话人ASR:利用pyannote-audio的说话人日志功能(提供说话人ID标签)语音活动检测(VAD)预处理:减少幻觉现象,支持批量处理且不影响词错误率(WER)
OpenAI开发的Whisper模型虽然转录准确度高,但其时间戳仅在话语级别,而非逐词级别,且可能存在数秒误差。此外,原生Whisper不支持批量处理。WhisperX通过集成以下技术解决了这些问题:
- 音素级ASR:微调模型以识别最小语音单元(如“tap”中的p元素),典型代表为wav2vec2.0强制对齐:将文字转录与音频记录对齐,自动生成音素级分割语音活动检测(VAD):检测人类语音的存在或缺失说话人日志:将音频流按说话人身份分割为同质段落
新特性🚨
- Ego4d转录挑战赛第一名🏆WhisperX被INTERSPEECH 2023会议收录v3版本发布:采用nltk句子分割技术,提升字幕生成和日志效果,开源70倍加速的批量whisper与faster-whisper后端v2版本发布:代码重构,启用默认VAD过滤(与论文一致)论文发布🎓👨🏫:详见我们的ArXiv预印本,介绍WhisperX基准测试及细节,同时引入更高效的批量推理技术,实现large-v2模型60-70倍实时速度
安装⚙️
1. 简单安装(推荐)
通过PyPi安装WhisperX最简便:
pip install whisperx
或者使用uvx:
uvx install whisperx
2. 高级安装选项
这些安装方法适用于开发者或有特定需求的用户。若不确定,建议使用上述简单安装。
选项A:从GitHub安装
直接从GitHub仓库安装:
uvx git+https://github.com/m-bain/whisperX.git
选项B:开发者安装
若需修改代码或贡献项目:
git clone https://github.com/m-bain/whisperX.gitcd whisperXuv sync --all-extras --dev
注意:开发版本可能包含实验性功能和漏洞。生产环境请使用稳定的PyPI版本。
您可能还需要安装ffmpeg、rust等。请遵循OpenAI的安装指南:github.com/openai/whis…
说话人日志功能
启用说话人日志需包含您的Hugging Face访问令牌(读取权限),您可从此处生成,并接受以下模型的用户协议:分割模型和Speaker-Diarization-3.1(若使用Speaker-Diarization 2.x,请参考此处要求)。
注意:截至2023年10月11日,pyannote/Speaker-Diarization-3.0在WhisperX中存在性能缓慢问题。这是由于faster-whisper与pyannote-audio 3.0.0之间的依赖冲突。详情及解决方法请参见此问题。
使用方法💬(命令行)
英语
在示例片段上运行whisper(使用默认参数,whisper small模型),添加--highlight_words True
可在.srt文件中可视化逐词时间。
whisperx path/to/audio.wav
使用WhisperX与wav2vec2.0 large模型强制对齐的结果:
与原始whisper模型相比,许多转录音频不同步:
如需提高时间戳精度(以增加GPU内存为代价),可使用更大模型(更大对齐模型未发现明显优势,详见论文),例如:
whisperx path/to/audio.wav --model large-v2 --align_model WAV2VEC2_ASR_LARGE_LV60K_960H --batch_size 4
为转录添加说话人ID标签(如已知说话人数,可设置--min_speakers 2
和--max_speakers 2
):
whisperx path/to/audio.wav --model large-v2 --diarize --highlight_words True
在CPU而非GPU上运行(适用于Mac OS X):
whisperx path/to/audio.wav --compute_type int8
其他语言
音素ASR对齐模型具有语言特异性,对于已测试语言,这些模型将自动从torchaudio管道或huggingface中选择。只需传入--language
代码,并使用whisper --model large
。
目前通过torchaudio管道为{en, fr, de, es, it}
提供默认模型,其他语言可通过Hugging Face获取。如检测语言不在列表中,您需要在huggingface模型中心查找音素级ASR模型并在数据上进行测试。请查看alignment.py
中的DEFAULT_ALIGN_MODELS_HF
以获取当前支持语言列表。
示例:德语
whisperx --model large-v2 --language de path/to/audio.wav
更多语言示例请参见此处。
Python使用方法🐍
import whisperximport gcdevice = "cuda"audio_file = "audio.mp3"batch_size = 16 # 如GPU内存不足可减小此值compute_type = "float16" # 如GPU内存不足可改为"int8"(可能降低精度)# 1. 使用原始whisper进行批量转录model = whisperx.load_model("large-v2", device, compute_type=compute_type)# 可选择将模型保存至本地路径(可选)# model_dir = "/path/"# model = whisperx.load_model("large-v2", device, compute_type=compute_type, download_root=model_dir)audio = whisperx.load_audio(audio_file)result = model.transcribe(audio, batch_size=batch_size)print(result["segments"]) # 对齐前的片段# 如GPU资源紧张,可删除模型# import gc; gc.collect(); torch.cuda.empty_cache(); del model# 2. 对齐whisper输出model_a, metadata = whisperx.load_align_model(language_code=result["language"], device=device)result = whisperx.align(result["segments"], model_a, metadata, audio, device, return_char_alignments=False)print(result["segments"]) # 对齐后的片段# 如GPU资源紧张,可删除模型# import gc; gc.collect(); torch.cuda.empty_cache(); del model_a# 3. 分配说话人标签diarize_model = whisperx.DiarizationPipeline(use_auth_token=YOUR_HF_TOKEN, device=device)# 如已知最小/最大说话人数,可添加参数diarize_segments = diarize_model(audio)# diarize_model(audio, min_speakers=min_speakers, max_speakers=max_speakers)result = whisperx.assign_word_speakers(diarize_segments, result)print(diarize_segments)print(result["segments"]) # 片段现已分配说话人ID
演示🚀
如无自有GPU,可通过上述链接尝试WhisperX。
技术细节👷♂️
有关批量处理和对齐的具体细节、VAD的影响以及所选对齐模型,请参阅预印本论文。
为降低GPU内存需求,可尝试以下方法(2和3可能影响质量):
- 减小批量大小,例如
--batch_size 4
使用更小的ASR模型--model base
使用更轻量的计算类型--compute_type int8
与OpenAI Whisper转录的差异:
- 无时间戳转录。为启用单次传递批量处理,whisper推理设置为
--without_timestamps True
,确保批次中每个样本仅进行一次前向传递。但这可能导致与默认whisper输出的差异。基于VAD的片段转录,与OpenAI的缓冲转录不同。WhisperX论文表明这可降低WER并实现准确的批量推理。默认设置--condition_on_prev_text
为False
(减少幻觉现象)限制⚠️
- 无法对齐包含对齐模型字典中不存在字符的文本词,例如“2014.”或“£13.60”,因此这些词不会被赋予时间戳。Whisper和WhisperX对重叠语音的处理效果不佳。日志功能远非完美。需要特定语言的wav2vec2模型。
贡献🧑🏫
如果您精通多种语言,为本项目做出重大贡献的方式之一是在huggingface上查找音素模型(或自行训练)并在目标语言的语音上进行测试。如结果良好,请发送拉取请求并附上成功示例。
同样,发现漏洞和提交拉取请求对于维持项目运转至关重要,因为它已超出原始研究范围。
待办事项🗓
- 多语言初始化基于语言检测的自动对齐模型选择Python使用方法集成说话人日志模型刷新,适用于低GPU内存资源faster-whisper后端添加max-line等(参考OpenAI的whisper utils.py)句子级片段(nltk工具箱)改进对齐逻辑更新带有日志和逐词高亮的示例恢复字幕.ass输出(v3中已移除)添加基准测试代码(TEDLIUM用于spd/WER和词分割)允许silero-vad作为替代VAD选项改进日志(逐词级)。比想象中难得多……
联系/支持📝
如有疑问,请联系maxhbain@gmail.com。
致谢🙏
我的博士研究和此项工作得到VGG(视觉几何组)和牛津大学的支持。
当然,这建立在OpenAI的whisper基础之上。
借鉴了PyTorch强制对齐教程的重要代码。
使用了出色的pyannote VAD/日志工具 github.com/pyannote/py…
来自以下来源的宝贵VAD和日志模型:
出色的faster-whisper和CTranslate2后端。
感谢为本项目提供财务支持的各位🙏
最后,感谢本项目的开源贡献者,他们维持项目运转并识别漏洞。
引用
如在研究中使用本项目,请引用以下论文:
@article{bain2022whisperx, title={WhisperX: Time-Accurate Speech Transcription of Long-Form Audio}, author={Bain, Max and Huh, Jaesung and Han, Tengda and Zisserman, Andrew}, journal={INTERSPEECH 2023}, year={2023}}