Steven
Steven5 min lugemist

Miks AI-transkriptsioon kuuleb tehnilisi termineid valesti (ja kuidas me selle parandasime)

Reaalajas seanss kuulis "what is the pointer in C++" asemel "what is the point in life". Siin on uurimisjälg sellest transkriptist kuni GeekBye v2.0.11-ni — keyterm biasing, ühendusi katkestav ajastusvõidujooks ja päev, mil meie enda parandus tagasilöögi andis.

Transkriptsioon
Töökindlus
Inseneritöö
GeekBye väljalasked
Miks AI-transkriptsioon kuuleb tehnilisi termineid valesti (ja kuidas me selle parandasime)
  1. juulil tegime testseansi ja küsisime GeekBye käest valjusti lihtsa küsimuse: "What is the pointer in C++?" ("mis on viit C++ keeles?").

Reaalajas transkript vastas luulega:

[23:16:37] You: Tell me, what is the point in life? [23:16:52] You: Handy Plus. [23:17:02] You: What the pointer in Plus Plus? [23:17:09] You: C.

Sama seansi tervisemõõdikud rääkisid ülejäänu: 3 katkenud transkriptsiooniühendust 163 sekundi jooksul ja 51-sekundiline auk transkriptis. Ja veel üks vihje, mis osutus kõige olulisemaks: meie seansijärgne taastekäik — mis transkribeerib lokaalselt salvestatud heli uuesti, et auke täita — sai lause peaaegu õigesti: "a pointer in plus, plus? What the pointer in plus, plus C++."

Heli oli korras. Reaalajas mudelil polnud lihtsalt põhjust C++-i oodata.

See on lugu GeekBye v2.0.11-st, jutustatuna päris transkriptide ja toodangulogide põhjal.

Miks kõnemudelid sinu sõnavara valesti kuulevad

Kõnetuvastus on ennustusprobleem. Mitmeti mõistetava heli puhul valib mudel kõige tõenäolisemad sõnad — ja üldotstarbelise mudeli jaoks on "point in life" (elu mõte) palju tõenäolisem fraas kui "pointer in C++" (viit C++ keeles). Iga insener, kes on näinud, kuidas koosoleku transkript kirjutab Kubernetese asemel "cube and eddies", on selle veaga kohtunud.

Lahendus ei ole parem mikrofon. See on keyterm biasing: mudelile enne seansi algust ütlemine, millised ebatõenäolised sõnad on sinu jaoks tõenäolised. Meie kõneteenusepakkuja toetab kuni 50 suunamisterminit seansi kohta. Ja nüüd piinlik osa: nende terminite torustik oli meie stäkis otsast lõpuni olemas — klient, backend, teenusepakkuja — ja mitte keegi polnud seda kunagi täitnud. Iga seanss jooksis ilma mingi valdkonnaabita.

Parandus 1: sinu profiilist saab mudeli sõnavara

GeekBye teab sinu valdkonda juba niigi — see on sinu aktiivses profiilis. v2.0.11 tuletab suunamis-keyterm'id profiili nimest ja kirjeldusest: sümbolitega terminid (C++, Node.js), akronüümid (SQL, AWS), kaamelkirjas nimed (TypeScript, PostgreSQL) ja pärisnimed. Profiil, mis mainib sinu stäkki, teeb selle stäki nüüd oodatuks, mitte eksootiliseks.

Päev, mil parandus tegi kõik hullemaks

Meie esimene versioon pidas iga suure algustähega sõna pärisnimeks. Sisemises testbuildis (see ei jõudnud kunagi klientideni) saatis proosas kirjutatud profiil mudelile sellise suunamisloendi:

Senior, Writing, Direct, For, Includes, Write, Role, Intent…

Kõnemudeli suunamine sõna "For" poole on hullem kui üldse mitte suunata. Juba järgmises testseansis tuli sõna "speak" — selgelt ja mitu korda välja öelduna — tagasi kujul "Clicky", "Hey, Vicky" ja "Peter Paderty". Õppetund maksis meile ühe pärastlõuna: suuna ainult eristuvate terminitega. Suure algustähega sõnad lähevad nüüd arvesse ainult siis, kui need esinevad lause keskel (ehtne pärisnime signaal); markdown-pealkirjad, kus iga sõna on suure tähega, ei anna kunagi midagi. Seesama profiil tuletab nüüd täpselt LinkedIn, AI, CEO, MCP — ja valideerimisseanss transkribeeris mitmekeelset, kiiresti vahelduvat heli õigesti 199 sekundit järjest, 189 transkriptisegmenti, null viga.

Parandus 2: võidujooks, mis katkestas ühendusi

Keyterm'id selgitasid valesti kuuldud sõnu. Kolme katkenud ühendust need ei selgitanud.

