论文:Turning Whisper into Real-Time Transcription System
code:https://github.com/ufal/whisper_streaming
这篇文章介绍了最近一种先进的多语言语音识别和翻译模型Whisper,然而,它并非设计用于实时转录。在本文中,我们在Whisper基础上构建了Whisper-Streaming,这是一种实时语音转录和翻译的实现,类似于Whisper模型。Whisper-Streaming采用本地协议策略与自适应延迟,以实现流式转录。我们展示了Whisper-Streaming在未分割的长篇语音转录测试集上实现了高质量和3.3秒的延迟,并展示了它作为多语言会议现场转录服务中组件的稳健性和实用性。
Whisper-Streaming的核心组件和内部工作原理。它包括更新循环、音频缓冲区、跳过音频缓冲区中已确认的输出、修剪缓冲区、连接句间上下文,以及可选的语音活动检测。

图1 处理三个连续更新的示例。黄色高亮文本是“提示”,表示要遵循的先前上下文。黑色边框矩形是音频缓冲区,里面的文本是Whisper从该声音段生成的转录文本。蓝色垂直线是时间戳,将缓冲区分为两部分,左边是先前确认的部分,右边是未确认的部分。LocalAgreement-2策略,或搜索最长公共前缀,应用于未确认(右侧)部分的两个连续更新。最长公共前缀用绿色突出显示,绿色下划线突出显示新确认的输出,而绿色虚线下划线表示先前和随后确认的输出。灰色下划线示范了在被忽略的确认部分的更新。
更新循环 Whisper-Streaming的主要部分是一个程序,利用循环接收源音频块并触发流式策略更新。参数MinChunkSize控制延迟和质量,并确定每次迭代处理的最小持续时间。如果更新计算超过MinChunkSize,下一个更新将立即在累积的音频输入上执行。该参数影响延迟和质量。
音频缓冲区 Whisper被训练用于处理长达30秒且包含一个完整句子的序列。它提供标点和单词级别的时间戳。这个过程在图1中有所说明。每次更新都涉及将传入音频存储在音频缓冲区的顶部,并用Whisper处理整个缓冲区。我们保持不变的是缓冲区始终以新句子开头,以保持Whisper的高质量。LocalAgreement-2被应用于当前和先前的Whisper输出。“确认输出”中最后一个单词的时间戳被保存。在后续更新中,我们总是从缓冲区的开头重新处理Whisper,包括上一个“确认输出”时间戳之前的部分(在图1中以灰色背景表示)。确认部分中转录的更改被忽略,因为它们在意义上常常是微不足道的。
跳过确认部分 当确定相对于先前更新的上一个确认单词的转录单词位置时,我们考虑到了由于新音频块导致的Whisper时间戳的潜在不准确性和更新。如果一个单词的时间戳在距离上一个确认单词的1秒间隔内,我们比较其前面的n-gram(其中n的范围从1到5)与上一个确认输出中的后缀。如果它们匹配,我们跳过这些单词。然而,这个规则在未来的工作中可以通过包括诸如设置和微调字符编辑距离阈值、修剪n-gram中的标点符号和大小写等措施来进一步增强。
修剪音频缓冲区 为了避免延迟中不可接受的长峰值,音频缓冲区限制在约30秒左右。当确认输出包含结束句标点符号后面跟着一个开始新句子的单词时,缓冲区会在标点符号的时间戳处被修剪。为此目的使用了语言特定的句子分割工具(例如Koehn等人,2007),确保缓冲区始终包含一个单句。尽管如此,如果缓冲区长度超过30秒,我们会保留由Whisper标记的最后确认的段落。
连接句间上下文 Whisper的转录函数利用“prompt”参数来保持文档内的一致性(一致的风格、术语和句间引用)。我们从先前音频缓冲区的确认输出中提取最后200个单词作为“prompt”参数,如图1所示(黄色背景文本)。
语音活动检测 有一个参数用于激活或停用Whisper的默认语音活动检测(VAD)过滤器,影响质量和延迟。