1 of 33

Python × 信号処理入門!

スペクトログラムで 視る 音の世界

2025.9.27(Day2)

10:20-10:50

wat

@watlablog

PyCon JP 2025

Python × Signal Processing! The Sound World Visualized with Spectrograms

/32

2 of 33

1

目次

  1. 自己紹介
  2. このトークについて
  3. Pythonで信号処理をするメリット
  4. 環境構築
  5. 音声分析のために知っておくべき基礎知識
  6. スペクトログラムの描き方
  7. 色々な音の可視化結果
  8. まとめ

/32

3 of 33

2

1.自己紹介 お前誰よ?

  • 名前:wat (Kenta WATANABE)
  • 職業:電機メーカーの機械設計者�   音振動、�   熱流体関連のシミュレーションや実験
  • 趣味:
    • Python (2019年〜)
    • ピアノ (独学)
    • 囲碁 (アマ五段くらい)
  • Python活動:

@watlablog

/32

4 of 33

3

2.このトークについて

  • このトークを聴くことで持ち帰れること
    • Pythonで録音や信号処理をする時の基礎知識�→是非本トークをきっかけに� 信号処理プログラミングをしてみてください。

github.com

  • このトークで話さないこと
    • 信号処理の細かい話�(ISO規格, 窓関数と振幅補正係数, パワースペクトルと振幅, 実効値, 聴感補正…)
    • 数式の詳細な説明
    • コードの詳細な説明

watlab-blog.com

/32

5 of 33

4

目次

  1. 自己紹介
  2. このトークについて
  3. Pythonで信号処理をするメリット
    1. 豊富なライブラリ群との連携
  4. 環境構築
  5. 音声分析のために知っておくべき基礎知識
  6. スペクトログラムの描き方
  7. 色々な音の可視化結果
  8. まとめ

/32

6 of 33

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

7 of 33

6

3.1.豊富なライブラリ群との連携

波形データ

信号処理

可視化

GUI

最適化

配布

音声

加速度

電圧

株価

アクセス数

・・・

機械学習

・・・

PyAudio

NumPy

Matplotlib, Plotly, PyVista...

PyTorch, scikit-learn...

SciPy, Platypus...

Tkinter, PyQt5, kivy...

Pyinstaller, Nuitka...

本日は音声信号を可視化する処理を紹介

NumPy, SciPy, librosa...

/32

8 of 33

7

目次

  1. このトークについて
  2. 自己紹介
  3. Pythonで信号処理をするメリット
  4. 環境構築
    1. 初心者におすすめの開発環境
  5. 音声分析のために知っておくべき基礎知識
  6. スペクトログラムの描き方
  7. 色々な音の可視化結果
  8. まとめ

/32

9 of 33

8

4.2.初心者におすすめの開発環境

  • Python本体
    • 公式(https://www.python.org/)のPython

  • 仮想環境
    • venv

  • エディタ(IDE)
    • JupyterLab
    • VSCode
    • PyCharm

環境構築についてもっと知りたい方は

本日午後の「開発環境の整え方ライブデモ」も

参考になると思います。

/32

10 of 33

9

目次

  1. 自己紹介
  2. このトークについて
  3. Pythonで信号処理をするメリット
  4. 環境構築
  5. 音声分析のために知っておくべき基礎知識
    1. 測定
    2. 周波数分析
  6. スペクトログラムの描き方
  7. 色々な音の可視化結果
  8. まとめ
  9. リアルタイムスペクトログラムのデモ

/32

11 of 33

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

  • PyAudio�クロスプラットフォームなオーディオライブラリ。�Linux, Windows, macOS等でPythonを使った�オーディオの再生・録音が簡単にできる。�
  • チャンネル数�1 = モノラル�2 = ステレオ�
  • デバイス番号�オーディオデバイスの指標※環境毎に番号は異なる

Check Point !:オーディオデバイスとは?

オーディオデバイス:音声を再生したり録音したりする機器

指標=

コピペで動くコードはこちら

/32

12 of 33

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

13 of 33

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

14 of 33

13

5.2.周波数分析:フーリエ変換(時間波形と周波数波形の関係)

  • 時間波形と周波数波形は互いに変換できる

フーリエ変換

時間波形

周波数波形

振幅

周期

周波数

振幅

逆フーリエ変換

Sample/fourier_transform.py

https://github.com/watlablog/pyconjp2025-wat

/32

15 of 33

14

  • 複雑な波も単純な波の重ね合わせで表現できる

フーリエ変換

時間波形

周波数波形

逆フーリエ変換

Sample/fourier_transform.py

https://github.com/watlablog/pyconjp2025-wat

5.2.周波数分析:フーリエ変換(時間波形と周波数波形の関係)

/32

16 of 33

15

フーリエ変換

逆フーリエ変換

時間波形

周波数波形

+

+

+

  • 複雑な波も単純な波の重ね合わせで表現できる

Sample/fourier_transform.py

https://github.com/watlablog/pyconjp2025-wat

5.2.周波数分析:フーリエ変換(時間波形と周波数波形の関係)

/32

17 of 33

16

5.2.周波数分析:リアルワールドの波形例

  • 実際の音声はかなり複雑

フーリエ変換

逆フーリエ変換

時間波形

周波数波形

Sample/fourier_transform.py

https://github.com/watlablog/pyconjp2025-wat

/32

18 of 33

17

5.2.周波数分析:リアルワールドの波形例

  • 実際の音声はかなり複雑

フーリエ変換

逆フーリエ変換

時間波形

周波数波形

Sample/fourier_transform.py

https://github.com/watlablog/pyconjp2025-wat

Check Point !:dB(デシベル)

実際の音は大きい振幅や小さい振幅が混ざっている。

dB表示は大小さまざまな振幅を一望するのに便利。

音の基準:0dB=20[μPa]

/32

19 of 33

18

目次

  1. 自己紹介
  2. このトークについて
  3. Pythonで信号処理をするメリット
  4. 環境構築
  5. 音声分析のために知っておくべき基礎知識
  6. スペクトログラムの描き方
    1. スペクトログラムとは?
    2. スペクトログラムの処理手順
    3. スペクトログラムの分解能について
  7. 色々な音の可視化結果
  8. まとめ

/32

20 of 33

19

6.1.スペクトログラムとは?

周波数

時間

振幅

周波数の時間変化

振幅の時間変化

  • 視ればどんな音なのかがわかる音声可視化方法

Check Point !:カラーマップ

スペクトログラムは振幅の大きさにカラーマップ

を使っている。カラーマップはMatplotlibで簡単に

指定することができる。

例)cmap='jet'

