『開發技巧』Python音頻操做工具PyAudio上手教程

『開發技巧』Python音頻操做工具PyAudio上手教程


0.引子

當須要使用Python處理音頻數據時,使用python讀取與播放聲音必不可少,下面介紹一個好用的處理音頻PyAudio工具包。python

PyAudio是Python開源工具包,由名思義,是提供對語音操做的工具包。提供錄音播放處理等功能,能夠視做語音領域的OpenCv。git

 

1.簡介

 

PyAudio爲跨平臺音頻I / O庫PortAudio提供Python 綁定。使用PyAudio,您能夠輕鬆地使用Python在各類平臺上播放和錄製音頻,例如GNU / Linux,Microsoft Windows和Apple Mac OS X / macOS。github

PyAudio的靈感來自:app

 

2.安裝

 

目前的版本是PyAudio v0.2.11。在大多數平臺上使用pip安裝PyAudio。對於v0.2.9以前的版本,PyAudio分發安裝二進制文件,這些文件 存檔在這裏工具

 

微軟Windows spa

使用pip安裝:命令行

python -m pip install pyaudio

筆記:code

  • 若是pip還沒有與您的Python安裝捆綁在一塊兒,請在此處獲取 。
  • pip將獲取並安裝PyAudio輪(預先打包的二進制文件)。目前,有車輪兼容Python 2.7,3.4,3.5和3.6 的 官方發行版。對於這些版本,能夠使用32位和64位車輪。
  • 這些二進制文件包括使用MinGW構建的PortAudio v19 v190600_20161030。它們僅支持Windows MME API,包括對DirectX,ASIO等的支持。若是須要支持未包含的API,則須要編譯PortAudio和PyAudio。

 

Apple Mac OS X.orm

使用Homebrew安裝必備的portaudio庫,而後使用pip安裝PyAudio:blog

brew install portaudio 
pip install pyaudio

筆記:

  • 若是還沒有安裝,請下載 Homebrew
  • pip將下載PyAudio源代碼併爲您的Python版本構建它。
  • Homebrew和構建PyAudio還須要安裝Xcode命令行工具(更多信息)。

 

Debian / Ubuntu

使用包管理器安裝PyAudio:

sudo apt-get install python-pyaudio python3-pyaudio

若是沒有最新版本的PyAudio,請使用pip安裝它:

pip install pyaudio

筆記:

  • pip將下載PyAudio源併爲您的系統構建它。請務必事先安裝portaudio庫開發包(portaudio19-dev)和python開發包(python-all-dev)。
  • 爲了更好地隔離系統包,請考慮在virtualenv中安裝PyAudio 。

 

PyAudio來源

源代碼可從Python Package Index(PyPI)下載:pypi.python.org/pypi/PyAudio

或克隆git存儲庫:

git clone https://people.csail.mit.edu/hubert/git/pyaudio.git

要從源代碼構建PyAudio,您還須要構建 PortAudio v19。有關爲各類平臺構建PyAudio的一些說明,請參閱編譯提示。要使用Microsoft Visual Studio構建PyAudio,請查看Sebastian Audet的說明

 

 

3.示例

1).採集音頻

下面以一段代碼演示如何從計算機麥克風採集一段音頻,採集音頻時長 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 ,它設置portaudio系統。

要錄製或播放音頻,請使用pyaudio.PyAudio.open() (2)在所需設備上打開所需音頻參數的流。這設置了pyaudio.Stream播放或錄製音頻。

經過使用流式傳輸pyaudio.Stream.write()音頻數據或使用流式傳輸音頻數據來播放音頻 pyaudio.Stream.read()。(3)

請注意,在「阻止模式」中,每一個pyaudio.Stream.write()或 pyaudio.Stream.read()阻止直到全部給定/請求的幀都被播放/記錄。或者,要動態生成音頻數據或當即處理錄製的音頻數據,請使用下面概述的「回調模式」。

使用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).以回調方式播放音頻

當須要在執行其餘程序時同時播放音頻,能夠使用回調的方式播放,示例代碼以下:

"""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/

相關文章
相關標籤/搜索