0.引子
當(dāng)需要使用Python處理音頻數(shù)據(jù)時,使用python讀取與播放聲音必不可少,下面介紹一個好用的處理音頻PyAudio工具包。
PyAudio是Python開源工具包,由名思義,是提供對語音操作的工具包。提供錄音播放處理等功能,可以視作語音領(lǐng)域的OpenCv。
1.簡介
PyAudio為跨平臺音頻I / O庫 PortAudio 提供 Python 綁定。使用PyAudio,您可以輕松地使用Python在各種平臺上播放和錄制音頻,例如GNU / Linux,Microsoft Windows和Apple Mac OS X / macOS。
PyAudio的靈感來自:
- pyPortAudio / fastaudio :PortAudio? v18 ?API的Python綁定。
- ?tkSnack :Tcl / Tk和Python的跨平臺聲音工具包。
2.安裝
目前的版本是 PyAudio v0.2.11 。在大多數(shù)平臺上使用pip安裝PyAudio。對于v0.2.9之前的版本,PyAudio分發(fā)安裝二進制文件,這些文件?存檔在這里 。
微軟Windows
使用 pip 安裝:
python -m pip install pyaudio
筆記:
- 如果pip尚未與您的Python安裝捆綁在一起,請 在此處 獲取?。
- pip將獲取并安裝PyAudio輪(預(yù)先打包的二進制文件)。目前,有車輪兼容Python 2.7,3.4,3.5和3.6?的?官方發(fā)行版 。對于這些版本,可以使用32位和64位車輪。
- 這些二進制文件包括使用MinGW構(gòu)建的PortAudio v19 v190600_20161030。它們僅支持Windows MME API, 不 包括對DirectX,ASIO等的支持。如果需要支持未包含的API,則需要編譯PortAudio和PyAudio。 Apple Mac OS X.
使用 Homebrew 安裝必備的portaudio庫,然后使用pip安裝PyAudio:
brew install portaudio
pip install pyaudio
筆記:
- 如果尚未安裝,請下載? Homebrew 。
- pip將下載PyAudio源代碼并為您的Python版本構(gòu)建它。
- Homebrew和構(gòu)建PyAudio還需要安裝Xcode命令行工具( 更多信息 )。
Debian / Ubuntu
使用包管理器安裝PyAudio:
sudo apt-get install python-pyaudio python3-pyaudio
如果沒有最新版本的PyAudio,請使用pip安裝它:
pip install pyaudio
筆記:
-
pip將下載PyAudio源并為您的系統(tǒng)構(gòu)建它。請務(wù)必事先安裝portaudio庫開發(fā)包(
portaudio19-dev)和python開發(fā)包(python-all-dev)。 - 為了更好地隔離系統(tǒng)包,請考慮在virtualenv中 安裝PyAudio?。
? PyAudio來源
源代碼可從Python Package Index(PyPI)下載: pypi.python.org/pypi/PyAudio 。
或克隆git存儲庫:
git clone ?https://people.csail.mit.edu/hubert/git/pyaudio.git
要從源代碼構(gòu)建PyAudio,您還需要構(gòu)建 PortAudio v19 。有關(guān)為各種平臺構(gòu)建PyAudio的一些說明,請參閱 編譯提示 。要使用Microsoft Visual Studio構(gòu)建PyAudio,請查看Sebastian Audet的 說明 。
3.示例
1).采集音頻
下面以一段代碼演示如何從計算機麥克風(fēng)采集一段音頻,采集音頻時長 4s,保存文件 output.wav
使用了tqdm模塊,可以方便顯示出來讀取過程,如下:
* 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)實例化PyAudio?,它設(shè)置portaudio系統(tǒng)。
要錄制或播放音頻,請使用
pyaudio.PyAudio.open()
(2)在所需設(shè)備上打開所需音頻參數(shù)的流。這設(shè)置了
pyaudio.Stream
播放或錄制音頻。
通過使用流式傳輸
pyaudio.Stream.write()
音頻數(shù)據(jù)或使用流式傳輸音頻數(shù)據(jù)來播放音頻?
pyaudio.Stream.read()
。
(3)請注意,在“阻止模式”中,每個
pyaudio.Stream.write()
或?
pyaudio.Stream.read()
阻止直到所有給定/請求的幀都被播放/記錄。或者,要動態(tài)生成音頻數(shù)據(jù)或立即處理錄制的音頻數(shù)據(jù),請使用下面概述的“回調(diào)模式”。
使用
pyaudio.Stream.stop_stream()
暫停播放/錄制,并
pyaudio.Stream.close()
終止流。(4)
最后,使用
pyaudio.PyAudio.terminate()
(5)終止portaudio會話
2).播放音頻
下面使用播放的功能來播放1)中保存的音頻 output.wav
通過tqdm,顯示播放進度條,如下:
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í)行其他程序時同時播放音頻,可以使用回調(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上手教程詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

