如何读取python和ffmpeg或类似的实时麦克风音量

我试图近乎实时地读取来自Python中USB麦克风audio的音量。

我有件,但不知道如何把它放在一起。

如果我已经有一个.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 

这很好,但我想实时处理来自麦克风的audio,而不是从文件。

所以我的想法是使用像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]无法find合适的输出格式为'pipe:'错误。

我认为这是一个相当简单的事情,因为我只需要检查音量级别的audio。

任何人都知道如何做到这一点? FFMPEG不是必需的,但它确实需要在OSX和Linux上工作。

感谢@Matthias建议使用sounddevice模块。 这正是我需要的。

对于后人来说,下面是一个将实时音频级别打印到外壳的实例:

 # Print out realtime audio volume as ascii bars import sounddevice as sd duration = 10 # seconds def print_sound(indata, outdata, frames, time, status): volume_norm = np.linalg.norm(indata)*10 print "|" * int(volume_norm) with sd.Stream(callback=print_sound): sd.sleep(duration * 1000) 

在这里输入图像描述