利用 OpenAI Whisper 进行语音识别与字幕生成

安装

无论是 Windows 还是 Linux 系统,首先确保系统中已经配置好 CUDA 相关环境,同时安装了 FFmpeg 并配置了相应的环境变量。

创建一个文件夹,如 whisper-demo,然后在文件夹内创建 Python 虚拟环境。

在虚拟环境下安装 Pytorch(从官网下载 GPU 版本),例如:

1
pip install torch==2.1.0 torchvision==0.16.0 torchaudio==2.1.0 --index-url https://download.pytorch.org/whl/cu118

之后在该虚拟环境下安装 Whisper

1
pip install -U openai-whisper

Whisper 支持 99 种语言,支持的语言列表可以从 whisper/tokenizer.py 文件内查看。

在项目文件夹内创建 models 文件夹,我们会把 Whisper 的模型下载到这里。Whisper 支持 5 种不同大小的模型,分别为 tinybasesmallmediumlarge。其中前 4 种模型又提供了用于英文语音识别的专用模型,分别为 tiny-enbase-ensmall-enmedium-en

越大的模型生成结果越精确,但处理所需要花费的时间越长。此外,large 模型目前存在 3 个版本:v1、v2 和 v3,我们直接使用 large-v3 模型即可。下载链接可以在文件 whisper/__init__.py 内查看。

考虑到国内的网络环境,建议提前手动下载模型到 models 目录。

Python 代码调用

Whisper 支持命令行调用和 Python 代码调用,这里介绍如何在 Python 文件内使用 Whisper 对视频进行语音识别和字幕生成。

引入 Whisper

首先,我们在代码中引入 Whisper,其中 get_writer 方法用于后续字幕文件的生成:

1
2
import whisper
from whisper.utils import get_writer

提取音频文件

其次,我们需要利用 FFmpeg 提取视频的音频数据,FFmepg 相应操作的命令为 ffmpeg -hide_banner -v error -i /your/video/path -vn -c:a copy /output/path/audio.aac -y

调用 Whisper

为了调用 Whisper,我们需要先加载 Whisper 模型:

1
model = whisper.load_model(model_name, download_root="/project/root/path/models/")
  • model_name 参数用来指定需要使用的模型,即之前提到的 smalllarge 等。
  • download_root 参数用于指定模型文件夹的路径,这里被设置为当前项目下的 models 文件夹。如果 download_root 参数保留默认,那么 Windows 下模型会被下载到 C:\Users\<UserName>\.cache\whisper\,Linux 下会被下载到 ~/.cache/whisper/

转录

在加载完模型后就能利用 Whisper 对音频文件进行转录。

1
result = model.transcribe(audio_path, language=None, initial_prompt=None)
  • audio_path 参数即为刚才提取的音频文件路径。
  • language 参数用于指定该音频文件内所使用的语言,如 language="en"language="zh" 等。如果设置 language=None,则 Whisper 会基于音频文件的前 30 秒来判断所使用的语言。
  • initial_prompt 用于向 Whisper 传入一些提示来控制输出文本。

转录结果

Whisper 转录后会返回一个字典:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
"text": "...",
"segments": [
{
"id": 0,
"seek": 0,
"start": 0.0,
"end": 6.32,
"text": "...",
"tokens": [
50364,
// ...
50680
],
"temperature": 0.0,
"avg_logprob": -0.17081948082045753,
"compression_ratio": 1.606694560669456,
"no_speech_prob": 0.0039425622671842575
},
{
//...
},
]
}

第一个 text 对应的值为当前音频文件语音内容的所有文本识别结果。

在每一个片段中,startend 对应这段内容在音频中的起始和结束时间;temperature 是指在模型生成结果时,控制输出随机性和多样性的参数;avg_logprob 是模型预测的置信度评分的平均值,;compression_ratio 音频信号压缩的比率;no_speech_prob 是指模型在某段时间内检测到没有语音信号的概率。

字幕生成

在 Whisper 转录完成获得结果后,可以利用 Whisper 内置方法输出字幕文件。我们已经在前面引入了 get_writer 方法:

1
2
writer = get_writer(output_format, output_dir)
writer(result, file_name)
  • output_format 用于选择输出文件格式,选项有 txtvttsrttsvjsonall。如果要输出字幕,则选择 srtvtt 即可。
  • output_dir 用于指定输出文件所在文件夹路径
  • result 即为转录过程中 model.transcribe() 方法返回的结果
  • file_name 为输出文件名