python使用pyaudio录音和格式转化方式
作者:沐岚浩 时间:2023-11-07 19:30:03
使用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,pyaudio,录音,格式
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
详解appium+python 启动一个app步骤
2021-12-19 02:44:55
![](https://img.aspxhome.com/file/2023/3/70203_0s.png)
Python时间戳使用和相互转换详解
2023-01-22 08:14:28
MySQL数据库同时查询更新同一张表的方法
2024-01-22 23:10:38
![](https://img.aspxhome.com/file/2023/8/81028_0s.png)
在 Python 应用中使用 MongoDB的方法
2023-09-13 21:53:11
浅析python 中__name__ = '__main__' 的作用
2022-07-21 16:32:28
Golang运行报错找不到包:package xxx is not in GOROOT的解决过程
2024-05-05 09:32:25
![](https://img.aspxhome.com/file/2023/2/127472_0s.jpg)
python把ipynb文件转换成pdf文件过程详解
2022-07-27 23:50:24
![](https://img.aspxhome.com/file/2023/1/84971_0s.png)
编写兼容IE和FireFox的脚本
2009-05-19 12:01:00
浅析Python 序列化与反序列化
2023-05-01 14:36:16
Python PIL库图片灰化处理
2022-08-18 20:57:30
![](https://img.aspxhome.com/file/2023/7/64617_0s.png)
python3定位并识别图片验证码实现自动登录功能
2022-07-23 13:23:59
![](https://img.aspxhome.com/file/2023/2/131252_0s.png)
修炼设计能力的土办法
2008-07-16 10:34:00
如何使用postman(新手入门)
2023-06-12 14:00:31
![](https://img.aspxhome.com/file/2023/6/58166_0s.jpg)
浅谈python中拼接路径os.path.join斜杠的问题
2023-08-21 23:41:23
PyTorch使用GPU训练的两种方法实例
2023-09-21 08:11:40
![](https://img.aspxhome.com/file/2023/9/85309_0s.png)
深入理解NumPy简明教程---数组2
2022-03-24 05:01:18
Python的Twisted框架中使用Deferred对象来管理回调函数
2021-01-04 09:01:23
![](https://img.aspxhome.com/file/2023/6/133716_0s.png)
SQL Server 2000 清理日志精品图文教程
2024-01-18 17:16:55
![](https://img.aspxhome.com/file/2023/5/106235_0s.gif)
XML:OpenSearch 浏览器指定搜索应用
2010-05-04 19:37:00
![](https://img.aspxhome.com/file/UploadPic/20105/4/2008101720221064077801-78s.png)
Python代码执行时间测量模块timeit用法解析
2023-06-13 16:14:04
![](https://img.aspxhome.com/file/2023/7/117567_0s.png)