用 whisper 时发现识别的时间戳不准,用 whisperx 识别的字幕又太长,设置切段后发现效果更差,尝试用语言理解模型按句意切段后匹配字符级时间戳,结果发现时间戳根本不准,麻了
只能靠自己来解决问题了,先说一下代码的逻辑:
1 、用 ffmpeg 提取视频中的音频,切成 20 分钟的段,用 UVR5 分离人声,再拼成完整音频。
2 、对音频进行 VAD 识别,标出有人声活动的部分,得到 VAD 时间戳,这也是最终字幕的时间戳。
3 、按照 VAD 结果切段音频,每 30 分钟一组,每组内的音频用 2 秒的静音段隔开,得到新的音频段。并按照上述逻辑计算出一组新的时间戳。
4 、将合成后的新音频送入 whisper 识别,得到带时间戳的识别结果,用计算后的时间戳和识别结果进行匹配,得到字幕。
5 、匹配后的结果时间戳是错误的,按照对应关系把字幕同步到 VAD 时间戳,得到最终的字幕结果。
6 、分批把字幕喂给 Gemini 进行翻译,每次喂 100 行熟悉上下文,之后分 10 次获取翻译。
目前最大的问题是 whisper 识别容易出错,不知道如何设置 hotwords 和 prompt ,翻译逻辑也有问题,识别结果包含很多单独成行的语气词,每次翻译 100 行无法提供足够的上下文,应该考虑用滑动窗口或者过滤掉字符量小的行。
代码在 github.com/4evergr8/ASMRASR ,欢迎大家批评指正,谢谢
1
xmoiduts 27 天前
这不巧了,同样在做两个 side-project ,一个是云 GPU 人声分离 https://github.com/xmoiduts/vocal-extract-transcribe-bot , 一个是 whisper 音频提取字幕 https://github.com/xmoiduts/OpenAI-API-transcriber 。题主您比我走得远,我还没走到发现时间轴不准的阶段,因为我不打轴,全文投成专栏。
我的方案选型有少量不同: 之前尝试从 UVR 代码里扒一个专用于提取干声的东西,失败,UVR 的陈年代码耦合太紧了。 后来我转用了 MSST https://github.com/ZFTurbo/Music-Source-Separation-Training ,同样的模型,推理命令行超级直观。 切段由于受 whisper api 单文件 25MB 的限制,我做了按 码率 和 时长 双要素判定每片长度的逻辑。相邻两片之间重合 9 秒(随便定的),合并逻辑还没做,目前实际是我手工合并。 我完全不准备用 whisper 自动断的句,只用单词模式[timestamp_granularity: word],后续接入一个大模型断句。 - 不建议用 gemini 思考模型断句,会爆 COT ,但 gemini flash 系列不错。 翻译推荐 claude 系列,但是要注意 claude 3.5 系会偷懒,3.7 系会有些幻觉,要在提示词中加以监工,claude 有足够的反思能力。 |
![]() |
2
unclemcz 27 天前 via Android
平时用来识别英文播客字幕,还没碰到 whisper 时间轴不准的问题。
|
6
xmoiduts 25 天前 via Android
@340746 gemini 2.0 flash 试试
10:直播听写粗分句 作用:对直播文稿粗略分行 建议模型:gemini 2 flash ( ai studio )理由:8k 输出( ctx 2000 行左右上下文行号开始异常); 不推荐 2.5 pro thinking ,想得太多反而无法完成工作爆 COT ``` 你是一个文字处理 ai , 将以下听写文稿按照以下标准来断行,不要修改也不要校对文稿内容。 在每行之前加入行(L for Line)号,例如 `{L1} 正文正文正文` ,请忠实断行并正常分配行号,只输出非空的行。 原文中的换行仅用于限制原文单行长度,请勿视为带有语义 模拟 YouTube 字幕的显示效果,遵循以下规则: - 每行字符数不超过约{拉丁字母:80 ,中日类:35}个字符。 - 优先在自然停处进行断句,例如句号、逗号、语气词等。 - 尽量保持语义完整性,避免在词组中间断句。 - 短句可以单独成行。 - 长句可以跨多行,但要在合适的位置断开。 - 保持视觉上的整洁,避免过长或过短的行。 - 考虑朗读时的自然停顿和节奏。 输出到 multiline text block 中 ``` {前五行断行结果} --process-full-text? -Y --line-number-start = L467 # (这个是给 claude 的监工代码,实际没什么用,删了也行) {大段未断行正文} |