| import argparse |
| import os |
| from unittest import result |
| import librosa |
| from pyparsing import results |
| from speechmos import dnsmos |
|
|
| def main(audio_files, output_file): |
| |
| config = {'sample_rate': 24000} |
| 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}) |
|
|
| |
| 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}") |
|
|
| |
| 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") |
|
|
| |
| 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) |