[TTS] Mel-Spectrogram

🎧 Mel-Spectrogram(メル・スペクトログラム)とは?
音声を 時間 × 周波数 の画像のようにしたものが スペクトログラムです。
その中でも 人間の聴覚に近い周波数感度で変換したものが
Mel-Spectrogram(メルスペクトログラム) です。

🧠 ポイント(簡単)
1. STFT(短時間フーリエ変換)で時間を細かく分ける
音声を短い区間に分けて FFT → 周波数別のエネルギーを得る。

2. 周波数軸を Mel scale(メル尺度)に変換
人間の聴感に近い形(低音域は細かく、高音域は粗く)。

3. 結果は 2D の行列 → 画像のように扱える
音声AI(TTS、音声認識、歌声合成)では
メルスペクトログラムを中間表現として使うのが主流。

📊 Melスペクトログラムのイメージ(構成)
← 時間軸 →
│□□□□□□□□□□□□□□
│■■□□□□□□■■■■□□
│■■■□□□□■■■■■□
│■■■■□□■■■■■■■

Mel周波数

🧪 Pythonで Mel-Spectrogram を生成するサンプル
以下は librosa を使った最小サンプルです。

import librosa
import librosa.display
import matplotlib.pyplot as plt

# 音声ファイル読み込み(例:sample.wav)
audio_path = "sample.wav"
y, sr = librosa.load(audio_path, sr=22050)

# Melスペクトログラム計算
mel_spec = librosa.feature.melspectrogram(
    y=y,
    sr=sr,
    n_fft=1024,
    hop_length=256,
    n_mels=80
)

# 対数Melスペクトログラム(TTSでよく使う)
mel_db = librosa.power_to_db(mel_spec, ref=np.max)

# 表示
plt.figure(figsize=(10, 4))
librosa.display.specshow(mel_db, sr=sr, hop_length=256, x_axis='time', y_axis='mel')
plt.colorbar(format='%+2.0f dB')
plt.title('Mel-Spectrogram')
plt.tight_layout()
plt.show()

✔️ コード解説(最重要点)
n_fft=1024
FFTの窓長
→ 高周波の精度が上がるが時間精度は悪くなる

hop_length=256

時間方向のステップ
→ 小さいほど細かい

n_mels=80

TTSでは 80次元 Mel が最も一般的
(Tacotron2, FastSpeech2, VITS 全て同じ)
power_to_db

TTS モデルに入れるときは 対数(dB) が使われることが多い。
🔊 TTS と Melスペクトログラムの関係
ほぼ全ての Neural TTS の特徴:
1. テキスト → Melスペクトログラム(Acoustic Model)
例:Tacotron2, FastSpeech2, VITS

2. Melスペクトログラム → 波形(Vocoder)
例:HiFi-GAN, WaveGlow, WaveRNN

つまり Melスペクトログラムは「TTSの心臓部」