录制音频代码如下所示。

# 导入音频相关模块import pyaudioimport wave# 设置录音时间RECORD_SECONDS = 80# 设置量化PyAudio 内置缓存大小CHUNK=1024# 设置量化位数,这里设置量化位数是16bit,字节FORMAT =pyaudio.paInt16# 设置声道数CHANNELS=1# 设置采样率RATE=16000# 生成PyAudio 对象p=pyaudio.PyAudio()stream =p.open(format=FORMAT,channels=CHANNELS,rate=RATE,input=True,frames_per_buffer=CHUNK)print("开始录音...")frames=[]for i in range(0,int(RATE/CHUNK*RECORD_SECONDS)):data=stream.read(CHUNK)frames.append(data)print("结束录音")stream.stop_stream()stream.close()p.terminate()wf=wave.open('test1.wav','wb')wf.setnchannels(CHANNELS)wf.setsampwidth(p.get_sample_size(FORMAT))wf.setframerate(RATE)# 把列表中数据写入文件wf.writeframes(b''.join(frames))wf.close()

(1)代码开头设置了录音时间、PyAudio内置缓存大小、量化位数、声道数和采样率这几个常量,这种通过变量保存各种参数的数值,然后通过变量进行参数设置的方式,可有效防止在代码量过多、多处用到参数设置时出现数据出错、数据不一致、维护量变大等问题。

(2)在stream =p.open(format=FORMAT,channels=CHANNELS,rate=RATE,input=True,frames_per_buffer=CHUNK) 语句中通过设置 input=True 把音频数据流对象设置为输入模式,也就时录音模式,其他参数可参考前面的介绍。

(3)音频文件播放或录制过程中,每秒钟产出的字节数等于采样率、声道数和量化位数三个数值的乘积;音频文件的帧记录了一个声音单元,其长度(字节数)等于量化位数和声道数的乘积。如果每次读取计算循环次数。

(4)以上代码的主要逻辑是:通过PyAduio生成一个音频数据流对象(stream),并通过传递参数设定数据流对象的量化位数、声道数、采样率、录音状态和内置缓存等属性,然后按照录制时间大小确定循环次数,在每次循环中通过数据流把录音读入并存放到变量中(data=stream.read(CHUNK)),然后依次存放到列表变量frames中,最后通过wave对象把列表中数据保存在文件中。