palavreado

June 13, 2026 · View on GitHub

Keyword-based intent parser for OVOS voice assistants — the drop-in replacement for Adapt.

Palavreado matches natural-language utterances against named intents built from required and optional keyword slots. Each slot holds a list of vocabulary words; if the right words are present in the utterance, the intent fires. Optional regex and simplematch autoregex patterns enable entity extraction.


Install

pip install palavreado

For the OVOS pipeline plugin:

pip install "palavreado[ovos]"

Quick start

from palavreado import IntentContainer, IntentCreator

container = IntentContainer()

intent = (
    IntentCreator("lights_off")
    .require("off",   ["off", "disable", "shutdown"])
    .require("light", ["light", "lights", "lamp"])
)
container.add_intent(intent)

result = container.calc_intent("turn off the lights")
print(result["name"])      # lights_off
print(result["conf"])      # 0.9438
print(result["keywords"])  # {'off': ['off'], 'light': ['light']}
print(result["utterance_remainder"])  # 'turn the'

An intent only fires when every required slot has at least one keyword match in the utterance.

Optional slots

intent = (
    IntentCreator("lights_off")
    .require("off",   ["off", "disable"])
    .require("light", ["light", "lights"])
    .optionally("room", ["kitchen", "bedroom", "bathroom"])
)
container.add_intent(intent)

result = container.calc_intent("turn off the bedroom lights")
print(result["keywords"]["room"])  # ['bedroom']

Autoregex / entity extraction

intent = (
    IntentCreator("buy")
    .require_autoregex("item", ["buy {item}", "purchase {item}", "get {item}"])
)
container.add_intent(intent)

result = container.calc_intent("buy some milk")
print(result["keywords"]["item"])  # ['some milk']

OVOS pipeline plugin

Palavreado ships an OVOS pipeline plugin that replaces Adapt as the keyword intent engine. It responds to the same bus events (register_vocab, register_intent, detach_intent, detach_skill) so existing skills need no changes.

Configure in mycroft.conf:

{
  "intents": {
    "palavreado": {
      "conf_high": 0.65,
      "conf_med":  0.45,
      "conf_low":  0.25
    }
  }
}

Entry point: palavreado.opm:PalavreadoPipeline


Documentation

PageDescription
Quickstart5-minute guide: keyword intents, optional slots, autoregex
Intent APIFull IntentCreator and IntentContainer reference
Confidence ScoringHow scores are calculated: formula, penalties, bonuses
NormalisationApostrophe handling, whitespace, plural/singular lemmatizer
Context GatingRequire / exclude contexts, worked examples
OVOS Pipeline PluginBus events, confidence tiers, migration from Adapt
ConfigurationAll config keys with types, defaults, and effect
BenchmarkAccuracy results and how to reproduce them
TroubleshootingCommon issues and fixes

Benchmark

Evaluated on a keyword-intent dataset of 284 cases (217 match utterances across 22 intents, 67 no-match utterances).

EngineAccuracyPrecisionRecallF1TN / no-matchFPMedian latency
palavreado81.7%80.6%94.0%0.86828 / 67490.58 ms
adapt80.3%81.0%90.3%0.85432 / 67460.20 ms
python benchmark/compare.py

Credits

Originally an experimental research project by TigreGóticoLda, polished and donated to OpenVoiceOS. Its modernization, integration into OpenVoiceOS, and intent benchmarking were funded by the NGI0 Commons Fund.

NGI0 Commons Fund

This project was funded through the NGI0 Commons Fund, a fund established by NLnet with financial support from the European Commission's Next Generation Internet programme, under the aegis of DG Communications Networks, Content and Technology under grant agreement No 101135429.


License

Apache 2.0