基于变动输入的Python实时声音合成器

4 投票
2 回答
4544 浏览
提问于 2025-04-17 12:48

我想做一个效果器 [¹],目的是为了让输入的声音变得扭曲。

因为我是从零开始,所以我想用Python生成一个持续的声音,并且当我滑动一个滑块(或者类似的控件)时,让这个声音的频率发生变化。

我试过使用tkSnack这个Python库来生成声音,但它在生成音调之间会停顿。我希望我的程序能持续播放声音,即使声音在变化也不停止。

我在Arduino上用tone()这个简单的函数得到了不错的效果 [²]。可能是因为延迟时间非常短,所以声音听起来是连续的。请问在我的电脑上用Python库在Linux系统下能做到类似的效果吗?

感谢任何能帮我的人!:)

[¹] http://en.wikipedia.org/wiki/Effects_pedal

[²] http://arduino.cc/en/Reference/Tone

2 个回答

1

PyAudio 是一个为 portaudio 提供 Python 接口的工具。使用它,你可以进行实时的音频处理,尽管 Python 在处理数字计算方面的性能不是特别高。

4

你好,我去年用这个公式做了一个效果器。

M = 2*D/(1-D);
x = (1+M)*(x)./(1+k*abs(x));

X = 输入信号

D = 失真效果,可以试试不同的值,比如0.1、0.5、0.9等等,看看效果如何。

这个可以在实时输入线上使用,结合Python和pyaudio,声音听起来就像一种过载效果。

更新:

用Python写的实时简单效果器失真。

#ederwander
import pyaudio 
import numpy as np 
import wave 

chunk = 1024 
FORMAT = pyaudio.paInt16 
CHANNELS = 1 
RATE = 8800 
K=0 
DISTORTION = 0.61

p = pyaudio.PyAudio() 

stream = p.open(format = FORMAT, 
                channels = CHANNELS, 
                rate = RATE, 
                input = True, 
                output = True, 
                frames_per_buffer = chunk) 


print "Eng Eder de Souza - ederwander" 
print "Primitive Pedal" 


while(True): 

    data = stream.read(chunk) 
    data = np.fromstring(data, dtype=np.int16)  
    M = 2*DISTORTION/(1-DISTORTION);
    data = (1+M)*(data)/(1+K*abs(data));
    data = np.array(data, dtype='int16') 
    signal = wave.struct.pack("%dh"%(len(data)), *list(data))
    stream.write(signal) 

stream.stop_stream() 
stream.close() 
p.terminate() 

改变变量DISTORTION可以看到不同的效果:

我稍微改了一下我的源代码,让它可以播放录制的样本,做了一些测试,得到了这个音频: http://www.freesound.org/people/eriatarka/sounds/15753/ 然后应用了这里描述的公式,你可以在这里听到变化后的文件: http://www.freesound.org/people/ederwander/sounds/146277/

撰写回答