python使用pyaudio录音和格式转化方式

 更新时间:2023年05月06日 16:30:25   作者:沐岚浩  
这篇文章主要介绍了python使用pyaudio录音和格式转化方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

使用pyaudio录音和格式转化

环境

pip3 install pyaudio
pip3 install wave
pip3 install numpy 
  • linux 21.04
  • python 3.7

代码(Record类)

#!/bin/python3
# 标识引用的python版本
import pyaudio
import wave
import sys
import os
import numpy as np
"""
首先集成一下录音功能和格式转换功能
"""
class Record():
    """
    录音的类
    CHUNK = 1024
    FORMAT = pyaudio.paInt16  
    CHANNELS = 1  声道
    RATE = 16000  频率
    RECORD_SECONDS = 5  录音时间  单位=> s
    WAVE_OUTPUT_FILENAME = os.getcwd() + "/python/output1.wav"   录音文件
    """
    def __init__(self,WAVE_OUTPUT_FILENAME,CHUNK=1024,
    FORMAT=pyaudio.paInt16,CHANNELS=1,RECORD_SECONDS=5,
    Input=True,RATE=16000,PCMName="out.pcm",DataType=np.int16):
        self.CHUNK = CHUNK
        self.FORMAT = FORMAT
        self.CHANNELS = CHANNELS
        self.RECORD_SECONDS = RECORD_SECONDS
        self.WAVE_OUTPUT_FILENAME = WAVE_OUTPUT_FILENAME
        self.Input = Input
        self.RATE = RATE
        self.PCMName = PCMName
        self.DataType = DataType
    def recording(self):
        """
        这句代码 会屏蔽一些不必要的报错
        os.close(sys.stderr.fileno())
        """
        #隐藏一些报错,这些不影响程序的运行
        os.close(sys.stderr.fileno())
        print("开始录音")
        p = pyaudio.PyAudio()
        stream = p.open(format=self.FORMAT,
                channels=self.CHANNELS,
                rate=self.RATE,
                input=self.Input,#默认为True
                frames_per_buffer=self.CHUNK)
        frames = []
        for i in range(0, int(self.RATE / self.CHUNK * self.RECORD_SECONDS)):
            data = stream.read(self.CHUNK)
            frames.append(data)
        print("done")
        # 关闭流
        stream.stop_stream()
        stream.close()
        p.terminate()
        wf = wave.open(self.WAVE_OUTPUT_FILENAME, 'wb')
        wf.setnchannels(self.CHANNELS)
        wf.setsampwidth(p.get_sample_size(self.FORMAT))
        wf.setframerate(self.RATE)
        wf.writeframes(b''.join(frames))
        wf.close()
    def wav2pcm(self):
        """
        音频文件wav格式 转 pcm格式
        """
        f = open(self.WAVE_OUTPUT_FILENAME, "rb")
        f.seek(0)
        f.read(1024)
        data = np.fromfile(f, dtype=self.DataType)
        # 获取 分割后的 数组
        filePath =  str(self.WAVE_OUTPUT_FILENAME).split('/')
        path = ''
        # 拼接路径 取出最后一位 [0,-1)
        for item in filePath[:-1]:
            path += item +'/'
        path += self.PCMName 
        # print("PCM Path =>",path)
        data.tofile(path)
        print("结束")
        # 可以返回一个元组; 也可以把它封成数组返回
        return (self.WAVE_OUTPUT_FILENAME,path)
    def run(self):
        self.recording()
        wavpath,path = self.wav2pcm()
        # print("wave =>",wavpath,"\n","path =>",path)
