先看代码👇
import pyaudio
import wave
def get_wav(sec):
#创建对象
pa = pyaudio.PyAudio()
#创建流:采样位,声道数,采样频率,缓冲区大小,input
stream = pa.open(format=pyaudio.paInt16,
channels=2,
rate=16000,
input=True,
frames_per_buffer=1024)
#创建式打开音频文件
wf = wave.open("test.wav", "wb")
#设置音频文件的属性:采样位,声道数,采样频率,缓冲区大小,必须与流的属性一致
wf.setnchannels(2)
wf.setsampwidth(pa.get_sample_size(pyaudio.paInt16))
wf.setframerate(16000)
print("开始录音")
#采样频率*秒数/缓冲区大小
for w in range(int(16000*sec/1024)):
data = stream.read(1024)#每次从流的缓存中读出数据
wf.writeframes(data)#把读出的数据写入wf
print("录音结束")
stream.stop_stream()#先把流停止
stream.close()#再把流关闭
pa.terminate()#把对象关闭
wf.close()#把声音文件关闭,否则不能播放
return "test.wav"
file = get_wav(6)
创建流:(下为流中的参数)
影响声音的几个参数:采样位、声道数、采样频率、缓冲区大小。
采样位(format):通常采用16位,
pyaudio.paInt16
,
声道数(channels):声道数是指支持能不同发声的音响的个数,它是衡量音响设备的重要指标之一。这里取声道数为2。
采样频率(rate):一秒钟的采样位。
缓冲区大小(frames_per_buffer):这里选的为1024。
开启录音
建立录音区:公式 采样频率*秒数/缓冲区大小
建立循环,在采样频率*秒数/缓冲区大小中,以缓冲区为单位,从流的缓存中读取数据,存入文件中。
结束录音
将流停止
stream.stop_stream()
将流关闭
stream.close()
关闭pyaudio用来录音的对象及导入数据的文件对象
pa.terminate() wf.close()
最后,函数的返回值,一定要是保存录音的文档!