PyAudio是语音处理的计算机编程语言库,提供了比较丰富的功能。本文将利用pyaudio控制指定设备,实现录制音频、采集音频流、播放音频,感兴趣的可以了解一下
简介
PyAudio是一个跨平台的音频处理工具包,使用该工具包可以在计算机编程语言程序中播放和录制音频,也可以产生声音资源文件文件等
安装
安装PyAudio
注意:使用该命令安装时可能会报错,报错内容如下:
针对该问题,我们使用whl文件进行安装,首先在网址下面找到以下文件并下载,根据自己的大蟒版本及计算机系统下载相应文件即可。
下载完成后,切换到文件所在目录,使用如下命令安装即可
pip3安装py音频-0。2 .11-cp38-cp38-win _ amd64。whl
pyaudio控制指定设备,录制音频/采集音频流/播放音频
#!/usr/bin/env python3
#-*-编码:utf-8 -*-
# - 音频设备操作模块-
#
# 功能:录制/获取音频流/播放音频
# 时间: 2021-09-13
#
# -
导入系统、pyaudio、wave
从tqdm导入tqdm
UacAudioInAndOut类:
def __init__(self):
'''
功能:录音参数初始化
创建志愿援助分队志愿救护支队检测模块对象
参数: /
返回值: /
'''
自我。input _ format _ dict={ ' S8 _ LE ':16,' S16_LE':8,' S24_LE':4,' S32_LE':2}
self.framerate_list=[8000,11025,16000,22050,32000,44100,48000,
88200, 96000, 176400, 192000, 352800, 384000]
def _inforPrintf(self,infor_content):
'''
功能:检测操作系统,使用正确编码
输出打印信息
参数:信息内容:信息内容
返回值: /
'''
if sys.platform!='linux '和sys.platform!='达尔文:
infor _ content=str(infor _ content).编码(' gbk ','忽略')。解码(“gbk”)
打印(信息内容)
def GetAllDevInfor(self):
'''
功能:显示支持设备信息
参数: /
返回值: /
'''
PA=pyaudio .PyAudio()
自我. infoprintf('-本机支持设备- ')
对于范围内的设备索引(PA.get _设备_计数()):
自我. infoprintf(' \ n-')
对于爸。获取设备信息索引(设备索引)中的键:
自我. infoprintf(' % s:% s ' %(key,str(pa。get _ device _ info _ by _ index(dev _ index)[key]))
自我. inforPrintf('========================================')
def GetUacDevInfor(self,devKeywordOrIndex=None):
'''
功能:获取UAC设备信息
参数:devKeywordOrIndex:设备名称关键字或索引
返回值:驾驶员信息中心设备信息字典
错误的设备信息获取失败
'''
PA=pyaudio .PyAudio()
如果devKeywordOrIndex==None:
自我. infoprintf(' \ 033[0;36;31m[UacAudioInAndOut]未设设备,当前使用默认设备\ 033[0m ']
返回pa。获取默认输入设备信息()
如果字符串(devKeywordOrIndex).isdigit():
devKeywordOrIndex=int(devKeywordOrIndex)
返回爸。获取设备信息索引
uac_infor_list=[]
对于范围内的UAC指数。获取设备计数()):
如果爸。获取设备信息索引(UAC索引).get('name ').find(str(devKeywordOrIndex))=0:
UAC信息列表。追加(pa。获取设备信息索引(UAC索引)
if len(uac_infor_list) 1:
自我. infoprintf(' \ 033[0;36;UAC设备有多个,\
请修正关键字,当前设备如下:%s\033[0m'%str(uac_infor_list))
返回错误的
否则:
返回uac_infor_list.pop()
def is_framerate_supported(self,setFramerate,UacAudioInHandle,
load_parame_dict,input_or_output='input '):
'''
功能:判断当配置在指定设备中是否支持
参数:setFramerate:设置采样率
UacAudioInHandle:设备句柄
load_parame_dict:加载字典
输入输出:输入/输出功能
返回值:bool真/假
'''
尝试:
if input_or_output=='input ':
uacaudioinhandle。is _ format _ supported(rate=float(设置帧速率),
input_device=load_parame_dict['索引'],
input _ channels=load _ parame _ dict[' setInputChannels '],
input _ format=load _ parame _ dict[' _ setInputFormat '])
否则:
uacaudioinhandle。is _ format _ supported(rate=float(设置帧速率),
output _ device=load _ parame _ dict['索引'],
output _ channels=load _ parame _ dict[' maxOutputChannels '],
output _ format=uacaudioinhandle。get _ format _ from _ width(load _ parame _ dict[' set output format ']))
返回真实的
除了:
返回错误的
def LoadUacAudioInDevice(self,maxStreamDuration=1000,setInputChannels=None,
setInputFormat=None,devKeywordOrIndex=None):
'''
功能:加载音频获取设备
参数:maxStreamDuration=1000默认一段流时长
setInputChannels:通道数
setInputFormat:位宽
devKeywordOrIndex:录音设备关键字/索引
返回值:
成功:UacAudioInHandle,StreamHandle,load_parame_dict
失败:错误
'''
尝试:
load_parame_dict={}
uac_infor_dict=self .GetUacDevInfor(devKeywordOrIndex)
如果不是setInputFormat:
_Format='S16_LE '
自我. infoprintf(' \ 033[0;36;33m[UacAudioInAndOut]未设置位宽,使用默认s16 _ LE \ 033[0m ']
否则:
_Format=setInputFormat
setInputFormat=self。输入格式字典[_格式]
如果不是setInputChannels或int(setInputChannels)UAC _信息_字典[' maxInputChannels ']:
setInputChannels=UAC _信息_字典[' maxInputChannels ']
自我. infoprintf(' \ 033[0;36;33m[UacAudioInAndOut]输入通道未设置/超出当前设备最大值,使用默认最大通道%s\
\ 033[0m“% setInputChannels”
否则:
setInputChannels=int(setInputChannels)
dev _ index=UAC _信息_字典['索引']
load _ parame _ dict[' index ']=dev _ index
load _ parame _ dict[' setInputFormat ']=_ Format
load _ parame _ dict[' _ setInputFormat ']=setInputFormat
load _ parame _ dict[' setInputChannels ']=setInputChannels
UacAudioInHandle=pyaudio .PyAudio()
对于self.framerate_list中的setInputFramerate:
如果自我。is _ frame rate _ supported(setInputFramerate,UacAudioInHandle,load_parame_dict):
load _ parame _ dict[' setInputFramerate ']=setInputFramerate
破裂
#计算数据大小一段
CHUNK _ SIZE=int(setInputFramerate * maxStreamDuration/1000)
load _ parame _ dict[' CHUNK _ SIZE ']=CHUNK _ SIZE
自我. infoprintf(' \ 033[0;36;38m[UacAudioInAndOut]加载参数:% s \ 033[0m ' % str(load _ parame _ dict))
#加载设备
stream handle=uacaudioinhandle。打开(
format=load _ parame _ dict[' _ setInputFormat '],
channels=load _ parame _ dict[' setInputChannels '],
rate=load _ parame _ dict[' setInputFramerate '],
输入=真,
输入设备索引=加载参数字典['索引'],
start=False,
帧每缓冲区=int(块大小))
#开始流获取
StreamHandle.start_stream()
返回UacAudioInHandle,StreamHandle,load_parame_dict
除了:
自我. infoprintf(' \ 033[0;36;31m[UacAudioInAndOut] Uac音频输入加载失败\ 033[0m ']
返回假,假,假
def LoadUacAudioOutDevice(self,devKeywordOrIndex):
'''
功能:加载音频输出设备
参数: /
返回值:UacAudioInHandle或错误的
'''
尝试:
uac_infor_dict=self .GetUacDevInfor(devKeywordOrIndex)
UacAudioInHandle=pyaudio .PyAudio()
返回UacAudioInHandle,uac_infor_dict
除了:
返回错误的
def GetUacAudioInStream(self,StreamHandle,CHUNK_SIZE):
'''
功能:开始采集声卡音频
生成音频流
参数:UacAudioInHandle:设备句柄
StreamHandle:流句柄
返回值区块数据流数据
'''
返回流句柄。read(CHUNK _ SIZE,exception _ on _溢出=False) #防止溢出
def UacAudioOutPlay(self,playWavFile,Repeat=None,Pdict=None,devKeywordOrIndex=None,):
'''
功能:可以循环播放指定文件
参数:playWavFile:播放文件路径
重复:循环播放次数
CustomizeAudioParam:自定义播放参数
返回值: /
'''
UacAudioInHandle,uac_infor_dict=self .LoadUacAudioOutDevice(devKeywordOrIndex)
自我. inforPrintf(str(UAC _信息_字典).编码(' gbk ','忽略')。解码(' gbk ')
自我. infoprintf(' \ 033[1;36;34m[UacAudioInAndOut指定设备:%s\t播放文件:%s\t循环总数:%s\
\ 033[0m"%(devKeywordOrIndex,playWavFile,Repeat))
尝试:
区块=1024
pfb=wave.open(playWavFile,' rb ')
setOutputFormat=pfb。getsampwidth()
setOutputChannels=pfb。获取频道()
setOutputFramerate=pfb。获取帧率()
UAC _信息_字典['设置输出格式']=设置输出格式
如果setOutputChannels UAC _信息_字典['最大输出通道']:
自我. infoprintf(' \ 033[0;36;31m[UacAudioInAndOut]当前通道数,在该设备上不支持, \
设备最大通道数:% s \ 033[0m ' % UAC _信息_字典['最大输出频道'])
返回错误的
如果不是自我。is _ frame rate _ supported(setOutputFramerate,UacAudioInHandle,uac_infor_dict,' output '):
自我. infoprintf(' \ 033[0;36;31m[UacAudioInAndOut]当前文件采样率,在该设备上不支持,\
设备默认采样率:% s \ 033[0m ' % UAC _信息_字典['默认抽样率'])
返回错误的
否则:
UAC _ infor _ dict[' defaultSampleRate ']=setOutputFramerate
stream=UacAudioInHandle.open(
输出设备索引=UAC信息字典['索引'],
format=uacaudioinhandle。get _ format _ from _ width(setOutputFormat),
通道=setOutputChannels,
rate=setOutputFramerate,
输出=真)
if Repeat=='Dead_cycle ':
自我. infoprintf(' \ 033[1;36;33m[UacAudioInAndOut]死循环玩法!\ 033[0m ']
虽然正确:
如果type(Pdict)==dict和Pdict['播放状态']=='停止:
破裂
pfb=wave.open(playWavFile,' rb ')
虽然正确:
data=pfb.readframes(chunk)
如果不是数据:
破裂
流.写(数据)
否则:
对于tqdm(range(int(Repeat)))中的索引:
如果type(Pdict)==dict和Pdict['播放状态']=='停止:
破裂
pfb=wave.open(playWavFile,' rb ')
虽然正确:
data=pfb.readframes(chunk)
如果不是数据:
破裂
流.写(数据)
stream.stop_stream()
stream.close()
自我。关闭音频设备(UacAudioInHandle)
返回真实的
除了:
stream.stop_stream()
stream.close()
返回错误的
def UacAudioInRecord(self,saveWavFile,recordTime,#单位秒
setInputChannels=None,
setInputFormat=None,
devKeywordOrIndex=None):
'''
功能:录制音频文件
参数:录制时间:录音时长,单位(s)
setInputFramerate:采样率
setInputChannels:通道数
setInputFormat:位宽
devKeywordOrIndex:录音设备索引
返回值: /
'''
最大数据流持续时间=1000
load_parame_dict={}
UacAudioInHandle,StreamHandle,load_parame_dict=self .LoadUacAudioInDevice(
maxStreamDuration,
setInputChannels,
setInputFormat,
devKeywordOrIndex)
如果不是UacAudioInHandle或者不是StreamHandle:
自我. infoprintf(' \ 033[0;36;31m[UacAudioInAndOut]录音失败\ 033[0m ']
返回错误的
自我. infoprintf(' \ 033[1;36;34m[UacAudioInAndOut录音-文件名:%s时长:%s\
\ 033[0m"%(saveWavFile,recordTime))
自我. infoprintf(load _ parame _ dict[' CHUNK _ SIZE '])
data_list=[]
对于范围内的记录时间_索引(int(记录时间)):
数据=无
数据=流句柄。read(load _ parame _ dict[' CHUNK _ SIZE '],exception_on_overflow=False)
数据列表。追加(数据)
StreamHandle.stop_stream()
StreamHandle.close()
自我。关闭音频设备(UacAudioInHandle)
使用wave.open(saveWavFile,' wb ')作为wavfb:
wavfb。setn通道(load _ parame _ dict[' setInputChannels '])
wavfb。setsampwidth(uacaudioinhandle。get _ sample _ size(load _ parame _ dict[' _ setInputFormat ']))
wavfb。setframerate(load _ parame _ dict[' setInputFramerate '])
wavfb.writeframes(b ' ' .join(数据列表))
'''
功能:关闭音频流设备
参数:UacAudioInHandle
返回值:bool真/假
'''
尝试:
StreamHandle.stop_stream()
StreamHandle.close()
自我CloseAudioDevice()
返回真实的
除了:
返回错误的
def CloseAudioDevice(self,UacAudioDeviceHandle):
'''
功能:释放声音的设备
参数:UacAudioDeviceHandle
返回值:bool真/假
'''
尝试:
UacAudioDeviceHandle.terminate()
返回真实的
除了:
返回错误的
if __name__=='__main__ ':
asv=UacAudioInAndOut()
asv .GetAllDevInfor()
#asv .UacAudioOutPlay(sys.argv[1],int(sys.argv[2]),None,sys.argv[3])
asv .UacAudioInRecord(sys.argv[1],sys.argv[2])
以上是Python pyaudio的音频控制示例的详细内容。更多关于Python pyaudio的音频控制,请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。