הפתרון שעבר אצלי
"שגיאה בהקראה" ב-TTS - הסיבה והפתרון
התסמין: טקסט שעבד עד עכשיו מושמע פתאום כ"שגיאה בהקראה". התשובה מהשרת תקינה, והחלפת קול לא עוזרת.
הסיבה: ספרות בתוך הטקסט, בעיקר ספרה שבאה לפני שם עצם. בבדיקה שעשיתי "יש 3" נכשל ו"יש שלוש" עבר.
הפתרון: לכתוב את המספרים במילים ("יש שלוש", "הקישו אחת"). מי שמחזיר טקסט מהשרת יכול להמיר אוטומטית לפני השליחה (JavaScript, צורת נקבה, עד 9999; טלפונים, שעות ומספרים שמתחילים ב-0 נשארים בספרות):
const ONES=['אפס','אחת','שתיים','שלוש','ארבע','חמש','שש','שבע','שמונה','תשע'];
const TEENS=['עשר','אחת עשרה','שתים עשרה','שלוש עשרה','ארבע עשרה','חמש עשרה','שש עשרה','שבע עשרה','שמונה עשרה','תשע עשרה'];
const TENS=['','','עשרים','שלושים','ארבעים','חמישים','שישים','שבעים','שמונים','תשעים'];
const HUND=['','מאה','מאתיים','שלוש מאות','ארבע מאות','חמש מאות','שש מאות','שבע מאות','שמונה מאות','תשע מאות'];
const THOU=['','אלף','אלפיים','שלושת אלפים','ארבעת אלפים','חמשת אלפים','ששת אלפים','שבעת אלפים','שמונת אלפים','תשעת אלפים'];
function words(n){if(!n)return ONES[0];const p=[];if(n>=1000)p.push(THOU[Math.floor(n/1000)]);if(n%1000>=100)p.push(HUND[Math.floor(n%1000/100)]);const r=n%100;if(r>=20){p.push(TENS[Math.floor(r/10)]);if(r%10)p.push(ONES[r%10]);}else if(r>=10)p.push(TEENS[r-10]);else if(r)p.push(ONES[r]);if(p.length>1)p[p.length-1]='ו'+p[p.length-1];return p.join(' ');}
const spell=s=>s.replace(/(?<![\d:])\d{1,4}(?![\d:])/g,m=>m.length>1&&m[0]==='0'?m:words(+m));
טיפ לאבחון: מחלקים את הטקסט לכמה קטעים (t-קטע א.t-קטע ב). קטע שנכשל מושמע כ"שגיאה בהקראה" והשאר ממשיכים, וכך רואים בדיוק מה שובר.