我该如何在OpenAI的Whisper ASR中获取单词级别的时间戳?

15
我使用OpenAI的Whisper Python库进行语音识别。如何获取单词级别的时间戳?

使用OpenAI的Whisper进行转录(在Ubuntu 20.04 x64 LTS上测试,使用Nvidia GeForce RTX 3090):

conda create -y --name whisperpy39 python==3.9
conda activate whisperpy39
pip install git+https://github.com/openai/whisper.git 
sudo apt update && sudo apt install ffmpeg
whisper recording.wav
whisper recording.wav --model large

如果使用Nvidia GeForce RTX 3090,请在conda activate whisperpy39后添加以下内容:
pip install -f https://download.pytorch.org/whl/torch_stable.html
conda install pytorch==1.10.1 torchvision torchaudio cudatoolkit=11.0 -c pytorch
3个回答

13
我创建了一个存储库,用于恢复单词级时间戳(和置信度),以及更精确的分段时间戳:https://github.com/Jeronymous/whisper-timestamped 它基于Whisper的交叉注意力权重构建,就像Whisper存储库中这个笔记本中所示。我对方法进行了微调以获得更好的位置,并添加了实时获取交叉注意力的可能性,因此无需两次运行Whisper模型。处理长音频时没有内存问题。
注意:首先,我尝试使用wav2vec模型的方法来重新对齐Whisper转录的单词到输入音频。它工作得相当好,但有很多缺点:需要处理单独的(wav2vec)模型,在完整信号上执行另一次推断,每种语言都需要一个wav2vec模型,规范化转录文本以使字符集与wav2vec模型匹配(例如将数字转换为字符,符号如“%”,货币...)。此外,对话不流畅的部分通常被Whisper删除,因此对齐可能会出现问题(例如被重新表述的句子开头缺失)。

顺便说一句,这个库真是太美妙了。在我的情况下,我已经有一个音频的文本记录,只需要时间戳。有没有一种方法可以将转录提供给改进准确度?例如使用initial_prompt选项? - Mallory-Erik
@Mallory-Erik 我还没有看过Jeronymous存储库,但是如果您查看最新的Whisper笔记本(Multilingual_ASR.ipynb)中的单元格19,以“tokens = torch.tensor(...”开头的行使用转录的标记生成模型输入。您可以将标记替换为自己的抄本以实现所需的效果。 - Nick Fisher
wav2vec模型也非常适合将转录与音频信号对齐,因为它们为每个音频帧上的字符分配概率。 您可以查看https://pytorch.org/audio/stable/tutorials/forced_alignment_tutorial.html 您只需要确保找到适用于要处理的语言的wav2vec模型,并且该模型的字符集与您的转录一致(您可能需要规范化您的转录,例如小写,"num2words"转换,标点符号去除等)。 - Jeronymous

7

Whisper中只提到了“短语级别的时间戳”(phrase-level timestamps),我可以从中推断出,如果不添加更多代码,是无法获得单词级别的时间戳的。

来自Whisper作者之一的信息

直接获得单词级别的时间戳并不支持,但使用预测的时间戳令牌分布或交叉注意力权重可能是可行的。

Stable-ts(MIT许可证):

该脚本修改了Whisper模型的方法,以便在不需使用额外推理的情况下获得对每个单词的预测时间戳标记的访问权限。它还将时间戳稳定到单词级别,以确保时序正确。

请注意:

另一个选择是使用一些单词级别的强制对齐程序。例如,Lhotse(Apache-2.0许可证)已经集成了Whisper ASR和Wav2vec强制对齐

enter image description here


如何获取“短语级时间戳”? - zero_cool

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接