Whisper是一种通用的语音识别模型。它是在包含各种音频的大型数据集上训练的,也是一个多任务模型,可以执行多语言语音识别、语音翻译和语言识别。 Open
AI在2022年9月21日开源了号称其英文语音辨识能力已达到人类水准的Whisper神经网络,且它亦支持其它98种语言的自动语音辨识。
Whisper系统所提供的自动语音辨识(Automatic Speech
Recognition,ASR)模型是被训练来运行语音辨识与翻译任务的,它们能将各种语言的语音变成文本,也能将这些文本翻译成英文。
1.在 Windows 系统上安装Whisper 模块
需要顺便安装需要的模块 如wheel,zhconv,torch 等
1. pip install -U openai-whisper
2. pip install --upgrade --no-deps --force-reinstall git+https://github.com/openai/whisper.git
3. pip install zhconv
4. pip3 install wheel
5. pip3 install torch torchvision torchaudio
注:没科学上网会下载有可能很慢,可以替换成国内镜像加快下载速度
下载ffmpeg
https://github.com/BtbN/FFmpeg-Builds/releases
解压后,找到bin文件夹下的“ffmpeg.exe”,假设这个文件夹的路径是"D: \ffmpeg\bin ",然后将"D: /ffmpeg/bin "添加到系统环境变量PATH。
2.Whisper的基本使用:识别声音文件
注:第一次使用对应的模型时,会自动从互联网下载相关内容,如下图是正常情况。
文件存放位置为:C:\Users\Administrator(用户名).cache\whisper
import whisper
import os
if __name__ == '__main__':
# 获取脚本所在目录的绝对路径
script_dir = os.path.dirname(os.path.abspath(__file__))
# 构建音频文件的绝对路径
audio_path = os.path.join(script_dir, "output.wav")
model = whisper.load_model("base")
result = model.transcribe(audio_path, fp16=False, language="Chinese")
print(result["text"])
我们会发现输出内容为繁体字,若需要显示简体中文需要安装相关转换库opencc
pip install opencc
import whisper
import os
import opencc
script_dir = os.path.dirname(os.path.abspath(__file__))
audio_path = os.path.join(script_dir, "test_talk_boy.mp3")
model = whisper.load_model("base")
result = model.transcribe(audio_path, language='Chinese', fp16=False)
cc = opencc.OpenCC("t2s")
res = cc.convert(result['text'])
print(res)
3.Whisper的基本使用:输出断句内容
在一个语音中,我们都会有一些停顿。但是,在识别结果中,这些停顿并没有被完全表示出来。我们可以如此修改代码,实现按断句输出结果:
import whisper
import opencc
import os
script_dir = os.path.dirname(os.path.abspath(__file__))
# 构建音频文件的绝对路径
audio_path = os.path.join(script_dir, "test_talk_boy.mp3")
model = whisper.load_model("base")
result = model.transcribe(audio_path,fp16=False,language='Chinese')
cc = opencc.OpenCC("t2s")
for i in result.items():
print(i)
for i in result['segments']:
res = cc.convert(i['text'])
print(f"断句开始于{i['start']}秒,结束于{i['end']}秒,识别结果:{res}")
4.使用Whisper和pyaudio,实现实时录音识别
import whisper
import zhconv
import wave # 使用wave库可读、写wav类型的音频文件
import pyaudio # 使用pyaudio库可以进行录音,播放,生成wav文件
def record(time): # 录音程序
# 定义数据流块
CHUNK = 1024 # 音频帧率(也就是每次读取的数据是多少,默认1024)
FORMAT = pyaudio.paInt16 # 采样时生成wav文件正常格式
CHANNELS = 1 # 音轨数(每条音轨定义了该条音轨的属性,如音轨的音色、音色库、通道数、输入/输出端口、音量等。可以多个音轨,不唯一)
RATE = 16000 # 采样率(即每秒采样多少数据)
RECORD_SECONDS = time # 录音时间
WAVE_OUTPUT_FILENAME = "./output.wav" # 保存音频路径
p = pyaudio.PyAudio() # 创建PyAudio对象
stream = p.open(format=FORMAT, # 采样生成wav文件的正常格式
channels=CHANNELS, # 音轨数
rate=RATE, # 采样率
input=True, # Ture代表这是一条输入流,False代表这不是输入流
frames_per_buffer=CHUNK) # 每个缓冲多少帧
print("* recording") # 开始录音标志
frames = [] # 定义frames为一个空列表
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)): # 计算要读多少次,每秒的采样率/每次读多少数据*录音时间=需要读多少次
data = stream.read(CHUNK) # 每次读chunk个数据
frames.append(data) # 将读出的数据保存到列表中
print("* done recording") # 结束录音标志
stream.stop_stream() # 停止输入流
stream.close() # 关闭输入流
p.terminate() # 终止pyaudio
wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb') # 以’wb‘二进制流写的方式打开一个文件
wf.setnchannels(CHANNELS) # 设置音轨数
wf.setsampwidth(p.get_sample_size(FORMAT)) # 设置采样点数据的格式,和FOMART保持一致
wf.setframerate(RATE) # 设置采样率与RATE要一致
wf.writeframes(b''.join(frames)) # 将声音数据写入文件
wf.close() # 数据流保存完,关闭文件
if __name__ == '__main__':
model = whisper.load_model("base")
record(5) # 定义录音时间,单位/s
# 根据设备是否支持FP16设置参数,避免警告
result = model.transcribe("output.wav", language='Chinese', fp16=False)
s = result["text"]
s1 = zhconv.convert(s, 'zh-cn')
print(s1)
comment 评论区
star_outline 咱快来抢个沙发吧!