Python:使用PyAudio(或其他方式)进行实时音频流传输?

19

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

应该跨平台。 我正在使用Python 3(Anaconda分发版)。

3个回答

18

这个方法有效了!感谢帮助!

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时,它似乎像地狱一样。


13

9
如您在示例中所见,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()

3
所以,基本上我应该检查numpy如何将numpy数组转换为WAV,然后做同样的事情,只是把它指向流而不是写入文件?顺便说一下,谢谢,但我在过去一个月里盯着那个例子看了几个小时,这个问题没有得到任何回复,我也没有想出如何解决它... - Mario Krušelj
2
@MarioKrušelj 只需将数据缩放和/或转换为16位有符号整数(numpy.int16dtype)。然后使用数组方法tobytes将其转换为字节字符串... - Roland Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接