Metaphrase

metaphrase-onix

Een model dat Nederlands niet als bijvangst behandelt.

De meeste spraakmodellen zijn getraind op wat er toevallig op internet staat, en dat is overwegend Engels. Aan een Nederlandse balie klinkt het anders: formeel register, straatnamen, geboortedata, vakjargon. Daarom hebben wij het model zelf bijgetraind.

6,34%

woordfoutmarge op Nederlands

22%

minder fouten dan het basismodel

0,44 s

voor elf seconden audio

1,5 GB

modelbestand in f16

Waarom eigen gewichten

Wie het model huurt, kan het niet bijstellen.

Een API van een derde partij is een dichte doos. U kunt hem aanroepen, maar niet bijtrainen op de woorden die bij u dagelijks langskomen, en u kunt hem niet meenemen naar een omgeving zonder internet.

Omdat metaphrase-onix van ons is, kunnen we hem bijtrainen op uw eigen opnames en terminologie, en kunt u hem draaien op hardware die u zelf beheert. De pipeline die het model produceert hoort bij het project, dus het is reproduceerbaar en geen zwarte doos.

De meting

Zelfde testset, zelfde decodering, twee modellen.

Woordfoutmarge op Nederlands

22% relatieve verbetering

whisper-large-v3-turbobasismodel

8,14%

metaphrase-onixons model

6,34%

0%2,5%5%7,5%10%

Hoe er is gemeten

  • Tweehonderd fragmenten uit de Nederlandse Common Voice testset
  • Beide modellen dezelfde fragmenten, dezelfde decodeerinstellingen
  • Woordfoutmarge berekend met jiwer, zonder nabewerking van de tekst

Wat dit getal niet zegt

Common Voice bestaat uit voorgelezen zinnen, geen baliegesprekken. Het cijfer laat zien dat bijtrainen werkt, het is geen belofte voor uw loket. Wat er aan uw balie uitkomt meten we tijdens de pilot, op uw eigen audio.

Hoe het gemaakt is

Vier stappen, allemaal in het project.

  1. 01

    Basis

    whisper-large-v3-turbo. Snel genoeg voor realtime en al redelijk in het Nederlands, dus een goed vertrekpunt in plaats van vanaf nul beginnen.

    • openai/whisper-large-v3-turbo
  2. 02

    Bijtrainen

    Een LoRA-adapter op de aandachtlagen. Alleen die lagen worden aangepast, wat het trainen goedkoop houdt en voorkomt dat het model zijn Engels verleert.

    • rang 32, alpha 64
    • dropout 0,05
    • q, k, v en out_proj
    • lr 1e-4, fp16
  3. 03

    Samenvoegen

    De adapter wordt in de gewichten gebakken en het geheel geëxporteerd naar GGML, het formaat dat de C++ engine rechtstreeks laadt. Geen Python in het hete pad.

    • export.py
    • f16, circa 1,5 GB
    • q5_0 optioneel, circa 550 MB
  4. 04

    Meten

    Woordfoutmarge op dezelfde testset voor het basismodel en voor het onze. Zonder die stap weet je niet of je iets hebt verbeterd of alleen iets veranderd.

    • evaluate_wer.py
    • jiwer

Wat erin zit

Snelheid van turbo, Nederlands van ons.

Transcriptie

Nederlands en Engels. Het Engels uit het basismodel is behouden, want bijtrainen op één taal mag de andere niet slopen.

Vertaling in het model

Nederlands naar Engels zit in het model zelf. De overige zestien talen lopen via het taalmodel dat ernaast draait.

Realtime

Elf seconden audio in ongeveer 0,44 seconde op een RTX 4070. Dat is ruim vijfentwintig keer sneller dan realtime, dus de vertaling loopt achter de spreker aan in plaats van andersom.

Zestien kilohertz mono

Het formaat waar de engine op werkt. Stereo wordt per kanaal gescheiden voordat het het model in gaat.

Echte fragmenten

De bestanden waar wij zelf mee testen.

Dit zijn geen opgenomen demo's voor deze site. Het zijn de fragmenten uit assets/audio in het project, dezelfde die in de documentatie langskomen. De golfvorm eronder is uitgelezen uit het bestand, niet getekend.

nl_sample

16 kHz mono

Een Nederlands fragment. Dit is wat de engine binnenkrijgt, en het bestand dat in de deploy-documentatie tegen /v1/transcriptions wordt aangehouden.

tts_nl

24 kHz mono

Uitvoer van de spraaksynthese in het Nederlands. Dit is de kant die de bezoeker hoort wanneer de balie iets zegt.

tts_en

24 kHz mono

Dezelfde synthese in het Engels. Het model achter de stem is XTTS v2, dat de stem van de spreker kan klonen uit een paar seconden referentie.

Reproduceerbaar

Drie opdrachten, van ruwe audio tot modelbestand.

De pipeline zit in het project onder model-pipeline. Wie de hardware en de dataset heeft, kan het model opnieuw maken en de cijfers zelf natrekken.

# fine-tune on Dutch speechpython train.py --common-voice-dir <corpus>/nl \  --output-dir outputs/turbo-nl-lora --max-train-samples 3000 --max-steps 500 # merge the adapter and export to GGMLpython export.py --adapter outputs/turbo-nl-lora \  --out ../models/custom/metaphrase-onix # word error rate, base model against ourspython evaluate_wer.py --common-voice-dir <corpus>/nl \  --model ../models/custom/metaphrase-onix-hf
  • config.py

    Hyperparameters en datasetinstellingen

  • data.py

    Lokale Common Voice loader, mel-extractie, collator

  • train.py

    LoRA-finetune met Seq2SeqTrainer, tussentijdse WER

  • export.py

    Adapter samenvoegen en naar GGML schrijven

  • evaluate_wer.py

    Woordfoutmarge op de testset

Grenzen

Wat er nog niet in zit.

Liever vooraf duidelijk dan achteraf teleurstellend.

Dit is een proefronde

Drieduizend fragmenten en vijfhonderd trainingsstappen. Genoeg om te laten zien dat het werkt, niet het maximum. Meer data en meer stappen brengen de foutmarge verder omlaag.

Voorgelezen spraak is geen gesprek

De testset bestaat uit voorgelezen zinnen. Echte baliegesprekken hebben achtergrondgeluid, accenten, onderbrekingen en mensen die door elkaar praten.

Sprekerherkenning zit apart

Wie er spreekt bepaalt de engine met kanaalscheiding of stemafdrukken, niet het model. Voor vergaderingen met meerdere sprekers is diarisatie een apart onderdeel.

Het echte werk zit in uw audio

De grootste winst komt niet uit meer openbare data maar uit een paar uur opnames uit uw eigen praktijk. Dat is precies wat een pilot oplevert.

Verder

Bijtrainen op uw eigen taalgebruik.

Formeel register uit corpora als VoxPopuli en CGN brengt het model dichter bij hoe er aan een loket wordt gesproken. Uw eigen opnames en terminologie brengen het de rest van de weg. Omdat de pipeline van ons is, is dat een kwestie van draaien en meten in plaats van wachten op een leverancier.

Plan een pilot