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

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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 使其变成字节串...

以上是关于Python:使用 PyAudio(或其他东西)的实时音频流?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 python 中生成音符或和弦?

如何使用 PyAudio 或 PortAudio 获取设备的音频采样率列表?

如何使用 PyAudio 或 PortAudio 获取设备的音频采样率列表?

Python人工智能之路 - 第三篇 : PyAudio 实现录音 自动化交互实现问答

pyaudio支持播放哪些文件?

如何选择使用哪个设备录制(Python PyAudio)