选择环境,不要混用CUDA组合
faster-whisper使用CTranslate2执行Whisper模型。当前官方说明的近期CTranslate2 GPU组合使用CUDA 12与cuDNN 9,旧版组合有不同要求。安装前核对所选版本README,保存faster-whisper、CTranslate2、驱动与库版本。驱动版本不等于cuDNN已安装,nvidia-smi显示CUDA版本也不证明全部用户态库齐全。
本文用Linux、独立虚拟环境和一份非敏感中文录音测试。无GPU机器可改为cpu与int8,但不能沿用GPU速度预期。语音文件可能含个人信息,下载模型后可以内网运行,不要未经授权上传录音到公共服务。
安装并固定一次成功组合
python3 -m venv .asr-env
source .asr-env/bin/activate
pip install faster-whisper
pip install 'huggingface_hub[cli]'
mkdir -p /srv/models/whisper-small
hf download Systran/faster-whisper-small \
--local-dir /srv/models/whisper-small
python -c "import ctranslate2; print(ctranslate2.__version__)"
pip freeze > asr-requirements.lock.txt示例使用small验证链路,准确率不等同于large-v3。升级大模型前先测模型加载、显存和输入分布。模型权重是转换后的CTranslate2格式,不能将原始PyTorch checkpoint随意放进同一路径。
生成可复核的SRT
保存以下代码为transcribe.py。迭代segments时才实际执行主要识别工作,计时不能只量transcribe函数返回。
import time
from pathlib import Path
from faster_whisper import WhisperModel
def stamp(t):
ms = max(0, round(t*1000))
h, ms = divmod(ms,3600000)
m, ms = divmod(ms,60000)
s, ms = divmod(ms,1000)
return f'{h:02}:{m:02}:{s:02},{ms:03}'
model = WhisperModel('/srv/models/whisper-small',
device='cuda',compute_type='float16')
t0=time.perf_counter()
segments, info = model.transcribe('sample.wav', language='zh',
beam_size=5, vad_filter=True, condition_on_previous_text=False)
rows=[]
for i, segment in enumerate(segments,1):
text=segment.text.strip()
rows.append(f'{i}\n{stamp(segment.start)} --> {stamp(segment.end)}\n{text}\n')
Path('sample.srt').write_text('\n'.join(rows),encoding='utf-8')
elapsed=time.perf_counter()-t0
print({'language':info.language,'duration':info.duration,
'elapsed':elapsed,'rtf':elapsed/max(info.duration,0.001)})python transcribe.pyCPU替换为device='cpu', compute_type='int8'。RTF是耗时除音频时长,低于1表示这次处理快于音频播放,但包含首次加载与否会改变结果。这里在模型加载后计时,应同时单独记录加载时间,避免把热模型结果误用于冷启动估计。
VAD、术语与长录音
vad_filter可帮助处理静音,但过强分段可能切掉弱声或短词。用带背景噪声、多人交替和低音量片段比较开启与关闭条件。condition_on_previous_text=False可减少部分跨段错误传播,却可能影响连贯性,应按业务测试而不是永久认为优于默认。
技术会议中的型号、英文缩写和人名需要专门标注集。可尝试initial_prompt提供领域词汇,但提示词不能保证所有词被正确识别,也不能把希望出现的词强行当作实际内容。字幕仍应抽样回听,特别是数字、否定词和金额。
验收与批量任务
选取30段录音,覆盖清晰、噪声、静音和长段落,人工转写真值。分别统计字符错误率、时间戳偏移和幻觉段落。高压缩比、低置信信息可作为人工复核线索,不直接当作可信度百分比。
批量处理先使用单进程顺序队列,每份音频保存输入哈希、模型版本、参数、耗时和输出文件。失败任务不覆盖上一份成功字幕。容量扩大后再测试并行,每个GPU工作进程都会加载模型,不无限创建子进程。
常见故障
cublas或cudnn库无法加载,按所选CTranslate2版本核对动态库和路径;compute_type不支持就查询设备支持或选择int8;无法解码先确认文件确实是音频而非错误页面。长静音生成句子时检查VAD和历史条件,并标记人工复核,不继续自动发布。
回滚保留asr-requirements.lock.txt和模型revision,恢复上一组合后重跑30段样本。官方依据:faster-whisper。
音频预处理的边界
同一段录音的容器格式、编码、采样率与声道不同,解码耗时和识别结果也可能变化。先记录原文件信息,用标准工具检查时长和损坏情况,再决定是否统一格式。左右声道分别包含不同说话人时,直接混音可能增加重叠,应按业务需求分轨或保留原声道。不要反复有损转码来“压缩模型输入”,这可能丢失弱声和高频信息。
长会议可先按合理时间边界切分,保留原始时间偏移,生成SRT时再加回偏移。切片之间的重叠要去重,不能把重复句子当作模型幻觉。模型不会自动可靠区分所有说话人,转写与说话人分离属于不同任务;若需要标注姓名,必须另行验证并得到授权。
模型大小与任务质量
small用于快速建立链路,后续比较更大模型时保持相同音频和参数。清晰普通话、方言、英语术语、低音量和多人重叠分别统计,不用一个总体字符错误率覆盖所有条件。会议里的产品编号和数字可单独列词表,但提示词不能成为强制输出,更不能把领域词表里的词当成录音中确实出现的内容。
字幕时间戳允许范围应由使用场景决定。视频编辑需要较准位置,内部会议记录可能更重内容;两者验收不同。人工复核抽样应覆盖低置信、静音与术语密集段,不能只选最清晰的开头。删除语气词或改写句子属于编辑加工,必须与原始转写分开保存。
批处理资源与恢复
每个任务记录输入哈希、模型版本、设备、精度、参数和输出文件。先完成一份再提交下一份,观察连续运行中的内存与GPU占用。并发增加时会产生多份模型或临时解码状态,主机内存、SSD和队列都可能先成为瓶颈,不能只看卡上还有剩余显存就无限加任务。
失败状态保留原因与已完成片段,恢复后不覆盖人工修订的字幕。任务结果写到唯一文件,再原子切换完成状态,避免用户下载一半内容。确认GPU动态库组合后保存锁定清单,升级前复跑三十段样本,比较质量、时间戳和耗时。业务录音备份、访问权限与保留周期纳入运维,不因采用本地模型就忽略隐私风险。
批量目录遍历只接受经过审核的音频后缀与实际可解码文件,拒绝把网页错误响应当录音。生成字幕后抽查末尾时间是否超出原始时长、是否有空条目与逆序时间戳。确认完成再提供下载,重复任务保持独立运行ID,避免覆盖已经人工校订的版本。
来源:网昱算力学院 · 技术编辑。第三方内容版权归原作者或发布机构所有;本站仅在许可证或明确授权允许时提供本地原文。
- 原文语言
- ZH
- 原文更新时间
- 未提供
- 许可证
- 原创工程内容
