lar*_*sks 2 python audio portaudio pyaudio
我试图在Python中编写一个简单的音频函数生成器,在Raspberry Pi(模型2)上运行.代码基本上是这样的:
例如:
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代码中生成这些信号?
你听到了"滴答声",因为你发送的音频存在不连续性.261.6 Hz的一秒包含261.6个周期,所以最后剩下大约半个周期:
您需要更改频率以使每秒有多个周期(例如,262 Hz),更改持续时间,使其足够长时间以进行整数个周期,或者每秒生成一个新的音频片段从正确的阶段开始,以适应最后一个块停止的位置.
| 归档时间: |
|
| 查看次数: |
2090 次 |
| 最近记录: |