Я пытаюсь написать простой генератор звуковых функций в Python, который будет запускаться на малиновой Pi (модель 2). Код по существу делает это:Создание гладкого звука с Python на компьютере с низким энергопотреблением
- Генерировать 1 секунду звукового сигнала (скажем, синусоидальную волну или квадратную волну, и т.д.)
- Play ее несколько раз в цикле
Например :
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