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