2016-10-19 8 views
5

私はにほぼリアルタイムでという音量で、読み込みしようとしています。リアルタイムのマイクロフォンの音量をPythonやffmpegなどで読み取る方法

私はこの作品を持っていますが、一緒に置く方法を理解することはできません。

私はすでに私はかなり単純wavefile使用してそれを読むことができ、.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 = np.linalg.norm(left_channel) 
     print volume 

を、ファイルからではありません。

私の考えは、リアルタイム出力をWaveReaderにPIPEするのにffmpegのようなものを使用することでしたが、私のバイト知識はいくらか欠けています。

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のおかげで、それは私が必要とするものです。私はその仕事をするために、いくつかの問題を抱えていたここ

# 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

これはうまく動作しますが、 'import numpy as np'を追加した場合に限り有効です。ところで、 'outdata'は必要ないので' InputStream'を使うことができます。しかしどちらの方法でも動作します... – Matthias

0

のPython 3ユーザー
:後世のために

は、ここにシェルにリアルタイムのオーディオレベルを出力実施例であります私が使用: https://python-sounddevice.readthedocs.io/en/0.3.3/examples.html#plot-microphone-signal-s-in-real-time
そして私はTkinter module not found on Ubuntu
その後、私はMODIFIのpython 3.6一見のためsudo apt-get install python3-tkをインストールする必要があります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) 

そして、はい、それは:)

関連する問題