今回は、Pythonを使ってマイクから入力した音声をリアルタイムでグラフ表示する方法を解説します。
音声処理は一見難しそうですが、Pythonなら強力なライブラリを組み合わせることで、驚くほど短いコードで実装可能です。私は業務で組み込み機器のオーディオ制御に関わることもありますが、手軽に波形を確認したいときにはPythonを重宝しています。
しかし、最近のPython(3.14など)ではインストールで致命的なエラーが出るケースが増えています。この記事では、そんな最新環境での罠と、確実な解決策についても詳しくまとめました。
必要なライブラリとインストール方法
1. PyAudio(最重要:バージョンに注意!)
音声デバイスを制御するための標準的なライブラリです。
- 推奨されるインストール方法:
pip install pyaudio
🚨 重要:Python 3.14など最新版をお使いの方へ
もしインストール中に以下のようなエラーが出た場合、その環境でPyAudioを入れるのは非常に困難です。
fatal error C1083: include ファイルを開けません。'portaudio.h': No such file or directoryこれは、最新のPython 3.14に対応したビルド済みパッケージ(Wheel)がまだ用意されておらず、自力でC言語のコンパイルが必要になっているためです。 解決策:Python 3.11 または 3.12 へのダウングレードを強く推奨します。 安定版であれば、上記コマンド一つで一発インストール可能です。
2. Matplotlib & Numpy
グラフ描画と数値計算に使用します。
pip install matplotlib numpyサンプルコード(コピペで動作OK)
最新のPython環境(3.12推奨)で動作を確認した、フリーズしにくい高速描画版のコードです。
import pyaudio
import numpy as np
import matplotlib.pyplot as plt
def main():
# --- 設定パラメータ ---
CHUNK = 1024 # 1回に読み込むデータ量
FORMAT = pyaudio.paInt16 # 16bit
CHANNELS = 1 # モノラル
RATE = 44100 # サンプリング周波数 (44.1kHz)
# PyAudioのインスタンス生成
p = pyaudio.PyAudio()
# ストリームの開始
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
# グラフの準備
fig, ax = plt.subplots()
x = np.arange(0, CHUNK)
line, = ax.plot(x, np.zeros(CHUNK))
# グラフの表示範囲設定(16bit音声の範囲:-32768〜32767)
ax.set_ylim(-32768, 32768)
ax.set_xlim(0, CHUNK)
plt.xlabel("Samples")
plt.ylabel("Amplitude")
print("録音中... (Ctrl+Cで終了)")
try:
while True:
# マイクからデータを取得
data = stream.read(CHUNK, exception_on_overflow=False)
# バイナリデータを数値配列に変換
data_np = np.frombuffer(data, dtype="int16")
# グラフデータの更新(高速化のためset_ydataを使用)
line.set_ydata(data_np)
# 描画を更新
plt.pause(0.01)
except KeyboardInterrupt:
print("終了します")
# 終了処理
stream.stop_stream()
stream.close()
p.terminate()
if __name__ == "__main__":
main()
実行結果
実際にプログラムを動かすと、以下のようにマイクが拾った音がリアルタイムに波形として表示されます。


このように、音の強弱や高さに合わせてグラフが激しく動く様子が確認できれば成功です!
プログラムの重要ポイント解説
1. マイクデータの取得とオーバーフロー対策
stream.read(CHUNK) でバッファサイズ分(1024サンプル)ずつデータを取得します。 exception_on_overflow=False を指定することで、PCの負荷変動によるエラー停止を防ぎ、安定した動作を維持しています。組み込み開発でも「予期せぬ停止」を防ぐ処理は非常に重要です。
2. 数値データへの変換
マイクから得られるデータはバイナリ形式ですが、np.frombuffer を使うことで、解析やグラフ化が可能な数値配列へ一瞬で変換できます。
3. 高速なグラフ更新のコツ
ループ内で plt.plot() を何度も呼び出すと動作が極端に重くなります。 本プログラムでは、最初に作成したプロットオブジェクトのデータのみを書き換える line.set_ydata() 手法を採用し、リアルタイム性を確保しています。
さらなるステップアップ:音声解析と応用
波形が見えるようになったら、次は「音の正体」を分析してみましょう。当ブログでは、音声処理に関する応用記事を多数公開しています。
周波数解析(スペクトラム解析)に挑戦
「音の高さ」を視覚化したい方は、フーリエ変換(FFT)を活用しましょう。リアルタイムのスペクトラム解析については以下の記事で詳しく解説しています。
効率的な音声処理の実装
より高度なプログラムを組むなら、描画と音声処理を分離する「コールバック処理」が有効です。また、音声合成(正弦波の生成)についてもまとめています。
デジタル音声の基礎
そもそものデジタル音声について基礎的な情報についてもまとめいます。
よくあるトラブルと対処法
- デバイスが見つからない場合 PCにWebカメラなどのマイクが複数ある場合、デバイス番号の指定が必要です。
p.get_device_info_by_index(i)で自分の環境に合った番号を確認してください。 - 表示を滑らかにしたい
CHUNKの値を512や256に下げると反応速度が上がりますが、PCの負荷も高まります。バランスを見て調整してみてください。
まとめ
Pythonを使えば、わずか数十行で本格的な音声モニターが作成できます。 最新のPython 3.14で詰まってしまった方も、一度 3.12等の安定版 に戻して試してみてください。
この記事が皆さんの開発の助けになれば幸いです!


コメント
こんにちは。
いま、ステレオ音声をLRそれぞれFFTにかけようとしています。
同様にPyaudioを用いて、channels=2としてステレオ入力にして、ちゃんとステレオで読み込めてはいるようですが、LとRに分けてのFFTができません。
もし、Pyaudioを用いる用いないにかかわらずLとR別々にFFTを行う方法をご存じでしたらご教示戴けませんでしょうか。
コメントありがとうございます。
ステレオでデータが取得できているのであれば、データは単純に L CH 16Bit + R Ch 16Bitのデータ列になっていますので、LChとRChでデータを分割してFFTすれば各チャンネルの周波数が取れます。
LRを分けて周波数を取得するサンプルコードを追記しましたので、参考にしてみてください。
numpyという記述がソースコード中にありましたが、importに記述しないのですか?
コメントありがとうございます。
テキストファイルから、転記するときにコピー漏れをしていたようです。
import numpy も必要です。
全体コードを修正しました。