Python × 信号処理入門!
スペクトログラムで 視る 音の世界
2025.9.27(Day2)
10:20-10:50
wat
@watlablog
PyCon JP 2025
Python × Signal Processing! The Sound World Visualized with Spectrograms
/32
1
目次
/32
2
1.自己紹介 お前誰よ?
@watlablog
/32
3
2.このトークについて
github.com
watlab-blog.com
/32
4
目次
/32
5
3.1.豊富なライブラリ群との連携
波形データ
信号処理
可視化
GUI
最適化
配布
音声
加速度
電圧
株価
アクセス数
・・・
機械学習
・・・
PyAudio
NumPy
NumPy, SciPy, librosa...
Matplotlib, Plotly, PyVista...
PyTorch, scikit-learn...
SciPy, Platypus...
Tkinter, PyQt5, kivy...
Pyinstaller, Nuitka...
世の中は信号で溢れている!
波形データに変換できるものは信号処理可能!
「こんなことができるかな?」と
思ったものは大体Pythonでできる!
社内に高価な信号処理ソフトはあるけど、
なんでもできる反面使い方が複雑…。
あと、かゆい所に手が届かないんだよな…。
OSS開発が活発(感謝!)
時間と大きさのデータ
/32
6
3.1.豊富なライブラリ群との連携
波形データ
信号処理
可視化
GUI
最適化
配布
音声
加速度
電圧
株価
アクセス数
・・・
機械学習
・・・
PyAudio
NumPy
Matplotlib, Plotly, PyVista...
PyTorch, scikit-learn...
SciPy, Platypus...
Tkinter, PyQt5, kivy...
Pyinstaller, Nuitka...
本日は音声信号を可視化する処理を紹介
NumPy, SciPy, librosa...
/32
7
目次
/32
8
4.2.初心者におすすめの開発環境
環境構築についてもっと知りたい方は
本日午後の「開発環境の整え方ライブデモ」も
参考になると思います。
/32
9
目次
/32
10
5.1.測定:PyAudioによる録音
def record(index, samplerate, fs, duration):
"""録音する関数"""
pa = pyaudio.PyAudio()
# ストリームの開始
data = []
stream = pa.open(format=pyaudio.paInt16,
channels=1,
rate=samplerate,
input=True,
input_device_index=index,
frames_per_buffer=fs)
# フレームサイズ毎に音声を録音していくループ
for i in range(int(((duration * samplerate) / fs))):
frame = stream.read(fs)
data.append(frame)
# ストリームの終了
stream.stop_stream()
stream.close()
pa.terminate()
Sample/record.py
PyAudioの準備
チャンネル数
デバイス番号
https://github.com/watlablog/pyconjp2025-wat
Check Point !:オーディオデバイスとは?
オーディオデバイス:音声を再生したり録音したりする機器
指標=
コピペで動くコードはこちら
/32
11
5.1.測定:ビット数とサンプリングレート
def record(index, samplerate, fs, duration):
"""録音する関数"""
pa = pyaudio.PyAudio()
# ストリームの開始
data = []
stream = pa.open(format=pyaudio.paInt16,
channels=1,
rate=samplerate,
input=True,
input_device_index=index,
frames_per_buffer=fs)
# フレームサイズ毎に音声を録音していくループ
for i in range(int(((duration * samplerate) / fs))):
frame = stream.read(fs)
data.append(frame)
# ストリームの終了
stream.stop_stream()
stream.close()
pa.terminate()
Sample/record.py
ビット数
サンプリングレート
ビット数を上げると縦軸の解像度が増える
サンプリングレート samplegrate
=1[s]間あたりに記録するデータ点の個数
例)samplerate = 44100[Hz]
→1[s]間に44100ポイントのデータ点
https://github.com/watlablog/pyconjp2025-wat
/32
12
5.1.測定:フレーム処理による録音
def record(index, samplerate, fs, duration):
"""録音する関数"""
pa = pyaudio.PyAudio()
# ストリームの開始
data = []
stream = pa.open(format=pyaudio.paInt16,
channels=1,
rate=samplerate,
input=True,
input_device_index=index,
frames_per_buffer=fs)
# フレームサイズ毎に音声を録音していくループ
for i in range(int(((duration * samplerate) / fs))):
frame = stream.read(fs)
data.append(frame)
# ストリームの終了
stream.stop_stream()
stream.close()
pa.terminate()
Sample/record.py
フレームサイズ
https://github.com/watlablog/pyconjp2025-wat
ループ処理�で録音
フレームサイズ fs
録音時間 duration
録音時間
.appendでフレーム毎に録音した�データを接続
Check Point !:データ点の総数NPointとループ数NLoop
/32
13
5.2.周波数分析:フーリエ変換(時間波形と周波数波形の関係)
フーリエ変換
時間波形
周波数波形
振幅
周期
周波数
振幅
逆フーリエ変換
Sample/fourier_transform.py
https://github.com/watlablog/pyconjp2025-wat
/32
14
フーリエ変換
時間波形
周波数波形
逆フーリエ変換
Sample/fourier_transform.py
https://github.com/watlablog/pyconjp2025-wat
5.2.周波数分析:フーリエ変換(時間波形と周波数波形の関係)
/32
15
フーリエ変換
逆フーリエ変換
時間波形
周波数波形
+
+
+
Sample/fourier_transform.py
https://github.com/watlablog/pyconjp2025-wat
5.2.周波数分析:フーリエ変換(時間波形と周波数波形の関係)
/32
16
5.2.周波数分析:リアルワールドの波形例
フーリエ変換
逆フーリエ変換
時間波形
周波数波形
Sample/fourier_transform.py
https://github.com/watlablog/pyconjp2025-wat
/32
17
5.2.周波数分析:リアルワールドの波形例
フーリエ変換
逆フーリエ変換
時間波形
周波数波形
Sample/fourier_transform.py
https://github.com/watlablog/pyconjp2025-wat
Check Point !:dB(デシベル)
実際の音は大きい振幅や小さい振幅が混ざっている。
dB表示は大小さまざまな振幅を一望するのに便利。
音の基準:0dB=20[μPa]
/32
18
目次
/32
19
6.1.スペクトログラムとは?
周波数
時間
振幅
周波数の時間変化
振幅の時間変化
Check Point !:カラーマップ
スペクトログラムは振幅の大きさにカラーマップ
を使っている。カラーマップはMatplotlibで簡単に
指定することができる。
例)cmap='jet'
jet
coolwarm
小
大
※口笛の音声
Sample/spectrogram.py
https://github.com/watlablog/pyconjp2025-wat
😗
/32
20
6.2.スペクトログラムの処理手順
全体時間波形からフレームを抽出
フレーム単位でフーリエ変換
スペクトログラムにデータを蓄積
Sample/spectrogram.py
https://github.com/watlablog/pyconjp2025-wat
/32
21
6.2.スペクトログラムの分解能について
Sample/spectrogram.py
https://github.com/watlablog/pyconjp2025-wat
/32
22
6.2.スペクトログラムの分解能について
Sample/spectrogram.py
https://github.com/watlablog/pyconjp2025-wat
オーバーラップ率を上げることで時間方向の分解能が上がる
/32
23
目次
/32
24
7.1.色々な音の可視化結果
/32
25
7.1.色々な音の可視化結果
アブラゼミの鳴き声
/32
26
7.1.色々な音の可視化結果
/32
27
7.1.色々な音の可視化結果
ミンミンゼミの鳴き声
/32
28
7.1.色々な音の可視化結果
/32
29
7.1.色々な音の可視化結果
ピアノの音
/32
30
7.1.色々な音の可視化結果
減衰振動
打鍵
ハンマー
弦
SciPy odeintによる弦振動のシミュレーション結果
/32
31
目次
/32
32
8.まとめ
スペクトログラムで色々な音を可視化してみましょう!
/32