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