Hoppa till innehållet
AI-grafen
F· AI engineeringljud-och-tal· ca 90 min· volatil — kontrolleras ofta· verifierad 2026-09-20

Taligenkänning (ASR)

Kunna förklara CTC och encoder–decoder-ASR och köra Whisper-liknande modeller.

Förkunskaper

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 x1:Tx_{1:T} och måltext y1:Uy_{1:U} med T≫UT \gg U: låt B\mathcal{B} vara funktionen som slår ihop upprepningar och tar bort blanks. Då är

P(y∣x)=∑π∈B−1(y)∏t=1TP(πt∣x)P(y \mid x) = \sum_{\pi \in \mathcal{B}^{-1}(y)} \prod_{t=1}^{T} P(\pi_t \mid x)

Summan över exponentiellt många vägar beräknas i O(TU)O(TU) med framåt–bakåt-algoritmen — samma dynamiska programmering som i dolda Markovmodeller.

WER (word error rate) är redigeringsavstånd på ordnivå:

WER=S+D+IN\mathrm{WER} = \frac{S + D + I}{N}

där SS, DD, II är substitutioner, strykningar och insättningar och NN 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:

ValEffekt
language="sv" explicitundviker att modellen gissar språk och transkriberar till engelska
KB-Whisper i stället för generisktränad på svenskt material, märkbart lägre WER
VAD-segmentering föreminskar hallucinationer i tysta partier kraftigt
condition_on_previous_text=Falsebryter 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

Alla källor och licenser