1.在做一些语音项目的时候,每次都要调用API,百度的或者是科大讯飞的,要钱贵不说,识别效果还差的要命,此事苦其久也。

2.使用python3.8及以上的编译器。

3.安装pyaudio库包,该库包是用来进行实时语音录制和保存的。使用以下命令:

pip install pyaudio -i https://pypi.tuna.tsinghua.edu.cn/simple


4.安装whisper库包,该库包是用来进行语音转文字识别。使用以下命令:

pip install openai-whisper -i https://pypi.tuna.tsinghua.edu.cn/simple


5.安装和配置ffmpeg软件,后面配合录音使用,安装配置好后检测如下。

6.新建一个.py文件,比如”语音识别.py”文件。

7.准备编写代码,首先导入以下四个库包。

import whisperimport zhconvimport wave# 使用wave库可读、写wav类型的音频文件import pyaudio# 使用pyaudio库可以进行录音,播放,生成wav文件


8.定义一个录音函数,同时在录音函数中定义数据流块。

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为一个空列表


9.计算声音数据,准备保存实时声音数据到列表。

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


10.将保存在列表中的声音数据以二进制的形式保存在一个wav声音文件中。

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()# 数据流保存完,关闭文件


11.继续定义一个main函数,该函数的功能是加载base语音模型(提示:该语音模型会自动下载),将实时语音以中文形式翻译成文字输出。

def main():model = whisper.load_model("base")record(5)# 定义录音时间,单位/sresult = model.transcribe("output.wav", language='Chinese', fp16=False)s = result["text"]s1 = zhconv.convert(s, 'zh-cn')print(s1)


12.最后,写一个运行入口,运行main函数。

if __name__ == '__main__':main()

13.运行“语音识别.py”文件,

14.运行后,说出“晚上睡不着怎么办”,查看效果。

15.完整代码展示

import whisperimport zhconvimport 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()# 终止pyaudiowf = 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()# 数据流保存完,关闭文件def main():model = whisper.load_model("base")record(5)# 定义录音时间,单位/sresult = model.transcribe("output.wav", language='Chinese', fp16=False)s = result["text"]s1 = zhconv.convert(s, 'zh-cn')print(s1)if __name__ == '__main__':main()


16.最后,运行成功的同学记得一键三连!有问题评论区见!