1、上一篇博客中讲到用SpeechRecognition库和Vosk模型来识别语音,通过麦克风录音的话,只能录很短的录音,经过不断网上搜寻,终于找到一段能控制录音时间的代码:
class Recorder(): # 录音程序
def __init__(self, chunk=1024, channels=1, rate=16000):
self.CHUNK = chunk # 音频帧率(也就是每次读取的数据是多少,默认1024)
self.FORMAT = pyaudio.paInt16 # 采样时生成wav文件正常格式
self.CHANNELS = channels # 音轨数(每条音轨定义了该条音轨的属性,如音轨的音色、音色库、通道数、输入/输出端口、音量等。可以多个音轨,不唯一)
self.RATE = rate # 采样率(即每秒采样多少数据)
self._running = True
self._frames = [] # 定义frames为一个空列表
def start(self):
_thread.start_new_thread(self.__recording, ())
def __recording(self):
self._running = True
self._frames = []
p = pyaudio.PyAudio() # 创建PyAudio对象
stream = p.open(format=self.FORMAT, # 采样生成wav文件的正常格式
channels=self.CHANNELS, # 音轨数
rate=self.RATE, # 采样率
input=True, # Ture代表这是一条输入流,False代表这不是输入流
frames_per_buffer=self.CHUNK) # 每个缓冲多少帧
while (self._running):
data = stream.read(self.CHUNK) # 每次读chunk个数据
self._frames.append(data) # 将读出的数据保存到列表中
stream.stop_stream() # 停止输入流
stream.close() # 关闭输入流
p.terminate() # 终止pyaudio
def stop(self):
self._running = False
def save_wave(self, filename):
p = pyaudio.PyAudio() # 创建PyAudio对象
if not filename.endswith(".wav"):
filename = filename + ".wav"
wf = wave.open(filename, 'wb') # 以’wb‘二进制流写的方式打开一个文件
wf.setnchannels(self.CHANNELS) # 设置音轨数
wf.setsampwidth(p.get_sample_size(self.FORMAT)) # 设置采样点数据的格式,和FOMART保持一致
wf.setframerate(self.RATE) # 设置采样率与RATE要一致
wf.writeframes(b''.join(self._frames)) # 将声音数据写入文件
wf.close() # 数据流保存完,关闭文件
def record(self):
print('请按回车键开始录音:')
a = input()
if str.__len__(a) == 0:
begin = time.time()
print("开始录音ing")
self.start()
print("请按回车键停止录音:")
b