【问题标题】:How to read realtime microphone audio volume in python and ffmpeg or similar如何在 python 和 ffmpeg 或类似文件中读取实时麦克风音量
【发布时间】: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 上运行。

【问题讨论】:

  • 我用过pyaudio;它可以在pypi上找到。
  • 对于 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


【解决方案1】:

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

为了后代,这是一个将实时音频级别打印到外壳的工作示例:

# 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)

【讨论】:

  • 效果很好,但前提是您添加import numpy as np。顺便说一句,您可以使用InputStream,因为您不需要outdata。但无论哪种方式都可以...
  • 获取ValueError: Input and output device must have the same samplerate =/
【解决方案2】:

Python 3 用户在这里
我在完成这项工作时遇到了一些问题,所以我使用了: https://python-sounddevice.readthedocs.io/en/0.3.3/examples.html#plot-microphone-signal-s-in-real-time
我需要为 python 3.6 安装 sudo apt-get install python3-tk 看看 Tkinter module not found on Ubuntu
然后我修改了脚本:

#!/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)

是的,它工作:)

【讨论】:

    猜你喜欢
    • 2020-09-23
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 2011-10-16
    • 2023-04-02
    • 2019-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多