【问题标题】:Python: Realtime audio streaming with PyAudio (or something else)?Python:使用 PyAudio(或其他东西)的实时音频流?
【发布时间】:2015-10-18 21:32:09
【问题描述】:

目前我正在使用 NumPy 从 NumPy 数组生成 WAV 文件。我想知道是否可以在 NumPy 数组实际写入硬盘驱动器之前实时播放它。我发现使用 PyAudio 的所有示例都依赖于首先将 NumPy 数组写入 WAV 文件,但我希望有一个预览功能,它只是将 NumPy 数组吐出到音频输出。

也应该是跨平台的。我正在使用 Python 3(Anaconda 发行版)。

【问题讨论】:

    标签: python audio numpy audio-streaming


    【解决方案1】:

    这已经奏效了!感谢您的帮助!

    def generate_sample(self, ob, preview):
        print("* Generating sample...")
        tone_out = array(ob, dtype=int16)
    
        if preview:
            print("* Previewing audio file...")
    
            bytestream = tone_out.tobytes()
            pya = pyaudio.PyAudio()
            stream = pya.open(format=pya.get_format_from_width(width=2), channels=1, rate=OUTPUT_SAMPLE_RATE, output=True)
            stream.write(bytestream)
            stream.stop_stream()
            stream.close()
    
            pya.terminate()
            print("* Preview completed!")
        else:
            write('sound.wav', SAMPLE_RATE, tone_out)
            print("* Wrote audio file!")
    

    现在看起来很简单,但是当你对 Python 不是很了解的时候,就好像地狱一样。

    【讨论】:

      【解决方案2】:

      python-sounddevice 真的很简单:

      import sounddevice as sd
      sd.play(myarray, 44100)
      

      【讨论】:

        【解决方案3】:

        正如您在examples 中看到的,pyaudio 只是从 WAV 文件中读取数据并将其写入流中。

        没有必要先写一个WAV文件,你只需要一个格式正确的数据流

        我将添加下面的示例以防链接失效(请注意,我没有编写此代码):

        """PyAudio Example: Play a WAVE file."""
        
        import pyaudio
        import wave
        import sys
        
        CHUNK = 1024
        
        if len(sys.argv) < 2:
            print("Plays a wave file.\n\nUsage: %s filename.wav" % sys.argv[0])
            sys.exit(-1)
        
        wf = wave.open(sys.argv[1], 'rb')
        
        p = pyaudio.PyAudio()
        
        stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
                        channels=wf.getnchannels(),
                        rate=wf.getframerate(),
                        output=True)
        
        data = wf.readframes(CHUNK)
        
        while data != '':
            stream.write(data)
            data = wf.readframes(CHUNK)
        
        stream.stop_stream()
        stream.close()
        
        p.terminate()
        

        【讨论】:

        • Sooo,基本上我应该检查 numpy 如何将 numpy 数组转换为 WAV,然后做同样的事情,除了将其指向流,而不是将其写入文件?顺便说一句,谢谢,但在过去的一个月里,我盯着那个例子看了几个小时,这个问题没有得到任何答复,我也没有找到解决方案来解决我该怎么做......
        • @MarioKrušelj 只需将数据缩放和/或转换为 16 位有符号整数(dtype of numpy.int16)。然后使用数组方法tobytes 使其变成字节串...
        猜你喜欢
        • 1970-01-01
        • 2016-09-12
        • 1970-01-01
        • 2015-12-05
        • 1970-01-01
        • 1970-01-01
        • 2012-08-22
        • 1970-01-01
        • 2011-02-23
        相关资源
        最近更新 更多