Files
rhasspy/docs/reference.md

602 lines
33 KiB
Markdown

# Reference
* [Supported Languages](#supported-languages)
* [HTTP API](#http-api)
* [Websocket API](#websocket-api)
* [MQTT API](#mqtt-api)
* [Command Line](#command-line)
* [Profile Settings](#profile-settings)
## Supported Languages
The table below lists which components and compatible with Rhasspy's supported languages.
| Category | Name | Offline? | en | de | es | fr | it | nl | ru | el | hi | zh | vi | pt | sv | ca |
| -------- | ------ | -------- | ------- | ------- | ------- | ------- | ------- | ------- | ------- | ------- | ------- | ------- | ------- | ------- | ------- | ------- |
| **Wake Word** | [pocketsphinx](wake-word.md#pocketsphinx) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | | | |
| | [porcupine](wake-word.md#porcupine) | ✓ | ✓ | | | | | | | | | | | | | |
| | [snowboy](wake-word.md#snowboy) | *requires account* | ✓ | • | • | • | • | • | • | • | • | • | • | • | • | • |
| | [precise](wake-word.md#mycroft-precise) | ✓ | ✓ | • | • | • | • | • | • | • | • | • | • | • | • | • |
| **Speech to Text** | [pocketsphinx](speech-to-text.md#pocketsphinx) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | ✓ | | ✓ |
| | [kaldi](speech-to-text.md#kaldi) | ✓ | ✓ | ✓ | | ✓ | | ✓ | | | | | ✓ | | ✓ | |
| **Intent Recognition** | [fsticuffs](intent-recognition.md#fsticuffs) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| | [fuzzywuzzy](intent-recognition.md#fuzzywuzzy) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| | [adapt](intent-recognition.md#mycroft-adapt) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| | [flair](intent-recognition.md#flair) | ✓ | ✓ | ✓ | ✓ | ✓ | | ✓ | | | | | | ✓ | | ✓ |
| | [rasaNLU](intent-recognition.md#rasanlu) | *needs extra software* | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| **Text to Speech** | [espeak](text-to-speech.md#espeak) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| | [flite](text-to-speech.md#flite) | ✓ | ✓ | | | | | | | | ✓ | | | | | |
| | [picotts](text-to-speech.md#picotts) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | | | | | | | | |
| | [marytts](text-to-speech.md#marytts) | ✓ | ✓ | ✓ | | ✓ | ✓ | | ✓ | | | | | | | |
| | [wavenet](text-to-speech.md#google-wavenet) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | ✓ | ✓ | | ✓ | ✓ | |
• - yes, but requires training/customization
## HTTP API
Rhasspy's HTTP endpoints are documented below. You can also visit `/api/` in your Rhasspy server (note the final slash) to try out each endpoint.
Application authors may want to use the [rhasspy-client](https://pypi.org/project/rhasspy-client/), which provides a high-level interface to a remote Rhasspy server.
### Endpoints
* `/api/custom-words`
* GET custom word dictionary as plain text, or POST to overwrite it
* See `custom_words.txt` in your profile directory
* `/api/download-profile`
* Force Rhasspy to re-download profile
* `?delete=true` - clear download cache
* `/api/listen-for-command`
* POST to wake Rhasspy up and start listening for a voice command
* Returns intent JSON when command is finished
* `?nohass=true` - stop Rhasspy from handling the intent
* `?timeout=<seconds>` - override default command timeout
* `?entity=<entity>&value=<value>` - set custom entity/value in recognized intent
* `/api/listen-for-wake-word`
* POST to wake Rhasspy up and return immediately
* `/api/lookup`
* POST word as plain text to look up or guess pronunciation
* `?n=<number>` - return at most `n` guessed pronunciations
* `/api/microphones`
* GET list of available microphones
* `/api/phonemes`
* GET example phonemes from speech recognizer for your profile
* See `phoneme_examples.txt` in your profile directory
* `/api/play-wav`
* POST to play WAV data
* `/api/profile`
* GET the JSON for your profile, or POST to overwrite it
* `?layers=profile` to only see settings different from `defaults.json`
* See `profile.json` in your profile directory
* `/api/restart`
* Restart Rhasspy server
* `/api/sentences`
* GET voice command templates or POST to overwrite
* Set `Accept: application/json` to GET JSON with all sentence files
* Set `Content-Type: application/json` to POST JSON with sentences for multiple files
* See `sentences.ini` and `intents` directory in your profile
* `/api/slots`
* GET slot values as JSON or POST to add to/overwrite them
* `?overwrite_all=true` to clear slots in JSON before writing
* `/api/speakers`
* GET list of available audio output devices
* `/api/speech-to-intent`
* POST a WAV file and have Rhasspy process it as a voice command
* Returns intent JSON when command is finished
* `?nohass=true` - stop Rhasspy from handling the intent
* `/api/speech-to-text`
* POST a WAV file and have Rhasspy return the text transcription
* Set `Accept: application/json` to receive JSON with more details
* `?noheader=true` - send raw 16-bit 16Khz mono audio without a WAV header
* `/api/start-recording`
* POST to have Rhasspy start recording a voice command
* `/api/stop-recording`
* POST to have Rhasspy stop recording and process recorded data as a voice command
* Returns intent JSON when command has been processed
* `?nohass=true` - stop Rhasspy from handling the intent
* `/api/test-microphones`
* GET list of available microphones and if they're working
* `/api/text-to-intent`
* POST text and have Rhasspy process it as command
* Returns intent JSON when command has been processed
* `?nohass=true` - stop Rhasspy from handling the intent
* `/api/text-to-speech`
* POST text and have Rhasspy speak it
* `?play=false` - get WAV data instead of having Rhasspy speak
* `?voice=<voice>` - override default TTS voice
* `?language=<language>` - override default TTS language or locale
* `?repeat=true` - have Rhasspy repeat the last sentence it spoke
* `/api/train`
* POST to re-train your profile
* `?nocache=true` - re-train profile from scratch
* `/api/unknown-words`
* GET words that Rhasspy doesn't know in your sentences
* See `unknown_words.txt` in your profile directory
## Websocket API
* `/api/events/intent`
* Listen for recognized intents published as JSON
* `/api/events/log`
* Listen for log messages published as plain text
## MQTT API
Rhasspy implements part of the [Hermes](https://docs.snips.ai/reference/hermes) protocol. Various services of Rhasspy can be configured to pass along MQTT messages or to react to MQTT messages following the Hermes protocol.
* `hermes/audioServer/<SITE_ID>/playBytes/<REQUEST_ID>`
* Rhasspy publishes audio in WAV format to this topic. By default it is 16 kHz, 16-bit mono for compatibility reasons, but other types are possible too.
* `SITE_ID` is set in Rhasspy's `mqtt` configuration.
* `REQUEST_ID` is generated using `uuid.uuid4` each time a sound is played.
* `hermes/audioServer/<SITE_ID>/audioFrame`
* Rhasspy listens to this topic for WAV data. Audio is automatically converted to 16 kHz, 16-bit mono audio and played.
* `SITE_ID` is set in Rhasspy's `mqtt` configuration.
* `hermes/asr/startListening`
* Rhasspy wakes up and starts recording on receiving this topic.
* The payload is a JSON object with a `siteId` key that holds Rhasspy's site ID.
* `hermes/asr/stopListening`
* Rhasspy stops recording and processes the voice command on receiving this topic.
* The payload is a JSON object with a `siteId` key that holds Rhasspy's site ID.
* `hermes/intent/<INTENT_NAME>`
* Rhasspy publishes a message to this topic on recognition of an intent.
* The payload is a JSON object with the recognized intent, entities and text.
* `hermes/nlu/intentNotRecognized`
* Rhasspy publishes a message to this topic when it doesn't recognize an intent.
* `hermes/asr/textCaptured`
* Rhasspy publishes a transcription to this topic each time a voice command is recognized.
* `hermes/hotword/<WAKEWORD_ID>/detected`
* Rhasspy wakes up when a message is received on this topic.
## Command Line
Rhasspy provides a powerful [command-line interface](usage.md#command-line) called `rhasspy-cli`.
For `rhasspy-cli --profile <PROFILE_NAME> <COMMAND> <ARGUMENTS>`, `<COMMAND>` can be:
* `info`
* Print profile JSON to standard out
* Add `--defaults` to only print settings from `defaults.json`
* `wav2text`
* Convert WAV file(s) to text
* `wav2intent`
* Convert WAV file(s) to intent JSON
* Add `--handle` to have Rhasspy send events to Home Assistant
* `text2intent`
* Convert text command(s) to intent JSON
* Add `--handle` to have Rhasspy send events to Home Assistant
* `train`
* Re-train your profile
* `mic2wav`
* Listen for a voice command and output WAV data
* Add `--timeout <SECONDS>` to stop recording after some number of seconds
* `mic2text`
* Listen for a voice command and convert it to text
* Add `--timeout <SECONDS>` to stop recording after some number of seconds
* `mic2intent`
* Listen for a voice command output intent JSON
* Add `--handle` to have Rhasspy send events to Home Assistant
* Add `--timeout <SECONDS>` to stop recording after some number of seconds
* `word2phonemes`
* Print the CMU phonemes for a word (possibly unknown)
* Add `-n <COUNT>` to control the maximum number of guessed pronunciations
* `word2wav`
* Pronounce a word (possibly unknown) and output WAV data
* `text2speech`
* Speaks one or more sentences using Rhasspy's text to speech system
* `text2wav`
* Converts a single sentence to WAV using Rhasspy's text to speech system
* `sleep`
* Run Rhasspy and wait until wake word is spoken
* `download`
* Download necessary profile files from the internet
### Profile Operations
Print the complete JSON for the English profile with:
rhasspy-cli --profile en info
You can combine this with other commands, such as `jq` to get at specific pieces:
rhasspy-cli info --profile en | jq .wake.pocketsphinx.keyphrase
Output (JSON):
"okay rhasspy"
### Training
Retrain your the English profile with:
rhasspy-cli --profile en train
Add `--debug` before `train` for more information.
### Speech to Text/Intent
Convert a WAV file to text from stdin:
rhasspy-cli --profile en wav2text < what-time-is-it.wav
Output (text):
what time is it
Convert multiple WAV files:
rhasspy-cli --profile en wav2text what-time-is-it.wav turn-on-the-living-room-lamp.wav
Output (JSON)
```json
{
"what-time-is-it.wav": "what time is it",
"turn-on-the-living-room-lamp.wav": "turn on the living room lamp"
}
```
Convert multiple WAV file(s) to intents **and** handle them:
rhasspy-cli --profile en wav2intent --handle what-time-is-it.wav turn-on-the-living-room-lamp.wav
Output (JSON):
```json
{
"what_time_is_it.wav": {
"text": "what time is it",
"intent": {
"name": "GetTime",
"confidence": 1.0
},
"entities": []
},
"turn_on_living_room_lamp.wav": {
"text": "turn on the living room lamp",
"intent": {
"name": "ChangeLightState",
"confidence": 1.0
},
"entities": [
{
"entity": "state",
"value": "on"
},
{
"entity": "name",
"value": "living room lamp"
}
]
}
}
```
### Text to Intent
Handle a command as if it was spoken:
rhasspy-cli --profile en text2intent --handle "turn off the living room lamp"
Output (JSON):
```json
{
"turn off the living room lamp": {
"text": "turn off the living room lamp",
"intent": {
"name": "ChangeLightState",
"confidence": 1.0
},
"entities": [
{
"entity": "state",
"value": "off"
},
{
"entity": "name",
"value": "living room lamp"
}
]
}
}
```
### Record Your Voice
Save a voice command to a WAV:
rhasspy-cli --profile en mic2wav > my-voice-command.wav
You can listen to it with:
aplay my-voice-command.wav
### Test Your Wake Word
Start Rhasspy and wait for wake word:
rhasspy-cli --profile en sleep
Should exit and print the wake word when its spoken.
### Text to Speech
Have Rhasspy speak one or more sentences:
rhasspy-cli --profile en text2speech "We ride at dawn!"
Use a different text to speech system and voice:
rhasspy-cli --profile en \
--set 'text_to_speech.system' 'flite' \
--set 'text_to_speech.flite.voice' 'slt' \
text2speech "We ride at dawn!"
### Pronounce Words
Speak words Rhasspy doesn't know!
rhasspy-cli --profile en word2wav raxacoricofallapatorius | aplay
### Text to Speech to Text to Intent
Use the miracle of Unix pipes to have Rhasspy interpret voice commands from itself:
rhasspy-cli --profile en \
--set 'text_to_speech.system' 'picotts' \
text2wav "turn on the living room lamp" | \
rhasspy-cli --profile en wav2text | \
rhasspy-cli --profile en text2intent
Output (JSON):
```json
{
"turn on the living room lamp": {
"text": "turn on the living room lamp",
"intent": {
"name": "ChangeLightState",
"confidence": 1.0
},
"entities": [
{
"entity": "state",
"value": "on"
},
{
"entity": "name",
"value": "living room lamp"
}
],
"speech_confidence": 1,
"slots": {
"state": "on",
"name": "living room lamp"
}
}
}
```
## Profile Settings
All available profile sections and settings are listed below:
* `rhasspy` - configuration for Rhasspy assistant
* `preload_profile` - true if speech/intent recognizers should be loaded immediately for default profile (default: `true`)
* `listen_on_start` - true if Rhasspy should listen for wake word at startup (default: `true`)
* `load_timeout_sec` - number of seconds to wait for internal actors before proceeding with start up
* `home_assistant` - how to communicate with Home Assistant/Hass.io
* `url` - Base URL of Home Assistant server (no `/api`)
* `access_token` - long-lived access token for Home Assistant (Hass.io token is used automatically)
* `api_password` - Password, if you have that enabled (deprecated)
* `pem_file` - Full path to your <a href="http://docs.python-requests.org/en/latest/user/advanced/#ssl-cert-verification">CA_BUNDLE file or a directory with certificates of trusted CAs</a>
* `event_type_format` - Python format string used to create event type from intent type (`{0}`)
* `speech_to_text` - transcribing [voice commands to text](speech-to-text.md)
* `system` - name of speech to text system (`pocketsphinx`, `kaldi`, `remote`, `command`, or `dummy`)
* `pocketsphinx` - configuration for [Pocketsphinx](speech-to-text.md#pocketsphinx)
* `compatible` - true if profile can use pocketsphinx for speech recognition
* `acoustic_model` - directory with CMU 16 kHz acoustic model
* `base_dictionary` - large text file with word pronunciations (read only)
* `custom_words` - small text file with words/pronunciations added by user
* `dictionary` - text file with all words/pronunciations needed for example sentences
* `unknown_words` - small text file with guessed word pronunciations (from phonetisaurus)
* `language_model` - text file with trigram [ARPA language model](https://cmusphinx.github.io/wiki/arpaformat/) built from example sentences
* `open_transcription` - true if general language model should be used (custom voices commands ignored)
* `base_language_model` - large general language model (read only)
* `mllr_matrix` - MLLR matrix from [acoustic model tuning](https://cmusphinx.github.io/wiki/tutorialtuning/)
* `mix_weight` - how much of the base language model to [mix in during training](training.md#language-model-mixing) (0-1)
* `mix_fst` - path to save mixed ngram FST model
* `kaldi` - configuration for [Kaldi](speech-to-text.md#kaldi)
* `compatible` - true if profile can use Kaldi for speech recognition
* `kaldi_dir` - absolute path to Kaldi root directory
* `model_dir` - directory where Kaldi model is stored (relative to profile directory)
* `graph` - directory where HCLG.fst is located (relative to `model_dir`)
* `base_graph` - directory where large general HCLG.fst is located (relative to `model_dir`)
* `base_dictionary` - large text file with word pronunciations (read only)
* `custom_words` - small text file with words/pronunciations added by user
* `dictionary` - text file with all words/pronunciations needed for example sentences
* `open_transcription` - true if general language model should be used (custom voices commands ignored)
* `unknown_words` - small text file with guessed word pronunciations (from phonetisaurus)
* `mix_weight` - how much of the base language model to [mix in during training](training.md#language-model-mixing) (0-1)
* `mix_fst` - path to save mixed ngram FST model
* `remote` - configuration for [remote Rhasspy server](speech-to-text.md#remote-http-server)
* `url` - URL to POST WAV data for transcription (e.g., `http://your-rhasspy-server:12101/api/speech-to-text`)
* `command` - configuration for [external speech-to-text program](speech-to-text.md#command)
* `program` - path to executable
* `arguments` - list of arguments to pass to program
* `sentences_ini` - Ini file with example [sentences/JSGF templates](training.md#sentencesini) grouped by intent
* `sentences_dir` - Directory with additional sentence templates (default: `intents`)
* `g2p_model` - finite-state transducer for phonetisaurus to guess word pronunciations
* `g2p_casing` - casing to force for g2p model (`upper`, `lower`, or blank)
* `dictionary_casing` - casing to force for dictionary words (`upper`, `lower`, or blank)
* `slots_dir` - directory to look for [slots lists](training.md#slots-lists) (default: `slots`)
* `slot_programs` - directory to look for [slot programs](training.md#slot-programs) (default `slot_programs`)
* `fsts_dir` - directory to write generated finite state transducers from JSGF grammars
* `intent` - transforming text commands to intents
* `system` - intent recognition system (`fsticuffs`, `fuzzywuzzy`, `rasa`, `remote`, `adapt`, `command`, or `dummy`)
* `fsticuffs` - configuration for [OpenFST-based](https://www.openfst.org) intent recognizer
* `intent_fst` - path to generated finite state transducer with all intents combined
* `converters_dir` - directory to look for [converter](training.md#converters) programs (default: `converters`)
* `ignore_unknown_words` - true if words not in the FST symbol table should be ignored
* `fuzzy` - true if text is matching in a fuzzy manner, skipping words in `stop_words.txt`
* `fuzzywuzzy` - configuration for simplistic [Levenshtein distance](https://en.wikipedia.org/wiki/Levenshtein_distance) based intent recognizer
* `examples_json` - JSON file with intents/example sentences
* `min_confidence` - minimum confidence required for intent to be converted to a JSON event (0-1)
* `remote` - configuration for remote Rhasspy server
* `url` - URL to POST text to for intent recognition (e.g., `http://your-rhasspy-server:12101/api/text-to-intent`)
* `rasa` - configuration for [Rasa NLU](https://rasa.com/) based intent recognizer
* `url` - URL of remote Rasa NLU server (e.g., `http://localhost:5005/`)
* `examples_markdown` - Markdown file to generate with intents/example sentences
* `project_name` - name of project to generate during training
* `adapt` - configuration for [Mycroft Adapt](https://github.com/MycroftAI/adapt) based intent recognizer
* `stop_words` - text file with words to ignore in training sentences
* `command` - configuration for external speech-to-text program
* `program` - path to executable
* `arguments` - list of arguments to pass to program
* `replace_numbers` if true, automatically replace number ranges (`N..M`) or numbers (`N`) with words
* `text_to_speech` - pronouncing words
* `system` - text to speech system (`espeak`, `flite`, `picotts`, `marytts`, `command`, or `dummy`)
* `espeak` - configuration for [eSpeak](http://espeak.sourceforge.net)
* `phoneme_map` - text file mapping CMU phonemes to eSpeak phonemes
* `flite` - configuration for [flite](http://www.festvox.org/flite)
* `voice` - name of voice to use (e.g., `kal16`, `rms`, `awb`)
* `picotts` - configuration for [PicoTTS](https://en.wikipedia.org/wiki/SVOX)
* `language` - language to use (default if not present)
* `marytts` - configuration for [MaryTTS](http://mary.dfki.de)
* `url` - address:port of MaryTTS server (port is usually 59125)
* `voice` - name of voice to use (e.g., `cmu-slt`). Default if not present.
* `locale` - name of locale to use (e.g., `en-US`). Default if not present.
* `wavenet` - configuration for Google's [WaveNet](https://cloud.google.com/text-to-speech/docs/wavenet)
* `cache_dir` - path to directory in your profile where WAV files are cached
* `credentials_json` - path to the JSON credentials file (generated online)
* `gender` - gender of speaker (`MALE` `FEMALE`)
* `language_code` - language/locale e.g. `en-US`,
* `sample_rate` - WAV sample rate (default: 22050)
* `url` - URL of WaveNet endpoint
* `voice` - voice to use (e.g., `Wavenet-C`)
* `fallback_tts` - text to speech system to use when offline or error occurs (e.g., `espeak`)
* `phoneme_examples` - text file with examples for each CMU phoneme
* `training` - training speech/intent recognizers
* `dictionary_number_duplicates` - true if duplicate words in dictionary should be suffixed by `(2)`, `(3)`, etc.
* `tokenizer` - system used to break sentences into words (`regex` only for now)
* `regex` - configuration for regex tokenizer
* `replace` - list of dictionaries with patterns/replacements used on each example sentence
* `split` - pattern used to break sentences into words
* `unknown_words` - configuration for dealing with words not in base/custom dictionaries
* `fail_when_present` - true if Rhasspy should halt training when unknown words are found
* `guess_pronunciations` - true if [Phonetisaurus](https://github.com/AdolfVonKleist/Phonetisaurus) should be used to guess how an unknown word is pronounced
* `speech_to_text` - training for speech decoder
* `system` - speech to text training system (`auto`, `pocketsphinx`, `kaldi`, `command`, or `dummy`)
* `command` - configuration for external speech-to-text training program
* `program` - path to executable
* `arguments` - list of arguments to pass to program
* `intent` - training for intent recognizer
* `system` - intent recognizer training system (`auto`, `fsticuffs`, `fuzzywuzzy`, `rasa`, `adapt`, `command`, or `dummy`)
* `command` - configuration for external intent recognizer training program
* `program` - path to executable
* `arguments` - list of arguments to pass to program
* `wake` - waking Rhasspy up for speech input
* `system` - wake word recognition system (`pocketsphinx`, `snowboy`, `precise`, `porcupine`, `command`, or `dummy`)
* `pocketsphinx` - configuration for Pocketsphinx wake word recognizer
* `keyphrase` - phrase to wake up on (3-4 syllables recommended)
* `threshold` - sensitivity of detection (recommended range 1e-50 to 1e-5)
* `chunk_size` - number of bytes per chunk to feed to Pocketsphinx (default 960)
* `snowboy` - configuration for [snowboy](https://snowboy.kitt.ai)
* `model` - path to model file(s), separated by commas (in profile directory)
* `sensitivity` - model sensitivity (0-1, default 0.5)
* `audio_gain` - audio gain (default 1)
* `apply_frontend` - true if ApplyFrontend should be set
* `chunk_size` - number of bytes per chunk to feed to snowboy (default 960)
* `model_settings` - settings for each snowboy model path (e.g., `snowboy/snowboy.umdl`)
* `<MODEL_PATH>`
* `sensitivity` - model sensitivity
* `audio_gain` - audio gain
* `apply_frontend` - true if ApplyFrontend should be set
* `precise` - configuration for [Mycroft Precise](https://github.com/MycroftAI/mycroft-precise)
* `engine_path` - path to the precise-engine binary
* `model` - path to model file (in profile directory)
* `sensitivity` - model sensitivity (0-1, default 0.5)
* `trigger_level` - number of events to trigger activation (default 3)
* `chunk_size` - number of bytes per chunk to feed to Precise (default 2048)
* `porcupine` - configuration for [PicoVoice's Porcupine](https://github.com/Picovoice/Porcupine)
* `library_path` - path to `libpv_porcupine.so` for your platform/architecture
* `model_path` - path to the `porcupine_params.pv` (lib/common)
* `keyword_path` - path to the `.ppn` keyword file
* `sensitivity` - model sensitivity (0-1, default 0.5)
* `command` - configuration for external speech-to-text program
* `program` - path to executable
* `arguments` - list of arguments to pass to program
* `microphone` - configuration for audio recording
* `system` - audio recording system (`pyaudio`, `arecord`, `hermes`, `gstreamer`, `http`, or `dummy`)
* `pyaudio` - configuration for [PyAudio](https://people.csail.mit.edu/hubert/pyaudio/) microphone
* `device` - index of device to use or empty for default device
* `frames_per_buffer` - number of frames to read at a time (default 480)
* `arecord` - configuration for ALSA microphone
* `device` - name of ALSA device (see `arecord -L`) to use or empty for default device
* `chunk_size` - number of bytes to read at a time (default 960)
* `http` - configuration for HTTP audio stream
* `host` - hostname or IP address of HTTP audio server (default 127.0.0.1)
* `port` - port to receive audio stream on (default 12333)
* `stop_after` - one of "never", "text", or "intent" ([see documentation](audio-input.md#http-stream))
* `gstreamer` - configuration for GStreamer audio recorder
* `pipeline` - GStreamer pipeline (e.g., `FILTER ! FILTER ! ...`) without sink
* `hermes` - configuration for MQTT "microphone" ([Hermes protocol](https://docs.snips.ai/reference/hermes))
* Subscribes to WAV data from `hermes/audioServer/<SITE_ID>/audioFrame`
* Requires MQTT to be enabled
* `sounds` - configuration for feedback sounds from Rhasspy
* `system` - which sound output system to use (`aplay`, `hermes`, or `dummy`)
* `wake` - path to WAV file to play when Rhasspy wakes up
* `recorded` - path to WAV file to play when a command finishes recording
* `aplay` - configuration for ALSA speakers
* `device` - name of ALSA device (see `aplay -L`) to use or empty for default device
* `hermes` - configuration for MQTT "speakers" ([Hermes protocol](https://docs.snips.ai/reference/hermes))
* WAV data published to `hermes/audioServer/<SITE_ID>/playBytes/<REQUEST_ID>`
* Requires MQTT to be enabled
* `command`
* `system` - which voice command listener system to use (`webrtcvad`, `oneshot`, `hermes`, or `dummy`)
* `webrtcvad` - configuration for [webrtcvad](https://github.com/wiseman/py-webrtcvad) system
* `sample_rate` - sample rate of input audio
* `chunk_size` - bytes per buffer (must be 10,20,30 ms)
* `vad_mode` - sensitivity of `webrtcvad` (0-3)
* `min_sec` - minimum number of seconds in a command
* `silence_sec` - number of seconds of silences after voice command before stopping
* `timeout_sec` - maximum number of seconds before stopping
* `throwaway_buffers` - number of buffers to drop when recording starts
* `speech_buffers` - number of buffers with speech before command starts
* `oneshot` - configuration for voice command system that takes first audio frame as entire command
* `timeout_sec` - maximum number of seconds before stopping
* `command` - configuration for external voice command program
* `program` - path to executable
* `arguments` - list of arguments to pass to program
* `hermes` - configuration for MQTT-based voice command system that listens betweens `startListening` and `stopListening` commands ([Hermes protocol](https://docs.snips.ai/reference/hermes))
* `timeout_sec` - maximum number of seconds before stopping
* `handle`
* `system` - which intent handling system to use (`hass`, `command`, or `dummy`)
* `forward_to_hass` - true if intents are always forwarded to Home Assistant (even if `system` is `command` or `remote`)
* `command` - configuration for external speech-to-text program
* `program` - path to executable
* `arguments` - list of arguments to pass to program
* `remote` - configuration for remote HTTP intent handler
* `url` - URL to POST intent JSON to and receive response JSON from
* `mqtt` - configuration for MQTT ([Hermes protocol](https://docs.snips.ai/reference/hermes))
* `enabled` - true if MQTT client should be started
* `host` - MQTT host
* `port` - MQTT port
* `username` - MQTT username (blank for anonymous)
* `password` - MQTT password
* `reconnect_sec` - number of seconds before client will reconnect
* `site_id` - ID of site ([Hermes protocol](https://docs.snips.ai/reference/hermes))
* `publish_intents` - true if intents are published to MQTT
* `download` - configuration for profile file downloading
* `cache_dir` - directory in your profile where downloaded files are cached
* `conditions` - profile settings that will trigger file downloads
* keys are profile setting paths (e.g., `wake.system`)
* values are dictionaries whose keys are profile settings values (e.g., `snowboy`)
* settings may have the form `<=N` or `!X` to mean "less than or equal to N" or "not X"
* leaf nodes are dictionaries whose keys are destination file paths and whose values reference the `files` dictionary
* `files` - locations, etc. of files to download
* keys are names of files
* values are dictionaries with:
* `url` - URL of file to download
* `cache` - `false` if file should be downloaded directly into profile (skipping cache)