See jälg viis kuhugi peenemasse kohta. Meie teenusepakkuja commit'ib (lõplikustab) transkriptsiooni oma häälaktiivsuse tuvastuse põhjal, umbes sekund pärast vaikuse algust. Meie klient saadab samuti turva-commit'i 250 millisekundit pärast vaikuse algust, et loksutada välja iga rippuma jäänud poolik lause. Teenusepakkuja kinnitus, et ta on juba commit'inud, võtab tagasiteel üks kuni kolm sekundit. Tee nende kolme numbriga arvutus: alati, kui teenusepakkuja jõudis esimesena, tulistas meie turva-commit peaaegu tühja puhvri pihta — ja teenusepakkuja vastus sellele ei olnud pelgalt viisakas äraütlemine. Ta katkestas ühenduse. Iga paus kõnes oli mündivise.

v2.0.11 toob selle vastu kaks kihti:

  1. Rakenduses: kui saabub commit'itud transkript, teab klient nüüd, et teenusepakkuja puhver just tühjendati, ja jätab üleliigse turva-commit'i vahele.
  2. Meie backend'is, samal päeval: proxy, mis istub rakenduse ja teenusepakkuja vahel, peegeldab teenusepakkuja heliarvestust täpselt — ta näeb iga helikaadrit ja iga commit'i kinnitust nullviivitusega — ja lihtsalt keeldub edastamast ühtegi commit'i, mille teenusepakkuja tagasi lükkaks. See kaitseb korraga kõiki kliendiversioone, ka kasutajaid, kes pole uuendanud.

Nägime seda toodangus töötamas tunni jooksul. Kaitse püüdis kinni hukule määratud commit'id, mis kandsid 178 ms ja 256 ms puhverdatud heli — igaüks neist oleks enne seda päeva olnud garanteeritud ühenduskatkestus ja auk kellegi koosolekumärkmetes. Sama pärastlõuna 60-minutine katkematu seanss registreeris viis kinnipüüdmist ja null katkestust. Enne parandust oli päris kasutaja samal hommikul taaskäivitanud oma salvestuse viis korda kuue minuti jooksul, võideldes täpselt selle veaga.

Kaks väiksemat parandust, mis kaasa tulevad

AI-järeldused ootavad nüüd sisu. Need moonutatud varajased fragmendid toitsid varem GeekBye reaalajas soovituskaarte, mis tootsid enesekindlalt teemasid nagu "Defining Life's Ultimate Purpose" valesti kuuldud C++ küsimusest. Soovitused ootavad nüüd, kuni seansil on päris vestlusmassi.

Taastatud tekst saab õige kõneleja. Taastekäik, mis transkribeeris meie C++ küsimuse õigesti, oli omistanud selle kõnelejale "Them". Lokaalselt salvestatud heli ajajoon salvestab nüüd, kes parasjagu rääkis, nii et taastatud lõigud omistatakse õigesti kas You või Them alla.

Tulemustabel

Mõõdik (mõõdetud, mitte hinnatud) Enne Pärast v2.0.11 + backend-kaitset
Ühenduskatkestused testseansis 3 / 163 s 0
Pikim auk transkriptis 51 s ~6 s halvim auk valideerimisel
"pointer in C++" "point in life" õige, suunatud sõnavaraga
Teenusepakkujani jõudvad hukule määratud commit'id kõik 0 (püütakse kinni backend'is)

Kui ehitad reaalaja kõne-API-de peale

Kolm ülekantavat õppetundi sellest väljalaskest:

  1. Toida suunamisfunktsiooni. Kui sinu STT-teenusepakkuja toetab keyterm'e / fraasivihjeid, on selle täitmine väikese, eristuva sõnavaraga odavaim saadaolev täpsusvõit — ja täitmine tavaliste sõnadega on täpsusekaotus.
  2. Ära kunagi võistle teenusepakkuja enda olekumasinaga võrgu-ringkäigu valelt poolelt. Meie klient ei saanud võita 250 ms vs 3 s infovõidujooksu. Kaitse kuulub sinna, kus mõlemad signaalid kokku saavad — meil on see backend-proxy.
  3. Valideeri live-buildil enne avaldamist. Keyterm'ide regressioon püüti kinni, sest iga GeekBye väljalase testitakse enne väljasaatmist allkirjastatud, notariseeritud buildina toodangu vastu. Halb versioon eksisteeris paar tundi ühes sisemises masinas, mitte sinu Macis.

GeekBye v2.0.11 on nüüd väljas — kui oled v2 peal, on see sul automaatuuenduse kaudu juba olemas. Töökindluse aluspõhja kohta, millele see väljalase toetub, loe miks sinu AI-märkmik kehva Wi-Fi peal seisma jääb ja mis muutus GeekBye v2-s. Kuidas reaalajas transkriptsioon igapäevaselt töötab — alusta artiklist reaalajas transkriptsioon GeekByes.