【问题标题】:howto stream numpy array into pyaudio stream?如何将 numpy 数组流式传输到 pyaudio 流中?
【发布时间】:2015-06-05 21:01:02
【问题描述】:

我正在编写一个代码,该代码应该根据用户的操作向用户提供一些音频输出,并且我想生成声音,而不是播放固定数量的 wav 文件。现在,我正在做的是生成 numpy 格式的信号,将数据存储在 wav 文件中,然后将同一文件读入 pyaudio。我认为这是多余的,但是,我找不到这样做的方法。我的问题是,我可以将 numpy 数组(或常规列表)直接流式传输到我的 pyaudio 中播放吗?

【问题讨论】:

  • 是的。您可以直接将数据从 numpy 数组读取到您传递给 pyaudio 的 CHUNK 中。您应该能够通过搜索找到示例。 afaik,IPython 中没有内置的结构可以一次性为整个数组执行此操作。
  • 可以直接使用python-sounddevice.rtfd.orgplay()函数直接回放NumPy数组。

标签: python audio numpy pyaudio


【解决方案1】:

如果它只是播放并且不需要同步到任何东西,那么您可以执行以下操作:

# Open stream with correct settings
stream = self.p.open(format=pyaudio.paFloat32,
                         channels=CHANNELS,
                         rate=48000,
                         output=True,
                         output_device_index=1
                         )
# Assuming you have a numpy array called samples
data = samples.astype(np.float32).tostring()
stream.write(data)

我使用这种方法,对我来说效果很好。如果您需要同时录制,那么这将不起作用。

【讨论】:

    【解决方案2】:

    如果您只是想生成音频,那么下面的代码可能会有用,

    它确实需要pyaudio 可以安装为

    pip install pyaudio

    示例代码

    #Play a fixed frequency sound.
    from __future__ import division
    import math
    import pyaudio
    
    #See http://en.wikipedia.org/wiki/Bit_rate#Audio
    BITRATE = 44100 #number of frames per second/frameset.      
    
    #See http://www.phy.mtu.edu/~suits/notefreqs.html
    FREQUENCY = 2109.89 #Hz, waves per second, 261.63=C4-note.
    LENGTH = 1.2 #seconds to play sound
    
    NUMBEROFFRAMES = int(BITRATE * LENGTH)
    RESTFRAMES = NUMBEROFFRAMES % BITRATE
    WAVEDATA = ''    
    
    for x in xrange(NUMBEROFFRAMES):
    WAVEDATA = WAVEDATA+chr(int(math.sin(x/((BITRATE/FREQUENCY)/math.pi))*127+128))    
    
    #fill remainder of frameset with silence
    for x in xrange(RESTFRAMES): 
    WAVEDATA = WAVEDATA+chr(128)
    
    p = pyaudio.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()
    

    askubuntu 站点的代码稍作修改

    【讨论】:

    • 开始和结束时为什么会弹出这个?
    • 您听到咔哒声,因为两帧的峰值不匹配。请参阅我的此 SO 帖子以获取可能的解决方案 stackoverflow.com/questions/36438850/…
    • 我在上面使用你的代码。没有其他的。事实上,即使我写了 0,我似乎也会突然冒出来。但是,如果我更改为更宽的采样深度(例如 32 位),则不会弹出。
    【解决方案3】:

    您可以通过pyaudio直接流式传输数据,无需写入和读取.wav文件。

    import pyaudio
    p = pyaudio.PyAudio()
    stream = p.open(format=pyaudio.paFloat32,
                    channels=1,
                    rate=44100,
                    frames_per_buffer=1024,
                    output=True,
                    output_device_index=1
                    )
    samples = np.sin(np.arange(50000)/20)
    stream.write(samples.astype(np.float32).tostring())
    stream.close()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-04
      • 2019-06-27
      • 2016-04-13
      • 2015-02-07
      • 1970-01-01
      • 1970-01-01
      • 2019-01-20
      • 2013-04-27
      相关资源
      最近更新 更多