Próbuję przeczytać, w niemal w czasie rzeczywistym, głośność pochodzącą z audio z mikrofonu USB w Pythonie.Jak odczytywać głośność dźwięku w czasie rzeczywistym mikrofon w python i ffmpeg lub podobny
Mam części, ale nie mogę wymyślić, jak je złożyć.
Jeśli już mam pliku wav, mogę całkiem po prostu odczytać go za pomocą 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
Działa to doskonale, ale chcę, aby przetwarzać dźwięk z mikrofonu w czasie rzeczywistym, nie z pliku.
Tak więc moim pomysłem było użycie czegoś takiego jak ffmpeg do PIPE wyjścia w czasie rzeczywistym do WaveReadera, ale moja wiedza na temat Bajtów jest nieco słaba.
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
To wygląda ładnie, ale nie robi zbyt wiele. Nie powiedzie się z [NULL @ 0x7ff640016600] Nie można znaleźć odpowiedniego formatu wyjściowego dla błędu "pipe:".
Zakładam, że jest to dość prosta sprawa, ponieważ muszę tylko sprawdzić poziom głośności dźwięku.
Ktoś wie, jak to osiągnąć? FFMPEG nie jest wymogiem, ale musi działać na systemie Linux OSX &.
mam używane [pyaudio] (https://people.csail.mit.edu/hubert/pyaudio/); jest dostępny na [pypi] (https://pypi.python.org/pypi/PyAudio). –
Aby wyprowadzić do WAV, upuść '-acodec aac' i wstaw' -f wav' przed '-' – Mulvya
Możesz użyć modułu [sounddevice] (http://python-sounddevice.readthedocs.io/). Istnieje [przykład do wykreślania sygnału mikrofonu w czasie rzeczywistym] (http://python-sounddevice.readthedocs.io/en/latest/examples.html#plot-microphone-signal-s-in-real-time), który mógłby łatwo zmienić, aby obliczyć poziom dźwięku zamiast kreślenia. – Matthias