我想在Python中編寫一個簡單的音頻函數生成器,以在Raspberry Pi(模型2)上運行。碼基本上做到這一點:在低功率計算機上從Python生成平滑音頻
- 生成的音頻信號的1秒(比方說,一個正弦波或方波等)
- 重複地播放它在一個循環
例如:
import pyaudio
from numpy import linspace,sin,pi,int16
def note(freq, len, amp=1, rate=44100):
t = linspace(0,len,len*rate)
data = sin(2*pi*freq*t)*amp
return data.astype(int16) # two byte integers
RATE = 44100
FREQ = 261.6
pa = pyaudio.PyAudio()
s = pa.open(output=True,
channels=2,
rate=RATE,
format=pyaudio.paInt16,
output_device_index=2)
# generate 1 second of sound
tone = note(FREQ, 1, amp=10000, rate=RATE)
# play it forever
while True:
s.write(tone)
的問題是,在音頻的可聽「嘀」的循環結果的每次迭代,使用外置USB聲卡也是如此。有什麼辦法可以避免這種情況,而不是試圖用C重寫所有的東西?
我嘗試使用pyaudio回調接口,但實際上聽起來更糟糕(就像也許我的Pi是脹氣)。
生成的音頻需要很短,因爲它最終將通過外部控制進行動態調整,並且任何超過1秒的控制更改延遲都會讓人覺得尷尬。有沒有更好的方法來從Python代碼中產生這些信號?
這種點擊可能與使用'PyAudio'的阻塞模式有關。出於您的目的(小緩衝區/低延遲),最好使用回調模式。嘗試以下示例:https://people.csail.mit.edu/hubert/pyaudio/docs/#example-callback-mode-audio-i-o – quasoft