
Miksi AI-transkriptio kuulee tekniset termit väärin (ja miten korjasimme sen)
Live-istunto kuuli kysymyksen "what is the pointer in C++" muodossa "what is the point in life". Tässä on rikostekninen jälki siitä transkriptista GeekBye v2.0.11:een — keyterm-painotus, yhteyksiä katkova ajoituskilpailu ja päivä, jona oma korjauksemme kostautui.
Heinäkuun 2. päivänä ajoimme testi-istunnon ja kysyimme GeekByeltä ääneen yksinkertaisen kysymyksen: "What is the pointer in C++?" ("mikä on osoitin C++:ssa?").
Live-transkripti vastasi runoudella:
[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.
Saman istunnon terveysmittarit kertoivat loput: 3 katkennutta transkriptioyhteyttä 163 sekunnissa ja 51 sekunnin aukko transkriptissa. Ja vielä yksi johtolanka, joka osoittautui tärkeimmäksi: istunnon jälkeinen palautusajomme — joka transkriboi paikallisesti tallennetun äänen uudelleen aukkojen täyttämiseksi — sai lauseen melkein oikein: "a pointer in plus, plus? What the pointer in plus, plus C++."
Ääni oli kunnossa. Live-mallilla ei vain ollut mitään syytä odottaa C++:aa.
Tämä on tarina GeekBye v2.0.11:stä, kerrottuna oikeista transkripteista ja tuotantolokeista.
Miksi puhemallit kuulevat sanastosi väärin
Puheentunnistus on ennustusongelma. Kun ääni on monitulkintaista, malli valitsee todennäköisimmät sanat — ja yleiskäyttöiselle mallille "point in life" (elämän tarkoitus) on paljon todennäköisempi fraasi kuin "pointer in C++" (osoitin C++:ssa). Jokainen insinööri, joka on nähnyt kokoustranskriptin kirjoittavan Kubernetesin muotoon "cube and eddies", on kohdannut tämän virheen.
Ratkaisu ei ole parempi mikrofoni. Se on keyterm-painotus (keyterm biasing): mallille kerrotaan ennen istunnon alkua, mitkä epätodennäköiset sanat ovat todennäköisiä juuri sinulle. Puhepalveluntarjoajamme tukee jopa 50 painotustermiä istuntoa kohden. Tässä nolo osuus: näiden termien putkisto oli olemassa stackissamme päästä päähän — klientti, backend, palveluntarjoaja — eikä mikään ollut koskaan täyttänyt sitä. Jokainen istunto ajettiin täysin ilman aihepiirin apua.
Korjaus 1: profiilistasi tulee mallin sanasto
GeekBye tietää jo alasi — se on aktiivisessa profiilissasi. v2.0.11 johtaa painotus-keytermit profiilin nimestä ja kuvauksesta: symboleja sisältävät termit (C++, Node.js), lyhenteet (SQL, AWS), camelCase-nimet (TypeScript, PostgreSQL) ja erisnimet. Profiili, joka mainitsee stackisi, tekee siitä stackista nyt odotetun eikä eksoottisen.
Päivä, jona korjaus pahensi kaiken
Ensimmäinen versiomme piti jokaista isolla alkukirjaimella alkavaa sanaa erisnimenä. Sisäisessä testibuildissa (tämä ei koskaan päätynyt asiakkaille) proosamuotoon kirjoitettu profiili lähetti mallille tämän painotuslistan:
Senior, Writing, Direct, For, Includes, Write, Role, Intent…
Puhemallin painottaminen kohti sanaa "For" on pahempaa kuin olla painottamatta lainkaan. Heti seuraavassa testi-istunnossa sana "speak" — selkeästi ja useaan kertaan lausuttuna — palasi muodoissa "Clicky", "Hey, Vicky" ja "Peter Paderty". Oppitunti maksoi meille yhden iltapäivän: painota vain erottuvilla termeillä. Isolla alkukirjaimella kirjoitetut sanat lasketaan nyt vain, kun ne esiintyvät keskellä lausetta (aito erisnimisignaali); markdown-otsikot, joissa jokainen sana on isolla, eivät koskaan vaikuta. Sama profiili johtaa nyt täsmälleen termit LinkedIn, AI, CEO, MCP — ja validointi-istunto transkriboi monikielistä, nopeasti vaihtuvaa ääntä oikein 199 sekuntia putkeen, 189 transkriptisegmenttiä, nolla virhettä.
Korjaus 2: kilpailu, joka katkoi yhteyksiä
Keytermit selittivät väärin kuullut sanat. Ne eivät selittäneet kolmea katkennutta yhteyttä.
Se jälki johti hienovaraisempaan paikkaan. Palveluntarjoajamme commitoi (viimeistelee) transkription oman puheaktiivisuuden tunnistuksensa perusteella, noin sekunti hiljaisuuden alusta. Klienttimme lähettää myös varmuus-commitin 250 millisekuntia hiljaisuuden alusta huuhtoakseen ulos roikkumaan jääneen keskeneräisen lauseen. Palveluntarjoajan vahvistus siitä, että se on jo commitoinut, kestää paluumatkallaan yhdestä kolmeen sekuntia. Laske noilla kolmella luvulla: aina kun palveluntarjoaja ehti ensin, varmuus-commitimme laukesi lähes tyhjää puskuria vasten — eikä palveluntarjoajan vastaus siihen ollut pelkkä kohtelias hylkäys. Se katkaisi yhteyden. Jokainen tauko puheessa oli kolikonheitto.
v2.0.11 tuo tätä vastaan kaksi kerrosta:
- Sovelluksessa: kun commitoitu transkripti saapuu, klientti tietää nyt, että palveluntarjoajan puskuri tyhjennettiin juuri, ja ohittaa turhan varmuus-commitin.
- Backendissämme, samana päivänä: sovelluksen ja palveluntarjoajan välissä istuva proxy peilaa palveluntarjoajan äänikirjanpidon täsmälleen — se näkee jokaisen äänikehyksen ja jokaisen commit-vahvistuksen nollaviiveellä — ja yksinkertaisesti kieltäytyy välittämästä yhtään commitia, jonka palveluntarjoaja hylkäisi. Tämä suojaa jokaista klienttiversiota kerralla, myös käyttäjiä, jotka eivät ole päivittäneet.
Näimme sen toimivan tuotannossa tunnin sisällä. Suoja sieppasi tuhoon tuomitut commitit, joissa oli 178 ms ja 256 ms puskuroitua ääntä — jokainen niistä olisi ennen sitä päivää ollut taattu yhteyskatko ja aukko jonkun kokousmuistiinpanoissa. Saman iltapäivän 60 minuutin yhtäjaksoinen istunto kirjasi viisi sieppausta ja nolla katkoa. Ennen korjausta oikea käyttäjä oli samana aamuna käynnistänyt tallennuksensa uudelleen viisi kertaa kuudessa minuutissa taistellessaan juuri tätä bugia vastaan.
Kaksi pienempää korjausta kylkiäisinä
AI-oivallukset odottavat nyt sisältöä. Nuo sekavat alkuvaiheen katkelmat syöttivät ennen GeekByen live-ehdotuksia, jotka tuottivat itsevarmasti aiheita kuten "Defining Life's Ultimate Purpose" väärin kuullusta C++-kysymyksestä. Ehdotukset odottavat nyt, kunnes istunnossa on oikeaa keskustelumassaa.
Palautettu teksti saa oikean puhujan. Palautusajo, joka transkriboi C++-kysymyksemme oikein, oli merkinnyt sen puhujalle "Them". Paikallisesti tallennetun äänen aikajana tallentaa nyt, kuka puhui, joten palautetut segmentit kohdistuvat oikein joko puhujalle You tai Them.
Tulostaulu
| Mittari (mitattu, ei arvioitu) | Ennen | Jälkeen: v2.0.11 + backend-suoja |
|---|---|---|
| Yhteyskatkot testi-istunnossa | 3 / 163 s | 0 |
| Pisin aukko transkriptissa | 51 s | ~6 s pahin aukko validoinnissa |
| "pointer in C++" | "point in life" | oikein, painotetulla sanastolla |
| Palveluntarjoajalle asti päässeet tuomitut commitit | kaikki | 0 (siepattu backendissä) |
Jos rakennat reaaliaikaisten puhe-API:en varaan
Kolme siirrettävää oppia tästä julkaisusta:
- Ruoki painotusominaisuutta. Jos STT-palveluntarjoajasi tukee keytermejä / fraasivihjeitä, sen täyttäminen pienellä, erottuvalla sanastolla on halvin saatavilla oleva tarkkuusvoitto — ja sen täyttäminen yleisillä sanoilla on tarkkuustappio.
- Älä koskaan kilpaile palveluntarjoajan oman tilakoneen kanssa verkkokierroksen väärältä puolelta. Klienttimme ei voinut voittaa 250 ms vs. 3 s -informaatiokilpailua. Suojan paikka on siellä, missä molemmat signaalit kohtaavat — meillä backend-proxyssa.
- Validoi live-buildilla ennen julkaisua. Keyterm-regressio jäi kiinni, koska jokainen GeekBye-julkaisu testataan allekirjoitettuna, notarisoituna buildina tuotantoa vasten ennen kuin se lähtee ulos. Huono versio oli olemassa muutaman tunnin yhdellä sisäisellä koneella, ei sinun Macillasi.
GeekBye v2.0.11 on nyt ulkona — jos käytät v2:ta, sinulla on se jo automaattipäivityksen kautta. Luotettavuuspohjasta, jonka päälle tämä julkaisu rakentuu, lue miksi AI-muistiinpanotyökalusi pysähtyy huonolla wifillä ja mikä muuttui GeekBye v2:ssa. Siihen, miten live-transkriptio toimii arjessa, pääset alkuun artikkelista reaaliaikainen transkriptio GeekByessä.


