cmagui's picture
Initial commit: full repository with code, configs and weights
613ce86
Raw
History Blame Contribute Delete
3.78 kB
import argparse
import os
from unittest import result
import librosa
from pyparsing import results
from speechmos import dnsmos
def main(audio_files, output_file):
# Configuración de sample rate original, ajústalo si es necesario
config = {'sample_rate': 24000} # Cambia 24000 por el sample rate real de tus audios si es distinto
results_txt = []
results = []
file_names = []
ovrl_cmos, sig_cmos, bak_mos, p808_mos = None, None, None, None
for audio_path in audio_files:
head, tail = os.path.split(audio_path)
file_names.append(tail)
if not os.path.isfile(audio_path):
print(f"Archivo no encontrado: {audio_path}")
results.append({'ovrl_mos': None, 'sig_mos': None, 'bak_mos': None, 'p808_mos': None})
continue
try:
wav, sr = librosa.load(audio_path, sr=None)
wav_resampled = librosa.resample(wav, orig_sr=sr,
target_sr=16000, res_type='kaiser_best', fix=True)
mos_dict = dnsmos.run(wav_resampled, sr=16000)
results.append(mos_dict)
except Exception as e:
print(f"{tail}: ERROR - {str(e)}")
results.append({'ovrl_mos': None, 'sig_mos': None, 'bak_mos': None, 'p808_mos': None})
# Imprimir tabla de resultados
header = f"{'Audio':<40} {'OVRL':>8} {'SIG':>8} {'BAK':>8} {'P808':>8}"
print(header)
print('-' * len(header))
for i, res in enumerate(results):
if res['ovrl_mos'] is not None:
print(f"{file_names[i]:<40} {res['ovrl_mos']:8.3f} {res['sig_mos']:8.3f} {res['bak_mos']:8.3f} {res['p808_mos']:8.3f}")
else:
print(f"{file_names[i]:<40} {'ERROR':>8} {'ERROR':>8} {'ERROR':>8} {'ERROR':>8}")
# Calcular CMOS si hay dos audios válidos
if len(results) == 2 and all(r['ovrl_mos'] is not None for r in results):
ovrl_cmos = results[0]['ovrl_mos'] - results[1]['ovrl_mos']
sig_cmos = results[0]['sig_mos'] - results[1]['sig_mos']
bak_mos = results[0]['bak_mos'] - results[1]['bak_mos']
p808_mos = results[0]['p808_mos'] - results[1]['p808_mos']
print("\nCMOS (Audio1 - Audio2):")
print(f"{'CMOS OVRL':<12}: {ovrl_cmos:.3f}")
print(f"{'CMOS SIG':<12}: {sig_cmos:.3f}")
print(f"{'CMOS BAK':<12}: {bak_mos:.3f}")
print(f"{'CMOS P808':<12}: {p808_mos:.3f}")
else:
print("\nNo es posible calcular CMOS")
# Guardar tabla en archivo
with open(output_file, "w") as f:
f.write(header + "\n")
f.write('-' * len(header) + "\n")
for i, res in enumerate(results):
if res['ovrl_mos'] is not None:
f.write(f"{file_names[i]:<40} {res['ovrl_mos']:8.3f} {res['sig_mos']:8.3f} {res['bak_mos']:8.3f} {res['p808_mos']:8.3f}\n")
else:
f.write(f"{file_names[i]:<40} {'ERROR':>8} {'ERROR':>8} {'ERROR':>8} {'ERROR':>8}\n")
if len(results) == 2 and all(r['ovrl_mos'] is not None for r in results):
f.write("\nCMOS (Audio1 - Audio2):\n")
f.write(f"{'CMOS OVRL':<12}: {ovrl_cmos:.3f}\n")
f.write(f"{'CMOS SIG':<12}: {sig_cmos:.3f}\n")
f.write(f"{'CMOS BAK':<12}: {bak_mos:.3f}\n")
f.write(f"{'CMOS P808':<12}: {p808_mos:.3f}\n")
else:
f.write("\nNo es posible calcular CMOS\n")
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Evalúa audios con DNSMOS")
parser.add_argument("--audios", nargs="+", help="Lista de archivos de audio a evaluar")
parser.add_argument("--output", default="dnsmos_results.txt", help="Archivo de salida para los resultados")
args = parser.parse_args()
main(args.audios, args.output)