pyAudioAnalysis 可以用于实时 http 音频流吗?

Can pyAudioAnalysis be used on a live http audio stream?

我正在尝试使用 pyAudioAnalysis 从 HTTP 流中实时分析音频流。我的目标是使用该库中的过零率 (ZCR) 和其他方法来识别流中的事件。

pyAudioAnalysis 仅支持来自文件的输入,但将 http 流转换为 .wav 会产生大量开销和我想避免的临时文件管理。

我的方法如下:

使用 ffmpeg 我能够将原始音频字节放入子进程管道中。

try:
    song = subprocess.Popen(["ffmpeg", "-i", "https://media-url/example", "-acodec", "pcm_s16le", "-ac", "1", "-f", "wav", "pipe:1"],
                            stdout=subprocess.PIPE)

然后我使用 pyAudio 缓冲了这些数据,希望能够在 pyAudioAnalysis 中使用字节

CHUNK = 65536

p = pyaudio.PyAudio()

stream = p.open(format=pyaudio.paInt16,
                channels=1,
                rate=44100,
                output=True)

data = song.stdout.read(CHUNK)

while len(data) > 0:
    stream.write(data)
    data = song.stdout.read(CHUNK)

但是,将此数据输出输入 AudioBasicIO.read_audio_generic() 会生成一个空的 numpy 数组。

是否有不创建临时文件的有效解决方案?

你可以试试我的ffmpegio包:

pip install ffmpegio

import ffmpegio

# read entire stream
fs, x = ffmpegio.audio.read("https://media-url/example", ac=1, sample_fmt='s16')
# fs - sampling rate
# x - [nx1] numpy array

# or read a block at a time:
with ffmpegio.open(["https://media-url/example", "ra", blocksize=1024, ac=1, sample_fmt='s16') as f:
    fs = f.rate
    for x in f:
       # x: [1024x1] numpy array (or shorter for the last block)
       process_data(x)

注意,如果需要归一化样本,可以设置sample_fmt'flt' 'dbl'

如果你希望保持低依赖性,调用 ffmpeg 子进程的关键是使用原始输出格式:


import subprocess as sp
import numpy as np

song = sp.Popen(["ffmpeg", "-i", "https://media-url/example", "-f", "s16le","-c:a", "pcm_s16le", "-ac", "1", "pipe:1"], stdout=sp.PIPE)

CHUNK = 65536
n = CHUNK/2 # 2 bytes/sample

data = np.frombuffer(song.stdout.read(CHUNK),np.int16)
while len(data) > 0:
    data = np.frombuffer(song.stdout.read(CHUNK),np.int16)

我不能说 pyAudioAnalysis 但我怀疑它需要样本而不是字节。