OVOS intent classifier, multilingual

A static-embedding intent classifier for OpenVoiceOS. It maps an utterance to one of 210 intent labels of the form <skill_id>:<intent_name>, exactly as the OVOS m2v pipeline registers them at runtime.

This is the default model. It covers all 54 locales in the training corpus and is the fallback for every language that has no monolingual model of its own. English also has a smaller monolingual model, ovos-m2v-intents-en, which is the better choice for an English-only device.

The base is a 128-dimensional Model2Vec distillation of intfloat/multilingual-e5-small (MIT). Inference is a vector lookup and an average, so it runs on a CPU with no neural network at inference time.

Size on disk is 73.5 MB. Overall accuracy on the held-out split is 0.9943 across 56,938 rows.

Use

from model2vec.inference import StaticModelPipeline

model = StaticModelPipeline.from_pretrained("OpenVoiceOS/ovos-m2v-intents-multilingual")
model.predict(["turn off the kitchen light"])

Evaluation

Accuracy on the held-out 20% split, per language, for every language with at least 50 test rows.

Language Test rows Accuracy F1 (weighted)
Catalan (ca) 19363 0.9986 0.9985
English (en) 7504 0.9933 0.9930
Italian (it) 6115 0.9975 0.9973
Portuguese (pt) 6114 0.9971 0.9965
Spanish (es) 4652 0.9946 0.9942
Galician (gl) 4326 0.9961 0.9954
German (de) 2431 0.9807 0.9791
Danish (da) 1637 0.9841 0.9838
Dutch (nl) 1246 0.9815 0.9787
Polish (pl) 1169 0.9966 0.9972
French (fr) 752 0.9614 0.9582
Basque (eu) 579 0.9620 0.9605
Swedish (sv) 398 0.9824 0.9829
Czech (cs) 287 0.9895 0.9862
Hungarian (hu) 110 0.9545 0.9486
Kabyle (kab) 91 0.9670 0.9674
Greek (el) 59 1.0000 1.0000

Languages below that threshold are present in the corpus with only a handful of rows each; the model still emits labels for them, but there is not enough held-out data to report a meaningful score.

How it was built

The corpus comes from the reproducible dataset pipeline in ovos-m2v-pipeline at commit 173c1fe. Every source is pinned to an immutable revision, so the build is repeatable: train/build_dataset.py resolves the sources, normalises and deduplicates them, drops labels the pinned skill revisions do not attest, and writes a stratified 80/20 split together with a manifest.

The build behind this model produced 284,687 rows over 210 labels and 54 locales. Its manifest hashes to c6831002352fe59ed2a2e201f057ccf75807bafcb9fa74cef2b4e4f93a3de720 and the label file to fdf0abefd0db94127804763c82e2497f33ff77d5d7fe0eb739ed4df8c849bae9.

The classifier is a model2vec StaticModelForClassification head fitted on the training split and exported with to_pipeline().save_pretrained(). Weights are float16, which reproduces the float32 predictions exactly on the full held-out split.

labels.json ships beside the weights. It lists the label set the model was fitted on, so the pipeline can restrict matching to labels this model can emit.

License

Apache-2.0. The base model is MIT.

Downloads last month
-
Safetensors
Model size
32M params
Tensor type
F16
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support