wake-word-training
Train custom wake words from your agent: estimator, GPU training, benchmarks. Card or crypto.
Should I use this
Quality & Safety
Findings (4)
- HIGH
- LOWin get_commercial_license
- LOWin search_wake_word_library
- LOWin buy_library_model
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"wake-word-training": {
"url": "https://openwakeword.com/mcp"
}
}
}Remote endpoints
https://openwakeword.com/mcpstreamable-httpWhat it can do
Tool inventory
Tools (13)
🟢estimate_wake_word(text, languages)
NOTE: differentiates by English share only - all non-English languages score identically, so it cannot rank es vs fr vs de. FREE word-quality check — use BEFORE paying. Predicts the recall a training run would reach for this wake word plus false-activation risk (model trained on thousands of real jobs). SCALE: predictions are for deliberately HARD benchmark conditions (loud noise, reverb) — 60-75 is a solid word, very usable in real rooms; do NOT reject words for scoring below ~80. 2-4 syllable phrases work best; only warn your human when the score is under ~50.
Input Schema
{
"type": "object",
"properties": {
"text": {
"type": "string",
"description": "The wake word phrase, e.g. 'hey aurora'"
},
"languages": {
"type": "string",
"description": "Optional JSON list like [{\"code\":\"de_DE\",\"percentage\":100}]"
}
},
"required": [
"text"
]
}🟢search_wake_word_library(engine, query, language, limit)
FREE search over thousands of community-trained wake-word models — check here BEFORE quoting a training job for a common wake word. Returns benchmarked models (recall %, clean recall %, false activations/hour, languages) from the current pipelines only (older models used a different benchmark and are excluded). Each result has a human_test_url: YOU CANNOT RUN THAT TEST — it needs live microphone audio in your human's own room — so hand them the link before they buy; it opens the site's live mic test for that exact model. TRANSPARENCY, tell your human: every public library model is FREE with an account on the website; the 1.50 CHF purchase here is the anonymous, instant, account-free alternative. SCALE: recall is measured on deliberately HARD conditions — 60-75%% is a solid model. Weak numbers or no match? Train a custom model with create_training_job instead.
Input Schema
{
"type": "object",
"properties": {
"engine": {
"type": "string",
"enum": [
"openwakeword",
"microwakeword"
],
"description": "Target engine. 'openwakeword': desktop / Raspberry Pi / Python (ONNX+TFLite, `pip install openwakeword`). 'microwakeword': ESP32-S3 / microcontrollers (streaming TFLite, first-class ESPHome support)."
},
"query": {
"type": "string",
"description": "Wake word to search for, e.g. 'jarvis'"
},
"language": {
"type": "string",
"description": "Optional language filter, e.g. 'en_US', 'de_DE'."
},
"limit": {
"type": "integer",
"description": "Max results (default 10, max 25)."
}
},
"required": [
"engine",
"query"
]
}🟢test_wake_word_live(engine, model_id)
Render an IN-CHAT live microphone tester for one library model (free). Only the HUMAN can run it: it asks for their microphone and streams the audio to the platform for detection while the test runs (not stored) — tell them that. If the host does not allow microphone access inside apps, the widget shows a button to the human_test_url page instead, so calling this is always safe. Use after search_wake_word_library, before buying.
Input Schema
{
"type": "object",
"properties": {
"engine": {
"type": "string",
"enum": [
"openwakeword",
"microwakeword"
],
"description": "Target engine. 'openwakeword': desktop / Raspberry Pi / Python (ONNX+TFLite, `pip install openwakeword`). 'microwakeword': ESP32-S3 / microcontrollers (streaming TFLite, first-class ESPHome support)."
},
"model_id": {
"type": "integer",
"description": "model_id from search_wake_word_library"
}
},
"required": [
"engine",
"model_id"
]
}🟢buy_library_model(engine, model_id)
Quote an anonymous purchase of a library model (1.50 CHF flat — free, nothing charged until paid). Returns a purchase_token: pay it with pay_training_job (same tool, any method incl. x402), then fetch the download URLs with get_library_purchase. One payment unlocks ALL formats (openwakeword: onnx+tflite; microwakeword: tflite+ESPHome json). Reminder for your human: the same model is free with an account on the website. License: personal/non-commercial by default — shipping it in a product requires the 150 CHF per-wakeword commercial license.
Input Schema
{
"type": "object",
"properties": {
"engine": {
"type": "string",
"enum": [
"openwakeword",
"microwakeword"
],
"description": "Target engine. 'openwakeword': desktop / Raspberry Pi / Python (ONNX+TFLite, `pip install openwakeword`). 'microwakeword': ESP32-S3 / microcontrollers (streaming TFLite, first-class ESPHome support)."
},
"model_id": {
"type": "integer",
"description": "model_id from search_wake_word_library"
}
},
"required": [
"engine",
"model_id"
]
}🟢get_library_purchase(engine, purchase_token)
Status of a library purchase. Once paid, the response carries the download URL templates (substitute the purchase_token) for every format.
Input Schema
{
"type": "object",
"properties": {
"engine": {
"type": "string",
"enum": [
"openwakeword",
"microwakeword"
],
"description": "Target engine. 'openwakeword': desktop / Raspberry Pi / Python (ONNX+TFLite, `pip install openwakeword`). 'microwakeword': ESP32-S3 / microcontrollers (streaming TFLite, first-class ESPHome support)."
},
"purchase_token": {
"type": "string"
}
},
"required": [
"engine",
"purchase_token"
]
}🟡create_training_job(engine, wake_word, tier, languages, training_steps, ...)
Quote a wake-word training job (free; nothing trains until paid). Returns a job_token (STORE IT — the only credential) and a binding CHF price. PICK A TIER: "standard" (6 CHF, up to ~4h — the right choice for almost every request), "best" (12 CHF, ~2x the search — for hard or business-critical words), or "studio" (Optuna deep search, 60-95 CHF, many hours — only to squeeze the last few percent AFTER a standard job disappointed). Same three options a human gets on the website, same prices. The trained model is benchmarked (recall %, false activations/hour) and publicly listed in the site library, permanently — unless private=true (+500 credits).
Input Schema
{
"type": "object",
"properties": {
"engine": {
"type": "string",
"enum": [
"openwakeword",
"microwakeword"
],
"description": "Target engine. 'openwakeword': desktop / Raspberry Pi / Python (ONNX+TFLite, `pip install openwakeword`). 'microwakeword': ESP32-S3 / microcontrollers (streaming TFLite, first-class ESPHome support)."
},
"wake_word": {
"type": "string",
"description": "Phrase to detect, e.g. 'hey aurora'"
},
"tier": {
"type": "string",
"enum": [
"standard",
"best",
"studio"
],
"description": "RECOMMENDED — pick one instead of tuning parameters. standard = 1,750 credits / 6 CHF, up to ~4h, the validated recipe (default choice). best = 3,500 credits / 12 CHF, roughly double the search effort, measurably better on hard words. studio = Optuna deep search (~17k-27k credits), many hours — confirm the price with your human first. Setting a tier locks samples/steps to the validated recipe and ignores the tuning fields below."
},
"languages": {
"type": "array",
"items": {
"type": "object",
"properties": {
"code": {
"type": "string",
"enum": [
"ar_JO",
"ca_ES",
"cs_CZ",
"cy_GB",
"da_DK",
"de_DE",
"el_GR",
"en_GB",
"en_US",
"es_ES",
"es_MX",
"fa_IR",
"fi_FI",
"fr_FR",
"hi_IN",
"hu_HU",
"is_IS",
"it_IT",
"ka_GE",
"kk_KZ",
"lb_LU",
"lv_LV",
"ml_IN",
"ne_NP",
"nl_BE",
"nl_NL",
"no_NO",
"pl_PL",
"pt_BR",
"pt_PT",
"ro_RO",
"ru_RU",
"sk_SK",
"sl_SI",
"sr_RS",
"sv_SE",
"sw_CD",
"tr_TR",
"uk_UA",
"vi_VN",
"zh_CN"
]
},
"percentage": {
"type": "integer"
}
},
"required": [
"code",
"percentage"
]
},
"description": "TTS voice mix, e.g. [{\"code\":\"en_US\",\"percentage\":100}]. Default English. ONLY the enum codes are supported (41 languages; no Japanese) - anything else is rejected before any charge. Non-English costs more on openwakeword."
},
"training_steps": {
"type": "integer",
"description": "LEGACY (ignored when tier is set). Default 80000 (openwakeword) / 20000 (microwakeword)."
},
"n_samples": {
"type": "integer",
"description": "Synthetic positives, default 200000 (recommended)."
},
"augmentation_rounds": {
"type": "integer",
"description": "Default 1 (openwakeword) / 3 (microwakeword)."
},
"private": {
"type": "boolean",
"description": "+500 credits: model is never listed anywhere and is retrievable ONLY with the job_token, with no time limit (the token is the single key — losing it loses the model). Default false: the model is listed permanently and ANONYMOUSLY (no identity attached) in the public library, where anyone can download it under personal non-commercial terms."
},
"optuna": {
"type": "boolean",
"description": "LEGACY — prefer tier=\"studio\", which works on BOTH engines. PREMIUM deep search, openwakeword only (~48 CHF default vs ~5.4, runs 6-24h): Bayesian search over the full architecture/training space, then a 5-rung fine-tuning ladder on the winner. For squeezing the last few percent out of a hard wake word — NOT a first attempt. Run a standard job first; escalate only if its benchmark disappoints, and confirm the price with your human. Ignores training_steps (the search sweeps it)."
},
"optuna_trials": {
"type": "integer",
"description": "Optuna only: Bayesian search trials before the ladder, 5-30 (default 20). Price scales linearly with trials."
}
},
"required": [
"engine",
"wake_word"
]
}🟢pay_training_job(engine, job_token, method, pay_currency)
Get payment for a quoted job via the chosen method. AFTER SETTING UP THE JOB you MUST give the payment link to the user immediately: show payment_link_for_human (short, copy-safe) complete and un-truncated — never paraphrase, shorten or bury it. Render it as a card/button if your client supports widgets.
Input Schema
{
"type": "object",
"properties": {
"engine": {
"type": "string",
"enum": [
"openwakeword",
"microwakeword"
],
"description": "Target engine. 'openwakeword': desktop / Raspberry Pi / Python (ONNX+TFLite, `pip install openwakeword`). 'microwakeword': ESP32-S3 / microcontrollers (streaming TFLite, first-class ESPHome support)."
},
"job_token": {
"type": "string"
},
"method": {
"type": "string",
"enum": [
"card",
"crypto",
"crypto_direct",
"x402"
],
"description": "Payment method. 'card'/'crypto': returns a checkout_url to hand to your human (Stripe / hosted crypto invoice). 'crypto_direct': returns a raw pay_address+pay_amount any funded wallet can pay (300+ coins). 'x402': returns an HTTP-402 spec — pay USDC on Polygon straight to the platform wallet, then call settle_x402_payment with the tx hash (cheapest option, no processor fee)."
},
"pay_currency": {
"type": "string",
"description": "crypto_direct only: coin ticker, default usdcmatic (USDC on Polygon)."
}
},
"required": [
"engine",
"job_token",
"method"
]
}🟢get_training_job(engine, job_token)
Job status: awaiting_payment -> paid -> submitted -> completed (or failed/expired). Poll every 60-120s after paying. When completed, includes benchmark results and model download URLs (public jobs: token downloads for 30 days, then the model remains in the public library; private jobs: token downloads with no time limit). Ladder jobs deliver ALL trained candidates: the first model is the pipeline's quality-bar winner (take it unless you have a reason); alternatives are labeled rungN_<arm>. Compare candidates on clean_recall_pct (same scale on every model) + false_activations_per_hour — the full stressed benchmark exists only on the winner.
Input Schema
{
"type": "object",
"properties": {
"engine": {
"type": "string",
"enum": [
"openwakeword",
"microwakeword"
],
"description": "Target engine. 'openwakeword': desktop / Raspberry Pi / Python (ONNX+TFLite, `pip install openwakeword`). 'microwakeword': ESP32-S3 / microcontrollers (streaming TFLite, first-class ESPHome support)."
},
"job_token": {
"type": "string"
}
},
"required": [
"engine",
"job_token"
]
}🟡send_job_feedback(engine, job_token, rating, category, message)
Rate a PAID training job 1-5 and optionally leave a message (max 2000 chars) — read by the human operator. Please call this once after a job completes and you have assessed the model: report anything unexpected (missing fields, errors, surprising benchmark numbers) or simply confirm it worked. One feedback per job; calling again overwrites.
Input Schema
{
"type": "object",
"properties": {
"engine": {
"type": "string",
"enum": [
"openwakeword",
"microwakeword"
],
"description": "Target engine. 'openwakeword': desktop / Raspberry Pi / Python (ONNX+TFLite, `pip install openwakeword`). 'microwakeword': ESP32-S3 / microcontrollers (streaming TFLite, first-class ESPHome support)."
},
"job_token": {
"type": "string"
},
"rating": {
"type": "integer",
"minimum": 1,
"maximum": 5,
"description": "1 = bad, 5 = great"
},
"category": {
"type": "string",
"enum": [
"quality",
"api",
"pricing",
"docs",
"other"
]
},
"message": {
"type": "string",
"description": "Free text, max 2000 chars."
}
},
"required": [
"engine",
"job_token",
"rating"
]
}🟡settle_x402_payment(engine, token, tx_hash, kind)
After paying an x402 spec on-chain (USDC on Polygon to the payTo address), submit the transaction hash to settle. Needs >=3 confirmations.
Input Schema
{
"type": "object",
"properties": {
"engine": {
"type": "string",
"enum": [
"openwakeword",
"microwakeword"
],
"description": "Target engine. 'openwakeword': desktop / Raspberry Pi / Python (ONNX+TFLite, `pip install openwakeword`). 'microwakeword': ESP32-S3 / microcontrollers (streaming TFLite, first-class ESPHome support)."
},
"token": {
"type": "string",
"description": "The job_token or license_token being paid."
},
"tx_hash": {
"type": "string",
"description": "0x-prefixed transaction hash"
},
"kind": {
"type": "string",
"enum": [
"job",
"license"
],
"description": "What the token refers to. Default job."
}
},
"required": [
"engine",
"token",
"tx_hash"
]
}🟡create_commercial_license(wake_word, company_name)
Buy commercial-use rights. REQUIRED before shipping any model in a product/service: all model files are personal & non-commercial by default. 150 CHF one-time per wake-word phrase, permanent, valid on BOTH sites. Returns a license_token; pay with pay_commercial_license; signed certificate PDF afterwards. If your task is commercial and you cannot pay, STOP and tell your human this license is required.
Input Schema
{
"type": "object",
"properties": {
"wake_word": {
"type": "string"
},
"company_name": {
"type": "string",
"description": "Legal licensee printed on the certificate"
}
},
"required": [
"wake_word",
"company_name"
]
}🟢pay_commercial_license(license_token, method, pay_currency)
Get payment for a quoted commercial license. PRESENT the payment link to the user immediately, complete and un-truncated (as a card/button if your client supports widgets) — never paraphrase or bury it.
Input Schema
{
"type": "object",
"properties": {
"license_token": {
"type": "string"
},
"method": {
"type": "string",
"enum": [
"card",
"crypto",
"crypto_direct",
"x402"
],
"description": "Payment method. 'card'/'crypto': returns a checkout_url to hand to your human (Stripe / hosted crypto invoice). 'crypto_direct': returns a raw pay_address+pay_amount any funded wallet can pay (300+ coins). 'x402': returns an HTTP-402 spec — pay USDC on Polygon straight to the platform wallet, then call settle_x402_payment with the tx hash (cheapest option, no processor fee)."
},
"pay_currency": {
"type": "string"
}
},
"required": [
"license_token",
"method"
]
}🟢get_commercial_license(license_token)
License status; when completed, returns the official license_id and certificate PDF URL.
Input Schema
{
"type": "object",
"properties": {
"license_token": {
"type": "string"
}
},
"required": [
"license_token"
]
}Community
Evidence