2016-10-19 60 views
5

我試圖閱讀近實時,該音量來自Python中USB麥克風的音頻。如何閱讀python和ffmpeg中的實時麥克風音量或類似

我有件,但無法弄清楚如何把它放在一起。

如果我已經有一個.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的實時輸出,但我的字節知識有點缺乏。

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上運行。

+0

我用[pyaudio(https://people.csail.mit.edu/hubert/pyaudio/);它可在[pypi](https://pypi.python.org/pypi/PyAudio)上找到。 –

+1

對於管道轉換爲WAV,在'-'之前放入'-acodec aac'並插入'-f wav'' – Mulvya

+2

您可以使用[sounddevice](http://python-sounddevice.readthedocs.io/)模塊。有一個[實時繪製麥克風信號的示例](http://python-sounddevice.readthedocs.io/en/latest/examples.html#plot-microphone-signal-s-in-real-time)很容易被改變來計算聲級而不是繪圖。 – Matthias

回答

8

感謝@Matthias建議使用sounddevice模塊。這正是我需要的。

對於後人,這裏是一個工作的例子,打印實時音頻電平到shell:

# Print out realtime audio volume as ascii bars 

import sounddevice as sd 

duration = 10 # seconds 

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(duration * 1000) 

enter image description here

+0

這很好用,但只有當你添加'numpy作爲np'時。順便說一句,你可以使用'InputStream',因爲你不需要'outdata'。但是,無論哪種方式...... – Matthias

0

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爲Python 3.6的外觀Tkinter module not found on Ubuntu
後來我modifi ed腳本:

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

而且是它的工作:)