オーディオ信号のスペクトログラムをプロット/保存する方法としては、matplotlib
のimshow()
を使う方法がありますが、今回はスペクトログラムを純粋な画像データとして保存する方法を試してみました。
実装
import librosa import numpy as np import cv2 bitdepth = 8 quality = 95 # jpegの品質, [0, 100], デフォルトは95 filepath = "your_audiofile.wav" y, sr = librosa.load(filepath, sr=None, mono=True) #spec_mag = np.abs(librosa.stft(y))# STFTスペクトログラム spec_mag = np.abs(librosa.cqt(y))# CQTスペクトログラム n_freqs, n_tf = spec_mag.shape # 周波数軸を反転 # 画像ファイルとして見た時に、下の方が周波数が低くなるようにするため spec_mag = spec_mag[::-1] # [0.0, 1.0]に正規化 spec_mag /= np.max(spec_mag) # bitdepthに基づいて整数に変換 spec_mag = spec_mag * (2**bitdepth) if bitdepth == 8: # 8-bit spec_mag = spec_mag.astype(np.uint8) elif bitdepth == 16: # 16-bit spec_mag = spec_mag.astype(np.uint16) # pngファイルとして書き出し cv2.imwrite("result.png", spec_mag) cv2.imwrite("result.jpeg", spec_mag, [cv2.IMWRITE_JPEG_QUALITY, quality])
結果 (jpeg 8-bit)
Perfume の無限未来のサビ頭10秒程度を切り出して使用しました。
STFT振幅スペクトログラム
一部拡大+着色
CQT(定Q変換)振幅スペクトログラム