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で動作する必要があります。
サウンドデバイスモジュールの使用を提案してくれた@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)