【问题标题】:How to generate audio from a numpy array?如何从 numpy 数组生成音频?
【发布时间】:2023-03-06 05:09:02
【问题描述】:

我想从 numpy 中的二维数组创建“心率监测器”效果,并希望音调反映数组中的值。

【问题讨论】:

    标签: python audio numpy matplotlib


    【解决方案1】:

    您可以使用scipy.io.wavfile 中的write function 创建一个wav 文件,然后您可以随意播放该文件。请注意,数组必须是整数,因此如果您有浮点数,您可能需要适当地缩放它们:

    import numpy as np
    from scipy.io.wavfile import write
    
    data = np.random.uniform(-1,1,44100) # 44100 random samples between -1 and 1
    scaled = np.int16(data/np.max(np.abs(data)) * 32767)
    write('test.wav', 44100, scaled)
    

    如果您希望 Python 真正播放音频,那么 this page 提供了一些包/模块的概述。

    【讨论】:

    • 问题 - data/np.max(np.abs(data)) - 我是否正确,这是在缩放之前标准化为 1/-1,如果最大值为 0.8,它会扩大规模?
    • 是的(虽然不是必需的)。
    • 谢谢。那不应该是* 32768吗?它是有符号的 16 位。
    • 请补充说明 44100 是采样率。
    【解决方案2】:

    对于 2016 年来到这里的人来说,scikits.audiolab 似乎不再起作用了。我能够使用 sounddevice 获得解决方案。

    import numpy as np
    import sounddevice as sd
    
    fs = 44100
    data = np.random.uniform(-1, 1, fs)
    sd.play(data, fs)
    

    【讨论】:

    • 我实际上尝试过 scikits.audiolab 在我的 Ubuntu 16.04 + python 2.7 (anaconda 4.1.1) 上工作。我只需要sudo apt-get install libsndfile1-dev。另一方面,sounddevice 对我不起作用:当我用 sd 替换 scikits.audiolab 时没有播放任何内容。
    • python3 运气不好,即使安装了 libsndfile1-dev,sounddevice 运气更好
    • 谢谢,完美运行! sd.play(data, fs, blocking=True) 让程序等到声音播放完毕。
    【解决方案3】:

    在 Jupyter 中,最好的选择是:

    from IPython.display import Audio
    wave_audio = numpy.sin(numpy.linspace(0, 3000, 20000))
    Audio(wave_audio, rate=20000)
    

    【讨论】:

    【解决方案4】:

    另外,你可以试试scikits.audiolab。它具有文件 IO 和“播放”数组的能力。数组不必是整数。模仿 dbaupp 的例子:

    import numpy as np
    import scikits.audiolab
    
    data = np.random.uniform(-1,1,44100)
    # write array to file:
    scikits.audiolab.wavwrite(data, 'test.wav', fs=44100, enc='pcm16')
    # play the array:
    scikits.audiolab.play(data, fs=44100)
    

    【讨论】:

    • scikits.audiolab 不适用于 python(32) +Windows(64)+Hardware(64) 位配置,因此我猜对我没那么有用
    • Python 3中没有,距离上次更新已经很久了。
    【解决方案5】:

    我在使用scikit.audiolabs 时遇到了一些问题,因此我为此任务寻找了一些其他选项。我想出了sounddevice,它似乎更新了很多。我没有检查它是否适用于 Python 3。

    执行您想要的操作的简单方法是:

    import numpy as np
    import sounddevice as sd
    
    sd.default.samplerate = 44100
    
    time = 2.0
    frequency = 440
    
    # Generate time of samples between 0 and two seconds
    samples = np.arange(44100 * time) / 44100.0
    # Recall that a sinusoidal wave of frequency f has formula w(t) = A*sin(2*pi*f*t)
    wave = 10000 * np.sin(2 * np.pi * frequency * samples)
    # Convert it to wav format (16 bits)
    wav_wave = np.array(wave, dtype=np.int16)
    
    sd.play(wav_wave, blocking=True)
    

    【讨论】:

    • 在 Python 3 上运行良好。如果在脚本中使用上述代码,请务必使用blocking=True,否则脚本将在没有播放完的情况下退出。
    • 事实上,我就是这么做的。更新了答案。谢谢!
    • sounddevice 在 Mac OS X 上出现问题,您需要为您的应用程序 [哪一个?] 赋予权利 com.apple.security.cs.allow-unsigned-executable-memory
    【解决方案6】:

    PyGame 有 pygame.sndarray 模块,它可以将 numpy 数据作为音频播放。其他答案可能更好,因为 PyGame 可能难以启动和运行。话又说回来,scipy 和 numpy 各有各的困难,所以也许将 PyGame 添加到混合中并不是一个很大的步骤。

    http://www.pygame.org/docs/ref/sndarray.html

    【讨论】:

      【解决方案7】:

      另一个现代且方便的解决方案是使用pysoundfile,它可以读写a wide range of audio file formats

      import numpy as np
      import soundfile as sf
      
      data = np.random.uniform(-1, 1, 44100)
      sf.write('new_file.wav', data, 44100)
      

      【讨论】:

        【解决方案8】:

        不确定如何从阵列中生成音频的具体细节,但我发现mpg321 是一款出色的命令行音频播放器,并且可能适合您。

        我将它用作Anki 的首选播放器,它是用 python 编写的,并且有一些库可以作为将代码/数组与音频接口的绝佳起点。

        退房:

        【讨论】:

          猜你喜欢
          • 2019-05-20
          • 2020-11-02
          • 2016-04-17
          • 2021-02-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-09
          • 2015-04-22
          相关资源
          最近更新 更多