录音&语音识别
一、MASR是什么?二、使用步骤1.必要的条件2.引入库2.Recording类三、单纯使用录音功能总结一、MASR是什么?
MASR是一款基于Pytorch实现的自动语音识别框架,MASR全称是神奇的自动语音识别框架(Magical Automatic Speech Recognition),MASR致力于简单,实用的语音识别项目。
本程序基于作者作品MASR简单录音并语音识别,感谢作者提供代码。
二、使用步骤
在github 上 clone code:record.py
其中MASR需要训练模型,需要很多时间,随你们折腾。
若不想训练模型,则可以在MASR上下载模型。
模型->下载
1.必要的条件
python3ffmpeg (MASR需要用到)pytorch、wave、pyaudio、masr(pip install XXX)2.引入库
代码如下(示例):
import waveimport timeimport osimport _threadimport pyaudioimport tkinterfrom masr.predict import Predictorimport torchdevice = torch.device("cpu") # 若有GPU,则修改GPUtk = tkinter.Tk() # 界面控件
2.Recording类
初始定义代码如下(示例):
def __init__(self, window: tk) -> None:self.window = windowself.window.title('语音识别')self.window.geometry('300x300')self.window.resizable(False, False) # 不能最大化self.recordButton = tkinter.Button(self.window, text='录音识别', width=10, command=self.record_audio_thread,)self.recordButton.place(x=100, y=50) # 放置位置self.showLabel = tkinter.Label(self.window, text="输出日志:")self.showLabel.place(x=10, y=80)# 放置位置self.result_text = tkinter.Text(self.window, width=39, height=10, yscrollcommand=True)self.result_text.place(x=10, y=100)# 放置位置# 录音功能self.recordFlag = False # 控制说话标志self.max_record = 600 # 600s 最大录音时长self.output_path = 'dataset/record'self.p = pyaudio.PyAudio()# 识别功能self.predictor = Predictor(decoder='ctc_greedy',use_gpu=False) # 其余的参数都是默认的,不需要改动太大。ctc_greedy解码器,我在Windows上使用,其他系统没测试过,若有人测试过,则告知我,谢谢。
录音
代码如下(示例):
def record_audio_thread(self):if not self.recordFlag:# 开始录音self.result_text.insert(tkinter.END, '开始录音\n')_thread.start_new_thread(self.recordAudio, ()) # 新线程else:self.result_text.insert(tkinter.END, '停止录音\n')self.recordButton.configure(text='录音识别')self.recordFlag = False # 停止录音#----------------------------------------------------------------def recordAudio(self):self.recordButton.configure(text='停止录音')self.recordFlag = True# 识别间隔时间interval_time = 2CHUNK = 16000 * interval_timeformat = pyaudio.paInt16channels = 1rate = 16000# 打开录音self.stream = self.p.open(format=format,channels=channels,rate=rate,input=True,frames_per_buffer=CHUNK)start = time.time()frames = []while True:if not self.recordFlag:breakdata = self.stream.read(CHUNK)frames.append(data)# 超出最大录制时间if len(frames) * 2 > self.max_record:self.result_text.insert(tkinter.END, "录音已超过最大限制时长,强制停止录音!")break# 保存录音if not os.path.exists(self.output_path):os.makedirs(self.output_path)self.wav_path = os.path.join(self.output_path, '%s.wav' % str(int(time.time())))wf = wave.open(self.wav_path, 'wb')wf.setnchannels(channels)wf.setsampwidth(self.p.get_sample_size(format))wf.setframerate(rate)wf.writeframes(b''.join(frames))wf.close()self.recording = Falseself.result_text.insert(tkinter.END, "录音已结束,录音文件保存在:%s\n" % self.wav_path)self.speechRecognition(self.wav_path)
语音识别
代码如下(示例):
def speechRecognition(self, wav_path):try:start = time.time()score, text = self.predictor.predict(audio_path=wav_path)self.result_text.insert(tkinter.END, "消耗时间:%dms, 识别结果: %s, 得分: %d\n" % (round((time.time() - start) * 1000), text, score))except Exception as e:print(e)
这样就可以录音识别,不需要借助百度阿里语音识别识别,只是准确率有点低。
三、单纯使用录音功能
代码如下(实例):
# -*- encoding:utf-8 -*-# author:rx-tedimport waveimport timeimport osimport _threadimport pyaudioimport tkinterclass Recording:def __init__(self, window: tk) -> None:self.window = windowself.window.title('语音')self.window.geometry('300x300')self.window.resizable(False, False) # 不能最大化self.recordButton = tkinter.Button(self.window, text='录音', width=10, command=self.record_audio_thread,)self.recordButton.place(x=100, y=50) # 放置位置self.showLabel = tkinter.Label(self.window, text="输出日志:")self.showLabel.place(x=10, y=80)# 放置位置self.result_text = tkinter.Text(self.window, width=39, height=10, yscrollcommand=True)self.result_text.place(x=10, y=100)# 放置位置# 录音功能self.recordFlag = False # 控制说话标志self.max_record = 600 # 600s 最大录音时长self.output_path = 'dataset/record'self.p = pyaudio.PyAudio()## 识别功能#self.predictor = Predictor(decoder='ctc_greedy',use_gpu=False) # 其余的参数都是默认的,不需要改动太大。def record_audio_thread(self):if not self.recordFlag:# 开始录音self.result_text.insert(tkinter.END, '开始录音\n')_thread.start_new_thread(self.recordAudio, ()) # 新线程else:self.result_text.insert(tkinter.END, '停止录音\n')self.recordButton.configure(text='录音')self.recordFlag = False # 停止录音# def speechRecognition(self, wav_path):# try:# start = time.time()# score, text = self.predictor.predict(audio_path=wav_path)# self.result_text.insert(tkinter.END, "消耗时间:%dms, 识别结果: %s, 得分: %d\n" % (# round((time.time() - start) * 1000), text, score))#except Exception as e:# print(e)def recordAudio(self):self.recordButton.configure(text='停止录音')self.recordFlag = True# 识别间隔时间interval_time = 2CHUNK = 16000 * interval_timeformat = pyaudio.paInt16channels = 1rate = 16000# 打开录音self.stream = self.p.open(format=format,channels=channels,rate=rate,input=True,frames_per_buffer=CHUNK)start = time.time()frames = []while True:if not self.recordFlag:breakdata = self.stream.read(CHUNK)frames.append(data)# 超出最大录制时间if len(frames) * 2 > self.max_record:self.result_text.insert(tkinter.END, "录音已超过最大限制时长,强制停止录音!")break# 保存录音if not os.path.exists(self.output_path):os.makedirs(self.output_path)self.wav_path = os.path.join(self.output_path, '%s.wav' % str(int(time.time())))wf = wave.open(self.wav_path, 'wb')wf.setnchannels(channels)wf.setsampwidth(self.p.get_sample_size(format))wf.setframerate(rate)wf.writeframes(b''.join(frames))wf.close()self.recording = Falseself.result_text.insert(tkinter.END, "录音已结束,录音文件保存在:%s\n" % self.wav_path)# self.speechRecognition(self.wav_pathif __name__ == '__main__':Recording(tk)tk.mainloop()
这个例子,简单录音,不具备识别语音。
总结
我叫高敬义,笔名是rx-ted,高兴和大家认识,希望和大家一起成长,一起收获能量的共振,使人开心的想要原地起飞。