Whisper

发布时间 2023-05-08 20:48:28作者: 蝈蝈俊

Whisper 是 OpenAI 公司开源的通用的语音识别模型。(https://github.com/openai/whisper

它是在包含各种音频的大型数据集上训练的,是一个可以执行多语言语音识别、语音翻译和语言识别的多任务模型。

它也是一个针对各种语音处理任务进行训练的 Transformer 序列到序列模型。

Whisper 执行操作的大致过程:

输入的音频被分割成 30 秒的小段、转换为 log-Mel 频谱图,然后传递到编码器。解码器经过训练以预测相应的文字说明,并与特殊的标记进行混合,这些标记指导单一模型执行诸如语言识别、短语级别的时间戳、多语言语音转录和语音翻译等任务。

使用示例

环境配置

brew install python         # Python 3.8 以上版本
brew install pytorch        # PyTorch 1.10 以上版本

# 依赖 OpenAI 的 tiktoken,用于实现快速分词,可能还需要安装 rust ,
# 以防 tiktoken 不为您的平台提供预构建的轮子。
brew install rust

brew install git            # 下载 github 上的whisper
brew install ffmpeg         # 处理音频

# 从该存储库中拉取并安装最新的提交及其 Python 依赖项:
pip install git+https://github.com/openai/whisper.git  

完成上面配置后,就可以录音转文字了。

录音文件转文字

Whisper提供了两种使用方式:命令行和作为模块在python文件中调用。

命令行

下面是把小朋友读三字经的录音转文字:

$ whisper /Users/ghj1976/Downloads/20230507_185926.m4a --model base --language Chinese 

/Users/ghj1976/opt/anaconda3/lib/python3.9/site-packages/whisper/transcribe.py:114: UserWarning: FP16 is not supported on CPU; using FP32 instead
  warnings.warn("FP16 is not supported on CPU; using FP32 instead")

[00:00.000 --> 00:07.520] 人之初,心本善,心相信,喜相怨,
[00:07.520 --> 00:10.920] 狗不叫,信乃天,
[00:10.920 --> 00:17.760] 教知到,貴一专,子不學,非死而以,
[00:17.760 --> 00:26.800] 又不學,老何為,一不著,不成氣,人不學,不知意,

其中,/Users/ghj1976/Downloads/20230507_185926.m4a 是你的语音文件路径。

目前 Whisper 有 9 种模型(分为纯英文和多语言),其中四种只有英文版本,开发者可以根据需求在速度和准确性之间进行权衡,以下是现有模型的大小,及其内存要求和相对速度,我们这里用的 base 模型。:

Size
大小
Parameters
参数
English-only model
纯英文模型
Multilingual model
多语言模型
Required VRAM
所需显存
Relative speed
相对速度
tiny 39 M tiny.en tiny ~1 GB ~32x
base 74 M base.en base ~1 GB ~16x
small 244 M small.en small ~2 GB ~6x
medium 769 M medium.en medium ~5 GB ~2x
large 1550 M N/A large ~10 GB 1x

作为模块在python文件中调用

这里我们重点介绍下 initial_prompt 参数,它可以提高未知单词的识别准确性、按需生成文字。

initial_prompt 参数 提高未知单词的识别准确性

我们可以通过 initial_prompt 参数提升 Whisper 语音生成文字的质量,使用这个参数,模型会尝试尽量匹配提示的样式。

import whisper
import arrow

# 定义模型、音频地址、录音开始时间
def excute(model_name,file_path,start_time,initial_prompt):
    model = whisper.load_model(model_name)
    result = model.transcribe(file_path,initial_prompt=initial_prompt)
    for segment in result["segments"]:
        now = arrow.get(start_time)
        start = now.shift(seconds=segment["start"]).format("YYYY-MM-DD HH:mm:ss")
        end = now.shift(seconds=segment["end"]).format("YYYY-MM-DD HH:mm:ss")
        print("【"+start+"->" +end+"】:"+segment["text"])

if __name__ == '__main__':
    excute("base","480803359.mp3","2023-05-08 05:41:00", "Hum, you know, I I I would like to to say that... OK")


典型的使用场景如下:

  1. 更正模型在音频中经常错误识别的特定单词,或首字母缩略词。 比如以下提示改进了单词 DALL·E 和 GPT-3,,没有这个提示则会写成“GDP 3”和“DALI”。

The transcript is about OpenAI which makes technology like DALL·E, GPT-3, and ChatGPT with the hope of one day building an AGI system that benefits all of humanity

或者下面方式,可以转换出 DALL·E:

whisper audio.mp3 --initial_prompt "So we were just talking about DALL·E"
  1. 模型可能会跳过标点符号。您可以通过使用包含标点符号的简单提示来避免这种情况,如下面这个提示:

Hello, welcome to my lecture.

  1. 模型还可能省略音频中的常见填充词。如果要在结果中保留填充词,可以使用包含它们的提示:

Umm, let me think like, hmm... Okay, here's what I'm, like, thinking."

  1. 有些语言可以用不同的方式书写,例如简体中文或繁体中文。默认情况下,模型可能并不总是使用您希望的成绩单写作风格。您可以通过使用首选写作风格的提示来改善这一点。
audio_file_path = "path/to/audio/file.wav"
prompt = "请将此转录为简体中文。"
transcription = whisper.transcribe(audio_file_path, prompt=prompt)

参考资料