File size: 3,779 Bytes
613ce86 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | 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) |