Whisper:通用语音识别模型
Whisper 是一个通用的语音识别模型。它基于大规模、多样化的音频数据集进行训练,是一个具备多任务处理能力的模型,可实现多语言语音识别、语音翻译和语言识别等功能。
实现方法
Transformer 序列到序列模型在多种语音处理任务上进行训练,这些任务包括多语言语音识别、语音翻译、口语语言识别和语音活动检测。这些任务被统一表示为解码器需要预测的一系列标记,这样单个模型就能取代传统语音处理流程中的多个阶段。多任务训练格式使用了一组特殊标记,这些标记可作为任务说明符或分类目标。
环境设置
使用 Python 3.9.9 和 PyTorch 1.10.1 来训练和测试模型,但代码库预计与 Python 3.8 - 3.11 以及近期的 PyTorch 版本兼容。代码库还依赖于一些 Python 包,其中最主要的是 OpenAI 的 tiktoken,用于实现快速标记化。
可以使用以下命令下载并安装(或更新到)Whisper 的最新版本:
pip install -U openai-whisper
或者,使用以下命令从仓库拉取并安装最新提交的版本及其 Python 依赖项:
pip install git+https://github.com/openai/whisper.git
若要将包更新到仓库的最新版本,请运行:
pip install --upgrade --no-deps --force-reinstall git+https://github.com/openai/whisper.git
此外,系统还需要安装命令行工具 ffmpeg,大多数包管理器都可提供:
在 Ubuntu 或 Debian 系统上:
sudo apt update && sudo apt install ffmpeg
在 Arch Linux 系统上:
sudo pacman -S ffmpeg
在 macOS 系统上使用 Homebrew(https://brew.sh/):
brew install ffmpeg
在 Windows 系统上使用 Chocolatey(https://chocolatey.org/):
choco install ffmpeg
在 Windows 系统上使用 Scoop(https://scoop.sh/):
scoop install ffmpeg
如果 tiktoken 没有为平台提供预构建的 wheel 文件,可能还需要安装 Rust。如果在上述 `pip install` 命令执行过程中出现安装错误,请按照入门指南安装 Rust 开发环境。另外,可能需要配置 `PATH` 环境变量,例如:
export PATH="$HOME/.cargo/bin:$PATH"
如果安装失败并提示 `No module named 'setuptools_rust'`,需要安装 `setuptools_rust`,例如运行:
pip install setuptools-rust
可用模型和支持语言
Whisper 有六种模型大小,其中四种有仅支持英语的版本,在速度和准确性之间提供了不同的权衡。以下是可用模型的名称、大致内存需求以及相对于大模型的推理速度。下面的相对速度是在 A100 上转录英语语音时测量的,实际速度会因语言、说话速度和可用硬件等多种因素而有很大差异。
| 大小 | 参数 | 仅英语模型 | 多语言模型 | 所需显存 | 相对速度 |
| --- | --- | --- | --- | --- | --- |
| tiny | 39 M | tiny.en | tiny | ~1 GB | ~10x |
| base | 74 M | base.en | base | ~1 GB | ~7x |
| small | 244 M | small.en | small | ~2 GB | ~4x |
| medium | 769 M | medium.en | medium | ~5 GB | ~2x |
| large | 1550 M | N/A | large | ~10 GB | 1x |
| turbo | 809 M | N/A | turbo | ~6 GB | ~8x |
仅用于英语应用的 `.en` 模型通常表现更好,特别是 `tiny.en` 和 `base.en` 模型。不过,对于 `small.en` 和 `medium.en` 模型,这种差异不太明显。此外,`turbo` 模型是 `large-v3` 的优化版本,在转录速度上更快,同时准确性仅有轻微下降。
Whisper 的性能因语言而异。下图展示了 `large-v3` 和 `large-v2` 模型按语言划分的性能,使用在 Common Voice 15 和 Fleurs 数据集上评估的 WER(单词错误率)或 CER(字符错误率,斜体显示)。其他模型和数据集对应的额外 WER/CER 指标可在论文的附录 D.1、D.2 和 D.4 中找到,翻译的 BLEU(双语评估替补)分数可在附录 D.3 中找到。
命令行使用方法
以下命令将使用 `turbo` 模型转录音频文件中的语音:
whisper audio.flac audio.mp3 audio.wav --model turbo
默认设置(选择 `turbo` 模型)在转录英语时效果很好。但 `turbo` 模型未针对翻译任务进行训练。如果需要将非英语语音翻译成英语,请使用多语言模型(tiny、base、small、medium、large)代替 `turbo`。例如,要转录包含非英语语音的音频文件,可以指定语言:
whisper japanese.wav --language Japanese
要将语音翻译成英语,使用:
whisper japanese.wav --model medium --language Japanese --task translate
注意:即使指定了 `--task translate`,`turbo` 模型仍会返回原文语言。使用 `medium` 或 `large` 模型可获得最佳翻译效果。
运行以下命令查看所有可用选项:
whisper --help
所有可用语言列表请参考 `tokenizer.py`。
Python 使用方法
也可以在 Python 中进行转录:
import whisper
model = whisper.load_model("turbo")
result = model.transcribe("audio.mp3")
print(result["text"])
在内部,`transcribe()` 方法会读取整个文件,并使用 30 秒的滑动窗口处理音频,对每个窗口进行自回归序列到序列预测。
以下是使用 `whisper.detect_language()` 和 `whisper.decode()` 的示例,它们提供了对模型的底层访问:
import whisper
model = whisper.load_model("turbo")
# 加载音频并填充/裁剪以适应 30 秒
audio = whisper.load_audio("audio.mp3")
audio = whisper.pad_or_trim(audio)
# 生成对数梅尔频谱图并移动到与模型相同的设备上
mel = whisper.log_mel_spectrogram(audio, n_mels=model.dims.n_mels).to(model.device)
# 检测语音语言
_, probs = model.detect_language(mel)
print(f"检测到的语言: {max(probs, key=probs.get)}")
# 解码音频
options = whisper.DecodingOptions()
result = whisper.decode(model, mel, options)
# 打印识别的文本
print(result.text)
更多示例
请在讨论区的“🙌 展示与分享”类别中分享 Whisper 的更多使用示例以及第三方扩展,如 Web 演示、与其他工具的集成、不同平台的移植等。
许可证
Whisper 的代码和模型权重遵循 MIT 许可证发布。更多详细信息请参阅 `LICENSE` 文件。 那么,Whisper 在实际应用中还会有怎样的表现呢?