$ 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 を作るか」にかかっています。