利用 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 种不同大小的模型,分别为 tiny、base、small、medium、large。其中前 4 种模型又提供了用于英文语音识别的专用模型,分别为 tiny-en、base-en、small-en 和 medium-en。
越大的模型生成结果越精确,但处理所需要花费的时间越长。此外,large 模型目前存在 3 个版本:v1、v2 和 v3,我们直接使用 large-v3 模型即可。下载链接可以在文件 whisper/__init__.py 内查看。
考虑到国内的网络环境,建议提前手动下载模型到 models 目录。
Python 代码调用
Whisper 支持命令行调用和 Python 代码调用,这里介绍如何在 Python 文件内使用 Whisper 对视频进行语音识别和字幕生成。
引入 Whisper
首先,我们在代码中引入 Whisper,其中 get_writer 方法用于后续字幕文件的生成:
1 | import whisper |
提取音频文件
其次,我们需要利用 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参数用来指定需要使用的模型,即之前提到的small、large等。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 | { |
第一个 text 对应的值为当前音频文件语音内容的所有文本识别结果。
在每一个片段中,start 和 end 对应这段内容在音频中的起始和结束时间;temperature 是指在模型生成结果时,控制输出随机性和多样性的参数;avg_logprob 是模型预测的置信度评分的平均值,;compression_ratio 音频信号压缩的比率;no_speech_prob 是指模型在某段时间内检测到没有语音信号的概率。
字幕生成
在 Whisper 转录完成获得结果后,可以利用 Whisper 内置方法输出字幕文件。我们已经在前面引入了 get_writer 方法:
1 | writer = get_writer(output_format, output_dir) |
output_format用于选择输出文件格式,选项有txt、vtt、srt、tsv、json或all。如果要输出字幕,则选择srt或vtt即可。output_dir用于指定输出文件所在文件夹路径result即为转录过程中model.transcribe()方法返回的结果file_name为输出文件名