「波形への復元」には、数学的な近似アルゴリズムである Griffin-Lim法 を使う
import librosa
import numpy as np
import soundfile as sf
# 1. アップロードされたファイルの読み込み
# path は実行環境に合わせて調整してください(通常はカレントディレクトリ)
file_path = 'speech.mp3'
y, sr = librosa.load(file_path, sr=None) # sr=None で元のサンプリングレートを維持
# 2. Mel-spectrogram への変換
S = librosa.feature.melspectrogram(y=y, sr=sr, n_mels=128)
S_dB = librosa.power_to_db(S, ref=np.max)
# 3. 復元 (Griffin-Lim)
S_inv = librosa.db_to_power(S_dB)
y_inv = librosa.feature.inverse.mel_to_audio(S_inv, sr=sr)
# 4. 保存
sf.write('output_speech.wav', y_inv, sr)
print(f"'{file_path}' の処理が完了し、'output_speech.wav' として保存しました。")
元
output
Mel-spectrogramとは?: 音の強さを「時間」と「周波数」の2軸で表したものですが、周波数軸を人間の耳の特性に近いメル尺度に変換したものです。
Vocoder(ボコーダー)の役割: スペクトログラムから音声を復元する際、元の波形が持っていた「位相(Phase)」の情報が失われています。このサンプルで使った mel_to_audio(Griffin-Lim)は、その位相を推測して補完する簡易的なボコーダーの役割を果たしています。
より高品質にするには: 実用的なAI(TTSや声質変換)では、Griffin-Limの代わりに HiFi-GAN や BigVGAN といったディープラーニングベースのボコーダーを使って、より肉声に近い高品質な復元を行います。
位相推論に限界があるということですね。