whisper_streaming
Whisper实时流式处理用于长语音转文本转录和翻译
将Whisper转变为实时转录系统
演示论文,作者:Dominik Macháček、Raj Dabre、Ondřej Bojar,2023年
摘要:Whisper是最近的多语言语音识别和翻译模型之一,处于最先进水平,但它并非为实时转录而设计。在本文中,我们在Whisper的基础上创建了Whisper-Streaming,这是一个Whisper类模型的实时语音转录和翻译实现。Whisper-Streaming使用具有自适应延迟的本地一致性策略来实现流式转录。我们展示了Whisper-Streaming在未分段的长形式语音转录测试集上实现了高质量和3.3秒的延迟,并证明了它作为多语言会议实时转录服务组件的稳健性和实用性。
幻灯片 -- IJCNLP-AACL 2023 15分钟口头报告
请引用我们。ACL Anthology,Bibtex引用:
@inproceedings{machacek-etal-2023-turning,
title = "Turning Whisper into Real-Time Transcription System",
author = "Mach{\'a}{\v{c}}ek, Dominik and
Dabre, Raj and
Bojar, Ond{\v{r}}ej",
editor = "Saha, Sriparna and
Sujaini, Herry",
booktitle = "Proceedings of the 13th International Joint Conference on Natural Language Processing and the 3rd Conference of the Asia-Pacific Chapter of the Association for Computational Linguistics: System Demonstrations",
month = nov,
year = "2023",
address = "Bali, Indonesia",
publisher = "Association for Computational Linguistics",
url = "https://aclanthology.org/2023.ijcnlp-demo.3",
pages = "17--24",
}
安装
-
pip install librosa soundfile
-- 音频处理库 -
Whisper后端。
集成了几种替代后端。最推荐的是支持GPU的faster-whisper。按照他们的说明安装NVIDIA库 -- 我们成功使用了CUDNN 8.5.0和CUDA 11.7。使用pip install faster-whisper
安装。
另一种限制较少但速度较慢的后端是whisper-timestamped:pip install git+https://github.com/linto-ai/whisper-timestamped
第三,也可以通过OpenAI Whisper API运行此软件。这种解决方案速度快且不需要GPU,只需一个小型虚拟机就足够了,但你需要向OpenAI支付API访问费用。另外请注意,由于每个音频片段都会被多次处理,价格会比定价页面上显示的更高,所以在使用时请密切关注成本。设置更高的chunk-size可以显著降低成本。
使用以下命令安装:pip install openai
要使用openai-api后端运行,请确保在OPENAI_API_KEY
环境变量中设置了你的OpenAI API密钥。例如,在运行之前,执行:export OPENAI_API_KEY=sk-xxx
,将sk-xxx替换为你的API密钥。
后端仅在被选择时加载。未使用的后端无需安装。
- 可选,不推荐:句子分割器(又称句子标记器)
集成并评估了两种缓冲区修剪选项。它们对质量和延迟有影响。根据我们的测试,默认的"segment"选项表现更好,且不需要安装任何句子分割器。
另一个选项"sentence" -- 在确认的句子结尾处修剪,需要安装句子分割器。它通过句号将带标点的文本分割成句子,避开不是句号的点。分割器是特定语言的。未使用的分割器无需安装。我们集成了以下分割器,但欢迎对更好的替代方案提出建议。
-
pip install opus-fast-mosestokenizer
用于语言代码为as bn ca cs de el en es et fi fr ga gu hi hu is it kn lt lv ml mni mr nl or pa pl pt ro ru sk sl sv ta te yue zh
的语言 -
pip install tokenize_uk
用于乌克兰语 --uk
-
对于其他语言,我们集成了
wtpslit
的性能良好的多语言模型。它需要pip install torch wtpsplit
,以及其神经网络模型wtp-canine-s-12l-no-adapters
。首次使用时会下载到默认的huggingface缓存中。 -
我们没有找到Whisper支持但wtpsplit不支持的语言
as ba bo br bs fo haw hr ht jw lb ln lo mi nn oc sa sd sn so su sw tk tl tt
的分割器。这些语言的默认备选方案是使用未指定语言的wtpsplit。欢迎提供替代建议。
如果在安装opus-fast-mosestokenizer时遇到问题,特别是在Windows和Mac上,我们建议只使用不需要它的"segment"选项。
使用方法
从音频文件进行实时模拟
usage: whisper_online.py [-h] [--min-chunk-size MIN_CHUNK_SIZE] [--model {tiny.en,tiny,base.en,base,small.en,small,medium.en,medium,large-v1,large-v2,large-v3,large}] [--model_cache_dir MODEL_CACHE_DIR] [--model_dir MODEL_DIR] [--lan LAN] [--task {transcribe,translate}]
[--backend {faster-whisper,whisper_timestamped,openai-api}] [--vad] [--buffer_trimming {sentence,segment}] [--buffer_trimming_sec BUFFER_TRIMMING_SEC] [--start_at START_AT] [--offline] [--comp_unaware]
audio_path
位置参数:
audio_path 用于模拟实时流的16kHz单声道wav文件名。
选项:
-h, --help 显示此帮助信息并退出
--min-chunk-size MIN_CHUNK_SIZE
最小音频块大小(秒)。它最多等待这么长时间才进行处理。如果处理时间更短,它会等待,否则会处理在此期间接收到的整个片段。
--model {tiny.en,tiny,base.en,base,small.en,small,medium.en,medium,large-v1,large-v2,large-v3,large}
要使用的Whisper模型的名称大小(默认:large-v2)。如果模型缓存目录中不存在,会自动从模型中心下载。
--model_cache_dir MODEL_CACHE_DIR
覆盖默认模型缓存目录,用于保存从模型中心下载的模型
--model_dir MODEL_DIR
保存Whisper model.bin和其他文件的目录。此选项覆盖--model和--model_cache_dir参数。
--lan LAN, --language LAN
源语言代码,例如en,de,cs,或'auto'用于语言检测。
--task {transcribe,translate}
转录或翻译。
--backend {faster-whisper,whisper_timestamped,openai-api}
仅加载此后端进行Whisper处理。
--vad 使用VAD = 语音活动检测,使用默认参数。
--buffer_trimming {sentence,segment}
缓冲区修剪策略 -- 修剪由标点符号标记并由句子分割器检测到的已完成句子,或由Whisper返回的已完成段落。"sentence"选项需要安装句子分割器。
--buffer_trimming_sec BUFFER_TRIMMING_SEC
缓冲区修剪长度阈值(秒)。如果缓冲区长度超过此值,将触发句子/段落修剪。
--start_at START_AT 在此时间开始处理音频。
--offline 离线模式。
--comp_unaware 计算不感知模拟。
示例:
它从预先录制的单声道16k wav文件模拟实时处理。
python3 whisper_online.py en-demo16.wav --language en --min-chunk-size 1 > out.txt
模拟模式:
-
默认模式,无特殊选项:从文件进行实时模拟,计算感知。块大小为
MIN_CHUNK_SIZE
或更大,如果在上次更新计算期间到达了更多音频。 -
--comp_unaware
选项:计算不感知模拟。这意味着计算发射时间的计时器在模型计算时"停止"。块大小始终为MIN_CHUNK_SIZE
。延迟仅由模型无法确认输出引起,例如由于语言歧义等,而不是由于硬件速度慢或实现不佳。我们实现此功能是为了找出延迟的下限。 -
--start_at START_AT
:在此时间开始处理音频。第一次更新接收到START_AT
之前的所有音频。这对调试很有用,例如当我们在音频文件的特定时间观察到错误,并想快速重现它,而无需长时间等待。 -
--offline
选项:它一次性处理整个音频文件,以离线模式。我们实现它是为了找出给定音频文件上可能的最低WER。
输出格式
2691.4399 300 1380 Chairman, thank you.
6914.5501 1940 4940 If the debate today had a
9019.0277 5160 7160 the subject the situation in
10065.1274 7180 7480 Gaza
11058.3558 7480 9460 Strip, I might
12224.3731 9460 9760 have
13555.1929 9760 11060 joined Mrs.
14928.5479 11140 12240 De Kaiser and all the
16588.0787 12240 12560 other
18324.9285 12560 14420 colleagues across the
作为模块使用
简而言之:使用OnlineASRProcessor对象及其方法insert_audio_chunk和process_iter。 whisper_online.py 代码有很好的注释,请将其作为完整文档阅读。
以下伪代码描述了我们建议您实现的接口。您可以根据应用需求实现任何功能。
from whisper_online import *
src_lan = "en" # 源语言
tgt_lan = "en" # 目标语言 -- 对于ASR任务与源语言相同,如果使用翻译任务则为"en"
asr = FasterWhisperASR(lan, "large-v2") # 加载并封装Whisper模型
# 设置选项:
# asr.set_translate_task() # 将从lan翻译成英语
# asr.use_vad() # 设置使用VAD
online = OnlineASRProcessor(asr) # 创建处理对象,使用默认缓冲区裁剪选项
while 音频未结束: # 处理循环:
a = # 接收新的音频块(例如,先等待min_chunk_size秒,...)
online.insert_audio_chunk(a)
o = online.process_iter()
print(o) # 对当前部分输出进行处理
# 在音频处理结束时
o = online.finish()
print(o) # 对最后的输出进行处理
online.init() # 如果要重复使用该对象处理下一段音频,请刷新
服务器 -- 从麦克风实时处理
whisper_online_server.py
具有与 whisper_online.py
相同的模型选项,另外还有 --host
和 --port
用于TCP连接,以及 --warmup-file
。请查看帮助信息(-h
选项)。
客户端示例:
arecord -f S16_LE -c1 -r 16000 -t raw -D default | nc localhost 43001
-
arecord 以原始音频格式从声音设备(如麦克风)发送实时音频 -- 16000采样率,单声道,S16_LE -- 有符号16位整数小端序。(使用适合您的arecord替代方案)
-
nc 是带有服务器主机和端口的netcat
背景
默认的Whisper适用于最长30秒且包含一个完整句子的音频块。更长的音频文件必须被分割成更短的块,并用"初始提示"合并。在低延迟同步流模式下,简单和幼稚的固定大小窗口分块效果不佳,可能会在单词中间分割。同时还需要知道转录何时稳定,应该确认("提交")并跟进,以及何时未来内容使转录更清晰。
为此,有LocalAgreement-n策略:如果n个连续更新(每个都有新可用的音频流块)在前缀转录上达成一致,则确认该转录。(参考:IWSLT 2022等的CUNI-KIT)
在本项目中,我们重用了Peter Polák的这个演示中的想法:
https://github.com/pe-trik/transformers/blob/online_decode/examples/pytorch/online-decoding/whisper-online-demo.py
然而,它不进行任何句子分割,但Whisper会产生标点符号,而faster-whisper
和whisper_transcribed
库会生成单词级时间戳。简而言之:我们连续处理新的音频块,输出经2次迭代确认的转录,并在确认的完整句子时间戳处滚动音频处理缓冲区。处理音频缓冲区不会太长,处理速度很快。
更详细地说:我们使用初始提示,处理不准确的时间戳,重新处理确认的句子前缀并跳过它们,确保它们不重叠,并限制处理缓冲区窗口。
性能评估
贡献
欢迎贡献。我们特别感谢:
- GitHub贡献者提供新功能和错误修复的拉取请求。
- 精彩解释视频 -- 2024年3月31日发布,不包含较新的更新。
- 本仓库的中文翻译。
- Ondřej Plátek进行论文预审。
- Peter Polák提供原始想法。
- ELITR项目的UEDIN团队提供原始line_packet.py。
联系方式
Dominik Macháček, machacek@ufal.mff.cuni.cz