【问题标题】:Sound generation / synthesis with python?用 python 生成/合成声音?
【发布时间】:2012-04-03 22:23:00
【问题描述】:

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

是否有可用的模块?如果没有,您将如何创建自己的?

另外,您是否需要某种主机环境来运行 python 以播放声音,或者仅通过从终端调用来实现?

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

【问题讨论】:

  • @hochl 好吧,讽刺的是,这是用不同的关键字搜索一天后返回的第一个 Google 结果...
  • 我会查看PyoHere's 一个很好的例子。

标签: python python-3.x python-2.7 audio synthesis


【解决方案1】:

我一直在寻找同样的东西,最后,我编写了这个运行良好的代码。

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

【讨论】:

  • 这可行,但在播放结束时会产生非常响亮的“砰砰”声。
  • 为什么我们需要将这些整数转换为 ascii 字符?
  • @Cerin 那是因为它输出的最后一个样本远非零,然后您的扬声器在单个样本中突然返回到零,这会产生相当大的噪音。如果你在最后提供几个样本衰减到零,或者确保你的波已经回到(接近)零,你会得到一个更干净的结局。
  • 有人能解释一下RESTRAMES是什么以及附加WAVEDATA + chr(128)的目的吗?
  • 如果我理解正确(我不确定我是否理解),那么帧由单个字节(而不是位)描述,BITRATE 将更恰当地命名为BYTERATE
【解决方案2】:

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

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

【讨论】:

  • 5 年后,它仍在积极开发中:O
【解决方案3】:

在一些无法编译或不存在的项目上浪费时间后,我发现了 python 模块wavebender,它提供了单通道或多通道正弦波、方波和组合波的生成。结果可以写入波形文件或sys.stdoutaplay 可以直接从那里实时解释它们。 here 解释了一些有用的示例,并包含在项目的 github page 中。

【讨论】:

  • 嗨 - 我是 pippi 的作者。它已经预发布了很长一段时间,但我正在努力实现稳定的 1.0 版本。如果您有时间在 github 上提交有关您的问题的错误报告,我将不胜感激。谢谢!
  • 谢谢,我很想再看看它,看看我能不能贡献一些东西。很高兴听到它还活着!
  • 不幸的是,wavebender 似乎仍然是non-functional and unmaintained.
【解决方案4】:

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

【讨论】:

    【解决方案5】:

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

    这是一个早期版本的正弦波发生器,它输出一个值列表,在应用 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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

      • 据我所知,无法从 pypi 下载 Audiere,他们的 pyaudiere.org 网站现在是一些随机广告页面。
      • 是的,似乎所有这些声音库在几个月后都被放弃了。这正在成为一个真正的问题。也许 PyGame 是要走的路。这似乎有点矫枉过正,但至少它得到了很好的支持。
      【解决方案7】:

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

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-21
        相关资源
        最近更新 更多