linux 如何读取实时麦克风音频音量在Python和FFMPEG或类似

oyt4ldly  于 2023-04-05  发布在  Linux
关注(0)|答案(3)|浏览(593)

我正在尝试读取,在 * 接近实时 *,从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中,但我的Byte知识有些欠缺。

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上工作。

bf1o4zei

bf1o4zei1#

感谢@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)

cl25kdpy

cl25kdpy2#

Python 3用户
我有几个问题,使工作,所以我用:https://python-sounddevice.readthedocs.io/en/0.3.3/examples.html#plot-microphone-signal-s-in-real-time
我需要安装sudo apt-get install python3-tk for python 3.6 look 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)

是的,它在工作:)

eyh26e7m

eyh26e7m3#

最快、最小的工作示例如下:

import sounddevice as sd
import numpy as np

def print_volume(indata, frames, time, status):
    volume_norm = np.linalg.norm(indata)*10
    print(f'Microphone Volume: {volume_norm:.2f}')

with sd.InputStream(callback=print_volume):
    sd.sleep(10000)

相关问题