Welke spraak-naar-tekst-engine kies je voor live, lokale transcriptie op de iPhone — en welke architectuur eronder beslist over de kwaliteit? Een keuzehulp plus de lessen uit het zelf bouwen.
Dit gaat niet over kant-en-klare dicteer-apps maar over de modellen en de streaming-architectuur eronder — opgedaan bij het bouwen van een on-device Nederlandse transcriptie-app en zijn experimentele forks (Apple, Whisper, Parakeet). De cijfers zijn eigen metingen op één toestel; gebruik ze als startpunt, niet als wet.
Vier vragen. De aanbeveling weegt taalondersteuning, latency-eis, download-budget en kwaliteit. Lawaai is (nog) informatief — die meting staat open.
Tik een kaart open voor de details. Latency hangt aan het streaming-type, niet aan de modelgrootte (zie les 03).
SFSpeechRecognizer+ De latency-winnaar voor Nederlands. Echte streaming-recognizer: vrijwel geen extra vertraging, toont woord voor woord. Regelt audio-sessie en error-recovery zelf.
− Oude API met scherpe randen: een silence-timeout, een ~60s-tasklimiet, en de beruchte stille-resume-bug (na een stilte valt de herkenning soms stil; speelt per 2026-06 nog steeds, lastig reproduceerbaar). Veel app-complexiteit (task-rotatie, generation-id's, utterance-reset) bestaat puur om die grilligheid te temmen. Closed-box: geen taal-forcing of tuning-knoppen.
SpeechAnalyzer (iOS 26)+ De moderne, snelle opvolger van SFSpeechRecognizer; echte streaming, ingebouwd in iOS 26.
− SpeechTranscriber.supportedLocales bevat geen Nederlands (geverifieerd 2026-06-07: de check faalt op nl-NL). Voor een NL-app dus onbruikbaar — je valt automatisch terug op de klassieke SF-engine. Voor Engels en een aantal andere talen wél de beste keuze.
+ Hoogste kwaliteit in stilte. Grootste woordenschat en sterkste taalmodel → vloeiend Nederlands, en repareert met volle context woorden achteraf (gemeten: "stemmusellaat" werd over twee passes "stemisolatie").
− Twee inherente prijskaartjes: niet-monotoon (een latere pass kan een al-correct woord terugdraaien — "Claude" → "Kloot") en proper-noun-drift naar de NL taal-prior ("Parakeet" → "parakiet"). Geen echte streaming → de re-transcribe-loop is verplicht. Hallucineert op stilte → de energie-poort is verplicht (zie 04).
+ Volledig lokaal, snelle TDT-inference, 25 EU-talen met auto-detect. Het echte streaming-model (EOU) is laagste latency — maar Engels-only.
− Voor Nederlands zit je vast aan het v3-batch-model in een pseudo-streaming-opzet (re-transcribe). Zonder forcing gokt het meertalige model de taal verkeerd bij koude inzet (Cyrillische rotzooi). Oplossing: NL forceren via de lager-niveau API (language: .dutch) plus de fix-vlaggen melChunkContext: false en dualDecodeArbitration: true tegen dropped clauses en Engels-bias.
De grootste les staat los van welk model je kiest. Beide niet-Apple-engines wonnen pas toen we de "slimme streaming"-aanpak (woord-voor-woord bevestigen via longest-common-prefix) lieten vallen. Het patroon dat overbleef is engine-agnostisch.
Transcribeer elke ~0,5s het hele lopende segment opnieuw, met volle context. Zodra de tekst ~1,6s niet meer verandert (de spreker pauzeert) → vastzetten, schoon segment beginnen. Geen verloren zinsbegin na stilte; bij verkeerde segmentatie raakt nooit tekst kwijt. De "slimme" aanpak faalde juist op wat een gesprek definieert: stilte, dan praten.
Whisper hallucineert op stilte ("Dank u wel", "Bedankt voor het kijken"). Poort op de piek-energie (RMS), niet op confidence. Gemeten: een hallucinatie had confidence 0,71 (hoog) bij energie 0,0005 (stilte). Een confidence-poort liet 'm door; de energie-poort niet. Speel ermee in 04 ↓.
Echte streaming (Apple) voegt vrijwel geen latency toe. Re-transcribe heeft een latency-vloer = één transcriptie-pass. Verrassend: zelfs het zware Whisper-large-v3-turbo q herleest een groeiend segment in ~1s, vlak tot 20s-segmenten (de ANE kauwt het weg). In lawaai kan een lagere confidence extra trage fallback-passes triggeren.
Een re-transcribe-engine voelt rustiger dan Apple, maar is objectief niet sneller — Apple streamt echt en heeft lagere latency. De rust komt van lagere update-churn: een paar bezonken updates in plaats van een zenuwachtige woord-voor-woord-stroom die zichzelf constant herschrijft.
Elke stip is een gemeten segment: echte spraak of een stilte-hallucinatie. Kies waarop de poort filtert en sleep de drempel. Doel: alle groene stippen toelaten én alle rode tegenhouden.
Alleen de oudste van de drie doet Nederlands on-device. Dat is precies het venster waarin een on-device NL-transcriptie-app waarde heeft: de moderne, snelle engine bestaat, maar niet voor deze taal — dus je bouwt óf op de grillige oude API, óf je brengt je eigen model mee (Whisper / Parakeet). Bron consumer-talen: Apple feature availability.