"""اختبارات المحرك بسيناريوهات نطق محاكاة.""" 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"])