web-dev-qa-db-ja.com

python andffmpegなどでリアルタイムマイクの音量を読み取る方法

PythonのUSBマイクのオーディオからの音量をnear-realtimeで読み込もうとしています。

ピースはありますが、組み立て方がわかりません。

すでに.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のようなものを使ってリアルタイム出力を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で動作する必要があります。

11
Ryan Martin

サウンドデバイスモジュールの使用を提案してくれた@Matthiasに感謝します。それはまさに私が必要としているものです。

後世のために、リアルタイムのオーディオレベルをシェルに出力する実用的な例を次に示します。

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

enter image description here

14
Ryan Martin