Pythonでマイク入力音声をリアルタイムで波形(グラフ)表示する方法【Windows、Pyaudio、matplotlib】

Python
この記事は約6分で読めます。
スポンサーリンク

プログラム解説

ここから解説していきます。

マイクデバイスのオープンと入力

まず、マイクデバイスの制御をするためにpyaudioをインポートしています。

import pyaudio

つづいて、マイクのオープン処理です。

def audiostart():
    audio = pyaudio.PyAudio()
    stream = audio.open( format = pyaudio.paInt16,
                         rate = 44100,
                         channels = 1, 
                         input_device_index = 1,
                        input = True, 
                        frames_per_buffer = 1024)
    return audio, stream

こちら、まず以下でAudioのインスタンスを生成

audio = pyaudio.PyAudio()

そして、以下でデバイスのオープンをしています。

stream = audio.open( format = pyaudio.paInt16,        … 16 bit
                         rate = 44100,                … 44.1Khz
                         channels = 1,                … チャンネル数 1 
                         input_device_index = 1,      … デバイスインデックス
                        input = True,                 … インプットを有効化
                        frames_per_buffer = 1024)     … 何バイト単位でデータをもらうか

そして、データの取得は以下で行います。

data = stream.read(1024)

最大で何バイト取得するのか指定してread関数を呼び出すだけです。

そして、使い終わったら、最後に後始末です。

def audiostop(audio, stream):
    stream.stop_stream()
    stream.close()
    audio.terminate()
スポンサーリンク

データのグラフ化

続いて、グラフを表示するためには、以下の通りインポートします。

import matplotlib.pyplot as plot

これは、「matplotlib」モジュールの「pyplot」というクラスを、「plot」という名前で使いますよってことです。
そして、実際にプロットしてグラフを表示しているのは以下です。

    plot.plot(audiodata)
    plot.draw()
    plot.pause(0.001)
    plot.cla()

これは以下のような流れを行うことでデータを設定して描画しています。

① plot.plot ・・・ データを設定
② plot.draw ・・・ 設定したデータで描画を指示
③ plot.pause ・・・ 少し止めて描画を待つ
※リアルタイムで描画したいときにはこれを行う必要があります。
④ plot.cla ・・・ データの内容をクリア

これで、マイクから音声を入力し、入力データをグラフ化できました。
Pythonはやっぱり簡単でいいですね。
次は、また勉強して、入力したデータをフーリエ変換し、入力波形の周波数をチェックしてみようと思います。

スポンサーリンク


2021/12/16 追記

音量(デシベル)と周波数の取得方法の記事を書きましたので、興味ある方はこちらも見てみてください。

こちらは録音ではなく、スピーカー出力となりますが、pyaudioでのコールバック処理の方法をまとめていますので、コールバックで処理したいよって方は以下を参考にしてみたください。

Pythonについて勉強したい人は以下がおすすめです。私も持っていてたまに眺めて勉強していますものですのでぜひ購入して学習してみてください。


コメント

  1. 北極のペンギン より:

    こんにちは。
    いま、ステレオ音声をLRそれぞれFFTにかけようとしています。
    同様にPyaudioを用いて、channels=2としてステレオ入力にして、ちゃんとステレオで読み込めてはいるようですが、LとRに分けてのFFTができません。
    もし、Pyaudioを用いる用いないにかかわらずLとR別々にFFTを行う方法をご存じでしたらご教示戴けませんでしょうか。

    • にいやん より:

      コメントありがとうございます。
      ステレオでデータが取得できているのであれば、データは単純に L CH 16Bit + R Ch 16Bitのデータ列になっていますので、LChとRChでデータを分割してFFTすれば各チャンネルの周波数が取れます。
      LRを分けて周波数を取得するサンプルコードを追記しましたので、参考にしてみてください。

  2. Landmine より:

    numpyという記述がソースコード中にありましたが、importに記述しないのですか?

    • にいやん より:

      コメントありがとうございます。
      テキストファイルから、転記するときにコピー漏れをしていたようです。
      import numpy も必要です。
      全体コードを修正しました。

タイトルとURLをコピーしました