Case study

Hablas

Case studies
Personal project
Year
2026
Stack
Laravel · Inertia.js · Vue 3 · TypeScript
Bekijk de code op GitHub →
Resultaat CEFR-voortgang per vaardigheid geeft een eerlijk beeld van wat je echt kunt, en vooraf gegenereerde audio laat elke gesproken regel op elke telefoon hetzelfde klinken zonder de server te belasten.

De uitdaging

De meeste taal-apps zijn gebouwd om je te laten tikken, niet om je vloeiend te maken. Ik wilde Spaans en daarna Portugees leren zoals het onderzoek aangeeft: stof afgestemd op de CEFR-niveaus, veel begrijpelijke input en spaced repetition die past bij hoe geheugen echt vervaagt, zonder een streakteller die me richting alles duwt wat de app open houdt.

Wat ik bouwde

  • Een Laravel-, Inertia- en Vue-app met een spaced-repetition-engine op basis van FSRS. Spaanse (Spanje) en Portugese (Portugal) decks blijven strikt gescheiden en komen nooit door elkaar in één herhaalsessie.
  • CEFR-niveau apart bijgehouden voor lezen, luisteren, spreken en schrijven. Het niveau bovenaan is het laagste van de vier, geen gemiddelde, zodat het me niet kan vleien.
  • Een lesengine met units, luister- en spreekoefeningen, meerdere oefenvormen en een hertoetsregel die je terugstuurt naar de zwakke plek in plaats van je erlangs te laten scrollen.
  • Natuurlijk klinkende spraak, vooraf gegenereerd. Elke gesproken regel wordt één keer gemaakt met een open text-to-speech-model, opgeslagen als klein audiobestand en vanaf de webserver geserveerd, met normaal en langzaam afspelen en keuze uit stemmen. Er wordt niets gegenereerd terwijl je wacht, en het klinkt op elke telefoon hetzelfde.
  • Grammaticafouten getagd per soort (verkeerd geslacht, ser tegenover estar, valse vrienden, verkeerde tijd) zodat herhalen zich richt op wat echt misgaat.
  • Een installeerbare web-app die goed werkt op een telefoon, en een pagina met vermeldingen voor de stemmen en de licentie van het model erachter.

Belangrijke keuzes

  • De zwakste vaardigheid bepaalt het niveau. Wie goed leest maar nog niet spreekt, hoort geen opgeblazen badge te zien.
  • Vooraf gegenereerde audio in plaats van live synthese. De gedeelde server blijft licht, elk fragment is overal identiek, en waar een fragment ontbreekt valt de app terug op de browserstem.
  • Inhoud wordt gecontroleerd voor die live gaat. Nieuwe units blijven verborgen tot een moedertaalspreker ze heeft nagekeken, en een test faalt als Portugese inhoud in Braziliaanse vormen afdwaalt.
Interesse in dit soort werk?

Laten we praten over jouw project.

Start een vergelijkbaar project →