Pythonで音声に画像を埋め込む
はじめに
Togetterを見ていたら,「とあるアイドルの楽曲に画像が仕込まれていた話」というまとめ記事が目に留まった.少し旬を過ぎてしまっている感はあるが,せっかくの機会なので,楽曲に画像を仕込む方法をメモしておく.
スペクトログラムとはなにか
本題へと入る前に,スペクトログラムとはなにか大まかに説明しておく.音声を解析するときは,しばしば「だいたい何Hzくらいの高さか」だとか「どんな高さの音が混ざっているか」だとかが重要になる.スペクトログラムは,これらを解析するのに便利なツールの1つである.
数学的なことは参考文献[2]と[3]にあるが,さしあたり,以下のことが重要である.
- 有限長の離散信号から計算される複素スペクトログラム
は,X 複素行列になるm\times n - 振幅スペクトログラム
は,A 成分が(i,j) のA_{i\,j}=\lvert X_{i\,j}\rvert 実行列であるm\times n -
は,時刻A_{i\,j} の十分近くにおける,iN 番目の周波数成分の強さを表している.ただし,j はフレームシフトというパラメータであり,通常は正の整数であるN
たとえば,信号
画像をスペクトログラムに埋め込む
本題に入る.引用したツイートの画像は,振幅スペクトログラムを図示したものであった.振幅スペクトログラムは複素スペクトログラムの位相
しかし,スペクトログラムの性質をうまく使って,(少なくとも
ここでは理論へと立ち入る代わりに,Griffin-Limアルゴリズムでスペクトログラムへと画像を埋め込めることをPythonで確かめる.Griffin-Limアルゴリズムにはlibrosa,スペクトログラムの表示はMatplotlibというライブラリを使い,以下のプログラムを作成した.
import numpy as np
from PIL import Image
import soundfile as sf
import librosa
import librosa.display
import matplotlib.pyplot as plt
from matplotlib import cm
def getGrayscaleMatrix(filename: str) -> np.ndarray:
with Image.open(filename) as img:
mat = np.array(img.convert(mode="L"))
return np.flipud(mat) / 255
mag = getGrayscaleMatrix("wathematica.bmp")
wave = librosa.griffinlim(mag)
sf.write(file="embedded.wav", data=wave, samplerate=44100)
fig, ax = plt.subplots()
ax.specgram(wave, Fs=44100, NFFT=2048, noverlap=1024, cmap=cm.Greys)
ax.set(xlabel="Time [s]", ylabel="Frequency [Hz]")
plt.tight_layout()
plt.savefig("specgram.png", dpi=200)
このプログラムによって,次の画像wathematica.bmp
を,音声embedded.wav
へと変換した.その結果がリンク先の音声ファイルである.
この音声は雑音のようにしか聞こえないが,スペクトログラムを表示すると,次のように変換前の画像が現れてくる.
おわりに
実はこの記事,Wathematicaというサークルの企画で書いたものである.〆切前日に書き始めるとマジで地獄を見るので,こういうのは早めに着手すべきだと学んだ[2].
参考文献
- 諦メロン. “14平米にスーベニア 広川恵一Remixで一番ヤバいのは、スペクトログラムを表示すると凪の絵が出現すること”. Twitter. 2022-06-18. https://twitter.com/_Akira_Melon_/status/1538172760622776321, (参照 2022-07-03).
- 矢田部浩平, 升山義紀, 草野翼, 及川靖広. 特集, 位相情報を考慮した音声音響信号処理: 位相変換による複素スペクトログラムの表現. 日本音響学会誌. 2019, 75(3), p.147-155. https://www.jstage.jst.go.jp/article/jasj/75/3/75_147/_article/-char/ja, (参照 2022-07-03).
- 矢田部浩平. 特集, 短時間フーリエ変換入門~離散信号の時間周波数解析の理論と実装~: 第三回:短時間フーリエ変換. 日本音響学会誌. 2021, 77(6), p.396-403. https://www.jstage.jst.go.jp/article/jasj/77/6/77_396/_article/-char/ja/, (参照 2022-07-03).
Discussion