在Python中生成正弦波声音
我需要在Python中生成正弦波声音,并且我需要能够控制频率,持续时间和相对音量。 '生成'我的意思是我希望它立即通过扬声器播放,而不是保存到文件。在Python中生成正弦波声音
这样做最简单的方法是什么?
在Python中安装声音处理方法的一个比较一致的方法是Pygame多媒体库。
我推荐使用它 - 有pygame.sndarray子模块,它允许你操纵数据向量中的数字,成为可以在pygame.mixer模块中播放的高级声音对象。
pygame.org网站上的文档应该足以使用sndarray模块。
我的bregman lab toolbox你有一套完全按你想要的功能。这Python模块是有点马车,但你能适应这个代码来获取自己的函数
404错误 - 页面未找到 - https://github.com/bregmanstudio/BregmanToolkit – scls
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()
伊万 - 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)
什么平台(S),你定位? –
主要是MacOS X - 我应该指定这个,对不起! – astrofrog
这个问题类似于http://*.com/questions/307305/play-a-sound-with-python和http://*.com/questions/260738/play-audio-with-python –