pyaudio
和sounddevice
都是用於Python中音頻處理和流的庫,允許用戶通過他們的API錄製、播放和處理音頻數據。下面是對這兩個庫的簡要介紹:
PyAudio
PyAudio 提供了 Python 綁定到 PortAudio,這是一個跨平臺的音頻I/O庫。它允許你很容易地使用Python語言進行音頻錄製和播放。
特點:
- 跨平臺(工作在Unix/Linux、MacOS和Windows上)
- 允許你直接訪問聲卡或其他音頻接口,例如通過麥克風錄製聲音或者向揚聲器輸出聲音
- 支持阻塞和非阻塞流
- 提供了詳細的錯誤信息和音頻流狀態
典型用途:
- 音頻錄製和播放
- 音頻信號處理
- 實現音頻應用,如語音識別和合成
示例代碼:
import pyaudio
import wave
# 打開WAV文件
wf = wave.open('file.wav', 'rb')
# 初始化PyAudio
p = pyaudio.PyAudio()
# 打開流
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),
output=True)
# 讀取數據
data = wf.readframes(1024)
# 播放流
while len(data) > 0:
stream.write(data)
data = wf.readframes(1024)
# 停止流
stream.stop_stream()
stream.close()
# 關閉PyAudio
p.terminate()
SoundDevice
sounddevice
庫是基於PortAudio的,提供了一個簡潔的Pythonic接口,用於錄製和播放音頻。
特點:
- 跨平臺(與PortAudio一樣)
- 提供了同步和異步的音頻流接口
- 支持NumPy,方便進行科學計算
- 相對於PyAudio,API更加簡潔和Pythonic
典型用途:
- 實時音頻處理
- 實驗心理學中的音頻刺激
- 用於科學研究的音頻數據採集
示例代碼:
import sounddevice as sd
import numpy as np
duration = 5.5 # seconds
frequency = 440 # Hz
# 生成一個音頻信號
t = np.linspace(0, duration, int(duration * 44100), False)
audio = np.sin(2 * np.pi * frequency * t)
# 播放音頻
sd.play(audio, samplerate=44100)
sd.wait() # 等待音頻播放完畢
總結
兩個庫都能夠處理音頻流,但在API設計上有所不同。PyAudio 更接近底層PortAudio接口,提供了很多配置選項和詳細的控制。而SoundDevice 提供了更加簡化和易於使用的接口,對於需要快速上手的項目而言可能更適合。如果需要進行復雜的音頻處理,或者與其他底層音頻庫(如Librosa或SciPy)結合使用,SoundDevice可能更合適,尤其是因爲它支持NumPy數組。選擇哪一個庫取決於你的項目需求和個人偏好。