Гласовни модел производи звук, а телефонском позиву треба више од тога. Између модела и позиваоца агент скраћује сваку реченицу, конвертује јој фреквенцију узорковања, проверава је тако што је препозна уназад и кешира, а кеш се ноћу сам проверава. Ова белешка описује ту обраду.
Синтетизована реченица може почети сопственом тишином, коју ниједан лог времена не показује. Ова белешка почиње одатле.
Измерено на: почетна тишина 400 клипова из гласовног кеша, праг −50 дБФС. Удели кеша са стенда за тест оптерећења, агент за регрутацију, 64.192 фразе. Прагови провере су подразумеване продукционе вредности и могу се подесити по инсталацији.
Укратко: тишина пре прве речи пада са медијане од 280 мс на 40 мс. Сваки клип који улази у кеш препознаје се уназад и пореди с текстом који је требало да изговори. Кеш се сваке ноћи сам проверава док ниједан позив није активан. На стенду за тест оптерећења 94% првих фраза одговора дошло је из проверено исправног кеша, а кеширана фраза почиње за око 1 мс.
Од звука до одговора у позиву
Модел за синтезу говора претвара текст у звук. Није прављен за телефонску линију, а разлика се види у ситницама које позивалац одмах примети:
- Тишина пре прве речи. Сваки клип почиње кратком паузом. Позивалац је чује као оклевање агента.
- Пауза усред реченице. На телефонској линији пола секунде тишине усред реченице звучи као прекинут позив. Позивалац почне да говори у празнину и реплика се распада.
- Реченица која се прекине или која не стаје. Ретко се деси да модел стане на пола пута или да упадне у петљу.
- Погрешне речи. Сваки неуронски глас повремено може да каже нешто друго од свог текста, зато се сваки клип проверава. Сва акустичка мерења пролазе: звук је чист говор друге реченице.
- Пуцкетање и клиповање. Звук настао на једној фреквенцији узорковања мора до линије стићи на другој, у деловима, без пуцкетања на сваком споју.
То је размак између звука и одговора у позиву, и ниједан део није грешка модела. Dialogist тај размак затвара обрадом на излазу, провером сваког клипа и кешом који сам себе одржава чистим.
Тишина пре прве речи
Измерили смо почетак 400 клипова из гласовног кеша. Медијални клип почињао је са 280 мс тишине, а ниједан није имао мање од 200 мс. Та тишина стоји тачно између краја питања позиваоца и одговора агента.
Агент је скраћује док се клип репродукује:
- Оквири. Исецач чита звук у оквирима од 10 мс. Први оквир гласнији од −50 дБФС почетак је говора.
- Резерва. Репродукција почиње 40 мс пре тог оквира. Четрдесет милисекунди чува благи почетак првог гласа, тако да ништа није одсечено.
- Стримовање. Исецач задржава само тихе оквире, а све од почетка говора пропушта бајт по бајт.
- Ограничење. Ако се говор не појави у року од 600 мс, исецач пушта клип онакав какав јесте: пауза кошта мање од прогутане прве речи.
- Оригинал остаје. Кеш чува нескраћен клип. Скраћивање се догађа при репродукцији, па га можемо подешавати без дирња сачуване датотеке.
Подразумевано агент скраћује прву реченицу сваког одговора, јер је ту тишина чисто чекање. Паузе између каснијих реченица остају онакве какве их је глас направио, јер тамо звуче као дисање.
Скраћивање уклања око 240 мс од медијалних 280 мс почетне тишине. На линији је одговор у једном позиву стигао око 200 мс раније.
Фреквенције узорковања без пуцкетања
Глас се производи на студијској фреквенцији узорковања, а телефонска линија ради на 8 или 16 кХз. Конвертовати цео клип одједном је лако. Конвертовати ток део по део је место одакле долази пуцкетање: сваки део конвертован засебно почиње и завршава се малим прелазним шумом, па се спојеви чују.
Агент конвертује методом оверлап-саве. Сваки део филтрира с контекстом с обе стране, а шаље само средину, део израчунат с пуним контекстом. Стримован на тај начин, излаз се поклапа с конверзијом целог клипа одједном унутар 2 најмање значајна бита, испод свега што телефонска линија може да пренесе.
Сваки клип се проверава
Пре него што клип уђе у кеш, где ће га чути много позивалаца, агент га проверава. Провера пропушта звук кроз препознавање говора и кроз низ акустичких тестова.
| Провера | Пада када | Зашто |
|---|---|---|
| Препознавање уназад | се препознати текст поклапа с траженим текстом мање од 80% | Једини начин да се зна да је глас рекао баш ову реченицу. Течан клип погрешних речи пролази све остале тестове. |
| Дужина | је клип краћи од 0,4× или дужи од 2,5× дужине очекиване на основу текста | Прекратак хвата прекинуту реченицу. Предуг хвата петљу. |
| Пауза унутар реченице | је било која тишина унутар реченице дужа од 0,7 с | На телефонској линији звучи као прекинут позив. |
| Ниво | је клип у целини тиши од −50 дБФС | Празан или скоро нем клип. |
| Клиповање | више од 0,5% одбирака достиже пун опсег | Изобличење које позивалац чује као пуцкетање. |
| Ивице | је тишина на било ком крају дужа од 0,5 с | Само упозорење: сам говор је исправан. |
Два детаља одржавају проверу поштеном:
- Бројеви се процењују благо. Препознавање пише „500“ речима, па би поређење слово по слово одбацило савршен клип. Код текста с цифрама неподударање је само упозорење, а агент не понавља генерисање клипа у бесконачној петљи.
- Ознаке изговора се уклањају пре поређења, па акценат у тексту не важи као грешка.
Агент поново генерише клип који не прође. Ако и даље не пролази, агент га означи да га човек послуша.
Фразе спремне пре позива
Многе реченице које агент изговара могу се предвидети: поздрав, питања из сценарија, потврде. Кеш агента загревамо пре почетка позива: водимо симулиране разговоре с агентом, скупимо шта говори, синтетизујемо сваку фразу, проверимо је као горе и сачувамо.
Свака фраза која не прође проверу добија други покушај, а све што и после тога не достигне задату меру означава се у извештају.
На стенду за тест оптерећења 94% првих фраза одговора и 95% свих 64.192 фразе дошло је из кеша. Кеширана фраза почиње за око милисекунду, а нова за око 100 мс.
Кеш се ноћу чисти сам
Кеш је добар колико и његов најгори клип, зато га Dialogist поново проверава ван радног времена.
- Када. У ноћном прозору, подразумевано од 01:00 до 06:00, и само док ниједан позив није активан. Ако стигне позив, провера се паузира и минут касније поново гледа.
- Шта. Клипови који никад нису проверени, клипови који су прошли с упозорењем и клипови проверени пре више од 30 дана.
- Којим редом. Прво највише пуштани. Грешка у фрази која се чује хиљаду пута дневно кошта више од грешке у фрази која се чује једном.
- Колико. До 2.000 клипова за ноћ, један по један, да провера не смета следећем јутру.
- На ком језику. Провера препознаје сваки клип на језику за који је направљен, па грешком не обара енглеску фразу у кешу који је углавном српски.
- Кад падне. Провера поново генерише клип, највише два пута. Нови звук замењује стари под истим уносом, а унос задржава историју репродукције.
- Карантин. Ако поновно генерисање не исправи клип, провера га ставља у карантин. Агент никад не пушта клип из карантина: ту реченицу синтетизује уживо, а резултат уживо не сме преписати датотеку у карантину. Клип остаје док га човек не преслуса и одобри, поново генерише или обрише.
Свако ноћно извршавање оставља извештај од једног реда: колико је клипова проверено, прошло, поново генерисано и стављено у карантин.
Иста реченица, исти звук
Кеш чува сваки клип са свим што мења како звучи: гласом, брзином говора, језиком и профилом изговора. Два агента с истим гласом и различитим брзинама никад не деле клип.
Речници изговора (називи брендова, улице, жаргон) чувају се уз клип. Када ноћна провера поново генерише фразу, примењује исте уносе из речника које је користио оригинални позив, па нови клип звучи као онај који мења.
На линији
Последњи корак је миксер који шаље звук позиваоцу:
- Меки лимитер на −1 дБФС на збиру свега што се репродукује, тако да глас агента и звук у позадини заједно никад не клипују.
- Утишавање од 30 мс када се агент заустави због прекида, да стане без пуцкетања.
- Спуштање јачине гласа агента док позивалац говори; глас се враћа кад он престане. Слушање док говоримо описује како агент поступа са страном позиваоца.