python使用pyaudio录音和格式转化方式
作者:沐岚浩 发布时间:2023-11-07 19:30:03
标签: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())
来源:https://blog.csdn.net/weixin_45729594/article/details/119478393


猜你喜欢
- 数据库缓存为了使用数据库表作为缓存后端,首先在数据库中运行这个命令以创建缓存表:python manage.py createcacheta
- 前言:写小程序时,遇到个需要自定义回归时间的场景,下面是实现的效果图。 于我需求而言,我只需要用到fixed_in
- 从接触互联网开始,一直在关注每个网站页面浏览速度,不管大小国内外网站,而且每个用户的浏览时间都不一样,从而了解用户在浏览页面上时间体验尺度的
- 本文实例讲述了JS获得选取checkbox整行数据的方法。分享给大家供大家参考。具体实现方法如下:<html><head&
- up.htm'::::::: 此程序属扬子原创 ::::::::::::::::::':::::: 在sql2000,200
- 一、类的构造函数与析构函数_init__ 函数是python 类的构造函数,在创建一个类对象的时候,就会自动调用该函数;可以用来在创建对象的
- 光的干涉干涉即两束光在叠加过程中出现的强度周期性变化情况,其最简单的案例即为杨氏双缝干涉。如图所示,光从 S S S点发出,通过两个狭缝 S
- 基本索引In [4]: sentence = 'You are a nice girl'In [5]: L = senten
- 一、AnacondaAnaconda(水蟒)是一个捆绑了Python、conda、其他相关依赖包的一个软件。包含了180多个可学计算包及其依
- ACCESS数据库在用的过程中,经常不断的进行删除和增加记录的操作,会出现以下问题:1、可能会使Update语句更新失败,明明一条记录存在,
- 目录1.使用说明2.准备3.语法3.1 变量及赋值3.2 入参出参3.3 流程控制-判断3.4 流程控制-循环3.5 流程控制-退出、继续循
- 自动化测试执行的用例有很多,python额测试用例文件,都是以“test”开头的。TestLoader(defaultTestLoader)
- 在python开发中,经常会出现调用子文件夹下的py模块如上图,如果在test.py文件中,要调用meeting文件夹下面的huodongs
- 本文实例为大家分享了python实现QQ空间自动点赞的具体代码,供大家参考,具体内容如下项目github地址使用python实现qq空间自动
- 编码问题因为涉及到中文,所以必然地涉及到了编码的问题,这一次借这个机会算是彻底搞清楚了。问题要从文字的编码讲起。原本的英文编码只有0~255
- CentOS安装Python1.CentOS已经自带安装了2.x版本,先尝试python命令检查已安装的版本.如果你使用rpm、yum或de
- 这篇文章主要介绍了Python属性和内建属性实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友
- 环境:python3.5,pycharm2017.2.3目录结构a.pyt=5b.pyfrom a import tprint(t)平台显示
- 权限及设计数据库用户管理使用SQLyog 创建用户,并授予权限演示基本命令/* 用户和权限管理 */ ------------------用
- 什么是模块?请思考与代码库类似的模块。模块是包含一组函数的文件,希望在应用程序中引用。创建模块如需创建模块,只需将所需代码保存在文件扩展名为