Using the Data
September 3, 2026 · View on GitHub
This page is for people who want to use what's been collected — researchers, model trainers, hobbyists building a wake-word detector — rather than run a server or contribute from a device.
Pulling exports
The simplest way to get data out is the export endpoints, which stream CSV or JSON directly, filtered however you like. See api-reference.md for the full parameter list; a few common pulls:
# every English intent match, as CSV
curl -o intents_en.csv \
"https://metrics.openvoiceos.pt/intents/export?format=csv&lang=en-us"
# every wake-word record for a specific wake word, as JSON
curl -o hey_mycroft.json \
"https://metrics.openvoiceos.pt/wake_words/export?format=json&name=hey+mycroft"
# intents in a date range
curl -o intents_january.csv \
"https://metrics.openvoiceos.pt/intents/export?format=csv&date_from=2026-01-01T00:00:00&date_to=2026-01-31T23:59:59"
Exports cap at 100,000 rows per request. If you need more, split the pull by
date range (date_from/date_to) or another filter and combine the results
client-side — there's no server-side cursor beyond that cap.
For quick browsing rather than a bulk pull, use the paginated read endpoints
(GET /intents, /wake_words, /utterances) instead — see
api-reference.md.
Streaming audio by id
Exports and the paginated list endpoints never include raw audio bytes — only
metadata. To fetch the actual WAV for a wake-word or STT record, grab its id
from a list/export and request it individually:
curl -o sample.wav "https://metrics.openvoiceos.pt/wake_words/42/audio"
curl -o utterance.wav "https://metrics.openvoiceos.pt/utterances/17/audio"
A batch download loop is straightforward:
#!/usr/bin/env bash
# download every wake-word audio file matching a name filter
curl -s "https://metrics.openvoiceos.pt/wake_words/export?format=json&name=hey+mycroft" \
| jq -r '.[].id' \
| while read -r id; do
curl -s -o "wake_words/${id}.wav" "https://metrics.openvoiceos.pt/wake_words/${id}/audio"
done
What the columns mean
Intents (/intents/export): id, intent, language, utterance,
pipeline, core_version, session_default, timestamp.
intent— the matched intent's registered name.language— BCP-47 tag, always lowercase (the server normalizes it on write regardless of how the device sent it).utterance— the raw text the user said, as transcribed by the device.pipeline— a pipe-joined list of pipeline stagesovos-coreattempted before this intent matched, e.g.adapt_high|padatious_high. Useful for understanding which intent engine actually resolved a given utterance, or for studying how deep into the pipeline matches typically happen. May be empty if the reporting device didn't send it.core_version— theovos-coreversion string of the device that sent this record. Useful for filtering out data from very old or unsupported versions, or for tracking how behavior changes acrossovos-corereleases. May be empty on older devices.session_default—trueif the reporting session used the device's default session id,falseotherwise, or empty if the reporting device is too old to send it. Since remote clients (e.g. HiveMind satellites) always carry a non-default session,falseis a privacy-respecting proxy for counting remote/HiveMind usage without ever storing a session id itself.
Wake words (/wake_words/export): id, name, model, plugin,
language, timestamp, plus the audio (fetched separately by id).
name— the wake word phrase, e.g."hey mycroft".model— the model file/identifier the device used to detect it.plugin— which wake-word engine plugin was running (e.g.ovos-ww-plugin-precise-lite).
Utterances (/utterances/export): id, transcript, model, plugin,
language, timestamp, plus the audio.
transcript— the STT engine's output text for the recording.model/plugin— which STT model and plugin produced the transcript.
Building training sets
Wake-word detectors want (audio, label) pairs. Pull /wake_words/export
filtered by name, download each id's audio, and pair it with the name
field as the label. Use model/plugin to separate or weight samples by
which detector originally triggered them, since detection quality varies by
plugin.
STT models want (audio, transcript) pairs, typically per language. Pull
/utterances/export filtered by lang, download each id's audio, and pair
it with transcript. Because transcripts come from the device's own STT
engine rather than a human, they're noisier than curated speech corpora —
treat them as a large, weakly-labeled dataset rather than gold-standard
transcriptions, and consider a manual or automated review pass before
training on them directly.
Intent classifiers / NLU can use /intents/export as (utterance, intent,
language) triples directly. pipeline and core_version are useful for
filtering out low-confidence engines or deprecated pipeline stages before
training.
Because every OVOS device that opts in contributes independently, expect
uneven language and accent coverage — check language_distribution on
/dashboard/stats before committing
to a language for a training run.
Licensing and ethics
Data is collected only from devices whose owners explicitly opted in, and never includes personally identifiable information by design. It may be republished as open datasets for community research. Read privacy.md for the complete policy, including what is and isn't collected and why submitted records can't be individually deleted on request.