如何以python和ffmpeg或类似格式读取实时麦克风音频音量

如何以python和ffmpeg或类似格式读取实时麦克风音频音量,python,linux,numpy,audio,ffmpeg,Python,Linux,Numpy,Audio,Ffmpeg,我试图以近乎实时的方式读取Python中USB麦克风音频的音量 我有这些碎片,但不知道如何组合 如果我已经有一个.wav文件,我可以非常简单地使用波形文件来读取它: 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

我试图以近乎实时的方式读取Python中USB麦克风音频的音量

我有这些碎片,但不知道如何组合

如果我已经有一个.wav文件,我可以非常简单地使用波形文件来读取它:

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]无法为“pipe:”找到合适的输出格式的错误

我假设这是一件相当简单的事情,因为我只需要检查音频的音量


有人知道如何简单地做到这一点吗?FFMPEG不是必需的,但它确实需要在OSX和Linux上工作

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

对于子孙后代,以下是一个将实时音频级别打印到shell的工作示例:

# Print out realtime audio volume as ascii bars

import sounddevice as sd
import numpy as np

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(10000)

这里是Python 3用户
我几乎没有什么问题,所以我使用:
我需要为python3.6安装
sudo apt get install python3 tk
,查看
然后我修改了脚本:

#!/usr/bin/env python3
import numpy as np
import sounddevice as sd

duration = 10 #in seconds

def audio_callback(indata, frames, time, status):
   volume_norm = np.linalg.norm(indata) * 10
   print("|" * int(volume_norm))


stream = sd.InputStream(callback=audio_callback)
with stream:
   sd.sleep(duration * 1000)

是的,它正在工作:)

我用过;可在上使用。对于WAV的管道,在可以使用该模块之前,放下
-acodec aac
并插入
-f WAV
。有一个可以很容易地改变计算声级而不是绘图的方法。感谢Warren,Mulvya&Matthias的反馈。Mulvya-非常好-你的建议告诉了我为什么我的FFMPEG流不能工作。Matthias-sounddevice非常棒,正是我想要的。我在下面发布了一个示例,供其他人参考。这很好,但前提是您添加
importnumpyasnp
。顺便说一句,您可以使用
InputStream
,因为您不需要
outdata
。但不管怎样它都能工作…获取
值错误:输入和输出设备必须具有相同的采样器
=/这在macOS Mojave上不起作用。这在macOS Mojave上不起作用。