רוב העיכוב בתרגום בשידור חי הוא המתנה: לזרם, למילה הבאה, למשפט. החלק היחיד שאתם שולטים בו הוא מצב ההשהיה: פחות עיכוב, או פחות תיקונים.
מאזין שקורא תרגום בשידור חי רואה כל שורה כמה שניות אחרי שהדובר אמר אותה. הפער הזה אינו עיכוב אחד אלא כמה, שמצטברים לאורך שרשרת, ורובם הם צורה של המתנה. הבנה של איזו המתנה היא איזו הופכת את בחירת מצב ההשהיה לפשוטה, ומראה למפתח שבונה קורא מה להציג, ומתי.
נקודת השוואה שימושית לפני המספרים: מתורגמן סימולטני אנושי מדבר בדרך כלל שתיים עד ארבע שניות אחרי הדובר. מתורגמנים קוראים לפער הזה ear-voice span (פער אוזן–קול), ומתמודדים עם שפות שבהן הפועל מופיע בסוף לא בכך שהם מחכים לפועל, אלא בכך שהם צופים אותו מראש, או מחלקים את המשפט לחלקים שיכולים לעמוד בפני עצמם. שנייה או שתיים של עיכוב אינן פגם של התוכנה; זה בערך מה שעושה מתרגם אנושי טוב מאוד.
כל תמלול בשידור חי ב-VocalStack עובר באותם שלבים, באותו סדר, וכל שלב מחכה לקודמו.
הטקסט המקורי מגיע לקורא כמעט כפי שנאמר. התרגום בא שנייה או שתיים אחריו, והמשפט המדובר מגיע אחרי התרגום שלו, ולכן קטע קול מגיע תמיד אחרון. התוצאה הראשונה הנראית לעין של השרשרת, אבל, מגיעה הרבה לפני כל קול: הטקסט עצמו זז.
הדבר הראשון שאנשים שמים לב אליו בתמליל חי הוא שהמילים החדשות ביותר זזות. ביטוי מופיע, משתנה, ומתייצב. זה שלב הטיוטה בפעולה, והוא קיים מסיבה שחלה על כל מזהה דיבור.
מזהה דיבור מכריע מילה לפי מה שבא אחריה. "I scream" ו-"ice cream" נשמעים אותו דבר עד שמגיעה המילה הבאה; סיומת "s" בסוף יכולה לשייך למילה הזו או לבאה. עד שיש שמע מימין למילה, האיות שלה הוא ניחוש, ולכן המילים החדשות ביותר בכל תמלול חי הן תמיד הפחות ודאיות. טיוטה היא פשוט הניחוש הזה, מוצג מוקדם במקום להיסתר.
כל טיוטה מחליפה לחלוטין את הזנב החי: המילים ששמעו מאז האישור האחרון, והן עדיין משתנות. אישור סופי הוא סופי. הוא לעולם לא משתנה, הוא נושא תזמוני מילים ברמת המילה, והאישורים ממוספרים ללא פערים, כך שקורא יכול לדעת אם החמיץ אחד.
למפתח זהו הכלל היחיד ש-API בזמן אמת דורש: להציג כל קטע מאושר, ואחריו את הטיוטה האחרונה, ולנקות את הטיוטה כשמגיע אישור. הוספת טיוטות במקום להחליף אותן מייצרת טקסט כפול ומהבהב; האישור פשוט צורך את הזנב. ה-מדריך WebSocket בונה קורא בדיוק סביב העיקרון הזה.
עבור מארח, טקסט שזז הוא המחיר של השהיה נמוכה. הצגת מילים לפני שהביטוי נגמר היא מה שגורם לתמליל להרגיש חי. התרגום, לעומת זאת, לא יכול להרשות לעצמו את הטריק הזה, כי אפשר לנחש מילה מתוך חצי ביטוי, אבל לא תרגום.
סדר המילים הוא הסיבה לכך שהתרגום לא יכול לעמוד בקצב של הטיוטה. פועל בגרמנית עשוי לעמוד בסוף הפסוקית, וביפנית הפועל תמיד מופיע אחרון. כל מתרגם צריך את המשפט כולו לפני שהוא מעביר אותו נאמנה. תרגום מילה-מילה מעניק למאזין שברים שצריכים להיקרא בלי שהמשפט נסגר. מתורגמנים מחכים לפועל בגרמנית כבר הרבה לפני שתוכנה ניסתה לעשות זאת.
לכן VocalStack מתרגם משפטים, לא קטעים. משפטים מופעלים כברירת מחדל, וכשהם פעילים השרת מרכיב את האישורים למשפט אחד ומתרגם אותו כולו. כל עוד המשפט פתוח, התרגום שלו זמני; כשהוא נסגר, התרגום סופי. הקורא מחזיק ערך אחד לכל משפט, ומחליף אותו ככל שמגיעים עדכונים.
הדיבור ממתין עוד יותר. רק משפט סגור מושמע, כי משפט שעדיין משתנה יסונתז מחדש בכל תיקון. משפט ארוך מושמע בחלקים, כך שהחלק הראשון יכול להתנגן בזמן שהשאר נוצר.
כשהמשפטים כבויים, כל אישור מקבל במקום זאת מסגרת תרגום משלו. המסלול הזה אינו מחכה לשום דבר, אבל משפטים שלמים קוראים הרבה יותר טוב.
כל ההמתנות האלה נמדדות מהרגע שבו השמע מגיע ל-VocalStack. בשידורים רבים, השמע כבר היה מאוחר כשהגיע.
כשהמקור הוא זרם ולא מיקרופון, השמע כבר מאחר לפני שמתמללים אותו. הוא נשאר מאחורי הקצה החי, הרגע החדש ביותר שהזרם פרסם.
זרם שמע HTTP רגיל, מסוג שרוב תחנות הרדיו באינטרנט מפרסמות, נמצא בדרך כלל שנייה עד שלוש מאחור. השרת שומר באפר פרץ: כמה שניות של שמע אחרון, שנשלחות בבת אחת כדי שנגן של מאזין חדש יוכל להתחיל בלי להיתקע. כל מאזין, כולל VocalStack, מצטרף לנקודה הזו מאחור. HLS גרוע יותר: רשימות ההשמעה שלו מתחילות לקוח שלושה מקטעים מאחורי הקצה החי, ובפועל זה אומר כמה שניות עד חצי דקה, לפי אורך הקטע. DASH רגיל נופל בדרך כלל באותו טווח כמו HLS; רק הגרסה שלו עם השהיה נמוכה יורדת משמעותית מתחתיו. זרם ה"חי" של תחנה יכול להיות חי באותו אופן שבו מכתב הוא עדכני.
הנתונים האלה משוערים, והם שייכים לזרם, לא לתמלול: שום הגדרה בצד של VocalStack לא יכולה להשיב אותם. אם השניות האלה חשובות לאירוע, הזינו את השמע לשלב ממיקרופון או ממקודד, ולא מזרם ציבורי. העיכוב של הזרם נקבע לפני ש-VocalStack שומע מילה; מצב ההשהיה הוא מה שאתם באמת יכולים להזיז.
מצב ההשהיה עושה דבר אחד: הוא קובע את האיזון בין עיכוב לדיוק. ההגדרה נמצאת תחת Advanced כשנוצר תמלול בשידור חי, ובלשונית Speed בזמן ההרצה. שם השבב מציג AUTO, SPEED או ACCURACY (Fast מופיע כ-SPEED). דרך ה-API, session.update משנה אותו באמצע הזרם.
הפשרה היא זו שהשמות מרמזים עליה. Fast מוציא טקסט מהר יותר אבל מתקן יותר ממנו; Accuracy לוקח מעט יותר זמן ומתקן פחות. קהל יושב שקורא כתוביות מתורגמות בדרך כלל לא שם לב לשנייה נוספת, אבל כן שם לב למילים שממשיכות להשתנות. לכן Accuracy הוא לעיתים ההגדרה הנעימה יותר, כל עוד תרשים העיכוב נשאר שטוח. Auto מגלה את קלפיו: שורה שהוא האיץ כדי לסגור פער נושאת תג FAST MODE בתמליל של המארח, עם הערה שהדיוק עשוי להיות נמוך יותר שם.
בכל מצב, התמלול חייב להיות מוכן לפני המילה הראשונה, וההכנה הזו היא העיכוב היחיד ששרשרת משלמת רק פעם אחת.
בחלק מהמסלולים, תמלול בשידור חי לוקח כמה שניות להתחיל. המשך תלוי במסלול: השורה "Start-up speed" בעמוד המחירים נעה מהתחלה קרה של עד 15 שניות בתשלום לפי שימוש, ועד מוכן תמיד ב-Enterprise.
דרך ה-API ההמתנה מופיעה כמסגרות session.loading בזמן שהסשן מתחיל, ואחריהן session.ready; הלקוח שולח שמע רק אחרי זה. מאזין שפותח את הקישור בינתיים רואה "Live. The first line appears in a moment." כשהתמלול כבר רץ, העיכוב הזה מאחוריכם, והשאלה היחידה שנשארת היא כמה מהעיכוב שנותר אתם נושאים.
בזמן שתמלול בשידור חי רץ, הלשונית Speed של המארח מציגה את כל זה יחד: הפער הנוכחי בין הדובר לטקסט, עם שבב המצב לצידו, ותרשים של הפער לאורך ההקלטה עם הממוצע והשיא שלו. בתמליל עצמו, שורה שהגיעה למאזינים באיחור נושאת תג שמציין את מספר השניות בין הרגע שבו נאמרה לרגע שבו הגיעה.
תרשים שנשאר נמוך ושטוח אומר שהמצב מתאים לשמע. תרשים שעולה אומר שהצנרת נופלת מאחור. במצב Accuracy, זה עשוי להיות הרגע לעבור ל-Auto, שמוותר על קצת דיוק תמורת מהירות, עד שהפער נסגר.
מפתחים מקבלים מספר יחיד במקום. כשסשן בזמן אמת מסתיים, session.done נושא את stats.realtimeFactor, שהוא כמות השמע שתומללה חלקי הזמן שהושקע בתמלולה. אזהרה למוסכמה: בספרות זיהוי דיבור, real-time factor בדרך כלל פירושו ההפך, זמן עיבוד חלקי זמן שמע, שבו ככל שנמוך יותר טוב יותר. VocalStack מדווח בכיוון ההפוך, ולכן כאן ככל שגבוה יותר טוב יותר: סשן חי נמצא קרוב ל-1, ומתחת ל-1 פירושו שהשמע הגיע מהר יותר ממה שהצנרת יכלה לתמלל.
אף אחת מהשניות האלה אינה מסתורית. חלקן שייכות לזרם, חלקן למילה שמחכה למילה שאחריה, חלקן למשפט שתרגום צריך, והשאר למצב ההשהיה שבחרתם. תיעוד ה-API כולל את הפירוט מסגרת אחר מסגרת, והדמו בעמוד הבית מראה את השרשרת בפעולה.