最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python+pyaudio實現(xiàn)音頻控制示例詳解

 更新時間:2022年07月22日 17:21:11   作者:小樹筆記  
PyAudio?是語音處理的?Python?庫,提供了比較豐富的功能。本文將利用pyaudio控制指定設(shè)備,實現(xiàn)錄制音頻、采集音頻流、播放音頻,感興趣的可以了解一下

簡介

PyAudio是一個跨平臺的音頻處理工具包,使用該工具包可以在Python程序中播放和錄制音頻,也可以產(chǎn)生wav文件等

安裝

pip install PyAudio

注意:使用該命令安裝時可能會報錯,報錯內(nèi)容如下:

針對該問題,我們使用whl文件進(jìn)行安裝,首先在網(wǎng)址下面找到以下文件并下載,根據(jù)自己的python版本及計算機(jī)系統(tǒng)下載相應(yīng)文件即可。

下載完成后,切換到文件所在目錄,使用如下命令安裝即可

pip3 install PyAudio-0.2.11-cp38-cp38-win_amd64.whl

pyaudio控制指定設(shè)備,錄制音頻/采集音頻流/播放音頻

#!/usr/bin/env python3
#-*- coding:utf-8 -*-
#------------- 音頻設(shè)備操作模塊 -------------------
#
#   功能:   錄制/獲取音頻流/播放音頻
#   時間:  2021-09-13
#
#--------------------------------------------------

import sys ,pyaudio, wave
from tqdm import tqdm

