使用python生成/合成声音?

Ale*_*lan 37 python audio synthesis python-2.7 python-3.x

有可能让python生成像正弦波一样的简单声音吗?

有可用的模块吗?如果没有,你会如何创建自己的?

另外,你需要某种主机环境让python运行才能播放声音,还是只能通过终端来电来实现?

如果答案取决于操作系统,我正在使用mac.

Lia*_*iam 30

我一直在寻找相同的东西,最后,我写了这个代码,它工作得很好.

import math        #import needed modules
import pyaudio     #sudo apt-get install python-pyaudio

PyAudio = pyaudio.PyAudio     #initialize pyaudio

#See https://en.wikipedia.org/wiki/Bit_rate#Audio
BITRATE = 16000     #number of frames per second/frameset.      

FREQUENCY = 500     #Hz, waves per second, 261.63=C4-note.
LENGTH = 1     #seconds to play sound

if FREQUENCY > BITRATE:
    BITRATE = FREQUENCY+100

NUMBEROFFRAMES = int(BITRATE * LENGTH)
RESTFRAMES = NUMBEROFFRAMES % BITRATE
WAVEDATA = ''    

#generating wawes
for x in xrange(NUMBEROFFRAMES):
 WAVEDATA = WAVEDATA+chr(int(math.sin(x/((BITRATE/FREQUENCY)/math.pi))*127+128))    

for x in xrange(RESTFRAMES): 
 WAVEDATA = WAVEDATA+chr(128)

p = PyAudio()
stream = p.open(format = p.get_format_from_width(1), 
                channels = 1, 
                rate = BITRATE, 
                output = True)

stream.write(WAVEDATA)
stream.stop_stream()
stream.close()
p.terminate()
Run Code Online (Sandbox Code Playgroud)

  • @Cerin那将是因为它输出的最后一个样本远非零,然后你的扬声器突然在一个样本中返回到零,这会产生相当大的噪音.如果你在最后将一些样本提供给零,或者确保你的波浪已经回到(接近)零,那么你将获得更清晰的结局. (9认同)
  • 这有效,但在播放结束时会产生非常响亮的"弹出". (3认同)
  • 为什么我们需要将这些内容转换为ascii字符? (3认同)
  • 有人可以解释一下`RESTRAMES`是什么以及附加`WAVEDATA + chr(128)`的目的? (2认同)

acs*_*ith 11

我知道我在这个游戏上有点晚了,但这是一个非常棒的python项目,用于综合和音频组合:https://github.com/hecanjog/pippi

它仍在积极开发中,但它已经持续了一段时间.

  • 未来5年,它仍在积极发展中:O (4认同)

egg*_*tax 5

Python In Music维基页面并没有得到很好的保持,但它是一个很好的起点. http://wiki.python.org/moin/PythonInMusic


J. *_*kel 5

在一些无法编译或不存在的项目上浪费了时间之后,我发现了python模块wavebender,该模块可生成正弦波,方波和组合波的单个或多个通道。结果可将其写入到一个wavefile或者sys.stdout,从那里可以直接解释aplay实时。这里解释一些有用的示例,这些示例包含在项目的github页面上

  • 嗨-我是pippi的作者 它已经发布了一段时间,但我正在努力开发稳定的1.0版本。如果您有时间在github上提交包含您的问题的错误报告,我将不胜感激。谢谢! (2认同)

Oct*_*ipi 5

我正在用 python 开发一个强大的合成器。我使用自定义函数直接写入 .wav 文件。有可用于此目的的内置函数。您需要修改 .wav 标头以反映采样率、每个样本的位数、通道数和合成持续时间。

这是正弦波发生器的早期版本,它输出一个值列表,在应用 bytearray 后,这些值适合写入波形文件的数据参数。[编辑]在应用字节数组之前,转换函数需要将列表转换为小端十六进制值。有关 .wav 规范的详细信息,请参阅下面的 WAVE PCM 声音文件格式链接。[/编辑]

def sin_basic(freq, time=1, amp=1, phase=0, samplerate=44100, bitspersample=16):
    bytelist = []
    import math
    TwoPiDivSamplerate = 2*math.pi/samplerate
    increment = TwoPiDivSamplerate * freq
    incadd = phase*increment
    for i in range(int(samplerate*time)):
        if incadd > (2**(bitspersample - 1) - 1):
            incadd = (2**(bitspersample - 1) - 1) - (incadd - (2**(bitspersample - 1) - 1))
        elif incadd < -(2**(bitspersample - 1) - 1):
            incadd = -(2**(bitspersample - 1) - 1) + (-(2**(bitspersample - 1) - 1) - incadd)
        bytelist.append(int(round(amp*(2**(bitspersample - 1) - 1)*math.sin(incadd))))
        incadd += increment
    return bytelist
Run Code Online (Sandbox Code Playgroud)

较新的版本可以使用波形来调制波形参数的频率、幅度和相位。数据格式使得将波混合和连接在一起变得微不足道。如果这似乎是您的习惯,请查看WAVE PCM 声音文件格式


rdc*_*ers 3

我喜欢PyAudiere,它可以让你将 numpy 数组当作声音来播放……我想它很适合我的 Matlab 背景。我相信它是跨平台的。我认为scikits.audiolab做了同样的事情,并且可能更最新/更好的支持......对我来说似乎比尝试将内容保存为 wavfiles 或将它们写入缓冲区并使用 Python 的内置声音库更容易。

  • 据我所知,Audiere 无法从 pypi 下载,并且他们的 pyaudiere.org 网站现在是一些随机广告页面。 (4认同)