在Python中生成正弦波声音

时间:2011-11-28 16:51:34

标签: python audio

我需要在Python中生成正弦波声音,我需要能够控制频率,持续时间和相对音量。通过'生成',我的意思是我希望它立即通过扬声器播放,而不是保存到文件中。

最简单的方法是什么?

6 个答案:

答案 0 :(得分:35)

import pyaudio
import numpy as np

p = pyaudio.PyAudio()

volume = 0.5     # range [0.0, 1.0]
fs = 44100       # sampling rate, Hz, must be integer
duration = 1.0   # in seconds, may be float
f = 440.0        # sine frequency, Hz, may be float

# generate samples, note conversion to float32 array
samples = (np.sin(2*np.pi*np.arange(fs*duration)*f/fs)).astype(np.float32)

# for paFloat32 sample values must be in range [-1.0, 1.0]
stream = p.open(format=pyaudio.paFloat32,
                channels=1,
                rate=fs,
                output=True)

# play. May repeat with different volume values (if done interactively) 
stream.write(volume*samples)

stream.stop_stream()
stream.close()

p.terminate()

答案 1 :(得分:5)

ivan-onys给出了一个很好的答案,但还有一点补充: 因为Pyaudio write方法需要float32的字符串数据,所以这个脚本产生的声音会比预期短4倍,但是当你将numpy数组传递给这个方法时,它会将整个数组作为实体转换为字符串,因此你必须将numpy数组中的数据转换为字节序列就像这样:

samples = (np.sin(2*np.pi*np.arange(fs*duration)*f/fs)).astype(np.float32).tobytes()

你也必须改变这一行:

stream.write(samples)

答案 2 :(得分:2)

在Pygame多媒体库中安装处理声音的方法更为一致,更为一致。

我建议使用它 - 有一个pygame.sndarray子模块,它允许你操作数据向量中的数字,这些数字向量成为可以在pygame.mixer模块中播放的高级声音对象。

pygame.org网站上的文档应该足以使用sndarray模块。

答案 3 :(得分:0)

bregman lab toolbox你有一套完全符合你想要的功能。这个python模块有点儿错误,但您可以调整此代码以获得自己的功能

答案 4 :(得分:0)

今天对于Python 3.5+,最好的方法是安装开发人员推荐的软件包。

http://people.csail.mit.edu/hubert/pyaudio/

对于Debian来说

sudo apt-get install python3-all-dev portaudio19-dev

尝试安装pyaudio之前

答案 5 :(得分:0)

ivan_onys中的脚本产生的信号比预期的短四倍。如果在卷为浮点数时返回TypeError,请尝试将.tobytes()添加到以下行。

stream.write((volume*samples).tobytes())

@mm_ float32 = 32位,而8位= 1个字节,因此float32 = 4个字节。将样本作为float32传递到stream.write时,字节数(持续时间)将被4除。将样本写回.tobytes()可以在写入float32时将样本数四分之一。