$ 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
明らかに大きい