Більшість затримки в живому перекладі — це очікування: потоку, наступного слова, речення. Єдина частина, якою ви керуєте, — це режим затримки: менша затримка або менше переглядів.
Слухач, який читає живий переклад, бачить кожен рядок через кілька секунд після того, як мовець його вимовив. Цей проміжок складається не з однієї затримки, а з кількох, що додаються одна до одної вздовж ланцюжка, і більшість із них — своєрідне очікування. Розуміння того, яке очікування де виникає, робить вибір режиму затримки простим і підказує розробникові, який читацький інтерфейс створює, що саме показувати і коли.
Корисний орієнтир перед цифрами: людський синхронний перекладач зазвичай говорить із запізненням від мовця на дві–чотири секунди. Перекладачі називають цей проміжок 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 у транскрипті ведучого з приміткою, що точність там може бути нижчою.
Незалежно від режиму транскрипція має бути готова до першого слова, і її підготовка — єдина затримка, яку ланцюжок платить лише раз.
На деяких тарифах жива транскрипція запускається за кілька секунд. Скільки саме, залежить від тарифу: рядок «Швидкість запуску» на сторінці цін варіюється від холодного старту до 15 секунд за оплатою за використання до завжди прогрітої системи в Enterprise.
Через API очікування видно як кадри session.loading, поки сеанс стартує, а потім session.ready; клієнт надсилає аудіо лише після цього. Слухач, який відкриває посилання в цей час, бачить «Наживо. Перший рядок з’явиться за мить». Щойно транскрипція запущена, ця затримка позаду, і залишається лише питання, скільки з решти затримки ви несете.
Поки жива транскрипція триває, вкладка Speed у ведучого показує, що все це разом дає: поточний розрив між мовцем і текстом із поруч розташованим індикатором режиму, а також графік цього розриву впродовж запису з його середнім і піковим значенням. У самій транскрипції рядок, який дійшов до слухачів із запізненням, має позначку з кількістю секунд між моментом, коли його вимовили, і моментом, коли він прийшов.
Графік, який лишається низьким і рівним, означає, що режим підходить до аудіо. Графік, що зростає, означає, що конвеєр відстає. У режимі Accuracy це може бути момент перейти на Auto, який жертвує частиною точності заради швидкості, доки розрив не зменшиться.
Розробники отримують одне число. Коли сеанс у реальному часі завершується, session.done містить stats.realtimeFactor — оброблене аудіо, поділене на час, витрачений на його транскрибування. Одне застереження щодо термінології: у літературі з розпізнавання мовлення real-time factor зазвичай означає обернене значення, тобто час обробки до тривалості аудіо, де менше краще. VocalStack рахує навпаки, тож тут більше краще: живий сеанс тримається біля 1, а значення нижче за 1 означає, що аудіо надходило швидше, ніж конвеєр встигав його транскрибувати.
Жодна з цих секунд не таємнича. Одні належать потоку, інші — слову, яке чекає на наступне слово, деякі — реченню, якого потребує переклад, а решта — режиму затримки, який ви обрали. Довідка з API містить детальний опис кадр за кадром, а демо на головній сторінці показує весь ланцюжок у дії.