1. 程式人生 > >『開發技巧』Python音訊操作工具PyAudio上手教程

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

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


0.引子

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

PyAudio是Python開源工具包,由名思義,是提供對語音操作的工具包。提供錄音播放處理等功能,可以視作語音領域的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。在大多數平臺上使用pip安裝PyAudio。對於v0.2.9之前的版本,PyAudio分發安裝二進位制檔案,這些檔案 存檔在這裡。

 

微軟Windows 

使用pip安裝:

python -m pip install pyaudio

筆記:

  • 如果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.

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

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/

 

&nbs