Vi troede modellen var problemet. Den var ikke.
Et speaker-identification-eksperiment på telefonopkald gik gennem fem runder — fra en konklusion om at 8kHz-telefonlyd 'drukner stemmeidentitet' (EER 35-45%), over et metodegennembrud (82-92% på et rigtigt guldsæt), til et realitetstjek der styrtdykkede til 59,5% på blinde opkald. Løsningen var ikke en bedre model — det var at opdage, at 68% af de 'enkelt-taler'-klip faktisk indeholdt to stemmer. Renset for det: 87,2% nøjagtighed, AUC 0,856.
Vi har en pipeline, der transskriberer og opsummerer tusindvis af telefonopkald. Et af de sidste, uløste problemer var enkelt at formulere og forbandet svært at løse: hvem taler egentlig i hvert opkald?
Diarization (at splitte lyd op i “taler A” og “taler B”) virker fint på det tekniske plan — men at vide hvem taler A og B er som mennesker, er en helt anden opgave. Vi prøvede i fem runder. Den femte gav endelig svaret — men ikke det svar, vi forventede.
Dette er et opfølgende indlæg til fem alternativer til pyannote og den fulde voicelog-pipeline. Ingen navne, telefonnumre eller virksomhedsdetaljer optræder i dette indlæg — kun metoden og tallene.
Udgangspunktet: “kanalen dominerer identiteten”
De første tre forsøgsrunder konkluderede noget deprimerende: på 8kHz-telefonlyd drukner stemmeidentitet i støj fra telefonlinjen og codec’et. En moderne speaker-embedding-model (ECAPA-TDNN) kunne knap skelne to forskellige mennesker fra hinanden bedre end tilfældigt gæt, målt ved en Equal Error Rate på 35-45%.
Konklusionen virkede solid. Den var forkert.
Runde 4: at stille spørgsmålstegn ved sin egen metode
Vi bad en anden model om at kritisere vores eget arbejde adversarielt — uden at være investeret i konklusionen. Den fandt to fatale metodefejl:
- Cirkulære labels. Vores træningsdata kom fra pipelinens egne speaker-labels — den samme pipeline, vi prøvede at forbedre. 40% af kaldene havde kollapset diarization (ét navn på hvert segment). Vi målte støj mod støj.
- Forkert opgave. Vi målte cross-call-verifikation (er stemme A fra kald 1 samme person som stemme B fra kald 2?), men den rigtige opgave er meget lettere: inden for ét opkald, hvilken af de to klynger er linjeejeren? Her går den delte telefonkanal ud i differencen — den nøjagtige confound, vi troede dominerede alt.
Vi genopbyggede et guldsæt fra transskript-selvintroduktioner (“det er [navn]”) i stedet for pipeline-labels, og re-scorede de samme embeddings på den rigtige opgave. Resultat: 82-92% nøjagtighed. Samme model. Samme data. Bare målt rigtigt denne gang.
Realitetstjekket der ikke stemte
Før vi fejrede, testede vi metoden blindt på de 100 seneste rigtige opkald — ikke det kuraterede guldsæt, bare almindelige samtaler.
59,5% enighed med pipelinens eksisterende labels. Stort set møntkast.
Og konfidensen var omvendt kalibreret: jo mere sikker modellen var, jo oftere tog den fejl. Det er ikke støj. Det er et systematisk problem.
Fem forsøg til at lukke gabet — ingen af dem virkede
Vi prøvede:
- Tekst + adfærdsfusion (ordvalg, taletidsandel, turtagning): 92% på guldsættet, 100% på det ene kendte svære forvekslingspar. Kollapsede til identisk 62% på blinde rigtige kald — samme selektionsbias som guldsættet selv.
- Kanal-fingeraftryk (udnytte at linjeejerens side af hvert opkald går gennem samme udstyr): tæt på tilfældigt. Viste sig at hele opkaldet — begge talere — deles om én mono-optaget kanal, så der findes ikke en separat “ejer-kanal”-signatur at finde.
- Domænetilpasning via Common Voice: her kom det første rigtige gennembrud i forklaringen, ikke løsningen. Vi tog en helt uafhængig dataset med pålidelig ground truth, kørte den gennem vores telefonsimulering, og testede den samme model: 100% på ren tale, 98,7% på telefonsimuleret tale. Modellen kan sagtens håndtere telefonlyd. Vores grundantagelse siden runde 1 var forkert.
- Formant/pitch-landmarks (Shazam-inspireret): reelt signal, men underpræsterede akustik.
- En trænet meta-klassifikator over alle sensorer samtidig: slog ikke den simple akustiske model alene.
Den manuelle mærkning der løste det
Vi byggede en mobilvenlig side, hvor et menneske kunne bekræfte: er dette lydklip linjeejeren, eller en anden? Tilfældig stikprøve — ingen automatisk forudindtagethed.
68% af klippene indeholdt hørbare spor af BEGGE talere.
Vi testede, om det bare var vores klip-metode: byggede den om fra bunden (færre, længere segmenter, kanttrimning, pauser mellem sammensplejsninger). Samme rate, til decimalen: 68,2% før, 68,2% efter.
Kapitlet der lukker historien
Vi scorede kun de klip, et menneske havde bekræftet var rene, fra en helt tilfældig population.
87,2% nøjagtighed. AUC 0,856.
Modellen har aldrig været problemet. Problemet var, at op mod 2 ud af 3 “enkelt-taler”-klynger faktisk indeholder to personers stemmer.
Bonusfundene undervejs
Menneskelig verifikation afslørede tre reelle fejl i vores kontaktregister, som ingen havde opdaget — fejlagtigt sammenblandede personer, et familiemedlem forkert registreret som forretningskontakt, og et navn indtastet forkert for år siden.
Det vi tager med os
- Mistro din egen evalueringsmetode, især hvis labels stammer fra det system, du prøver at forbedre.
- Test på en population, du ikke selv har kurateret.
- Split confidence fra korrekthed. Et velkalibreret system bliver mere præcist, når det er mere sikkert — sker det modsatte, leder du efter det forkerte problem.
- Simple metoder vinder, indtil du har data nok til at retfærdiggøre kompleksitet.
- Menneskelig verifikation er stadig den billigste vej til sandheden, når du ved præcis, hvilket spørgsmål du skal stille.
Se også fem alternativer til diarization for det tekniske trin, der kommer før dette — at splitte lyd op i talere, inden man forsøger at identificere dem — og Whisper-backend-sammenligningen for transskriptionslaget under det hele.