Python:使用PyAudio(或其他)实时音频流?

Mar*_*elj 11 python audio numpy audio-streaming

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

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

Mar*_*elj 8

这有效!感谢帮助!

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!")
Run Code Online (Sandbox Code Playgroud)

现在看起来很简单,但是当你不太了解Python时,它似乎很糟糕.


Rol*_*ith 7

正如您在示例中所见,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()
Run Code Online (Sandbox Code Playgroud)

  • Sooo,基本上我应该检查 numpy 如何将 numpy 数组转换为 WAV 然后做同样的事情,除了将它指向流,而不是将它写入文件?顺便说一句,谢谢,但我在过去的一个月里盯着那个例子看了几个小时,这个问题没有得到任何答复,也没有解决方案告诉我我该怎么做…… (3认同)
  • @MarioKrušelj 只需将数据缩放和/或转换为 16 位有符号整数(`numpy.int16` 的 `dtype`)。然后用数组方法`tobytes`把它变成一个字节串... (2认同)

Mat*_*ias 5

使用python-sounddevice,这真的很简单:

import sounddevice as sd
sd.play(myarray, 44100)
Run Code Online (Sandbox Code Playgroud)