Some checks failed
Linux Build / Linux cpu (push) Has been cancelled
Linux Build / Linux cpu-clang (push) Has been cancelled
Linux Build / Linux vulkan (push) Has been cancelled
mac-build / macOS CPU (push) Has been cancelled
Nix Build / Nix (cpu) (push) Has been cancelled
Nix Build / Nix (vulkan) (push) Has been cancelled
windows-build / Windows CPU (push) Has been cancelled
34 lines
1.6 KiB
Python
34 lines
1.6 KiB
Python
"""Compare native pronunciation with upstream eSpeak and Misaki frontends."""
|
|
import argparse
|
|
import json
|
|
import os
|
|
from pathlib import Path
|
|
import subprocess
|
|
import espeakng_loader
|
|
from phonemizer.backend.espeak.wrapper import EspeakWrapper
|
|
EspeakWrapper.set_library(espeakng_loader.get_library_path())
|
|
EspeakWrapper.set_data_path(espeakng_loader.get_data_path())
|
|
from misaki import espeak, ja, zh
|
|
|
|
p = argparse.ArgumentParser()
|
|
p.add_argument('--probe', type=Path, required=True)
|
|
p.add_argument('--resources', type=Path, required=True)
|
|
p.add_argument('--output', type=Path, required=True)
|
|
a = p.parse_args()
|
|
cases_path = Path(__file__).with_name('multilingual_cases.json')
|
|
cases = json.loads(cases_path.read_text(encoding='utf-8'))
|
|
frontends = {k: espeak.EspeakG2P(language=v) for k,v in
|
|
{'e':'es', 'f':'fr-fr', 'h':'hi', 'i':'it', 'p':'pt-br'}.items()}
|
|
frontends['j'], frontends['z'] = ja.JAG2P(), zh.ZHG2P()
|
|
native = subprocess.run([str(a.probe.resolve()), str(a.resources.resolve()), str(cases_path.resolve())],
|
|
capture_output=True, encoding='utf-8', check=True)
|
|
lines = native.stdout.splitlines()
|
|
if len(lines) != len(cases): raise RuntimeError(native.stdout + native.stderr)
|
|
results = []
|
|
for case, actual in zip(cases, lines):
|
|
expected = frontends[case['language']](case['text'])[0]
|
|
results.append({**case, 'reference':expected, 'native':actual, 'match':expected == actual})
|
|
a.output.parent.mkdir(parents=True, exist_ok=True)
|
|
a.output.write_text(json.dumps(results, ensure_ascii=False, indent=2), encoding='utf-8')
|
|
for i, r in enumerate(results): print(i, r['language'], r['match'], flush=True)
|
|
print('Report:', a.output)
|