見出し画像

リアルタイムで音声波形の取得【PyAudio】

環境

RaspberryPi Zero W (OS: Raspbian)
USBマイク
・Python 3.5

使用したライブラリ

・numpy
・PyAudio

USBマイクの接続

ラズパイのUSBにUSBマイクを接続します。
LXTarminalで以下のコマンドを入力してちゃんと接続できているかを確認します。

$ arecord -l

下の画像のように表示されていればOKです。

リアルタイムで波形取得

まず、PyAudioをインストールします。

$ sudo apt install python3-pyaudio

numpyをインストールしていない人は以下のコマンドでいれてください。

$ sudo apt install python3-numpy

次に以下のようなコードを書き、実行してみましょう。

# coding: utf-8

import pyaudio
import numpy as np

CHUNK = 1024
RATE = 44100 # サンプリング周波数

P = pyaudio.PyAudio()

stream = P.open(format=pyaudio.paInt16, channels=1, rate=RATE, frames_per_buffer=CHUNK, input=True, output=False)

while stream.is_active():
    try:
        input = stream.read(CHUNK, exception_on_overflow=False)
        # bufferからndarrayに変換
        ndarray = np.frombuffer(input, dtype='int16')

        ''' 高速フーリエ変換をして時間領域から周波数領域にする場合は下1行を追加する '''
        #f = np.fft.fft(ndarray)

        # ndarrayからリストに変換
        # Pythonネイティブのint型にして扱いやすくする
        a = [np.asscalar(i) for i in ndarray]

        # 試しに0番目に入っているものを表示してみる
        print(a[0])

        ''' 音声を出力する場合はstreamのoutputをTrueにして下2行を追加する '''
	#output = np.array(a, dtype='int16').tobytes()
        #stream.write(output)
    except KeyboardInterrupt:
        break

stream.stop_stream()
stream.close()
P.terminate()

print('Stop Streaming')

上記コードの「a」には波形データが入っていて、-32767〜32767の値が1024個あります。


いいなと思ったら応援しよう!