开发者

Python如何运用pyaudio库去做一个固定采样率音频录制器

开发者 https://www.devze.com 2023-05-07 09:42 出处:网络 作者: Obito_TXP
目录python用pyaudio库做固定采样率音频录制器Python音频操作工具pyaudio上手来看示例wave_read相关方法总结Python用pyaudio库做固定采样率音频录制器
目录
  • python用pyaudio库做固定采样率音频录制器
  • Python音频操作工具pyaudio上手
    • 来看示例
    • wave_read相关方法
  • 总结

    Python用pyaudio库做固定采样率音频录制器

    首先要去下载一个对应的pyaudio库的whl文件,目前最新版本是cp38的那个,如果版本太低是用不了的,下载好后在编译环境下的控制台输入pip install +whl文件路径+XXX.whl+回车 

    # -*- coding: utf-8 -*-
    """
    Spyder Editor
    This is a temporary script file.
    """
    import pyaudio
    import wave
    CHUNK=256#设置底缓存块的大小为256
    FORMAT=pyaudio.paInt16#设置采样深度为16位
    CHANNELS=2#设置声道数为2
    RATE=16000#设置采样率16
    RECORD_SECONDS=10#录音时长为10s
    p=pyaudio.PyAudio()#实例化一个对象
    #打开声卡
    stream=p.open(format=FORMAT,
                      channels=CHANNELS,
                      rate=RATE,               
                      input=True,
                      frames_per_buffer=CHUNK)
    #创建列表用来储存采样的音频数据
    record_buf=[]
    print("***开始录音:请在10s内输入语音***")
    for i in range(0,int(RATE/CHUNK*RECORD_SECONDS)):
        data=stream.read(CHUNK)
        record_buf.append(data)
    print("***录音结束***")
    wf=wave.open('audiol.wav','wb')
    wf.setnchannels(CHANNELS)
    wf.setsampwidth(p.get_sample_size(FORMAT))
    wf.setframerate(RATE)
    wf.writeframes(b''.join(record_buf))
    wf.close()#写完后关闭声卡
    stream.stop_stream()#停止声卡
    stream.close()#关闭声卡
    p.terminate()#终止pyaudio

    先前我出现了一个错误:一直提示sample width not specified(采样深度没有被指定)

    Python如何运用pyaudio库去做一个固定采样率音频录制器

     在我无数次检查后发现出错http://www.devze.com的地方是程序中sample少打了个字母nnasHArIL9;e'

    最后在相应的文件夹下会出现wav文件

    Python音频操作工具pyaudio上手

    当需要使用Python处理音频数据时,使用Python读取与播放声音必不可少,下面介绍一个好用的处理音频PyAudio工具包。

    PyAudio是Python开源工具包,由名思义,是提供对语音操作的工具包。提供录音播放处理等功能,可以视作语音领域的OpenCV

    来看示例

    1、采集音频

    下面以一段代码演示如何从计算机麦克风采集一段音频,采集音频时长 4s,保存文件 output.wav

    使用了tqdm模块,可以方便显示出来读取过程:

    import pyaudio
    import wave
    from tqdm impor编程客栈t tqdm
    def record_audio(wave_out_path,record_second):
    	  FORMAT = pyaudio.paInt16#音频数据格式
    	  CHANNELS = 2#声道数
    	  RATE = 44100#采样率
    	  CHUNK = 1024#每次读多少个数据
    	  p = pyaudio.PyAudio()
    	  stream = p.open(format=FORMAT,
    	          		  channels=CHANNELS,
    			          rate=RATE,
    			          input=True,
    			          frames_per_buffer=CHUNK)
    	  wf = wave.open(wave_out_path, 'wb')
    	  wf.setnchannels(CHANNELS)
    	  wf.setsampwidth(p.get_sample_size(FORMAT))#其实就是2,表示两个字节
    	  wf.setframerate(RATE)
    	  print("* recording")
    	  ## RATE / CHUNK * record_second意思是:
    	  ## 采样率是RATE,每秒采集RATE个数据,所以每秒的音频需要读取RATE / CHUNK次
    	  for i in tqdm(range(0, int(RATE / CHUNK * record_second))):
    		    data = stream.read(CHUNK)
    		    wf.writeframes(data)
    	  print("* done recording")
    	  stream.stop_stream()
    	  stream.close()
    	  p.terminate()
    	  wf.close()
    record_audio("output.wav",record_second=4)

    2、播放音频

    下面使用开发者_JAV培训播放的功能来播放1中保存的音频 output.wav,通过tqdm,显示播放进度条:

    """PyAudio Example: Play a WAVE file."""
    import pyaudio
    import wave
    from tqdm import tqdm
    def play_audio(wave_path):
    	  CHUNK = 1024
    	  wf = wave.open(wave_path, 'rb')
    	  # instantiate PyAudio (1)
    	  p = pyaudio.PyAudio()
    	  # open stream (2)
    	  stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
    	          		http://www.devze.com  channels=wf.getnchannels(),
    			          rate=wf.getframerate(),
    			          output=True)
    	  # read data
    	  data = wf.readframes(CHUNK)
    	  # play stream (3)
    	  datas = []
    	  while len(data) > 0:
    		    data = wf.readframes(CHUNK)
    		    datas.append(data)
    	  for d in tqdm(datas):
    	    	stream.write(d)
    	  # stop stream (4编程)
    	  stream.stop_stream()
    	  stream.close()
    	  # close PyAudio (5)
    	  p.terminate()
    play_audio("output.wav")

    wave_read相关方法

    Python如何运用pyaudio库去做一个固定采样率音频录制器

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消