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 verbeteringwhisper-large-v3-turbobasismodel
8,14%
metaphrase-onixons model
6,34%
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.
- 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
- 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
- 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
- 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-hfconfig.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.
