我需要在Python中生成正弦波声音,我需要能够控制频率,持续时间和相对音量.通过'生成'我的意思是我希望它立即通过扬声器播放,而不是保存到文件中.
最简单的方法是什么?
iva*_*nys 38
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()
Run Code Online (Sandbox Code Playgroud)
小智 6
ivan-onys给出了一个很好的答案,但还有一点补充:这个脚本产生的声音比预期短4倍,因为Pyaudio write方法需要float32的字符串数据,但是当你将numpy数组传递给这个方法时,它会转换为整个数组作为字符串的实体,因此您必须将numpy数组中的数据转换为字节序列,如下所示:
samples = (np.sin(2*np.pi*np.arange(fs*duration)*f/fs)).astype(np.float32).tobytes()
Run Code Online (Sandbox Code Playgroud)
你也必须改变这一行:
stream.write(samples)
Run Code Online (Sandbox Code Playgroud)
Pygame 多媒体库是 Python 中处理声音的更一致且易于安装的方法之一。
我建议使用它 - pygame.sndarray 子模块允许您操作数据向量中的数字,这些数字成为可以在 pygame.mixer 模块中播放的高级声音对象。
pygame.org 站点中的文档应该足以使用 sndarray 模块。
| 归档时间: |
|
| 查看次数: |
36061 次 |
| 最近记录: |