继续发Whisper的研究报告。这次推荐的是whisper-webui+whisper-timestamped的方案。
whisper-timestamped前面说过,直接推理来校准whisper生成的字幕,不需要另外的wav2vec,但是其解决不了whisper固有的hallucination的问题。由于large-v3的hallucination特别严重,所以基本上只能用large-v2。
whisper-webui的重点不在于webui,而是它是利用vad先对音频按30s进行切割,然后对切割后的片段各自用whisper处理后再合并字幕(是不是发现跟Whisperx很像),基本上将hallucination问题消除了一大半,即使偶尔碰到,也不会带到下一个30s去,不会出现whisper那种一大片重复一句话的严重问题。但是由于没有校准,所以whisper那种每句字幕的时间轴都有点偏差的问题依旧。
于是想着将两者结合,试了一下是可行的,具体做法就是改whisper-webui的代码(主要是src/whisper/whisperContainer.py,让它本来调用whisper改成调用whisper-timestamped。不过水平有限,改出来的小问题还是挺多的,代码就不放了,希望有高手能将两个项目合并。
两者结合之后,大幅减少了hallucination的出现,也能用large-v3了,总体结果能与Whisperx打得有来有回。(说起来Whisperx真是强,尽管已经停止开发,但是目前就是没有对手。唯一的按句子合并导致一大坨的问题,通过spacy也基本解决,是目前最佳方案了)
whisper-webui+whisper-timestamped作为备用方案也算是相当不错,尤其是对于小语种特别友好。不过由于whisper-timestamped没法用fast whisper,所以速度是相当的慢(慢5~6x)。
whisper-timestamped速度慢的问题可以用distil-large-v3或large-v3-turbo模型来部分解决,distil-large-v3大概快6x,large-v3-turbo似乎更快点,不过差别不太大。准确率上好像是distil-large-v3更好,两者与large-v3相比都差不太多,不过distil-large-v3只有英语。
关于Whisper有时会没有标点没有首字母大写的问题,这个帖子有讨论
其中有人建议加提示词
–initial_prompt “Please do not forget the punctuations!”
试了试对于缺少标点的情况有用,但是对于一大坨没有断句的就没用。
又找到这个x.com
试了试有用,手头一个一大坨的就拆分得很干净了。
于是似乎是提示词写得越详细越有用。
目前打算抄这个
–initial_prompt “Whisper, as you transcribe speech into text, please ensure to include punctuation marks as accurately as possible. Additionally, when creating the timeline for the subtitles, try to split at the punctuation marks to ensure that sentences are not divided across different time segments. The goal is to have each sentence contained within a single time segment for clarity and coherence.”
不过应该只是缓解,不能完美解决。
喷了,我又试了一下,发现只要加prompt,就会大幅增加hallucination和丢句子的概率,而且prompt越长,出问题的概率越大。于是只有碰到大坨没断句的情况下才建议使用prompt。