v1.3 live in de App Store (Stemisolatie-hint) · de hefboom in lawaai is mic-richting (gemeten). Nieuw: een echte gebruiker zet Versta in als notitieboekje — de live build logt schoon, maar de persist-gap (tekst weg bij wegswitchen) is nu het echte risico. V·Switch 2.0 wisselt live tussen Apple, Whisper en Parakeet mét Apple-fallback; de open vraag — verdienen de model-engines hun accu + hitte terug? — wordt bij Orbit (25 juli) beslist.
[debug…]-regels. Weerlegd via verificatie: de live App Store-1.3 (READY_FOR_SALE, build 1780443185) bevat de strip-fix — geüpload 7 min ná de fix-commit, logt dus schoon. Les: voor "wat staat live" is ASC appStoreVersions de bron, niet build-status (= TestFlight; die misleidde mid-onderzoek met de vervuilde pre-fix-build die nooit naar de App Store ging). Het echte risico voor notitieboekje-gebruik = de persist-gap: Versta schrijft de transcript alleen weg bij stop/reset, niet bij pause() — en naar de achtergrond gaan/vergrendelen roept pause() aan → tekst kan verloren gaan. Voorgestelde (nog niet gebouwde) fix: persist-on-pause. Persist-gap in de Onderzoek-tab →…exp.switch) zodat de App-Store-Versta ongemoeid blijft. Fase A (de teardown zelf) bewezen: 64 engine-wissels, 0 WARN. Fase B (8/9 jun) af: instellingenscherm, één model per engine (Whisper 632MB — kleinere modellen waardeloos, grotere onbruikbaar traag), en het belangrijkste — een Apple-fallback met naadloze auto-switch + tekstbehoud (verbergt de trage model-compile achter een meteen werkende app), plus de hele cosmetische ronde (statusbalk onderin, tekst-rotatie-toggle). Fase C nog open: model-opslag-sectie + wis-functie (verborgen modellen stapelen in App Support, niet via Bestanden wisbaar → FileManager.removeItem). Engine-matrix in de Onderzoek-tab →AVAudioSession-opties (.mixWithOthers / A2DP-output behouden) die de mic openen zónder de output te kappen. NB — andere bug dan de "BT wordt mic-input"-kwestie (8 jun bewust níét gefixt: niet tegen iOS-default in vechten). (2) Interruption-handling (H3, code-review 10 jun): bij een binnenkomend gesprek/Siri lijkt de app te luisteren maar is doof — voor de doelgroep de ernstigste stille faalmodus, een aparte sessie waard. De code-review (subagent over heel V·Switch, 10 jun) fixte K1/K2/H1/H2/H6; nog open op severity: H3, H4, M2-M4 (o.a. geen herstel bij route-change/RØDE uitpluggen), M1, L1-L4.appStoreVersions → READY_FOR_SALE, build 1780443185). Eén nieuwe feature: een niet-blokkerende, eenmalig wegklikbare kaart die de gebruiker naar Stemisolatie (Apple's Voice Isolation) leidt voor beter verstaan in lawaai, plus een groene bevestiging als 't aan staat. De app blijft meteen bruikbaar — geen onboarding-flow. Build debug-vrij (#if !DEBUG strip-fix, commit 346aac5), 8 screenshots, metadata van 1.2 overgenomen. Onderbouwd door het WER-onderzoek — Stemisolatie is de enige gratis interne-mic-winst tegen lawaai. Open de Onderzoek-tab →appStoreVersions). Niet-blokkerende hint naar Voice Isolation + groene status als 't aan staat. Onderbouwd door het WER-onderzoek. Build 1780443185 (debug-vrij → logt schoon, ook geverifieerd op de live build). Bouwde voort op approved 1.2.pause() — en naar de achtergrond gaan/vergrendelen roept pause() aan → tekstverlies. Voorstel: persist-on-pause. Afgebakende, hoog-nut fix; nog niet gebouwd.task: .translate).V·Switch maakt dit een eerlijke A/B: dezelfde audio, live wisselen tussen Apple / Whisper / Parakeet. In stilte zijn Whisper en Parakeet Apple-vergelijkbaar of beter — maar het hele punt van een zwaardere engine is lawaai, en daar tegenover staan twee kosten: (1) accu + hitte (de model-engines compileren bij first-run en trekken bij continu gebruik de accu hard leeg; Apple is veel lichter), (2) latency (Parakeet/Whisper doen pseudo-streaming; Apple's SpeechAnalyzer is een echte streaming-recognizer). De gekaderde test: lees hetzelfde 15-zinnen-dictee in babble op de interne mic, vergelijk de WER met Apple's 13,3% én meet stroomverbruik + warmte per engine (~10 min continu). Onder 13,3% mét aanvaardbare accu → echt voordeel, serieuze lawaai-modus. Anders → Apple-default blijft, model-engines als opt-in. Beslissende meting: Orbit-festival 25 juli (met Bert, RØDE-richtmic + USB-verlengsnoer). V·Nemotron is al afgevallen (8 jun): streaming verliest van re-transcribe, ook op de beste tier.
Het WER-onderzoek liet geen twijfel: een externe richtmic halveert de fout (6,0% vs 13,3% intern). Drie routes: (a) een externe USB-C richtmic netjes ondersteunen + de gebruiker erheen coachen, (b) onderzoeken of de interne 4-mic-array softwarematig directioneel kan (setPreferredPolarPattern) — maar de cardioïde-test faalde hard (86%, verkeerde mic-zijde + kaal signaal), (c) accepteren dat dit hardware-afhankelijk is en het in de founder-story/marketing verwerken. Welke?
Mega-ASR-klasse engines (1.7B Qwen + LoRA op GPU) halen ~30% relatieve WER-winst in ruis, maar draaien niet on-device. Een knop "moeilijke omgeving" die audio naar een GPU-endpoint stuurt zou de bodem verschuiven, maar kost privacy + latency + geld en breekt de offline-belofte. Serieus apart bouwproject, geen middagklus. Eerst de gap meten — de benchmark-dataset is bruikbaar als eval zónder Mega-ASR te draaien.
Beslissing 13 mei: klein default-model (Whisper-tiny ~150MB of -small ~400MB quantized), Moshi-experiment bevestigde haalbaarheid. Versta draait nu op Apple's SFSpeechRecognizer (legacy-pad; de NL-opvolger is nog absent). Open: tiny of small als default? Past binnen WhisperKit of vereist refactor? In een v1.x of pas de v2-pivot? Vertaling als bijvangst.
Tycho 9 mei opende de tweede pijl (jij praat → ander leest) als product. Drie use-cases zitten in dezelfde knop: instructie, boodschap, ontvangen. Eigen knop / tab / landscape, of pinch-to-zoom als brug (groot zonder modus-omschakeling)? De ontvangen-modus bij 100 dB is nu fysiek verklaard (input-niveau, niet engine) — een richtmic is de echte fix.
Olivia 7 mei: huidige tekst "veel te lang" en AI slop. v1.3 nam de 1.2-beschrijving ongewijzigd over (alleen "Wat is nieuw" is nieuw), dus dit blijft open. Korter, persoonlijker, niet-technisch. Stem-referentie: reference_versta_anekdote + feedback_geen_em_dash.
Een vriend meldt dat zijn moeder — na jaren weer een iPhone, mede dankzij Versta — de app als notitieboekje wil gebruiken en de transcript-logs echt wil lezen. Onno's aanname: de App Store-build schrijft nog [debug…]-regels. Onafhankelijk geverifieerd i.p.v. de premisse napraten: code op main (= v1.3) strijkt alle [debug…-regels in release (#if !DEBUG, commit 346aac5); de live App Store-versie is via ASC appStoreVersions opgezocht → READY_FOR_SALE, build 1780443185, geüpload 3 jun 01:35 = 7 min ná de strip-fix → de live build bevat de fix. De vervuilde pre-fix-build (1780441193, 00:59) ging alléén naar TestFlight, nooit naar de App Store — build-status toonde die en misleidde mid-onderzoek; appStoreVersions gaf de echte productie-release. Les: voor "wat staat live in de App Store" is appStoreVersions (READY_FOR_SALE) de bron, niet build-status (= TestFlight). Kanttekening: v1.1/v1.2 stripten niet → een verse 1.3-install (de moeder) start schoon, maar meegesleepte oude logs houden hun [debug…]-regels. Geen re-ship nodig. Het echte risico voor notitieboekje-gebruik = de persist-gap (tekst weg bij wegswitchen/vergrendelen zonder stop) → voorstel persist-on-pause.
Een los maar verwant spoor naast de tekst-route: de stem van iemand op de dansvloer als geluid in je oren krijgen. Twee researchsporen + Grok convergeerden — latency-keten ~150-250 ms (MFi-Bluetooth domineert, non-issue voor mond-aan-oor zonder lipbeeld), nabijheid/mic-richting > software, Roger bewezen winnaar, DeepFilterNet geen wonder in muziek. Kantelend feit (Onno's eigen scherm): Live Listen heeft op iOS 26 nu zélf een stemisolatie-toggle én (Engelse) live-transcriptie — dat corrigeert de eerdere high-confidence-claim (van mij + Grok) dat Voice Isolation niet in Live Listen te forceren was (gold voor oudere iOS). Recept: Live Listen aan, stemisolatie aan, Oticon Intent-mics dicht via de Companion-app, iPhone-mic bij de mond. Besluit: geen app bouwen zolang de Apple-stack volstaat; enige open vraag is stemisolatie-kwaliteit op échte ~100 dB → thuis (Genelecs-babble) + Orbit 25 juli. Plus een "praat hier"-lockscreen gemaakt (toon-aan-vreemde). Toestel-correctie verankerd: Onno draagt ~1 jaar Oticon Intent (de wiki leunde op verouderde Phonak-reviews).
Code-review (subagent over heel V·Switch, 10 jun): K1/K2/H1/H2/H6 gefixt; nog open op severity — H3 interruption-handling (binnenkomend gesprek/Siri → app lijkt te luisteren maar is doof; voor de doelgroep de ernstigste stille faalmodus), H4, M2-M4 (o.a. geen herstel bij route-change/RØDE uitpluggen, WhisperKit-buffer groeit onbegrensd), M1, L1-L4. Hoorapparaat-mic + in-oor-spraak (10 jun, North-Star): Tycho's "BT wordt mic"-bug geherframed tot mogelijk kern-feature — op de dansvloer praat men tóch al in je oor, en de hoorapparaat-mic zit precies dáár → closeness maximaal (mond op ~5 cm vs telefoon op armlengte ≈ 15-20 dB SNR-winst). Werkt al in productie zonder code (.allowBluetoothHFP aan). Thuis-pre-test (15-zinnen-dictee in babble, voorlezer op ~5 cm van het rechteroor) beslist vóór Orbit of dit kern-feature of leuke theorie is. Versta Duo (PoC werkt 11 jun): aparte app — elke telefoon transcribeert eigen near-field mic en relayt alleen tékst via MultipeerConnectivity. Eigen cockpit: versta-duo.html. Apple Core AI (10 jun, WWDC 2026): nieuw framework vervangt Core ML, officiële Whisper large-v3-turbo + AOT-compilatie (= instant load, raakt cold-start én fallback-noodzaak); Parakeet-v3 model-request ingediend (issue #7). Vereist iOS 27 → v3-spoor.
De losse forks (V·Apple, V·Whisper, V·Parakeet) zijn samengebracht tot één engine-agnostische app op branch feature/engine-switch-teardown (bouwt als V·Switch, …exp.switch; de App-Store-Versta blijft ongemoeid). Fase A — de teardown zelf: engine als verwisselbaar component achter de pijplijn, bewezen met 64 live wissels en 0 WARN. Fase B (8/9 jun) — uitgebouwd instellingenscherm met een tandwiel in de onderbalk; één model per engine (Whisper 632MB; submenu's eruit — kleinere modellen waardeloos, grotere onbruikbaar traag); een Apple-fallback met naadloze auto-switch + tekstbehoud die de trage model-compile verbergt achter een meteen werkende app; plus de cosmetische ronde (statusbalk onderin, tekst-rotatie-toggle). Onno: "naadloos, fantastisch". Fase C nog open: model-opslag-sectie + wis-functie (FileManager.removeItem voor de verborgen modellen in App Support). Naast de UX-winst dichtte dit een open vraag: de trage dev-loop-compile bleek grotendeels een debug-artefact (Xcode/devicectl-installs nemen sowieso een uncached ANE-pad) — of een échte App Store-update de compile-cache behoudt is alleen via TestFlight te meten.
NVIDIA's Nemotron-3.5-ASR-Streaming (uitgebracht 6 jun) leek de heilige graal: échte cache-aware streaming, meertalig incl. NL, on-device via dezelfde FluidAudio-SDK als Parakeet — lage latency (Apple's enige voordeel) mét NL. In één avond gebouwd (…exp.nemotron). Maar Onno's test (8 jun): slecht in stilte — verhaspelt, mist losse woorden én hele zinnen, vooral na een pauze. Slechter dan Parakeet/Whisper/Apple. Zelfs op de beste tier (1120ms + flush-op-pauze + warmup) geen verbetering. Gecontroleerde conclusie: V·Parakeet (NVIDIA, 0.6b, FluidAudio, NL, re-transcribe) = goed; V·Nemotron (zelfde leverancier/grootte/SDK/taal, streaming) = slecht → de enige variabele is streaming-decoding, dat kost de kwaliteit (minder context per decode). Onafhankelijk bevestigd door Joel (getmoshi.app), die Nemotron in batch inzet, niet streaming. Geparkeerd, niet weggegooid: de engine blijft herbruikbaar zodra er een beter streaming-NL-model komt; research-reminder ~15 jun naar FluidAudio-streaming-best-practices (Onno's instinct: een 0.6b dat hele zinnen mist ruikt naar een fixbare config).
Onno ontdekte Parakeet-0.6b-v3 (NVIDIA) in de Moshi-app — meertalig, NL ✓, on-device. In één avond/nacht een experimentele Versta-fork gebouwd (~/Developer/useful-apps/Versta-Parakeet/, "V·Parakeet") met de spraak-engine vervangen door Parakeet-TDT-0.6b-v3, volledig on-device CoreML/ANE via FluidAudio — geen SFSpeech-permissie meer nodig, alleen microfoon. Live iteratief: Onno testte elke build op de iPhone, ik analyseerde de device-logs. Het kantelpunt (it.5): wég van de sliding-window naar een re-transcribe-loop met commit-op-stabiliteit + geforceerd Nederlands (language: .dutch) + de #594-fixes — dat haalde de koude-inzet-verliezen, het Cyrillisch én de hoge latency in één klap weg. Daarna een stilte-poort (energie-gate) tegen ruis-hallucinatie, laad-UX en persistente tuning. Resultaat in stilte: ~90% accuraat, "vergelijkbaarder met het Apple-model". Aanbevolen config: interval 0,4s / commit 1,6s / silenceFloor 0,02. Eén open vraag: de lawaai-test vs Apple. Onderzoek-tab →
Feature: Stemisolatie-hint — niet-blokkerende, eenmalig wegklikbare kaart die de gebruiker naar Voice Isolation leidt, plus groene status als 't aan staat. Tikken opent de systeem-mic-modus-UI (showSystemUserInterface(.microphoneModes)); de app leest activeMicrophoneMode voor de bevestiging. Geen wijziging aan spraak-logica, privacy of dataflow. Build 1780443185, 8 screenshots (01-08), export-compliance OK → ingediend, en inmiddels goedgekeurd en live (geverifieerd 15 jun via ASC: READY_FOR_SALE).
Productie-app had UIFileSharingEnabled → gebruikers zagen [debug-modern]-regels in versta-log.txt. appendToLog (beide managers) strijkt nu [debug-regels weg in release-builds (#if !DEBUG); dev-builds houden ze. Op iPhone geverifieerd (Release-build → verse log: alleen transcripten, 0 debug-regels), commit 346aac5. De lopende 1.3-submissie geannuleerd en met de schone build opnieuw ingediend. Versie-hygiëne-bug ook gefixt: Info.plist verwees naar hardcoded versie/build (kostte eerder een geweigerde upload) → nu $(MARKETING_VERSION)/$(CURRENT_PROJECT_VERSION).
Eigen meet-app (~/Developer/useful-apps/Versta-Lab/): live wisselen tussen strategieën onder identieke audio-pijplijn + Diagnostics-HUD (hartslag, mic-niveau dBFS, klapper-maat, resume-latency, resume word loss, mic-route). Daaroverheen Onno's idee, het kantelpunt: 15 vaste NL-zinnen voorlezen in babble (via 2 Genelecs) en de WER per blok/conditie meten. Geen gevoel meer, maar cijfers. Volledige matrix in de Onderzoek-tab →
Apple's SFSpeechRecognizer on-device gebenchmarkt op 2500 EN-samples (Voices-in-the-Wild-Bench / NOIZEUS) → 30,7% WER totaal, echo/galm veruit het ergst (47-66%). Tooling buiten de vault in ~/Developer/versta-benchmarks/. De wekelijkse Apple-NL-watcher bevestigt: het NL-spraakmodel (Live Captions + SpeechTranscriber) is nog steeds absent — productie draait op de oude recognizer.
Twee hypotheses bewust níét als bevinding verkocht: (1) "AGC-uit helpt" — schone meting weerlegt het: WER gelijk (uit 19,3% / aan 18,0%), stabiliteit juist béter mét AGC (9× rood vs 19×). De eerdere indruk was een meetartefact. (2) Interne cardioïde (setPreferredPolarPattern(.cardioid)) = 86,0% WER — activeert de voorkant-mic (schermzijde) i.p.v. de onderkant én sluit Apple's voice-processing uit. Interne software-richting = harde doodlopende weg.
Populaire arXiv-paper (Tsinghua, Apache 2.0): ASR getraind op 2,4M ruis-samples, ~30% relatieve WER-winst in moeilijke akoestiek. Niet als Versta-engine — het is 1.7B Qwen + LoRA onder vLLM op een GPU, geen on-device drop-in. Wél bruikbaar: de benchmark-dataset als eval (gap meten zónder het model te draaien) en als blauwdruk voor een eventuele cloud-fallback. Dit was de aanleiding die de hele meet-sessie startte.
De versta-improver launchd-job (elke nacht 03:00 een variant op de iPhone, sinds 18 mei) is uitgeschakeld; experiment-bord + runs naar _archief/. Reden: het WER-onderzoek beantwoordde precies de vragen die de pijplijn najoeg (welke stilte-strategie wint? → geen) en bewees ze overbodig. De één gemergde winst blijft: confidence-weg (meter uit de UI). De experiment-dashboard-snapshot blijft als historisch overzicht staan.
Op of vlakbij dansvloer (~100 dB) sprak Tycho complimentjes in over wat de DJ deed; liet de tekst aan de DJ lezen. Spontane positieve reacties van vreemden, geen prompt vooraf. Tweede gebruiksmodus die toevallig in dezelfde knop zit: jij praat → ander leest (mic op 5-10 cm, ontvanger heeft geen audio nodig — omzeilt het ASR-noise-probleem volledig). 5e onafhankelijke wow-validatie. Open beslissing: first-class maken of in pinch-to-zoom absorberen?
Launch-post 6 mei: 2.595 impressies, 71 reacties, ~20 echte comments, 19 installs op 6 mei. Founder-story 12 mei: duizenden views, ~90 emoji's, ~20 reacties. Solide compounding-bouwsteen — bewijst dat WhatsApp + LinkedIn + App Store-combo lading geeft. Pre-mortem revisie #6 afgehandeld.
v1.1 goedgekeurd en live (175 territories). Diezelfde dag, vooraan bij Chef'Special: jongeren met prima gehoor reageerden enthousiast en installeerden de app meteen zelf. Mainstream-appeal bevestigd. Bug-signaal: gebruikers praten niet dichtbij genoeg → mic-afstand-UX (nu fysiek verklaard door het WER-onderzoek).
Submission was clean. Eerste v1.1 ging op 5 mei live (binnen ~1u CDN), v1.2 volgde erna. Cross-device sync werd niet meegenomen in v1.2 — verschoven naar v1.x-Inbox als gevolg van Olivia's rooms-uitbreiding (multi-peer i.p.v. 1-op-1).
Lessen voor v1.3: Notes for Reviewer met preempt op 4.2 + screenshots-disclosure + UGC-clarification was doorslaggevend. Industry-baseline van ~60% first-time approval gehaald op eerste poging.
Goedgekeurd en live in de App Store (geverifieerd 15 jun via ASC appStoreVersions → READY_FOR_SALE). Eén nieuwe feature t.o.v. 1.2: een niet-blokkerende, eenmalig wegklikbare kaart die de gebruiker naar Stemisolatie (Apple's Voice Isolation) leidt, plus een subtiele groene bevestiging onderaan als 't actief is. App blijft meteen bruikbaar (geen onboarding). Description/keywords ongewijzigd van 1.2 overgenomen; alleen "Wat is nieuw" + 3 nieuwe screenshots (06-08, Stemisolatie-flow).
Getriggerd door notitieboekje-gebruik (een gebruiker wil de transcript-logs lézen). Aanname "App Store-build schrijft nog [debug…]-regels" weerlegd: code op main strijkt ze in release (#if !DEBUG, commit 346aac5) en de live versie is build 1780443185, geüpload 7 min ná die fix. De vervuilde pre-fix-build 1780441193 ging alléén naar TestFlight. Les: voor "wat staat live" is appStoreVersions (READY_FOR_SALE) de bron — build-status toont de TestFlight-state en wees mid-onderzoek de verkeerde build aan. Een verse 1.3-install start schoon; alleen meegesleepte logs van v1.1/v1.2 (die stripten niet) houden oude regels. Geen re-ship nodig. Echte open issue voor notitieboekje-gebruik = de persist-gap (zie Status / Onderzoek).
appendToLog (beide managers) strijkt [debug-regels weg in release-builds; op iPhone geverifieerd (verse versta-log.txt = alleen transcripten). Commit 346aac5, schone build opnieuw ingediend.$(MARKETING_VERSION)/$(CURRENT_PROJECT_VERSION)), voorkomt de eerder geweigerde upload.reference_versta_anekdote + feedback_geen_em_dash.Olivia 7 mei: na korte stilte begint Versta vaak niet of pas na 1-2 zinnen. Ook in Apple Notes dictation reproduceerbaar. Na drie reproductie-tests + log-analyse: niet sluimer, maar AGC-recalibratie (Automatic Gain Control, onderdeel iOS Voice Processing I/O Unit).
Mogelijk conflict in huidige config: AVAudioSession.mode = .measurement (minimaliseert audio-processing) + setVoiceProcessingEnabled(true) (max audio-processing). Apple-docs vaag; in praktijk: mode wint waarschijnlijk → effectief geen VP. Mogelijk draaien we al zonder AGC zonder het te weten.
Update 3 jun — gemeten: de ground-truth-WER weerlegt de AGC-stilte-hypothese grotendeels. AGC-uit verbetert de WER niet (uit 19,3% / aan 18,0%) en de resume-"bug" kost weinig woorden (blok B 4,3%). De multi-speaker-zwakte blijft reëel, maar de échte hefboom bleek mic-richting, niet de gain-laag. Volledige matrix in Onderzoek →
De 4-modi debug-build van 9 mei gaf richting, maar werd uiteindelijk overgenomen door de nachtelijke experiment-pijplijn (sinds 18 mei): specifieke ingrepen op het probleem in plaats van log-vergelijkingen tussen audio-configs.
.measurement zonder VP?Aanvullend spoor — hardware: RØDE VideoMic Me-C+ binnen 12 mei. JBL PartyBox vervolg-thuistest staat klaar (vergelijking met 4 mei interne-mic-baseline). Als hardware-mic het 100 dB-probleem op zichzelf oplost, verschuift het AGC-spoor naar v2/Whisper-fork i.p.v. nog meer iOS-trucs.
Afloop 2-3 jun: dit AGC-spoor is afgesloten. De nachtelijke experiment-pijplijn is opgeheven en vervangen door een ground-truth-WER-meting. Uitkomst: geen van deze sporen (chain/timer/keepalive/vad/gate/AEC) verslaat Apple's Baseline; de hardware-mic deed dat wél (13,3% → 6,0%). Zie Onderzoek →
versta-log.txt wacht op uitlezen via xcrun devicectl.Accuracy + batterijverbruik in bass-zware setting getest. Resultaat: research/lawaai-test-2026-05-04.md in vault.
Alle externe + interne feedback nu chronologisch in één log: _Projects/Versta/feedback-log.md. Categorieën: bug · ui · feature · wow · use-case. Status-flow: new → triaged → scheduled (vX.Y) → done. Triage-ritueel zondagavond. Alleen scheduled items met versie-target krijgen een Kanban-kaart.
Dit onderzoek draaide de eigen aanpak om. We begonnen met "los de stilte-resume-bug op in software" (vier nachtelijke varianten) en eindigden met het gemeten bewijs dat dat het verkeerde probleem was. Het kantelpunt was Onno's idee: stop met op gevoel oordelen, lees een vaste tekst voor en bereken de WER. De aanleiding was een inbox-notitie over een ruis-ASR-paper (Mega-ASR); de uitkomst is een verdedigbare, ingediende App Store-feature.
Eén app (~/Developer/useful-apps/Versta-Lab/, bundle com.terwisscha.verstalab) waarin je live wisselt tussen strategieën onder een identieke audio-pijplijn, met een HUD die meet i.p.v. raadt:
Drie blokken met bewuste verstoringen: blok A schone basislijn (zin 1-5), blok B na een stilte-pauze van ~8s (meet resume), blok C na de mic even naar de speakers te draaien (meet mic-vergrendeling op ruis). Per conditie één opstelling, "Opnieuw luisteren" tussendoor, ruis constant via 2 Genelecs (voice_babble). WER = (vervangingen + weglatingen + invoegingen) ÷ referentiewoorden. Lager is beter — 0% perfect, 100% alles fout.
Apple's SFSpeechRecognizer on-device gebenchmarkt op 2500 EN-samples (Voices-in-the-Wild-Bench / NOIZEUS): 30,7% WER totaal, echo/galm veruit het ergst (47-66%). Dit is de bodem waar mic-richting niet onderuit komt — die verschuift alleen met een betere engine. De NL-opvolger van Apple (SpeechTranscriber) is nog steeds absent (wekelijkse watcher), dus productie draait op de oude recognizer. Tooling: ~/Developer/versta-benchmarks/.
De paper die de sessie startte (Tsinghua, Apache 2.0): ASR getraind op 2,4M ruis-samples, ~30% relatieve WER-winst in moeilijke akoestiek. Maar het is 1.7B Qwen + LoRA onder vLLM op een GPU (min. 8GB) — geen drop-in voor on-device Versta. Relevantie zit elders: (1) de benchmark-dataset als eval om de huidige gap te meten zónder het model te draaien, (2) als blauwdruk voor een optionele cloud "ruis-modus" — die de offline/privacy-belofte breekt, dus een serieus apart bouwproject.
Als mic-richting de bodem niet onderuit haalt, blijft één hefboom over: een betere engine. V·Parakeet is dat experiment, nu gebouwd. Een Versta-fork waarin Apple's recognizer vervangen is door NVIDIA Parakeet-TDT-0.6b-v3 (~600-700MB, NL + 24 EU-talen, auto-detect), volledig on-device via FluidAudio (CoreML/ANE, gepind v0.15.0). Model wordt bij eerste start gedownload; daarna 100% lokaal, alleen mic-permissie — geen SFSpeech meer.
language: .dutch-hint (geen Cyrillisch meer) + de #594-fixes (melChunkContext:false, dualDecodeArbitration:true) tegen dropped clauses + Engels-drift. Koude-inzet-verlies na stilte verdween (zin 1/7/11 weer perfect).Zolang elke engine in een eigen fork zat, was er geen eerlijke vergelijking en geen product. V·Switch lost dat op: de productie-Versta is opengebroken zodat de engine een verwisselbaar component wordt achter één gedeelde audio-pijplijn. Je kiest live via een tandwiel in de onderbalk. Gebouwd als aparte app (…exp.switch, branch feature/engine-switch-teardown) zodat de App-Store-Versta ongemoeid blijft.
FileManager.removeItem. Afgebakende bouwklus.SFSpeechRecognizer, debug-build van productie (pullbaar, mét logging) voor een eerlijke vergelijking. Echte streaming-recognizer → laagste latency, lichtste accu. De maatstaf: 13,3% WER intern in babble.Xcode-debug-meting (9 jun): de eerste ANE-compile van een 600MB-model piekt op ~2,33 GB geheugen (Whisper, 17 Pro Max). Dat overschrijdt de jetsam-limiet (~2,0-2,2 GB) van 4GB-toestellen (SE 2/3, 11, 12/12 mini, 13 mini) → daar verwacht ik een harde jetsam-crash bij de eerste compile. Op 12GB-toestellen geen geheugenprobleem (hooguit een zeldzame transiënte watchdog onder verzadiging). De compile draait correct async (main idle, queue com.apple.anef.p4) → geen code-fix, de mitigatie is een device-capability-gate: zware engines verbergen op low-RAM-toestellen. Parakeet is lichter (483MB-model → lagere piek, nog schoon te meten). NB: de ANE-compile wordt na de eerste keer naar schijf gecached → op een echte install is de piek een eenmalige first-use-kost. Dit weegt mee in de Apple-vs-model-beslissing: de model-engines zijn niet alleen zwaarder voor accu/hitte, maar mogelijk ook gewoon onbeschikbaar op een deel van het toestellenpark.
Het leek de doorbraak: échte cache-aware streaming, NL, on-device, lage latency. Maar de gecontroleerde vergelijking isoleert de oorzaak: V·Parakeet (re-transcribe) is goed, V·Nemotron (streaming) is slecht — zelfde leverancier (NVIDIA), grootteklasse (0.6b), SDK (FluidAudio) en taal. De enige variabele is de decode-modus. Re-transcribe her-decodeert het hele segment (veel context); streaming decodeert per chunk (weinig context) → mist losse woorden en hele zinnen, vooral na een pauze. Onafhankelijk bevestigd: Joel (getmoshi.app) zet hetzelfde model in batch in, niet streaming — "better accuracy and speed". Versta's live on-device streaming-NL blijft dus een differentiator die zelfs een volwassen app niet doet; het kost alleen (nog) kwaliteit. Research-reminder ~15 jun: FluidAudio-streaming-best-practices (preprocessing, context-tiles, decoding) — als er een knop blijkt, heropenen.
De WER-meting wees capture (SNR) aan als de grootste hefboom in lawaai — vóór welke engine dan ook. Doel: betere SNR, het liefst zonder dat gebruikers een richtmic moeten kopen. Bij Orbit (met Bert, één mic per sessie, reset ertussen) worden deze naast elkaar gemeten op een echte ~100 dB-dansvloer:
.allowBluetoothHFP aan). Tegenkrachten: BT-spraakprofiel = lagere kwaliteit + waarschijnlijk geen Voice Isolation, slechts één toestel is de mic (10 jun: rechts), DSP-gedrag bij 100+ dB onbekend. Thuis-pre-test beslist of dit kern-feature of theorie is.AVAudioSession typisch .measurement met voice-processing uit als default. Aanzetten via AVAudioInputNode.setVoiceProcessingEnabled(true) (iOS 13+). v1.3 leidt de gebruiker naar de systeem-mic-modus.AVInputPickerInteraction (AVKit) — toont aangesloten mics, live levels, Mic Modes. Bron: WWDC25 "Enhance your app's audio recording capabilities".setPreferredPolarPattern(.cardioid) = 86,0% (verkeerde zijde + kaal signaal). Winst zit in fysieke richting + behoud van Apple's processing.Versta levert standaard een klein Whisper-model (tiny ~150MB of small ~400MB quantized). Grote modellen (medium 1.5GB+) blijven optioneel als opt-in voor power-users die bewust voor zware situaties willen upgraden.
Aanleiding: Moshi-experiment 13 mei. Grote modellen hadden onacceptabel lange neural-engine-aanpassing bij eerste run plus lange in-memory-load. Een 400MB small-quantized werkte "opvallend goed" voor dictation in normale omstandigheden.
task: .translate ingebouwd. Strategisch eerst: core "live ondertiteling" of apart spoor?MultipeerConnectivity multi-peer, lokaal, geen server..mixWithOthers / A2DP-output behouden.pause() — en naar de achtergrond gaan/vergrendelen roept pause() aan → tekstverlies. Raakt direct het nieuwe notitieboekje-gebruik (een gebruiker die de logs wil lézen). Voorstel: persist-on-pause. Afgebakende, hoog-nut fix.