qari / tests /test_engine.py
Alayoob's picture
Upload 33 files
f640ed4 verified
Raw History Blame Contribute Delete
3.09 kB
"""اختبارات المحرك بسيناريوهات نطق محاكاة."""
import json, sys, os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))
from qari.g2p import words_from_text
from qari.mock import synth
from qari.analyze import analyze
TEXT = "عِنْدَ جَدَّتِي قِطَّةٌ بَيْضَاءُ. تَشْرَبُ القِطَّةُ الحَلِيبَ."
def run(script, text=TEXT):
W = words_from_text(text)
probs, V, blank, fs, wav = synth(script)
return W, analyze(W, probs, V, blank, fs, wav)
def phones(text):
return [w.phones for w in words_from_text(text)]
def show(r):
m = r["metrics"]
print(f" دقة الكلمات {m['word_accuracy']}% | الحركات {m['haraka_accuracy']}% | الأصوات {m['phoneme_accuracy']}% | تأتأة/100 مقطع {m['sld_per_100']} | ك/د {m['wcpm']}")
for w in r["words"]:
errs = "; ".join(f"{e['label']}[{e['status']}] {e['detail']}" for e in w["errors"])
dis = "; ".join(f"{d['label']}: {d['detail']}" for d in w["disfluencies"])
print(f" {w['text']:<12} {w['status']:<9} سُمع: {w['heard']:<14} {errs} {('| ' + dis) if dis else ''}")
for x in r["extras"]:
print(" + إضافة:", x["heard"])
P = phones(TEXT)
flat = lambda ws: [p for w in ws for p in w + ["|"]]
cases = {}
# 1) قراءة سليمة مع الوقف على أواخر الكلمات
cases["سليمة (وقف)"] = ["_"] + flat([P[0], P[1], ["q","I","TT","A","h"], ["b","a","y","D","AA","<"], ["t","a","$","r","a","b"], ["<","a","l","q","I","TT","A","h"], ["<","a","l","H","a","l","ii","b"]])
# 2) أخطاء: ج←ح بثقة، حذف الشدة، ضمة بدل فتحة، ب←ت
cases["أخطاء حروف وتشكيل"] = ["_"] + flat([P[0], ["H","a","d","a","t","ii"], P[2], ["b","u","y","D","AA","<","u"], ["t","a","$","r","a","t","u"], P[5], P[6]])
# 3) حالة مشكوك فيها: سمع ح بثقة ضعيفة و ج محتملة
cases["حالة تحتاج تأكيد"] = ["_"] + flat([P[0], [("H",0.08,0.55,"j",0.35),"a","dd","a","t","ii"], P[2], P[3], P[4], P[5], P[6]])
# 4) تأتأة: ب-ب-ب بيضاء، مط السين، تكرار كلمة، انحباس، حشو، وقفة
st = ["_"] + flat([P[0], P[1], P[2]])
st += ["b","a","|","b","a","|","b","a"] + P[3][2:] + ["|"] # بَ-بَ-بَيضاء
st += ["t","a",("~$",0.8),"r",("_",0.45),"a","b","u","|"] # مط الشين + انحباس داخل تشرب
st += [("a",0.1),("_",0.1),("m",0.3),("_",1.4)] # امم + وقفة
st += P[5] + ["|"] + P[5] + ["|"] # تكرار كلمة القطة
st += ["l","H","a","l","ii","b","a"]
cases["تأتأة"] = st
# 5) كلمة محذوفة
cases["حذف كلمة"] = ["_"] + flat([P[0], P[1], P[3], P[4], P[5], P[6]])
if __name__ == "__main__":
for name, sc in cases.items():
print("=" * 10, name)
W, r = run(sc)
show(r)
for d in r["disfluencies"]:
print(" ~", d["label"], "|", d["detail"], "|", d["start"], "-", d["end"])