在低功耗计算机上从Python生成流畅的音频

lar*_*sks 2 python audio portaudio pyaudio

我试图在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)
Run Code Online (Sandbox Code Playgroud)

问题是,即使使用外部USB声卡,循环的每次迭代都会在音频中产生可听见的"滴答声".有没有办法避免这种情况,而不是试图重写C中的所有内容?

我尝试使用pyaudio回调接口,但实际上听起来更糟糕(就像我的Pi是胀气的).

生成的音频需要很短,因为它最终会通过外部控制动态调整,控制变化超过1秒的延迟只会让人觉得尴尬.有没有更好的方法从Python代码中生成这些信号?

dus*_*uff 6

你听到了"滴答声",因为你发送的音频存在不连续性.261.6 Hz的一秒包含261.6个周期,所以最后剩下大约半个周期:

波形在1秒内显示不连续性

您需要更改频率以使每秒有多个周期(例如,262 Hz),更改持续时间,使其足够长时间以进行整数个周期,或者每秒生成一个新的音频片段从正确的阶段开始,以适应最后一个块停止的位置.