Wizard Notes

音楽信号解析の技術録、作曲活動に関する雑記

PythonとOpenCVでスペクトログラムを画像データ(jpeg, png)として保存

オーディオ信号のスペクトログラムをプロット/保存する方法としては、matplotlibimshow()を使う方法がありますが、今回はスペクトログラムを純粋な画像データとして保存する方法を試してみました。

実装

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秒程度を切り出して使用しました。

無限未来

無限未来

  • Perfume
  • エレクトロニック
  • ¥255

STFT振幅スペクトログラム

f:id:Kurene:20210212083357j:plain

一部拡大+着色

f:id:Kurene:20210212083757p:plain

CQT(定Q変換)振幅スペクトログラム

f:id:Kurene:20210212083359j:plain