2023年5月6日土曜日

音声データからスペクトログラム画像を作成する(Python)

音声データを用いて農業に役立つ何かを作れないかと考えています。

より具体的には、音声データからスペクトログラム画像を作成して、画像認識の機械学習(Google Cloud の Vertex AI)で何かを判定するなんてことができたらいいなと。例えば、原木椎茸のホダ化の具合なんかを判定できたら面白いのですけどね。

スペクトログラム画像というのは、下図のように音の周波数と時間の情報を視覚的に表現したものです。

スペクトログラム画像
(このスペクトログラム画像は、私が「あー」と言っている音声から作成)


そんなわけで、(ChatGPT の力も借りて)WAV 形式の音声データをスペクトログラム画像に変換する簡単な Python コードを作成しました。

import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile
from scipy.signal import spectrogram

# 音声ファイルの読み込み
sample_rate, samples = wavfile.read("input.wav")

# FFTをかけて周波数スペクトルを取得
frequencies, times, spec = spectrogram(samples, fs=sample_rate)

# スペクトログラム画像の描画
Z = 10. * np.log10(spec)
plt.imshow(Z, origin='lower', aspect='auto', cmap='viridis')
plt.xlabel('Time (sec)')
plt.ylabel('Frequency (Hz)')
plt.colorbar()
plt.show()

実際にスペクトログラム画像を機械学習に使うのであれば、音量や時間などの諸々の条件をそろえるために音声データの取得や加工の方法もより詳細に考えなければいけないようです(たぶん、他にもいろいろ)。


***

音声データを圧縮して特徴を文字列として表現するということをやられている方がおり、似たようなことができないものかと思ったのですが、知識が足りな過ぎてうまくいかず……(勉強して出直します)。

それならばと、ライブラリを活用して比較的簡単にできそうだったスペクトログラム画像への変換を試みた次第です。

こういうものは、ひとまず思いついた時に思いついた部分だけでも作ってストックしておくと、いざ使いどころのアイデアが出たときにすぐに実行することができます。


Twitter (@nkkmd) 日々更新中です。