,,Python+pyaudio实现音频控制示例详解

,,Python+pyaudio实现音频控制示例详解

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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: