个人作品https://github.com/nihaina/SubtitleEditforAndroid
粗略打轴
使用silero_vad识别语音段,使用asr按语音段处理
优点:速度快,不容易oom,
缺点:vad实现原理导致不可能准确识别所有语音段。且语音段较短,准确度下降,vad更适用于会议记录,语音助手等场景
粗略打轴二次处理
使用相同或不同的vad模型以不同参数对于未识别到语音段的静音区域进行二次识别,识别到新的语言段后,选择性的和第一次vad识别语音段进行合并,该方案能相对减少过长语音段的出现概率
精细打轴
抛弃vad模型,直接使用ASR模型全量识别,根据token时间进行切分
实现难度较高,对于ctc模型,需要自行通过强制对齐等方式预测token持续时间,部分模型(如whisper)一个token包含多个字符,难以切分,传统方案Forced Alignment通过语素强制对齐,在ASR识别结果不完全准确的情况下,该方案基本没有效果
优点:以内容为主,确保文本准确,时间更准,有上下文
缺点:单段较长,易产生幻觉,whisper尤为明显,对ASR模型要求较高,为防止oom,需要固定分段处理,固定分段边界可能会截断语音,导致边界处识别不准确
字幕后处理方案
在ASR模型识别文本时,保留所有的token时间戳,将所有token文本切分格式化后拼接为完整文本,使用标点恢复模型或llm模型添加标点。以标点所在位置为时间边界切分token时间,可以保证按照语义切分字幕,比按照静音时间切分更准确,llm只负责添加标点符号,相对节省token
音频预处理方案
使用demucs模型分离人声和效果音
对于多人同时说话的复杂场景,按照说话人日志做区分对于提高转录准确度没有帮助。可以使用SepFormer / Conv-TasNet框架进行盲源分离,如果语言固定为中英文,可使用MossFormer2实现更好的分离效果
一般多人声同时说话的音频为双声道音频,多个人声再分离开后单独转录文本,使用声源定位识别声音方向,ass等字幕格式支持在同一时间、不同位置同时显示两段或多段字幕,根据声音方向添加字幕,可以保证重叠字幕内容都能准确显示
以上为个人在开发软件时的总结,一些方案难以在手机上实现,如有其他方案,欢迎分享