Python音頻操作工具PyAudio上手教程詳解
0.引子
當(dāng)需要使用Python處理音頻數(shù)據(jù)時(shí),使用python讀取與播放聲音必不可少,下面介紹一個(gè)好用的處理音頻PyAudio工具包。
PyAudio是Python開(kāi)源工具包,由名思義,是提供對(duì)語(yǔ)音操作的工具包。提供錄音播放處理等功能,可以視作語(yǔ)音領(lǐng)域的OpenCv。
1.簡(jiǎn)介
PyAudio為跨平臺(tái)音頻I / O庫(kù) PortAudio 提供 Python 綁定。使用PyAudio,您可以輕松地使用Python在各種平臺(tái)上播放和錄制音頻,例如GNU / Linux,Microsoft Windows和Apple Mac OS X / macOS。
PyAudio的靈感來(lái)自:
- pyPortAudio / fastaudio :PortAudio v18 API的Python綁定。
- tkSnack :Tcl / Tk和Python的跨平臺(tái)聲音工具包。
2.安裝
目前的版本是 PyAudio v0.2.11 。在大多數(shù)平臺(tái)上使用pip安裝PyAudio。對(duì)于v0.2.9之前的版本,PyAudio分發(fā)安裝二進(jìn)制文件,這些文件 存檔在這里 。
微軟Windows
使用 pip 安裝:
python -m pip install pyaudio
筆記:
- 如果pip尚未與您的Python安裝捆綁在一起,請(qǐng) 在此處 獲取 。
- pip將獲取并安裝PyAudio輪(預(yù)先打包的二進(jìn)制文件)。目前,有車(chē)輪兼容Python 2.7,3.4,3.5和3.6 的 官方發(fā)行版 。對(duì)于這些版本,可以使用32位和64位車(chē)輪。
- 這些二進(jìn)制文件包括使用MinGW構(gòu)建的PortAudio v19 v190600_20161030。它們僅支持Windows MME API, 不 包括對(duì)DirectX,ASIO等的支持。如果需要支持未包含的API,則需要編譯PortAudio和PyAudio。 Apple Mac OS X.
使用 Homebrew 安裝必備的portaudio庫(kù),然后使用pip安裝PyAudio:
brew install portaudio pip install pyaudio
筆記:
- 如果尚未安裝,請(qǐng)下載 Homebrew 。
- pip將下載PyAudio源代碼并為您的Python版本構(gòu)建它。
- Homebrew和構(gòu)建PyAudio還需要安裝Xcode命令行工具( 更多信息 )。
Debian / Ubuntu
使用包管理器安裝PyAudio:
sudo apt-get install python-pyaudio python3-pyaudio
如果沒(méi)有最新版本的PyAudio,請(qǐng)使用pip安裝它:
pip install pyaudio
筆記:
- pip將下載PyAudio源并為您的系統(tǒng)構(gòu)建它。請(qǐng)務(wù)必事先安裝portaudio庫(kù)開(kāi)發(fā)包(
portaudio19-dev
)和python開(kāi)發(fā)包(python-all-dev
)。 - 為了更好地隔離系統(tǒng)包,請(qǐng)考慮在virtualenv中 安裝PyAudio 。
PyAudio來(lái)源
源代碼可從Python Package Index(PyPI)下載: pypi.python.org/pypi/PyAudio 。
或克隆git存儲(chǔ)庫(kù):
git clone https://people.csail.mit.edu/hubert/git/pyaudio.git
要從源代碼構(gòu)建PyAudio,您還需要構(gòu)建 PortAudio v19 。有關(guān)為各種平臺(tái)構(gòu)建PyAudio的一些說(shuō)明,請(qǐng)參閱 編譯提示 。要使用Microsoft Visual Studio構(gòu)建PyAudio,請(qǐng)查看Sebastian Audet的 說(shuō)明 。
3.示例
1).采集音頻
下面以一段代碼演示如何從計(jì)算機(jī)麥克風(fēng)采集一段音頻,采集音頻時(shí)長(zhǎng) 4s,保存文件 output.wav
使用了tqdm模塊,可以方便顯示出來(lái)讀取過(guò)程,如下:
* recording 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 172/172 [00:03<00:00, 43.40it/s] * done recording
import pyaudio import wave from tqdm import tqdm def record_audio(wave_out_path,record_second): CHUNK = 1024 FORMAT = pyaudio.paInt16 CHANNELS = 2 RATE = 44100 p = pyaudio.PyAudio() stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK) wf = wave.open(wave_out_path, 'wb') wf.setnchannels(CHANNELS) wf.setsampwidth(p.get_sample_size(FORMAT)) wf.setframerate(RATE) print("* recording") for i in tqdm(range(0, int(RATE / CHUNK * record_second))): data = stream.read(CHUNK) wf.writeframes(data) print("* done recording") stream.stop_stream() stream.close() p.terminate() wf.close() record_audio("output.wav",record_second=4)
要使用PyAudio,首先使用 pyaudio.PyAudio()
(1)實(shí)例化PyAudio ,它設(shè)置portaudio系統(tǒng)。
要錄制或播放音頻,請(qǐng)使用 pyaudio.PyAudio.open()
(2)在所需設(shè)備上打開(kāi)所需音頻參數(shù)的流。這設(shè)置了 pyaudio.Stream
播放或錄制音頻。
通過(guò)使用流式傳輸 pyaudio.Stream.write()
音頻數(shù)據(jù)或使用流式傳輸音頻數(shù)據(jù)來(lái)播放音頻 pyaudio.Stream.read()
。
(3)請(qǐng)注意,在“阻止模式”中,每個(gè) pyaudio.Stream.write()
或 pyaudio.Stream.read()
阻止直到所有給定/請(qǐng)求的幀都被播放/記錄?;蛘?,要?jiǎng)討B(tài)生成音頻數(shù)據(jù)或立即處理錄制的音頻數(shù)據(jù),請(qǐng)使用下面概述的“回調(diào)模式”。
使用 pyaudio.Stream.stop_stream()
暫停播放/錄制,并 pyaudio.Stream.close()
終止流。(4)
最后,使用 pyaudio.PyAudio.terminate()
(5)終止portaudio會(huì)話
2).播放音頻
下面使用播放的功能來(lái)播放1)中保存的音頻 output.wav
通過(guò)tqdm,顯示播放進(jìn)度條,如下:
100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 172/172 [00:03<00:00, 43.40it/s]
"""PyAudio Example: Play a WAVE file.""" import pyaudio import wave from tqdm import tqdm def play_audio(wave_path): CHUNK = 1024 wf = wave.open(wave_path, 'rb') # instantiate PyAudio (1) p = pyaudio.PyAudio() # open stream (2) stream = p.open(format=p.get_format_from_width(wf.getsampwidth()), channels=wf.getnchannels(), rate=wf.getframerate(), output=True) # read data data = wf.readframes(CHUNK) # play stream (3) datas = [] while len(data) > 0: data = wf.readframes(CHUNK) datas.append(data) for d in tqdm(datas): stream.write(d) # stop stream (4) stream.stop_stream() stream.close() # close PyAudio (5) p.terminate() play_audio("output.wav")
2).以回調(diào)方式播放音頻
當(dāng)需要在執(zhí)行其他程序時(shí)同時(shí)播放音頻,可以使用回調(diào)的方式播放,示例代碼如下:
"""PyAudio Example: Play a WAVE file.""" import pyaudio import wave from tqdm import tqdm import time def play_audio_callback(wave_path): CHUNK = 1024 wf = wave.open(wave_path, 'rb') # instantiate PyAudio (1) p = pyaudio.PyAudio() def callback(in_data, frame_count, time_info, status): data = wf.readframes(frame_count) return (data, pyaudio.paContinue) # open stream (2) stream = p.open(format=p.get_format_from_width(wf.getsampwidth()), channels=wf.getnchannels(), rate=wf.getframerate(), output=True, stream_callback=callback) # read data stream.start_stream() while stream.is_active(): time.sleep(0.1) # stop stream (4) stream.stop_stream() stream.close() # close PyAudio (5) p.terminate() play_audio_callback("output.wav")
Reference:
1. http://people.csail.mit.edu/hubert/pyaudio/
總結(jié)
以上所述是小編給大家介紹的Python音頻操作工具PyAudio上手教程詳解,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
python + winrm 實(shí)現(xiàn)遠(yuǎn)程連接Windows服務(wù)器并執(zhí)行指定命令的操作過(guò)程
Windows遠(yuǎn)程管理(WinRM)是Windows Server 2003 R2,Windows Vista和Windows Server 2008中一種新式的方便遠(yuǎn)程管理的服務(wù),這篇文章主要介紹了python + winrm 實(shí)現(xiàn)遠(yuǎn)程連接Windows服務(wù)器并執(zhí)行指定命令的操作過(guò)程,需要的朋友可以參考下2023-10-10Django實(shí)現(xiàn)celery定時(shí)任務(wù)過(guò)程解析
這篇文章主要介紹了Django實(shí)現(xiàn)celery定時(shí)任務(wù)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04python socket 超時(shí)設(shè)置 errno 10054
這篇文章主要介紹了python 遠(yuǎn)程主機(jī)強(qiáng)迫關(guān)閉了一個(gè)現(xiàn)有的連接 socket 超時(shí)設(shè)置 errno 10054 ,需要的朋友可以參考下2014-07-07python中的property及屬性與特性之間的優(yōu)先權(quán)
這篇文章主要介紹了python中的property及屬性與特性之間的優(yōu)先權(quán),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-07-07盤(pán)點(diǎn)Python?爬蟲(chóng)中的常見(jiàn)加密算法
這篇文章主要介紹了盤(pán)點(diǎn)Python?爬蟲(chóng)中的常見(jiàn)加密算法,加密即Encryption指將明文數(shù)據(jù)變換為密文的過(guò)程,解密即Decryption指加密的逆過(guò)程,即由密文恢復(fù)出原明文的過(guò)程2022-07-07Pycharm代碼無(wú)法復(fù)制,無(wú)法選中刪除,無(wú)法編輯的解決方法
今天小編就為大家分享一篇Pycharm代碼無(wú)法復(fù)制,無(wú)法選中刪除,無(wú)法編輯的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-10-10python實(shí)現(xiàn)Android與windows局域網(wǎng)文件夾同步
這篇文章主要給大家詳細(xì)介紹了python實(shí)現(xiàn)Android與windows局域網(wǎng)文件夾同步,文中有詳細(xì)的代碼示例和圖文介紹,具有一定的參考價(jià)值,需要的朋友可以參考下2023-09-09tkinter如何獲取復(fù)選框(Checkbutton)的值
這篇文章主要介紹了tkinter如何獲取復(fù)選框(Checkbutton)的值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01Python計(jì)算一個(gè)文件里字?jǐn)?shù)的方法
這篇文章主要介紹了Python計(jì)算一個(gè)文件里字?jǐn)?shù)的方法,涉及Python文件操作及內(nèi)容遍歷的相關(guān)技巧,需要的朋友可以參考下2015-06-06