# 这个就不写入那个类里了, 这样方便调用 不需要再初始化类了
# 可直接copy到使用的类中或者文件里
def pcm2wav(pcmfile,wavfile,channels=1,rate=16000):
    with open(pcmfile,'rb') as fp:
        pcmdata = fp.read()
    with wave.open(wavfile, 'wb') as wav:
        wav.setnchannels(channels)
        wav.setsampwidth(16 // 8)
        wav.setframerate(rate)
            # 写入
        wav.writeframes(pcmdata)
# 测试
if __name__ == "__main__":
    wavepath = os.getcwd() + "/python/output1.wav"  
    dev = Record(wavepath)
    # dev.run()
    pcmfile = os.getcwd() + '/python/demo.pcm'
    wavfile = os.getcwd() + '/python/demo.wav'
    pcm2wav(pcmfile,wavfile) 

pyaudio播放声音不清晰问题

在树莓派上使用pyaudio播放pcm文件的时候,发现明显的不清晰,感觉有轻微的断断续续,而使用aplay播放则非常清晰

测试文件:https://sis-sample-audio.obs.cn-north-1.myhuaweicloud.com/16k16bit.pcm

>>> import pyaudio
>>> p = pyaudio.PyAudio()
>>> stream = p.open(format=pyaudio.paInt16, channels=1, output=True)
>>> with open("16k16bit.pcm", "rb") as f:
...     stream.write(f.read())
>>> aplay -f cd -c 1 -r 16000 16k16bit.pcm

最后发现是由于缓冲区的帧数过少导致播放不流畅,默认pyaudio缓冲区的帧数为1024。可以通过提高frames_per_buffer参数值来解决。

>>> import pyaudio
>>> p = pyaudio.PyAudio()
>>> stream = p.open(format=pyaudio.paInt16, channels=1, rate=16000, frames_per_buffer=4096, output=True)
>>> with open("16k16bit.pcm", "rb") as f:
...     stream.write(f.read())

总结

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

相关文章

  • Anaconda安装配置Jupyter最新版的图文步骤

    Anaconda安装配置Jupyter最新版的图文步骤

    本文详细介绍了在本地环境中使用Anaconda安装和配置Jupyter Notebook的过程,具有一定的参考价值,感兴趣的可以了解一下
    2025-03-03
  • Python3.5编程实现修改IIS WEB.CONFIG的方法示例

    Python3.5编程实现修改IIS WEB.CONFIG的方法示例

    这篇文章主要介绍了Python3.5编程实现修改IIS WEB.CONFIG的方法,涉及Python针对xml格式文件的读写以及节点操作相关技巧,需要的朋友可以参考下
    2017-08-08
  • python3实现高效的端口扫描

    python3实现高效的端口扫描

    这篇文章主要为大家详细介绍了python3实现高效的端口扫描,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • python中扫描条形码和二维码的实现代码

    python中扫描条形码和二维码的实现代码

    pyzbar模块是Python一个开源库用于扫描和识别二维码信息。这篇文章主要介绍了python中扫描条形码和二维码的示例代码,需要的朋友可以参考下
    2021-10-10
  • Python中星号的五种用法小结

    Python中星号的五种用法小结

    本文主要介绍了Python中星号的五种用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • python同时替换多个字符串方法示例

    python同时替换多个字符串方法示例

    这篇文章主要介绍了python同时替换多个字符串方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • 详解pytest中runtestprotocol方法的实现

    详解pytest中runtestprotocol方法的实现

    runtestprotocol 是 pytest 执行测试流程中的一个核心函数,它主要负责调用测试函数的“setup”、“call”和“teardown”钩子函数,并生成对应的测试报告,本文将深入探究pytest中runtestprotocol方法的实现,需要的朋友可以参考下
    2023-10-10
  • 利用python求积分的实例

    利用python求积分的实例

    今天小编就为大家分享一篇利用python求积分的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • python读取并定位excel数据坐标系详解

    python读取并定位excel数据坐标系详解

    这篇文章主要介绍了python读取并定位excel数据坐标系详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-06-06
  • 使用Python进行数据清洗和预处理的实现代码

    使用Python进行数据清洗和预处理的实现代码

    Python作为数据科学领域的热门编程语言,提供了丰富的库和工具来处理和清洗数据,本文将介绍如何使用Python进行数据清洗和预处理,并提供相应的代码示例,需要的朋友可以参考下
    2024-05-05

最新评论