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
0
投稿
猜你喜欢
- 在网页设计中有一些通用的交互设计模式。网站导航各种各样的通用和大家熟知的设计模式,可以用来作为为网站创建有效地信息架构的基础。这篇指南涵盖了
- 一、查询条件精确,针对有参数传入情况 二、SQL逻辑执行顺序 FROM-->JOIN-->WHERE-->GROUP--&
- 看那个自由落体div有感。这个没落体,画个圆。(ie only)<html><head><style>v
- 正则表达式(Regular Expression,在代码中常简写为regex、regexp或RE)是计算机科学的一个概念。正则表达式使用单个
- 一、asp.net中导出Execl的方法:在asp.net中导出Execl有两种方法,一种是将导出的文件存放在服务器某个文件夹下面,然后将文
- <%'============================================================
- PHP作为开源语言,发展至今已有很多成熟的国内外开源系统,足以满足个人和企业用户自己建立WEB站点,下面则主要介绍PHP建站的流程和步骤。不
- sql代码如下:CREATE PROCEDURE Proname //使用CREATE PROCED
- 本文实例讲述了php将textarea数据提交到mysql出现很多空格的解决方法。分享给大家供大家参考。具体分析如下:有一些朋友可能会发现我
- 本文实例为大家分享了js实现简单贪吃蛇效果的具体代码,供大家参考,具体内容如下上代码之前,先给大家看一下效果:是不是想说:我能这样玩一天…话
- 在我们的生活中,需要接触大量的带有机械按键的物品。当你用手指按下按键的时候。都会或强或弱的感受一股(嗯,也有可能是一丝丝)反作用力传递到你手
- ERROR 2003:Can't connect to MySQL server on 'localhost' (1
- 一、用HTTP头信息 也就是用PHP的HEADER函数。PHP里的HEADER函数的作用就是向浏览器发出由HTTP协议规定的本来应该通过WE
- 或者说有一条命令 hostname [string],当string是不包含2950时,是true,包含2950时是false。使用Exce
- 帮网友小改了一下主题. 任务比较简单, 只是为一个三栏主题添加对 Widget 的支持而已,就先从这次简单的案例开始说吧.单侧边栏funct
- 在计算机信息技术中,少有象类似 XML 那样的技术,她让人们产生范围很大的联想,而这些联想及其应用又可能相距甚远。她也更多引起人们对 XML
- 我们开发数据库应用时,常常需要用到模糊查询。如果同一个条件需要匹配很多字段怎么办呢?通常,程序员会每个字段都在SQL中“field like
- 惊现!表面下的隐藏信息——浅谈信息可视化1910年,病卧床上的魏格那(德国气象学家,以“大陆漂移学说”闻名),无意地注视着墙上的世界地图……
- 到目前为止,我已经开发了两个HTML编辑器了,一个用在公司的CMS项目,另一个用在这个Blog(TidyEditor,暂时没有单独发布)。下
- Google网站管理员工具的验证方式有两种,一个是通过html文件,或一种是通过meta标签。通常情况下,这两个方式直接就可以通过验证了。但