2011-11-28 348 views
14

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

这样做最简单的方法是什么?

+0

什么平台(S),你定位? –

+1

主要是MacOS X - 我应该指定这个,对不起! – astrofrog

+0

这个问题类似于http://stackoverflow.com/questions/307305/play-a-sound-with-python和http://stackoverflow.com/questions/260738/play-audio-with-python –

回答

1

在Python中安装声音处理方法的一个比较一致的方法是Pygame多媒体库。

我推荐使用它 - 有pygame.sndarray子模块,它允许你操纵数据向量中的数字,成为可以在pygame.mixer模块中播放的高级声音对象。

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

0

我的bregman lab toolbox你有一套完全按你想要的功能。这Python模块是有点马车,但你能适应这个代码来获取自己的函数

+0

404错误 - 页面未找到 - https://github.com/bregmanstudio/BregmanToolkit – scls

21
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() 
+0

我得到这:文件“C:\ Python27 \ lib \ site-packages \ numpy \ core \ __init__.py”,第6行,在, 之内。 import multiarray ImportError:DLL加载失败:%1不是有效的Win32应用程序。 – chwi

+0

我发现@yahweh的贡献是这样。包含在代码示例中会很有帮助。 – chris

1

伊万 - onys之前做

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

给了一个很好的答案,但有一点除了它: 这个脚本会产生比预期短4倍的声音,因为Pyaudio写入方法需要float32的字符串数据,但是当您将numpy数组传递给此方法时,它会将整个数组作为实体转换为字符串,因此您必须转换在numpy的阵列到自己的字节序列像这样的数据:

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

,你必须改变这一行,以及:

stream.write(samples)