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
但我怀疑它需要样本而不是字节。
我正在尝试使用 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
但我怀疑它需要样本而不是字节。