$ pip3 install librosa
import librosa import numpy as np def calculate_mcd(ref_wav_path, syn_wav_path, sr=16000, n_mfcc=25): """ Mel Cepstral Distortion (MCD) を計算する修正版関数 正規化+フレームごとの距離平均を行います """ # 音声読み込み ref, _ = librosa.load(ref_wav_path, sr=sr) syn, _ = librosa.load(syn_wav_path, sr=sr) # 正規化 (-1〜1 の範囲) ref = ref / np.max(np.abs(ref)) syn = syn / np.max(np.abs(syn)) # MFCC 抽出(c0 は除外) ref_mfcc = librosa.feature.mfcc(y=ref, sr=sr, n_mfcc=n_mfcc)[1:] syn_mfcc = librosa.feature.mfcc(y=syn, sr=sr, n_mfcc=n_mfcc)[1:] # フレーム数を揃える(短い方に合わせる) min_len = min(ref_mfcc.shape[1], syn_mfcc.shape[1]) ref_mfcc = ref_mfcc[:, :min_len] syn_mfcc = syn_mfcc[:, :min_len] # フレームごとのユークリッド距離 distances = np.sqrt(np.sum((ref_mfcc - syn_mfcc)**2, axis=0)) # MCD 計算式(フレームごとの平均) mcd = (10.0 / np.log(10)) * np.sqrt(2.0) * np.mean(distances) return mcd # 使用例 if __name__ == "__main__": ref_file = "original.wav" # 参照音声 syn_file = "tts.wav" # 合成音声 mcd_value = calculate_mcd(ref_file, syn_file) print(f"MCD: {mcd_value:.2f} dB")
$ python3 app.py
MCD: 568.47 dB
明らかに大きい