【发布时间】:2017-03-01 11:39:26
【问题描述】:
我正试图以近实时的方式读取来自 Python 中 USB 麦克风的音频的音量。
我有碎片,但不知道如何将它们组合在一起。
如果我已经有一个 .wav 文件,我可以很简单地使用 wavefile 读取它:
from wavefile import WaveReader
with WaveReader("/Users/rmartin/audio.wav") as r:
for data in r.read_iter(size=512):
left_channel = data[0]
volume = np.linalg.norm(left_channel)
print volume
这很好用,但我想实时处理来自麦克风的音频,而不是来自文件。
所以我的想法是使用 ffmpeg 之类的东西将实时输出通过管道传输到 WaveReader 中,但是我的字节知识有些缺乏。
import subprocess
import numpy as np
command = ["/usr/local/bin/ffmpeg",
'-f', 'avfoundation',
'-i', ':2',
'-t', '5',
'-ar', '11025',
'-ac', '1',
'-acodec','aac', '-']
pipe = subprocess.Popen(command, stdout=subprocess.PIPE, bufsize=10**8)
stdout_data = pipe.stdout.read()
audio_array = np.fromstring(stdout_data, dtype="int16")
print audio_array
这看起来很漂亮,但作用不大。它失败并出现 [NULL @ 0x7ff640016600] Unable to find a proper output format for 'pipe:' 错误。
我认为这是一件相当简单的事情,因为我只需要检查音频的音量。
有人知道如何简单地做到这一点吗? FFMPEG 不是必需的,但它确实需要在 OSX 和 Linux 上运行。
【问题讨论】:
-
对于 WAV 的管道,删除
-acodec aac并在-之前插入-f wav -
您可以使用sounddevice 模块。有一个 example for plotting the microphone signal in realtime 可以轻松更改以计算声级而不是绘图。
-
感谢 Warren、Mulvya 和 Matthias 的反馈。 Mulvya - 非常好 - 你的建议向我展示了为什么我的 FFMPEG 流不起作用。 Matthias - sounddevice 很棒,正是我想要的。我在下面发布了一个示例供其他人查看。
-
很好,但现在可以从回调外部获取音量信息。
标签: python linux numpy audio ffmpeg