尝试解决 whisper 识别字幕的痛点,大家帮忙看看还能不能优化一下

28 天前
 340746

用 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 ,欢迎大家批评指正,谢谢

1578 次点击
所在节点    分享创造
9 条回复
xmoiduts
28 天前
这不巧了,同样在做两个 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 有足够的反思能力。
unclemcz
28 天前
平时用来识别英文播客字幕,还没碰到 whisper 时间轴不准的问题。
GobyHsu
26 天前
@unclemcz 我之前用 whisper 的感觉是,其要求人声纯净度比较高,多点杂音就识别不出来,而且还容易识别出呵呵呵之类的一堆没必要作为字幕的语气词
340746
26 天前
@GobyHsu #3 确实,动作片的战斗场景的识别结果很糟糕
340746
26 天前
@unclemcz #2 日语的时间轴也不是很偏,最大的问题是句子太长,无法断句
xmoiduts
26 天前
@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 的监工代码,实际没什么用,删了也行)

{大段未断行正文}
xmoiduts
26 天前
@GobyHsu 识别出错误的语气词,是不是因为那段时间没有语音,只有静音或 BGM 。whisper 在这种情况下会有幻觉。
340746
26 天前
@xmoiduts #7 应该不太可能,我对音频进行了处理,去掉了背景音乐,只保留人声,每段人声间固定间隔 2 秒
340746
26 天前
@xmoiduts #6 试过对结果分句,whisperx 的字级时间戳也是偏的,字幕根本没法看

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://yangjunhui.monster/t/1130920

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX