[TTS] Mel-spectrogram出力 → vocoder変換

$ pip3 install librosa soundfile numpy

import numpy as np
import librosa
import soundfile as sf

# ---- 1. ダミーのMelスペクトログラムを作る ----
mel = np.random.rand(80, 100).astype(np.float32)

# ---- 2. Mel → 線形スペクトログラムに逆変換 ----
sr = 22050
n_fft = 1024
hop_length = 256
win_length = 1024

mel_basis = librosa.filters.mel(
    sr=sr,
    n_fft=n_fft,
    n_mels=80
)

inv_mel_basis = np.linalg.pinv(mel_basis)
S = np.dot(inv_mel_basis, mel)

# ---- 3. Griffin-Limで波形へ ----
audio = librosa.griffinlim(
    S,
    n_iter=60,
    hop_length=hop_length,
    win_length=win_length
)

# ---- 4. WAVとして保存 ----
sf.write("output.wav", audio, sr)

print("output.wav を生成しました!")

Melスペクトログラムこそが、TTS(Text-to-Speech)の “声の元” です。

以下で「なぜ Mel が TTS の中心なのか」をわかりやすく説明します。

🔊 結論:TTS の音声生成は『Melスペクトログラム → Vocoder → 音声』です

TTS(特に Tacotron2 / FastSpeech2 / VITS などの Neural TTS)は、
次の2段階で音声を作っています:

① Acoustic Model(Tacotron2 / FastSpeech)
→ メルスペクトログラムを生成

② Vocoder(WaveGlow / HiFi-GAN / WaveRNN)
→ メルスペクトログラムを音声波形に変換

つまり…

🎤 TTS が作るのは “直接の音声” ではなく Melスペクトログラム
✔️ TTS の本体(Acoustic Model)が出力するもの

“音声波形(wav)” ではない

Melスペクトログラム(80次元 × フレーム数)

理由:

人間の声の特徴をコンパクトに持てる

音声波形に比べて扱いやすい(次元が小さく学習が安定)

周波数分解能が人間の聴覚特性に近い

👂 Melスペクトログラムは “声の写真”

イメージとしては:

横:時間

縦:周波数(低音 → 高音)

色:音の強さ

写真のように「音の特徴が平面にまとまっている」。

だから AI が学習しやすい。

📘 なぜ Mel を使うのか?(技術理由)
① 音声波形(時系列)は扱いにくい

1秒で 22,050 サンプル → 学習には巨大すぎる
⇒ 変動が激しく、局所性が弱い

② Melスペクトログラムは圧縮され学習しやすい

22,050サンプル → 約80次元に圧縮
しかも

音の高さ(フォルマント)

強さ

リズム

声質の特徴
が明瞭になるため 学習のターゲットとして最高。

③ 聴覚特性に合う(メルスケール)

人間の耳は

低音に敏感

高音に鈍い
→ Mel スケールはこの特性に合わせている
→ 音質向上につながる

🎛 Vocoder が Melスペクトログラムを“音声”に変換する

代表的なvocoder:

Vocoder 特徴
WaveGlow 高音質、高速
HiFi-GAN いま最も使われる、軽量&高品質
WaveRNN 高品質、軽量だがやや遅い
DiffWave 拡散モデルで高品質

Vocoder があるからこそ、
「絵(mel)」→「声(wav)」が成立する。

TTS の7〜8割は「いかに自然な Mel を作るか」にかかっています。