先看代码👇

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()


最后,函数的返回值,一定要是保存录音的文档!