Streaming ASR (automatic speech recognition) på Apple Silicon handler om én ting: lav latenstid. Når transskriptionen følger med, mens der stadig tales, bliver tale til tekst pludselig brugbart til live-undertekster, diktering i apps og realtids-søgning i lyd.
Her får du en praktisk, udviklerfokuseret gennemgang af, hvordan du kommer i gang med Parakeet streaming ASR på Apple Silicon via CoreML – og hvordan du typisk tænker det ind i en Swift-demoapp.
Hvad du bygger: “streaming” i praksis
I en klassisk “offline”-løsning optager du lyd, gemmer en fil og kører genkendelse bagefter. Streaming vender det på hovedet: du behandler lyd i små bidder (chunks/frames), og modellen leverer løbende delresultater, som gradvist bliver mere præcise.
Det betyder, at din app skal være god til tre ting:
- Stabil lydpipeline (konstant input, korrekt sample rate og format).
- Kontrolleret buffering (chunk-størrelser, overlap og timing).
- UI, der tåler ændringer (delresultater kan blive revideret undervejs).
Forudsætninger (kort og konkret)
Hardware og platform
Guiden tager udgangspunkt i streaming ASR på Apple Silicon med CoreML og en Swift-demoapp. Alt her handler om at få en model til at køre lokalt på Apple hardware med lav latency.
Det du typisk skal have klar
- En CoreML-kompatibel model til Parakeet streaming ASR.
- Et Xcode-projekt (Swift) til demoappen.
- En lydinput-løsning (mikrofon) med realtidslevering til din inferens-kode.
Trin 1: Få modellen ind i projektet (CoreML)
Målet er at kunne loade modellen deterministisk og køre inference på en baggrundskø.
- Tilføj modellen til projektet (typisk som en .mlmodel-ressource, hvis det er den form du arbejder med).
- Kontrollér build: Xcode skal kunne generere de Swift-typer, du bruger til at kalde modellen.
- Planlæg compute: Streaming ASR er mest brugbart, når du konsekvent får svar hurtigt. Overvej derfor at holde inferens væk fra hovedtråden fra start.
Trin 2: Byg en pålidelig lydpipeline
Din streaming-kvalitet afhænger mere af lydens “disciplin” end af UI’et. En typisk fejl i demoapps er ujævne audio callbacks og inkonsistente bufferstørrelser, som giver hakkende delresultater.
Det vigtige at beslutte
- Sample rate og kanalantal: hold det konsistent fra input til model.
- Chunk-størrelse: små chunks giver lav latency, men kan give mere støj i delresultater.
- Overlap: mange streaming-opsætninger arbejder med et glidende vindue, så modellen “hører” lidt bagud for stabilitet.
Praktisk implementering i en Swift-demo
Du vil typisk:
- Starte mikrofonoptagelse.
- Modtage PCM-buffere løbende.
- Konvertere/normalisere bufferformat til det, modellen forventer.
- Skubbe lyd ind i en ringbuffer eller kø, som inferens-laget læser fra.
Det afgørende er, at inferenslaget kan arbejde stabilt, selv hvis UI-tråden er travl.
Trin 3: Streaming-inferens med CoreML
Streaming ASR er ofte stateful: du “fodrer” modellen med nye frames, og den svarer med deltransskription. Det betyder, at du skal have en klar strategi for:
- Tilstand (state): hvad nulstilles ved “Start”, og hvad bevares mellem chunks?
- Timing: hvornår kalder du modellen – per chunk, per N chunks, eller på en fast cadence?
- Resultatfletning: hvordan samler du delresultater til en tekst, der giver mening for brugeren?
En robust “demo”-tilgang
I en Swift-demoapp er et pragmatisk setup ofte:
- En AudioCapture-komponent der kun leverer rå buffers.
- En ASREngine-komponent der står for CoreML-kald, state og resultatlogik.
- En ViewModel der kun modtager tekst-opdateringer og eksponerer dem til UI.
Så kan du teste, optimere og måle uden at alt hænger sammen i én ViewController.
Pro TipLog både “rå delresultater” og “stabiliseret tekst” hver for sig i din Swift-demo—så kan du se præcis, om jitter kommer fra audio-chunks, modelkald eller din egen fletningslogik.
Trin 4: UI og delresultater (så det ikke føles som en beta)
Streaming-transskription ændrer sig. Brugere accepterer det, hvis UI’et signalerer det rigtigt. En simpel, effektiv model er:
- Vis stabil tekst i normal stil.
- Vis midlertidig tekst (det, der kan ændre sig) i en svagere farve eller kursiv.
Det holder oplevelsen “rolig”, selv når modellen justerer ordvalg eller tegnsætning i takt med ny kontekst.
Trin 5: Fejlfinding – de klassiske problemer
1) Latenstid føles høj
Typiske årsager er for store chunks, for sjældne modelkald eller for meget arbejde på main thread. Sørg for, at inferens sker konsekvent og at UI-opdatering er letvægts.
2) Teksten “hopper” frem og tilbage
Det er ofte resultatfletning. Hvis du bare overskriver hele tekstfeltet med seneste output, føles det ustabilt. Flet i stedet delresultater, og “lås” tidligere dele, når de virker stabile.
3) Dårlig nøjagtighed
Start med audio: forkert format, clipping eller støj giver dårlige resultater uanset model. Tjek også, om din preprocessing matcher modellens forventninger.
4) Overophedning eller højt CPU/GPU-forbrug
Streaming betyder hyppige inference-kald. Skru på cadence, chunk-størrelse og hvor aggressivt du opdaterer UI. Demoapps bliver hurtigt “for ærlige” og opdaterer alt hele tiden.
Min vurdering
Det mest interessante ved Parakeet streaming ASR på Apple Silicon via CoreML er ikke, at det kan transskribere—det kan mange systemer. Det interessante er, at du kan bygge en realtidsoplevelse med lokal inference, hvor pipeline og produktfølelse bliver vigtigere end rå model-PR.
Hvis din Swift-demoapp får styr på de tre grundpiller (audio-disciplin, stabil inferens-cadence og fornuftig resultatfletning), ender du med noget, der føles som en feature, ikke et eksperiment. Og det er i praksis forskellen på “en model kører” og “en app virker”.
Næste skridt
Når demoen virker stabilt, giver det mening at:
- Tilføje simple målinger (latenstid pr. chunk, tid til første ord, FPS/UI-opdateringsrate).
- Teste med forskellige tale-situationer (hurtig tale, pauser, baggrundsstøj).
- Pakke ASR-motoren ind, så den kan genbruges i flere views og projekter.
Så har du en streaming ASR-kerne, du kan stole på – og som reelt udnytter Apple Silicon og CoreML på den måde, de er bedst til: hurtige lokale workflows med lav friktion.