我正在尝试在 Python 中创建一个无限长的纯正弦音(这样我以后可以添加实时开/关事件),虽然我可以播放音调,但它是断断续续的和削波的。我的假设是,它要么是从下一个块开始,而不是在波循环中与最后一个块结束的相同位置开始,要么是计算下一个块有延迟,我不知道它是哪一个。
是发生了这些事情,还是我犯了其他错误?此外,是否有更好的方法可以在不牺牲实时更改传入数据的能力的情况下采取?
import time
import numpy
import pyaudio
import math
CHUNK = 4096
RATE = 44100
def sine(current_time, frequency=440):
length = CHUNK
factor = float(frequency) * (math.pi * 2) / RATE
this_chunk = numpy.arange(length) + current_time
return numpy.sin(this_chunk * factor)
def get_chunk():
data = sine(time.time())
return data * 0.1
def callback(in_data, frame_count, time_info, status):
chunk = get_chunk() * 0.25
data = chunk.astype(numpy.float32).tostring()
return (data, pyaudio.paContinue)
p = pyaudio.PyAudio()
stream = p.open(format = pyaudio.paFloat32,
channels = 2,
rate = RATE,
output = True,
stream_callback = callback)
stream.start_stream()
while stream.is_active():
time.sleep(0.1)
stream.stop_stream()
stream.close()