
Kõrvaklappide viga: kui teine vestluskaaslane meie transkriptsioonist kadus
Kahekanaliline transkriptsioon töötas laitmatult sülearvuti kõlarite ja kõrvaklappidega. Siis pistis keegi kõrva nööpkõrvaklapid ning inimene, kellega ta rääkis, kadus transkriptsioonist lihtsalt ära — sest Chromium vaigistas meie heli vaikselt samal hetkel, kui too rääkima hakkas. Üksteist parandust ebaõnnestusid. Kaheteistkümnes muutis kogu arhitektuuri.
GeekBye transkribeerib vestluse kaks poolt: sinu mikrofoni ühel kanalil, teise osaleja heli (seda, mida su arvuti mängib) teisel. See töötas laitmatult sülearvuti kõlaritega. See töötas kõrvaklappidega. Siis pistis üks kasutaja kõrva nööpkõrvaklapid ning inimene, kellega ta rääkis, kadus transkriptsioonist. Mitte moonutatuna. Mitte valesti omistatuna. Kadunud.
See on lugu GeekBye v1.6.12 väljalaskest, veast, mis nõudis üksteist ebaõnnestunud parandust, ja hetkest, mil taipasime, et võitleme brauseri vastu, mitte ei tööta sellega koos.
Rada, mis oli elus ja tühi
Sümptom oli kummaline. Alustad koosolekut, kõik näeb korras välja, ütled ühe sõna — ning sellest hetkest läheb teise inimese helikanal puhtasse digitaalsesse vaikusesse. Me mõõtsime seda: süsteemiheli signaal püsis normaalsel energiatasemel (RMS umbes 0.03–0.06) ning hetkel, mil mikrofon su hääle üles korjas, kukkus see väärtuseni 0.0000 ja jäigi selleks ülejäänud seansi vältel.
Siin on see osa, mis meile päevi maksis. Iga brauseri API väitis kangekaelselt, et helirada on täiesti terve. readyState: live. enabled: true. muted: false. Iga staatuslipu järgi, mille platvorm avaldas, oli voog korras. Surnud olid heliproovid — elus toru, mis kandis vaid nulle. Me ei uskunud kaua omaenda energiamõõdikut, sest ametlik lugu ütles, et rada töötab.
Vallandaja oli spetsiifiline nööpkõrvaklappidele ja põhjus on füüsiline: nööpkõrvaklapp on üks seade, mis on korraga nii sinu mikrofoni sisend kui su heli väljund. Sülearvuti kõlarid ja kõrvaklapid eraldavad need — väljund läheb ühte kohta, mikrofon on mujal. Aga kui sisend ja väljund on üks ja sama seade, on sul definitsiooni järgi tagasiside tee. Meie tugev järeldus (see elab brauseri sisikonnas, seega me ei saa tsiteerida peatükki ega salmi) on, et Chromium tuvastab selle mikrofoni-pluss-kõlari-ühel-seadmel kuju, otsustab, et see on kohe kiljuma hakkav tagasisidesilmus, ja kaitsvalt vaigistab hõive — vaikselt, teatamata sellest rakendusele läbi ühegi lipu, mida rakendus lugeda saab.
Üksteist parandust, mitmed neist hullemad
Ründasime seda kõigepealt ilmselgetel viisidel ja panime iga katse kirja. Keerata välja kaja summutamine, müravähendus ja automaatvõimendus mõlemas voos. Käivitada kaks voogu järjestikku viivitusega, mitte koos. Anda igale voole oma diskreetimissagedus. Lisada vaikne võimendussõlm. Suunata kõik läbi ühe jagatud helikonteksti. Minna üle AudioWorkletile. Kukkuda alla lausa toore WebCodecs raja protsessorini.
Üksteist lähenemist. Nad mitte ainult ei ebaõnnestunud — mitmed tegid asja hullemaks. Üks tekitas 30-sekundilise viivituse. Teine pani su mikrofoni transkriptsiooni ilmuma teise inimese sildiga. Olime sügaval võsas, ravisime iga sümptomit, ja viga aina liikus edasi.
Läbimurre oli ümbersõnastus: iga senine parandus üritas hoida tervena kaht eraldi voogu. Aga kaks eraldi voogu olid täpselt see, mida Chromiumi tagasiside-heuristika nägi ja vaigistas. Mis siis, kui poleks midagi võrrelda?
Parandus: anna brauserile üks voog, mitte kaks
v1.6.12 lõpetas võitlemise ja muutis arhitektuuri. Selle asemel, et saata mikrofon ja süsteemiheli kahe iseseisva voona, miksib see need üheks mono vooks kliendipoolel enne, kui miski rakendusest lahkub. Kui mõlemad allikad voolavad läbi ühe toru, ei saa rajad iseseisvalt surra — enam pole kahe seadme tagasiside kuju, mida brauser tuvastada ja vaigistada saaks. Vallandav tingimus lihtsalt lakkab olemast.
Oli ka üks meeldiv boonus. Kaks voogu tähendasid kaht kliendi-ja-taustasüsteemi WebSocket-ühendust ning kaht taustasüsteemi-ja-teenusepakkuja ühendust; üks miksitud voog kokkusurus selle üheks ja üheks. Nööpkõrvaklappide vea parandamine poolitas meie transkriptsioonikulu kõrvalmõjuna.
Aga mono miksimisel on ilmne probleem: kui segad mõlemad inimesed üheks kanaliks, kuidas sa ikka veel tead, kes mida ütles? Oled ju minema visanud just selle eralduse, mis sulle seda ütles.
"Kes rääkis" taastamine energiast
Vastus oli mõõta iga allika valjust enne nende miksimist ja lisada igale helitükile vihje, milline allikas domineeris — mikrofon, süsteem või vaikus. Valjem allikas võidab. Kõlaritega piisavalt lihtne.
Nööpkõrvaklapid vajasid veel üht kihti, ja siin naaseb kaja loosse — suunatuna vastupidiselt sellele, mida arvata võiks. Nööpkõrvaklappidega lekib teise inimese hääl kõrvaklapist välja ja tagasi mikrofoni. Nii et ilma ettevaatuseta omistatakse tema kaja, mis saabub su mikrofonikanalile, sinule. Parandus on hulk kaja-teadlikke lävendeid: kui süsteemiheli mängib üle väikese põranda, hüppab latt, mille su mikrofon peab ületama, et lugeda "sinu rääkimiseks", järsult üles — normaalselt väärtuselt 0.015 väärtusele 0.1. Teisisõnu: kui teine inimene räägib, peab su mikrofon olema selgelt ja üheselt valjem kui tema kaja, enne kui me sõnad sinule krediteerime. Mitmeti mõistetavad kaadrid vaikimisi loetakse "süsteemiks", eeldusel, et need on kaja. See on tahtlik kalle, mis saab omistamise õigeks just selles olukorras, mis sai varem valeks.
See kontseptsiooni tõestus — mono miksimine pluss energiapõhine, kaja-teadlik hääletuvastus — on selle omistamissüsteemi eellane, mida GeekBye täna kasutab. Tellingud rebiti välja samas väljalaskes, niipea kui need end tõestasid, ja energiamatemaatika kõvenes hiljem korralikult testitud mooduliks. Aga v1.6.12 on see, kus idee sündis — surve all, kasutaja poolt, kellel oli paar nööpkõrvaklappe.
Kolm asja, mida nööpkõrvaklappide viga õpetas
- Terve käepide võib kanda surnud andmeid. Kogu juurdlus pöördus selle ümber, et usaldasime oma energiamõõdikut rohkem kui platvormi staatuslippe —
live,enabled,unmuted, kõik valetasid, samal ajal kui heliproovid olid nullid. Jälgi sisu, mitte API enesearuannet. Kui voog väidab, et on korras, mõõda, kas ta tegelikult on. - Kui platvorm võitleb su arhitektuuri vastu, muuda arhitektuuri — mitte platvormi. Me ei suutnud Chromiumi tagasisidekaitset üle vaielda ning iga katse seda äärtel keelata ebaõnnestus või lõi tagasi. Jälgitava tingimuse eemaldamine — kaks voogu saab üheks — pani kogu probleemi kaduma. Peaaegu alati on odavam vallandaja eemaldada kui brauseriga võitu saada.
- Kui koondad kanaleid töökindluse nimel, pead uuesti üles ehitama selle, mille hävitasid. Mono miksimine tappis kanalite eralduse, mis kandis "kes rääkis". See info tuli uuesti tuletada miksimis-eelsest energiast ja kaja-teadlikest lävenditest. Kompenseeriv loogika pole paranduse järelmõte — see on pool parandusest.
See on neljas peatükk töökindluse loos, mis saab GeekBye v2-ks. Eelmise peatüki jaoks vaata katkenud ühendus ei tohiks kogu su rakendust kokku kukutada (v1.6.8); torustiku ümberkirjutamise jaoks, millele see helitöö toetus, me kustutasime 5000 rida helikoodi (v1.6.0); ja kogu kaare jaoks tarkvara täiuseni tarnimise anatoomia.