使用python生成/合成声音?

问题描述 投票:33回答:7

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

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

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

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

python python-3.x python-2.7 audio synthesis
7个回答
29
投票

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

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()

11
投票

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

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


5
投票

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


5
投票

在一些无法编译或不存在的项目上浪费时间之后,我发现了python模块wavebender,它提供单个或多个正弦波,方波和组合波的通道。结果可以写入wavefile或sys.stdout,从aplay可以实时解释。一些有用的例子被解释为here,并包含在项目的github page中。


3
投票

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


3
投票

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

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

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

较新版本可以使用波形来调制波形参数的频率,幅度和相位。数据格式使得混合和连接波形变得微不足道。如果这似乎是你的胡同,请查看WAVE PCM soundfile format


3
投票

我发现这两个python存储库非常有用,可能想看看它...

python https://github.com/JeremyCCHsu/Python-Wrapper-for-World-Vocoder

ipython:https://timsainb.github.io/spectrograms-mfccs-and-inversion-in-python.html

[编辑]正如所指出的,这里是两个链接的解释

python似乎有一个错误,但很多人能够让它运行,所以我不确定。 ipython就像一个魅力,所以我希望你能运行它。

两个链接都应该将音频作为输入,最好是.wav文件。对其进行特征化(使用FFT:512,步长= 512/8)以获得光谱图(您甚至可以将其可视化),它是一个2D矩阵,然后使用代表原始矩阵的矩阵训练您的机器学习对象或做任何您想做的事情音频。如果你想在任何一点,那些矢量代表什么,你也可以重新合成音频。

© www.soinside.com 2019 - 2024. All rights reserved.