【信号処理】Melspectrogramがぼやけるとどうなる???【機械学習】
この記事の経緯
とある実験でVAEに音声信号を学習させてました.音質をあげたり高度なSTOAレベルの信号生成が目的ではないので
「とりまシンプルなVAE + MelSpectrogram + Griffin-limでいいしょっ!」
て感じで実装しました.
(VAE, MelSpectrogram, Griffin-limそれぞれについての説明はしませんが検索やGPTに聞けばいろいろな情報があると思います. )
学習が終わって生成してみると,とにかく音質がわるい…
オリジナルと生成結果のMelspctrogram
上が生成結果,下がオリジナルのデータです.
VAE特有のぼやけはありますが,それなりに再現入力の再現ができているように見えます.
気づき
今回利用したMelspectrogramから波形の合成には,
Mel ⇒ STFT変換が含まれています.
ということで変換したSTFTを表示すると…
なんだこれ???
生成物の方は,本来-60dbの部分が,-20db程度となっていてS/Nが悪くなっています.
というわけでMel ⇒ STFT変換に原因がありそうということが分かりました.
(恥を忍んで白状するとSTFTを見るという発想に至るまでにかなり時間がかかりいろいろな無駄な努力をしてます...)
実験
Melspectrogram ⇒ STFT変換がどのような性質なのか調べる実験をします.
仮説 : Melspectrogram ⇒ STFT変換はMelspectrogramの変化に敏感である.
今回はVAEによる変化を再現するためにガウシアンブラーを使ってMelspectrogramを変化させてみます.
実験用のソースコードは以下から利用できます!!!
実験方法 :
波形を用意する.今回は1kHzと2kHzの正弦波の合成波
波形をMelspctrogramにする
Melspectrogramにガウシアンブラーをかける
波形 ⇒ STFT , Mel ⇒ STFT , ブラーをかけたMel ⇒ STFT を可視化し検証
1.波形
a=0.5,f=1000hzのsin波 + a=0.3, f=2000hzのsin波の合成
2.Melspectrogram変換
3.ガウシアンブラーをかける
sigma = 2のガウシアンブラーをmelにかける.
ガウシアンブラーについては以下などを参照
https://ja.wikipedia.org/wiki/%E3%82%AC%E3%82%A6%E3%82%B7%E3%82%A2%E3%83%B3%E3%81%BC%E3%81%8B%E3%81%97
4. 波形 ⇒ STFT , Mel ⇒ STFT , ブラーをかけたMel ⇒ STFT を可視化
それぞれを可視化して各変換でどのような変化があるか調べます.
波形 ⇒ STFT :
きれいに1000Hz,2000Hzにパワーがあることが分かります.
ほかの帯域は-80dB付近です.
Mel ⇒ STFT :
ブラーをかける前のMelをSTFTに変換したものです.
この時点で1000Hz,2000Hzの周りに余計な成分が生まれているのが分かります.
この時点で機械学習等を用いずにMel ⇒ 波形にする場合その質には限界があるといえそうです.
ブラーをかけたMel ⇒ STFT :
予想通りS/Nが非常悪くなりました.
先ほども見られた余計な成分に加えて全体に成分が発生しています.
結果
仮説通りMelspectrogramの変化に敏感でブラーをかけると大きくS/Nが悪化することが分かりました.
結論
VAE + Melspectrogramを使った音声生成の質が悪いということを発端にMelspectrogramの性質を調べる実験を行いました.
VAEの出力はぼやけやすいという性質を考えると
単純なVAE+Melspectrogram+ Griffin-limの組み合わせは厳しいものがありそうです.
今回調べたMelspectrogramの性質などは,信号処理等をちゃんと理解している人にとっては当たりまえのことかもしれません…
でもまあこういう実学的な検証って意外とちゃんと教わったりしないと思うので,この記事が同じような苦戦をしているだれかの参考になることを祈って締めたいと思います.