Python 3.x 在Python的sounddevice模块中使用流方法进行基本音高变换?

Python 3.x 在Python的sounddevice模块中使用流方法进行基本音高变换?,python-3.x,numpy,audio,Python 3.x,Numpy,Audio,关于如何实现Sounddevice流方法,我确实不理解正确的格式或代码结构。我想创建一个基本缓冲区,将数组数据写入回调中,以便几乎实时地读取。我希望能够通过与流集成的线程查询来更改声波的频率。我试图了解基本的API,以及输入到输出如何通过Sounddevice进行流媒体处理 我对这个API缺乏了解,这使我很难知道从哪里开始。这只是为了学习声音操纵,并将效果应用到连续的声音中,而不需要任何声音切断,有点像Theremin 因此,在大量阅读API和一些euroscipy视频之后,我找到了sound

关于如何实现Sounddevice流方法,我确实不理解正确的格式或代码结构。我想创建一个基本缓冲区,将数组数据写入回调中,以便几乎实时地读取。我希望能够通过与流集成的线程查询来更改声波的频率。我试图了解基本的API,以及输入到输出如何通过Sounddevice进行流媒体处理


我对这个API缺乏了解,这使我很难知道从哪里开始。这只是为了学习声音操纵,并将效果应用到连续的声音中,而不需要任何声音切断,有点像Theremin

因此,在大量阅读API和一些euroscipy视频之后,我找到了sounddevice(portaudio fork)流方法的正确格式。我还学习了一些线程和队列的基本知识,创建了一个基本的基音变换器,几乎是实时的。需要更换变桨器,并使用旋钮执行。还需要提高缓冲区速度,以实现实时性。希望这能帮助那些想不费吹灰之力直接操纵声音的人

def waveform(q):

    with sd.Stream(samplerate=RATE,blocksize=CHUNK,dtype='int32',latency='low',callback=None) as s:

        sps = 44100
        wave = signal.square
        t = .3
        atten = .015
        while True:
            i = q.get()
            freq = i
            waveform = wave(2*np.pi*(np.arange(t*sps))*freq/sps)
            waveform_quiet = waveform*atten
            wave_int = waveform_quiet * 2147483647
            s.write(np.ascontiguousarray(wave_int, np.int32))

q=Queue()
q.put(i)

p = Thread(target=waveform, args=(q,))
p.daemon = True
p.start()

#pitch shifter, increments of 10hz
while True:
i+ = 10
q.put(i)
print('Queues being stored')
print(i)
if i >880:
    print('Queues Stored')
    break