Glasovni model proizvodi zvuk, a telefonskom pozivu treba više od toga. Između modela i pozivaoca agent skraćuje svaku rečenicu, konvertuje joj frekvenciju uzorkovanja, proverava je tako što je prepozna unazad i kešira, a keš se noću sam proverava. Ova beleška opisuje tu obradu.
Sintetizovana rečenica može početi sopstvenom tišinom, koju nijedan log vremena ne pokazuje. Ova beleška počinje odatle.
Izmereno na: početna tišina 400 klipova iz glasovnog keša, prag −50 dBFS. Udeli keša sa stenda za test opterećenja, agent za regrutaciju, 64.192 fraze. Pragovi provere su podrazumevane produkcione vrednosti i mogu se podesiti po instalaciji.
Ukratko: tišina pre prve reči pada sa medijane od 280 ms na 40 ms. Svaki klip koji ulazi u keš prepoznaje se unazad i poredi s tekstom koji je trebalo da izgovori. Keš se svake noći sam proverava dok nijedan poziv nije aktivan. Na stendu za test opterećenja 94% prvih fraza odgovora došlo je iz provereno ispravnog keša, a keširana fraza počinje za oko 1 ms.
Od zvuka do odgovora u pozivu
Model za sintezu govora pretvara tekst u zvuk. Nije pravljen za telefonsku liniju, a razlika se vidi u sitnicama koje pozivalac odmah primeti:
- Tišina pre prve reči. Svaki klip počinje kratkom pauzom. Pozivalac je čuje kao oklevanje agenta.
- Pauza usred rečenice. Na telefonskoj liniji pola sekunde tišine usred rečenice zvuči kao prekinut poziv. Pozivalac počne da govori u prazninu i replika se raspada.
- Rečenica koja se prekine ili koja ne staje. Retko se desi da model stane na pola puta ili da upadne u petlju.
- Pogrešne reči. Svaki neuronski glas povremeno može da kaže nešto drugo od svog teksta, zato se svaki klip proverava. Sva akustička merenja prolaze: zvuk je čist govor druge rečenice.
- Pucketanje i klipovanje. Zvuk nastao na jednoj frekvenciji uzorkovanja mora do linije stići na drugoj, u delovima, bez pucketanja na svakom spoju.
To je razmak između zvuka i odgovora u pozivu, i nijedan deo nije greška modela. Dialogist taj razmak zatvara obradom na izlazu, proverom svakog klipa i kešom koji sam sebe održava čistim.
Tišina pre prve reči
Izmerili smo početak 400 klipova iz glasovnog keša. Medijalni klip počinjao je sa 280 ms tišine, a nijedan nije imao manje od 200 ms. Ta tišina stoji tačno između kraja pitanja pozivaoca i odgovora agenta.
Agent je skraćuje dok se klip reprodukuje:
- Okviri. Isecač čita zvuk u okvirima od 10 ms. Prvi okvir glasniji od −50 dBFS početak je govora.
- Rezerva. Reprodukcija počinje 40 ms pre tog okvira. Četrdeset milisekundi čuva blagi početak prvog glasa, tako da ništa nije odsečeno.
- Strimovanje. Isecač zadržava samo tihe okvire, a sve od početka govora propušta bajt po bajt.
- Ograničenje. Ako se govor ne pojavi u roku od 600 ms, isecač pušta klip onakav kakav jeste: pauza košta manje od progutane prve reči.
- Original ostaje. Keš čuva neskraćen klip. Skraćivanje se događa pri reprodukciji, pa ga možemo podešavati bez dirnja sačuvane datoteke.
Podrazumevano agent skraćuje prvu rečenicu svakog odgovora, jer je tu tišina čisto čekanje. Pauze između kasnijih rečenica ostaju onakve kakve ih je glas napravio, jer tamo zvuče kao disanje.
Skraćivanje uklanja oko 240 ms od medijalnih 280 ms početne tišine. Na liniji je odgovor u jednom pozivu stigao oko 200 ms ranije.
Frekvencije uzorkovanja bez pucketanja
Glas se proizvodi na studijskoj frekvenciji uzorkovanja, a telefonska linija radi na 8 ili 16 kHz. Konvertovati ceo klip odjednom je lako. Konvertovati tok deo po deo je mesto odakle dolazi pucketanje: svaki deo konvertovan zasebno počinje i završava se malim prelaznim šumom, pa se spojevi čuju.
Agent konvertuje metodom overlap-save. Svaki deo filtrira s kontekstom s obe strane, a šalje samo sredinu, deo izračunat s punim kontekstom. Strimovan na taj način, izlaz se poklapa s konverzijom celog klipa odjednom unutar 2 najmanje značajna bita, ispod svega što telefonska linija može da prenese.
Svaki klip se proverava
Pre nego što klip uđe u keš, gde će ga čuti mnogo pozivalaca, agent ga proverava. Provera propušta zvuk kroz prepoznavanje govora i kroz niz akustičkih testova.
| Provera | Pada kada | Zašto |
|---|---|---|
| Prepoznavanje unazad | se prepoznati tekst poklapa s traženim tekstom manje od 80% | Jedini način da se zna da je glas rekao baš ovu rečenicu. Tečan klip pogrešnih reči prolazi sve ostale testove. |
| Dužina | je klip kraći od 0,4× ili duži od 2,5× dužine očekivane na osnovu teksta | Prekratak hvata prekinutu rečenicu. Predug hvata petlju. |
| Pauza unutar rečenice | je bilo koja tišina unutar rečenice duža od 0,7 s | Na telefonskoj liniji zvuči kao prekinut poziv. |
| Nivo | je klip u celini tiši od −50 dBFS | Prazan ili skoro nem klip. |
| Klipovanje | više od 0,5% odbiraka dostiže pun opseg | Izobličenje koje pozivalac čuje kao pucketanje. |
| Ivice | je tišina na bilo kom kraju duža od 0,5 s | Samo upozorenje: sam govor je ispravan. |
Dva detalja održavaju proveru poštenom:
- Brojevi se procenjuju blago. Prepoznavanje piše „500“ rečima, pa bi poređenje slovo po slovo odbacilo savršen klip. Kod teksta s ciframa nepodudaranje je samo upozorenje, a agent ne ponavlja generisanje klipa u beskonačnoj petlji.
- Oznake izgovora se uklanjaju pre poređenja, pa akcenat u tekstu ne važi kao greška.
Agent ponovo generiše klip koji ne prođe. Ako i dalje ne prolazi, agent ga označi da ga čovek posluša.
Fraze spremne pre poziva
Mnoge rečenice koje agent izgovara mogu se predvideti: pozdrav, pitanja iz scenarija, potvrde. Keš agenta zagrevamo pre početka poziva: vodimo simulirane razgovore s agentom, skupimo šta govori, sintetizujemo svaku frazu, proverimo je kao gore i sačuvamo.
Svaka fraza koja ne prođe proveru dobija drugi pokušaj, a sve što i posle toga ne dostigne zadatu meru označava se u izveštaju.
Na stendu za test opterećenja 94% prvih fraza odgovora i 95% svih 64.192 fraze došlo je iz keša. Keširana fraza počinje za oko milisekundu, a nova za oko 100 ms.
Keš se noću čisti sam
Keš je dobar koliko i njegov najgori klip, zato ga Dialogist ponovo proverava van radnog vremena.
- Kada. U noćnom prozoru, podrazumevano od 01:00 do 06:00, i samo dok nijedan poziv nije aktivan. Ako stigne poziv, provera se pauzira i minut kasnije ponovo gleda.
- Šta. Klipovi koji nikad nisu provereni, klipovi koji su prošli s upozorenjem i klipovi provereni pre više od 30 dana.
- Kojim redom. Prvo najviše puštani. Greška u frazi koja se čuje hiljadu puta dnevno košta više od greške u frazi koja se čuje jednom.
- Koliko. Do 2.000 klipova za noć, jedan po jedan, da provera ne smeta sledećem jutru.
- Na kom jeziku. Provera prepoznaje svaki klip na jeziku za koji je napravljen, pa greškom ne obara englesku frazu u kešu koji je uglavnom srpski.
- Kad padne. Provera ponovo generiše klip, najviše dva puta. Novi zvuk zamenjuje stari pod istim unosom, a unos zadržava istoriju reprodukcije.
- Karantin. Ako ponovno generisanje ne ispravi klip, provera ga stavlja u karantin. Agent nikad ne pušta klip iz karantina: tu rečenicu sintetizuje uživo, a rezultat uživo ne sme prepisati datoteku u karantinu. Klip ostaje dok ga čovek ne preslusa i odobri, ponovo generiše ili obriše.
Svako noćno izvršavanje ostavlja izveštaj od jednog reda: koliko je klipova provereno, prošlo, ponovo generisano i stavljeno u karantin.
Ista rečenica, isti zvuk
Keš čuva svaki klip sa svim što menja kako zvuči: glasom, brzinom govora, jezikom i profilom izgovora. Dva agenta s istim glasom i različitim brzinama nikad ne dele klip.
Rečnici izgovora (nazivi brendova, ulice, žargon) čuvaju se uz klip. Kada noćna provera ponovo generiše frazu, primenjuje iste unose iz rečnika koje je koristio originalni poziv, pa novi klip zvuči kao onaj koji menja.
Na liniji
Poslednji korak je mikser koji šalje zvuk pozivaocu:
- Meki limiter na −1 dBFS na zbiru svega što se reprodukuje, tako da glas agenta i zvuk u pozadini zajedno nikad ne klipuju.
- Utišavanje od 30 ms kada se agent zaustavi zbog prekida, da stane bez pucketanja.
- Spuštanje jačine glasa agenta dok pozivalac govori; glas se vraća kad on prestane. Slušanje dok govorimo opisuje kako agent postupa sa stranom pozivaoca.