class UacAudioInAndOut:
    def __init__(self):
        """
            功能:   錄音參數(shù)初始化
                    創(chuàng)建vad檢測模塊對象
            參數(shù):   /
            返回值: /
        """
        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):
        """
            功能:   檢測操作系統(tǒng),使用正確編碼
                    輸出打印信息
            參數(shù):   infor_content: 信息內(nèi)容
            返回值: /
        """
        if sys.platform != "linux" and sys.platform != "darwin":
            infor_content = str(infor_content).encode("gbk","ignore").decode("gbk")
        print(infor_content)

    def GetAllDevInfor(self):
        """
            功能:   顯示支持設(shè)備信息
            參數(shù):   /
            返回值: /
        """
        PA = pyaudio.PyAudio()
        self._inforPrintf("----------------------< 本機(jī)支持設(shè)備 >------------------------------")
        for dev_index in range(PA.get_device_count()):
            self._inforPrintf("\n-------------------------------------------------------")
            for key in PA.get_device_info_by_index(dev_index):
                    self._inforPrintf("%s:%s"%(key, str(PA.get_device_info_by_index(dev_index)[key])))
            self._inforPrintf("========================================================")


    def GetUacDevInfor(self, devKeywordOrIndex=None):
        """
            功能:   獲取UAC設(shè)備信息
            參數(shù):   devKeywordOrIndex: 設(shè)備名稱關(guān)鍵字或索引
            返回值: dic 設(shè)備信息字典
                    False 設(shè)備信息獲取失敗
        """
        PA = pyaudio.PyAudio()
        if devKeywordOrIndex == None:
            self._inforPrintf("\033[0;36;31m[UacAudioInAndOut] 未設(shè)設(shè)備, 當(dāng)前使用默認(rèn)設(shè)備\033[0m")
            return PA.get_default_input_device_info()
        if str(devKeywordOrIndex).isdigit():
            devKeywordOrIndex = int(devKeywordOrIndex)
            return PA.get_device_info_by_index(devKeywordOrIndex)

        uac_infor_list = []
        for uac_index in range(PA.get_device_count()):
            if PA.get_device_info_by_index(uac_index).get("name").find(str(devKeywordOrIndex)) >= 0:
                uac_infor_list.append(PA.get_device_info_by_index(uac_index))

        if len(uac_infor_list) > 1:
            self._inforPrintf("\033[0;36;33m[UacAudioInAndOut] UAC 設(shè)備有多個,\
                    請修正關(guān)鍵字, 當(dāng)前設(shè)備如下: %s\033[0m"%str(uac_infor_list))
            return False
        else:
            return uac_infor_list.pop()

    def is_framerate_supported(self, setFramerate, UacAudioInHandle,
                                load_parame_dict, input_or_output="input"):
        """
            功能:   判斷當(dāng)配置在指定設(shè)備中是否支持
            參數(shù):   setFramerate:       設(shè)置采樣率
                    UacAudioInHandle:   設(shè)備句柄
                    load_parame_dict:   加載字典
                    input_or_output:    輸入/輸出功能
            返回值: bool True/False
        """
        try:
            if input_or_output == "input":
                UacAudioInHandle.is_format_supported(rate=float(setFramerate),
                            input_device=load_parame_dict['index'],
                            input_channels=load_parame_dict['setInputChannels'],
                            input_format=load_parame_dict['_setInputFormat'])
            else:
                UacAudioInHandle.is_format_supported(rate=float(setFramerate),
                            output_device=load_parame_dict['index'],
                            output_channels=load_parame_dict['maxOutputChannels'],
                            output_format=UacAudioInHandle.get_format_from_width(load_parame_dict['setOutputFormat']))
            return True
        except:
            return False

    def LoadUacAudioInDevice(self, maxStreamDuration=1000, setInputChannels=None,
                                        setInputFormat=None, devKeywordOrIndex=None):
        """
            功能:   加載音頻獲取設(shè)備
            參數(shù):   maxStreamDuration=1000 默認(rèn)一段流時長
                    setInputChannels:           通道數(shù)
                    setInputFormat:             位寬
                    devKeywordOrIndex:    錄音設(shè)備關(guān)鍵字/索引
            返回值:
                    成功: UacAudioInHandle, StreamHandle, load_parame_dict
                    失敗: False
        """
        try:
            load_parame_dict = {}
            uac_infor_dict = self.GetUacDevInfor(devKeywordOrIndex)
            if not setInputFormat:
                _Format = "S16_LE"
                self._inforPrintf("\033[0;36;33m[UacAudioInAndOut] 未設(shè)置位寬,使用默認(rèn) S16_LE \033[0m")
            else:
                _Format = setInputFormat
            setInputFormat = self.input_format_dict[_Format]

            if not setInputChannels or int(setInputChannels) > uac_infor_dict["maxInputChannels"]:
                setInputChannels = uac_infor_dict["maxInputChannels"]
                self._inforPrintf("\033[0;36;33m[UacAudioInAndOut] 輸入通道未設(shè)置/超出當(dāng)前設(shè)備最大值,使用默認(rèn)最大通道 %s\
                                                                                    \033[0m"%setInputChannels)
            else:
                setInputChannels = int(setInputChannels)
            dev_index = uac_infor_dict["index"]
            load_parame_dict["index"]=dev_index
            load_parame_dict["setInputFormat"] = _Format
            load_parame_dict["_setInputFormat"] = setInputFormat
            load_parame_dict["setInputChannels"] = setInputChannels
            UacAudioInHandle = pyaudio.PyAudio()
            for setInputFramerate in self.framerate_list:
                if self.is_framerate_supported(setInputFramerate, UacAudioInHandle, load_parame_dict):
                    load_parame_dict["setInputFramerate"] = setInputFramerate
                    break
            #計算數(shù)據(jù)大小一段
            CHUNK_SIZE = int(setInputFramerate * maxStreamDuration / 1000)
            load_parame_dict["CHUNK_SIZE"] = CHUNK_SIZE
            self._inforPrintf("\033[0;36;38m[UacAudioInAndOut] 加載參數(shù): %s\033[0m"%str(load_parame_dict))
            #加載設(shè)備
            StreamHandle = UacAudioInHandle.open(
                                format=load_parame_dict['_setInputFormat'],
                                channels=load_parame_dict['setInputChannels'],
                                rate=load_parame_dict['setInputFramerate'],
                                input=True,
                                input_device_index=load_parame_dict['index'],
                                start=False,
                                frames_per_buffer=int(CHUNK_SIZE))
            #開始流獲取
            StreamHandle.start_stream()
            return UacAudioInHandle, StreamHandle, load_parame_dict
        except:
            self._inforPrintf("\033[0;36;31m[UacAudioInAndOut] Uac AudioIn 加載失敗\033[0m")
            return False, False, False

    def LoadUacAudioOutDevice(self, devKeywordOrIndex):
        """
            功能:   加載音頻輸出設(shè)備
            參數(shù):   /
            返回值: UacAudioInHandle 或 False
        """
        try:
            uac_infor_dict = self.GetUacDevInfor(devKeywordOrIndex)
            UacAudioInHandle = pyaudio.PyAudio()
            return UacAudioInHandle, uac_infor_dict
        except:
            return False


    def GetUacAudioInStream(self, StreamHandle, CHUNK_SIZE):
        """
            功能:   開始采集聲卡音頻
                    生成音頻流
            參數(shù):   UacAudioInHandle:   設(shè)備句柄
                    StreamHandle:       流句柄
            返回值  chunk_data 流數(shù)據(jù)
        """
        return StreamHandle.read(CHUNK_SIZE, exception_on_overflow=False) #防止溢出


    def UacAudioOutPlay(self, playWavFile, Repeat=None, Pdict=None, devKeywordOrIndex=None,):
        """
            功能:   可以循環(huán)播放指定文件
            參數(shù):   playWavFile:            播放文件路徑
                    Repeat:                 循環(huán)播放次數(shù)
                    CustomizeAudioParam:    自定義播放參數(shù)
            返回值: /
        """
        UacAudioInHandle, uac_infor_dict = self.LoadUacAudioOutDevice(devKeywordOrIndex)
        self._inforPrintf(str(uac_infor_dict).encode("gbk","ignore").decode("gbk"))
        self._inforPrintf("\033[1;36;34m[UacAudioInAndOut] 指定設(shè)備: %s\t播放文件: %s\t循環(huán)總數(shù): %s\
                                            \033[0m"%(devKeywordOrIndex, playWavFile,Repeat))
        try:
            chunk=1024
            pfb = wave.open(playWavFile, 'rb')
            setOutputFormat = pfb.getsampwidth()
            setOutputChannels = pfb.getnchannels()
            setOutputFramerate = pfb.getframerate()
            uac_infor_dict['setOutputFormat'] = setOutputFormat

            if setOutputChannels > uac_infor_dict["maxOutputChannels"]:
                self._inforPrintf("\033[0;36;31m[UacAudioInAndOut] 當(dāng)前通道數(shù),在該設(shè)備上不支持, \
                                設(shè)備最大通道數(shù): %s\033[0m"%uac_infor_dict["maxOutputChannels"])
                return False
            if not self.is_framerate_supported(setOutputFramerate, UacAudioInHandle, uac_infor_dict, "output"):
                self._inforPrintf("\033[0;36;31m[UacAudioInAndOut] 當(dāng)前文件采樣率,在該設(shè)備上不支持,\
                                    設(shè)備默認(rèn)采樣率: %s\033[0m"%uac_infor_dict["defaultSampleRate"])
                return False
            else:
                uac_infor_dict["defaultSampleRate"] = setOutputFramerate
            stream = UacAudioInHandle.open(
                                output_device_index=uac_infor_dict['index'],
                                format=UacAudioInHandle.get_format_from_width(setOutputFormat),
                                channels=setOutputChannels,
                                rate=setOutputFramerate,
                                output=True)

            if Repeat == "Dead_cycle":
                self._inforPrintf("\033[1;36;33m[UacAudioInAndOut] Dead cycle play !!! \033[0m")
                while True:
                    if type(Pdict) == dict and Pdict["play status"] == "stop":
                        break
                    pfb = wave.open(playWavFile, 'rb')
                    while True:
                        data = pfb.readframes(chunk)
                        if not data:
                            break
                        stream.write(data)
            else:
                for index in tqdm(range(int(Repeat))):
                    if type(Pdict) == dict and Pdict["play status"] == "stop":
                        break
                    pfb = wave.open(playWavFile, 'rb')
                    while True:
                        data = pfb.readframes(chunk)
                        if not data:
                            break
                        stream.write(data)

            stream.stop_stream()
            stream.close()
            self.CloseAudioDevice(UacAudioInHandle)
            return True
        except:
            stream.stop_stream()
            stream.close()
            return False


    def UacAudioInRecord(self, saveWavFile, recordTime, #單位秒
                        setInputChannels=None,
                        setInputFormat=None,
                        devKeywordOrIndex=None):
        """
            功能:   錄制音頻文件
            參數(shù):   recordTime:         錄音時長, 單位(s)
                    setInputFramerate:  采樣率
                    setInputChannels:   通道數(shù)
                    setInputFormat:     位寬
                    devKeywordOrIndex:      錄音設(shè)備索引
            返回值: /
        """
        maxStreamDuration=1000
        load_parame_dict = {}
        UacAudioInHandle, StreamHandle, load_parame_dict = self.LoadUacAudioInDevice(
                                                                    maxStreamDuration,
                                                                    setInputChannels,
                                                                    setInputFormat,
                                                                    devKeywordOrIndex)
        if not UacAudioInHandle or not StreamHandle:
            self._inforPrintf("\033[0;36;31m[UacAudioInAndOut] 錄音失敗\033[0m")
            return False

        self._inforPrintf("\033[1;36;34m[UacAudioInAndOut] 錄音 -> 文件名: %s 時長: %s\
                                            \033[0m"%(saveWavFile,recordTime))
        self._inforPrintf(load_parame_dict["CHUNK_SIZE"])
        data_list = []
        for recordTime_index in range(int(recordTime)):
            data = None
            data = StreamHandle.read(load_parame_dict["CHUNK_SIZE"], exception_on_overflow=False)
            data_list.append(data)
        StreamHandle.stop_stream()
        StreamHandle.close()
        self.CloseAudioDevice(UacAudioInHandle)
        with wave.open(saveWavFile, "wb") as wavfb:
            wavfb.setnchannels(load_parame_dict["setInputChannels"])
            wavfb.setsampwidth(UacAudioInHandle.get_sample_size(load_parame_dict["_setInputFormat"]))
            wavfb.setframerate(load_parame_dict["setInputFramerate"])
            wavfb.writeframes(b''.join(data_list))

        """
            功能:   關(guān)閉音頻流設(shè)備
            參數(shù):   UacAudioInHandle
            返回值: bool True/False
        """
        try:
            StreamHandle.stop_stream()
            StreamHandle.close()
            self.CloseAudioDevice()
            return True
        except:
            return False

    def CloseAudioDevice(self, UacAudioDeviceHandle):
        """
            功能:   釋放 Audio 設(shè)備
            參數(shù):   UacAudioDeviceHandle
            返回值: bool True/False
        """
        try:
            UacAudioDeviceHandle.terminate()
            return True
        except:
            return False


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實現(xiàn)音頻控制示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Python pyaudio音頻控制的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 一文教會你用Python讀取PDF文件

    一文教會你用Python讀取PDF文件

    Python?工程師在日常的工作中,經(jīng)常會碰到解析和處理PDF文件的情況。本文將pdfplumber進(jìn)行PDF文件的讀取操作,感興趣的可以了解一下
    2022-08-08
  • Python Django查詢集的延遲加載特性詳解

    Python Django查詢集的延遲加載特性詳解

    在 Django 的開發(fā)過程中,查詢集(QuerySet)是我們與數(shù)據(jù)庫進(jìn)行交互的重要工具,本文將深入探討 Django 查詢集的延遲加載特性,幫助新手理解其工作原理及優(yōu)缺點,提供一些實用的代碼示例來展示延遲加載如何在實際項目中使用,需要的朋友可以參考下
    2024-10-10
  • Python 爬蟲之Beautiful Soup模塊使用指南

    Python 爬蟲之Beautiful Soup模塊使用指南

    這篇文章主要介紹了Python 爬蟲之Beautiful Soup模塊使用指南,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • Python如何基于rsa模塊實現(xiàn)非對稱加密與解密

    Python如何基于rsa模塊實現(xiàn)非對稱加密與解密

    這篇文章主要介紹了Python如何基于rsa模塊實現(xiàn)非對稱加密與解密,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • Python 經(jīng)典貪心算法之Prim算法案例詳解

    Python 經(jīng)典貪心算法之Prim算法案例詳解

    這篇文章主要介紹了Python 經(jīng)典貪心算法之Prim算法案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • tensorflow 實現(xiàn)自定義梯度反向傳播代碼

    tensorflow 實現(xiàn)自定義梯度反向傳播代碼

    今天小編就為大家分享一篇tensorflow 實現(xiàn)自定義梯度反向傳播代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • Python docx庫代碼演示

    Python docx庫代碼演示

    這篇文章主要介紹了Python docx庫用法,結(jié)合實例形式分析了docx庫相關(guān)的docx文件讀取、文本添加、格式操作,需要的朋友可以參考下
    2021-10-10
  • 利用python實現(xiàn)簡單的郵件發(fā)送客戶端示例

    利用python實現(xiàn)簡單的郵件發(fā)送客戶端示例

    下面小編就為大家分享一篇利用python實現(xiàn)簡單的郵件發(fā)送客戶端示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • python中數(shù)字是否為可變類型

    python中數(shù)字是否為可變類型

    在本篇文章里小編給大家整理了關(guān)于python中數(shù)字是否為可變類型的相關(guān)文章內(nèi)容,需要的朋友們可以學(xué)習(xí)下。
    2020-07-07
  • 關(guān)于keras中卷積層Conv2D的學(xué)習(xí)記錄

    關(guān)于keras中卷積層Conv2D的學(xué)習(xí)記錄

    這篇文章主要介紹了關(guān)于keras中卷積層Conv2D的學(xué)習(xí)記錄,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02

最新評論

昌江| 荆门市| 铅山县| 布拖县| 永登县| 襄汾县| 高碑店市| 新郑市| 霍邱县| 舞钢市| 林口县| 荃湾区| 从江县| 内丘县| 石城县| 南乐县| 民县| 车致| 赤城县| 德兴市| 黄冈市| 哈尔滨市| 英德市| 鄂尔多斯市| 郯城县| 巴里| 南宁市| 翁源县| 兖州市| 乐山市| 罗田县| 于都县| 孙吴县| 苏尼特右旗| 页游| 大姚县| 五莲县| 朝阳区| 斗六市| 灵武市| 叙永县|