[英]How to read volume value from mp3 file in python and ffmpeg or similar
[英]How to read realtime microphone audio volume in python and ffmpeg or similar
我正在尝试近乎实时地读取来自 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的东西将实时输出PIPE到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] 无法为“管道:”错误找到合适的输出格式而失败。
我认为这是一件相当简单的事情,因为我只需要检查音频的音量。
有谁知道如何简单地做到这一点? 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 用户在这里
我在做这项工作时遇到的问题很少,所以我使用了: 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)
是的,它有效:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.