Glasovni model proizvodi zvuk, a za telefonski poziv treba više od toga. Između jednog i drugog agent skraćuje svaku rečenicu, pretvara je u drugu frekvenciju uzorkovanja, provjerava je tako što je ponovo prepozna i kešira, a keš se noću sam provjerava. Ova bilješka opisuje tu obradu.
Sintetizovana rečenica može početi sa malo tišine, koju ne vidi nijedan dnevnik vremena. Ova bilješka počinje od toga.
Mjereno na: početna tišina u 400 klipova iz glasovnog keša, prag −50 dBFS. Udjeli keša sa stola za test opterećenja, agent za zapošljavanje, 64.192 fraze. Pragovi provjere su proizvodne zadane vrijednosti i mogu se podešavati po instalaciji.
Ukratko: tišina prije prve riječi pada sa medijane od 280 ms na 40 ms. Svaki klip koji ide u keš prepoznaje se nazad i poredi sa tekstom koji je trebalo da kaže. Keš se sam provjerava svake noći, dok nema poziva. Na stolu za test opterećenja 94% prvih fraza odgovora došlo je iz provjerenog keša, a fraza iz keša počinje za oko 1 ms.
Od zvuka do odgovora na pozivu
Model za sintezu govora pretvara tekst u zvuk. Nije pravljen za telefonsku liniju, a razlika se vidi u sitnicama koje pozivalac odmah primijeti:
- Tišina prije prve riječi. Svaki klip počinje kratkom pauzom. Pozivalac je čuje kao oklijevanje agenta.
- Pauza unutar rečenice. Na telefonskoj liniji pola sekunde tišine usred rečenice zvuči kao prekinut poziv. Pozivalac počinje da govori u prazninu i smjena govornika se lomi.
- Prekinuta rečenica ili rečenica koja se ne završava. Rijetko, model stane na pola ili se vrti u krug.
- Pogrešne riječi. Svaki neuralni glas povremeno može reći nešto drugo od svog teksta, pa se svaki klip provjerava. Sve akustičke mjere prolaze: zvuk je čist govor druge rečenice.
- Pucketanje i klipovanje. Zvuk napravljen na jednoj frekvenciji uzorkovanja mora do linije stići na drugoj, u dijelovima, bez klika na svakom spoju.
To je razmak između zvuka i odgovora na pozivu, a nijedan od ovih problema nije greška modela. Dialogist taj razmak zatvara obradom na izlazu, provjerama svakog klipa i kešom koji sam sebe čisti.
Tišina prije prve riječi
Izmjerili smo početak 400 klipova u glasovnom kešu. Medijalni klip počinjao je sa 280 ms tišine, a nijedan sa 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 reproducira:
- Okviri. Skraćivač čita zvuk u okvirima od 10 ms. Prvi okvir glasniji od −50 dBFS je početak govora.
- Rezerva. Reprodukcija počinje 40 ms prije tog okvira. Četrdeset milisekundi čuva mekani početak prvog glasa, pa ništa ne ostaje odsječeno.
- Strujanje. Skraćivač 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, skraćivač reproducira klip onakav kakav jeste: pauza košta manje od progutane prve riječi.
- Original ostaje. Keš čuva neskraćeni klip. Skraćivanje se događa pri reprodukciji, pa ga možemo podešavati bez diranja sačuvanog fajla.
Agent po zadanim postavkama skraćuje prvu rečenicu svakog odgovora, gdje je 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 uvoda. Na liniji je odgovor jednog poziva stizao oko 200 ms ranije.
Frekvencije uzorkovanja bez klikova
Glas se proizvodi na studijskoj frekvenciji uzorkovanja, a telefonska linija radi na 8 ili 16 kHz. Pretvoriti cijeli klip odjednom je lako. Pretvarati tok dio po dio je mjesto odakle dolaze klikovi: svaki dio pretvoren zasebno počinje i završava se malim prelaznim šumom, a spojevi se čuju.
Agent pretvara metodom preklapanja i čuvanja (overlap-save). Svaki dio filtrira sa kontekstom sa obje strane i šalje samo sredinu, onaj dio izračunat sa punim kontekstom. Tako strujan izlaz se poklapa sa pretvaranjem cijelog klipa odjednom u granicama od 2 najmanje značajna bita, ispod svega što telefonska linija može da prenese.
Svaki klip se provjerava
Prije nego što klip ode u keš, gdje će ga čuti mnogi pozivaoci, agent ga provjerava. Provjera pušta zvuk nazad kroz prepoznavanje govora i kroz niz akustičkih testova.
| Provjera | Pada kada | Zašto |
|---|---|---|
| Prepoznat nazad | se prepoznati tekst poklapa sa namijenjenim tekstom manje od 80% | Jedini način da se zna da je glas izgovorio ovu rečenicu. Tečan klip pogrešnih riječi prolazi sve ostale testove. |
| Dužina | je klip kraći od 0,4× ili duži od 2,5× dužine koja se očekuje za taj tekst | Prekratak hvata odsječenu rečenicu. Predug hvata petlju. |
| Pauza unutar | 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 ukupno tiši od −50 dBFS | Prazan ili gotovo nečujan klip. |
| Klipovanje | više od 0,5% uzoraka dostigne punu skalu | Izobličenje koje pozivalac čuje kao pucketanje. |
| Rubovi | je tišina na bilo kom kraju duža od 0,5 s | Samo upozorenje: sam govor je ispravan. |
Dvije pojedinosti čuvaju pravičnost provjere:
- Brojevi se procjenjuju blago. Prepoznavanje „500“ zapiše riječima, pa bi poređenje slovo po slovo odbacilo savršen klip. Za tekst sa ciframa nepodudaranje je samo upozorenje, a agent ne generiše klip iznova u beskonačnoj petlji.
- Oznake izgovora se uklanjaju prije poređenja, pa oznaka akcenta u tekstu ne važi kao greška.
Agent ponovo generiše klip koji padne. Ako i dalje pada, označi ga da ga neko presluša.
Fraze spremne prije poziva
Mnoge rečenice koje agent izgovara mogu se predvidjeti: pozdrav, pitanja iz skripte, potvrde. Keš agenta zagrijavamo prije početka poziva: vodimo simulirane razgovore s agentom, skupljamo ono što kaže, sintetizujemo svaku frazu, provjeravamo je kao gore i čuvamo.
Svaka fraza dobija drugi pokušaj ako padne na provjeri, a sve što i dalje ne zadovolji prag označava se u izvještaju.
Na stolu za test opterećenja 94% prvih fraza odgovora i 95% svih 64.192 fraze došlo je iz keša. Fraza iz keša počinje za oko milisekundu, a nova za oko 100 ms.
Keš se čisti noću
Keš je dobar koliko i njegov najgori klip, pa ga Dialogist ponovo provjerava van radnog vremena.
- Kada. U noćnom prozoru, po zadanim postavkama od 01:00 do 06:00, i samo dok nema aktivnih poziva. Ako stigne poziv, provjera se pauzira i pogleda ponovo za minut.
- Šta. Klipovi koji nikad nisu provjereni, klipovi koji su prošli sa upozorenjem i klipovi provjereni prije više od 30 dana.
- Kojim redom. Najviše puštani prvi. 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 noću, jedan po jedan, da provjera nikad ne konkuriše sljedećem jutru.
- Na kom jeziku. Provjera 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. Provjera klip ponovo generiše, najviše dvaput. Novi zvuk zamjenjuje stari pod istim unosom, a unos zadržava istoriju reprodukcije.
- Karantin. Ako ponovno generisanje ne popravi klip, provjera ga stavlja u karantin. Agent nikad ne reproducira klip iz karantina: tu rečenicu umjesto toga sintetizuje uživo, a rezultat uživo ne smije prepisati fajl u karantinu. Klip ostaje dok ga neko ne presluša i odobri, ponovo generiše ili obriše.
Svako noćno izvršavanje ostavlja izvještaj od jednog reda: koliko je klipova provjereno, prošlo, ponovo generisano i stavljeno u karantin.
Ista rečenica, isti zvuk
Keš čuva svaki klip sa svim što mijenja kako zvuči: glasom, brzinom govora, jezikom i profilom izgovora. Dva agenta sa istim glasom i različitim brzinama nikad ne dijele klip.
Rječnici izgovora (nazivi marki, ulice, žargon) čuvaju se uz klip. Kad noćna provjera ponovo generiše frazu, primjenjuje iste stavke rječnika koje je koristio originalni poziv, pa novi klip zvuči kao onaj koji zamjenjuje.
Na liniji
Posljednji korak je mikser koji šalje zvuk pozivaocu:
- Meki limiter na −1 dBFS na zbiru svega što se reprodukuje, da glas agenta i zvuk u pozadini nikad ne klipuju zajedno.
- Utišavanje od 30 ms kad agent stane zbog upadanja u riječ, da stane bez klika.
- Spuštanje jačine glasa agenta dok pozivalac govori; glas se vraća kad on stane. Slušanje dok govori opisuje kako agent postupa sa pozivaočevom stranom.