jet

coolwarm

※口笛の音声

Sample/spectrogram.py

https://github.com/watlablog/pyconjp2025-wat

😗

/32

21 of 33

20

6.2.スペクトログラムの処理手順

  • STFT(Short-Time Fourier Transform)

全体時間波形からフレームを抽出

フレーム単位でフーリエ変換

スペクトログラムにデータを蓄積

Sample/spectrogram.py

https://github.com/watlablog/pyconjp2025-wat

/32

22 of 33

21

6.2.スペクトログラムの分解能について

  • フレームサイズが大きい:周波数分解能が上がる⤴️/時間分解能が下がる⤵️
  • フレームサイズが小さい:周波数分解能が下がる⤵️/時間分解能が上がる⤴️

Sample/spectrogram.py

https://github.com/watlablog/pyconjp2025-wat

/32

23 of 33

22

6.2.スペクトログラムの分解能について

Sample/spectrogram.py

https://github.com/watlablog/pyconjp2025-wat

  • オーバーラップ率=0%
  • オーバーラップ率=50%

オーバーラップ率を上げることで時間方向の分解能が上がる

/32

24 of 33

23

目次

  1. 自己紹介
  2. このトークについて
  3. Pythonで信号処理をするメリット
  4. 環境構築
  5. 音声分析のために知っておくべき基礎知識
  6. スペクトログラムの描き方
    1. スペクトログラムとは?
    2. スペクトログラムの処理手順
    3. スペクトログラムの分解能について
  7. 色々な音の可視化結果
  8. まとめ

/32

25 of 33

24

7.1.色々な音の可視化結果

/32

26 of 33

25

7.1.色々な音の可視化結果

アブラゼミの鳴き声

/32

27 of 33

26

7.1.色々な音の可視化結果

/32

28 of 33

27

7.1.色々な音の可視化結果

ミンミンゼミの鳴き声

/32

29 of 33

28

7.1.色々な音の可視化結果

/32

30 of 33

29

7.1.色々な音の可視化結果

ピアノの音

/32

31 of 33

30

7.1.色々な音の可視化結果

減衰振動

打鍵

ハンマー

SciPy odeintによる弦振動のシミュレーション結果

/32

32 of 33

31

目次

  1. 自己紹介
  2. このトークについて
  3. Pythonで信号処理をするメリット
  4. 環境構築
  5. 音声分析のために知っておくべき基礎知識
  6. スペクトログラムの描き方
  7. 色々な音の可視化結果
  8. まとめ

/32

33 of 33

32

8.まとめ

  • このトークで説明した内容
    • 録音/フーリエ変換/スペクトログラム描画をする方法
    • スペクトログラムの見方

  • スペクトログラムの応用
    • スペクトログラムはCNN(畳み込みニューラルネットワーク)�の入力データに使用可能�→異常検知、音声分類等のアプリケーションに活用可能

スペクトログラムで色々な音を可視化してみましょう!

/32