Taligenkänning (ASR)
Kunna förklara CTC och encoder–decoder-ASR och köra Whisper-liknande modeller.
Förkunskaper
- DTransformers — arkitekturenkrävs
- EMel-skala och MFCCkrävs
Intuition
Grundproblemet i ASR: ljudet har tusentals ramar, transkriptionen har tiotals tecken, och ingen säger var gränserna går. Två familjer av lösningar:
CTC. Låt modellen gissa ett tecken per ram, med ett extra «blank»-tecken. Slå sedan ihop upprepningar och ta bort blanks: h h _ e e j j → hej. Träningen summerar över alla vägar som ger rätt utdata. Snabbt, strömmande, men varje ram avgörs oberoende — ingen språkmodellering inbyggd.
Encoder–decoder. Encodern kodar hela ljudet, decodern genererar text token för token och får titta på ljudet via cross-attention. Bättre språkriktighet, men inte strömmande och kan hallucinera text som inte sades.
Whisper är encoder–decoder, tränad på 680 000 timmar svagt märkt ljud från webben — och just den skalan, inte arkitekturen, är förklaringen till att den är robust mot brus och brytning.
Formellt
CTC-förlusten. För ljudramar och måltext med : låt vara funktionen som slår ihop upprepningar och tar bort blanks. Då är
Summan över exponentiellt många vägar beräknas i med framåt–bakåt-algoritmen — samma dynamiska programmering som i dolda Markovmodeller.
WER (word error rate) är redigeringsavstånd på ordnivå:
där , , är substitutioner, strykningar och insättningar och antal ord i facit. WER kan överstiga 100 % (många insättningar).
Normalisera innan du mäter — annars mäter du formatering, inte igenkänning: gemener, bort med skiljetecken, siffror till ord eller tvärtom konsekvent. En orimligt hög WER beror oftare på att «5» jämförs med «fem» än på modellen.
Svenska i praktiken:
| Val | Effekt |
|---|---|
language="sv" explicit | undviker att modellen gissar språk och transkriberar till engelska |
| KB-Whisper i stället för generisk | tränad på svenskt material, märkbart lägre WER |
| VAD-segmentering före | minskar hallucinationer i tysta partier kraftigt |
condition_on_previous_text=False | bryter loopar där modellen upprepar samma fras |
Den tredje raden är den viktigaste i praktiken: Whisper-modeller hallucinerar helst i tystnad, och en enkel röstaktivitetsdetektor före transkriberingen tar bort det mesta.
Kod
import re, jiwer
from transformers import pipeline
asr = pipeline("automatic-speech-recognition", model="KBLab/kb-whisper-small",
chunk_length_s=30, return_timestamps=True)
ut = asr("mote.wav", generate_kwargs={"language": "sv", "task": "transcribe",
"condition_on_previous_text": False})
NORM = jiwer.Compose([jiwer.ToLowerCase(), jiwer.RemovePunctuation(),
jiwer.RemoveMultipleSpaces(), jiwer.Strip(),
jiwer.ReduceToListOfListOfWords()])
def wer(facit, hyp):
return jiwer.wer(facit, hyp, truth_transform=NORM, hypothesis_transform=NORM)
print(round(wer("Vi ses klockan tre på torsdag", ut["text"]), 3))
# Hallucinationsdetektor: samma fras upprepad i följd
def misstankt(text, n=3):
ord_ = text.lower().split()
for i in range(len(ord_) - 2 * n):
if ord_[i:i + n] == ord_[i + n:i + 2 * n]:
return True
return False
misstankt är ovärderlig i produktion: den fångar det klassiska Whisper-felet där en tyst passage ger «tack för att du tittade» om och om igen. Kombinera med tidsstämplar — ett segment med ovanligt många tecken per sekund är nästan alltid hallucination.
Behärskning innebär
- Förklarar skillnaden mellan CTC och encoder–decoder
- Mäter WER korrekt
- Väljer modell och inställningar för svenska
Logga in för att göra övningarna och bygga upp din behärskning.
Källor
- arXiv — Robust Speech Recognition via Large-Scale Weak Supervision — arXiv (öppen åtkomst; licens per artikel)
- Kungliga biblioteket — KB-Whisper — öppna modeller
- Graves m.fl. — Connectionist Temporal Classification (ICML 2006) — författarens kopia, fri läsning