---
source_path: "api/setting-keys/configuration.md"
canonical_url: "https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration/"
---

# Configuration

Configuration settings are both readable and writable and are part of task models;
they are saved to [Stream](https://doc.sensory.com/tnl/7.8/api/io.md#stream) by [dup](https://doc.sensory.com/tnl/7.8/api/inference.md#dup) and [save](https://doc.sensory.com/tnl/7.8/api/inference.md#save), and restored by [load](https://doc.sensory.com/tnl/7.8/api/inference.md#load).

Use these to change model or fine-tune model behavior. Models have reasonable
defaults, so most applications set no configuration keys at runtime — defaults
are baked into the `.snsr` model file at training time.

Most salient are [operating-point](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#operating-point) for wake words and command sets,
[leading-silence](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#leading-silence) and [trailing-silence](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#trailing-silence) for VAD templates,
[partial-result-interval](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#partial-result-interval) for LVCSR and STT, and [stt-profile](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#stt-profile) for STT models.

Common reasons applications *do* override configuration include enrollment
(see [user](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#user), [interactive](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#interactive)), [THF Micro][] export (see [dsp-target](https://doc.sensory.com/tnl/7.8/api/setting-keys/runtime.md#dsp-target)), and
selecting an active template slot in multi-stage models (see [slot](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#slot)).

Use the [Session](https://doc.sensory.com/tnl/7.8/api/inference.md#session) `get` and `set` functions that match the type of the setting.
Use [getInt](https://doc.sensory.com/tnl/7.8/api/inference.md#getters), for example, to read the
_(int)_ value for [operating-point](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#operating-point).

<!-- Setting-key page conventions: shared admonition for all docs/api/setting-keys/*.md pages. -->
### Details: Page conventions

Settings are grouped by concern. Within each group they're listed
alphabetically. A setting that serves more than one concern appears once
under its primary group; secondary groups link to it.

The code tabs on each setting show one paste-able call site per language.
Adapt the placeholder names (`s` for the [Session](https://doc.sensory.com/tnl/7.8/api/inference.md#session), plus `value`,
`stream`, `on_event`, or `on_item` for the operand) to your code. Each
example assumes the language's standard prelude:

<!-- tab: c -->

**C/C++**

```c
#include <snsr.h>
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
import com.sensory.speech.snsr.Snsr;
import com.sensory.speech.snsr.SnsrSession;
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
import snsr
```
<!-- /tab -->

For the full Session lifecycle (`snsrNew`, `new SnsrSession()`,
`snsr.Session(...)`) see [Your first program](https://doc.sensory.com/tnl/7.8/getting-started/your-first-program.md#your-first-program).

## Audio I/O

### audio-stream-size
- configuration
- int
- read-write

<!-- tab: c -->

**C/C++**

```c
snsrSetInt(s, SNSR_AUDIO_STREAM_SIZE, value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setInt(Snsr.AUDIO_STREAM_SIZE, value);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_int(snsr.AUDIO_STREAM_SIZE, value)
```
<!-- /tab -->

Input audio buffer size.

The number of audio samples kept in a circular audio history buffer,
accessible through [audio-stream](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#audio-stream).

Use this buffer to retrieve segmented audio using alignments
([begin-sample](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#begin-sample), [begin-ms](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#begin-ms), [end-sample](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#end-sample), [end-ms](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#end-ms))
obtained in the [^result](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#result).

Set to `0` to disable audio buffering.

**Also see these related items:** [audio-stream](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#audio-stream)

### samples-per-second
- configuration
- int
- read-only

<!-- tab: c -->

**C/C++**

```c
int value;
snsrGetInt(s, SNSR_SAMPLE_RATE, &value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
int value = s.getInt(Snsr.SAMPLE_RATE);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
value = s.get_int(snsr.SAMPLE_RATE)
```
<!-- /tab -->

Model sample rate in Hz.

## VAD & endpointing

### backoff
- configuration
- int
- read-write

<!-- tab: c -->

**C/C++**

```c
snsrSetInt(s, SNSR_BACKOFF, value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setInt(Snsr.BACKOFF, value);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_int(snsr.BACKOFF, value)
```
<!-- /tab -->

Start point back-off in ms.

Audio margin added before the start point found by a VAD.

**Also see these related items:** [begin-ms](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#begin-ms), [begin-sample](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#begin-sample)

### hold-over
- configuration
- int
- read-write

<!-- tab: c -->

**C/C++**

```c
snsrSetInt(s, SNSR_HOLD_OVER, value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setInt(Snsr.HOLD_OVER, value);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_int(snsr.HOLD_OVER, value)
```
<!-- /tab -->

Endpoint hold-over.

Audio margin added after the endpoint found by a VAD.
This is the amount of trailing silence to include in the segmentation.

**Also see these related items:** [end-ms](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#end-ms), [end-sample](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#end-sample)

### include-leading-silence
- configuration
- int
- read-write

<!-- tab: c -->

**C/C++**

```c
snsrSetInt(s, SNSR_INCLUDE_LEADING_SILENCE, value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setInt(Snsr.INCLUDE_LEADING_SILENCE, value);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_int(snsr.INCLUDE_LEADING_SILENCE, value)
```
<!-- /tab -->

Include leading silence in VAD output.

Set to `1` to include all audio up to the endpoint in the
[<-audio-pcm](https://doc.sensory.com/tnl/7.8/api/setting-keys/runtime.md#audio-pcm-out) output stream. Set to `0` to return to the
default behavior, which discards leading silence.

If this setting is used with a spot-VAD template such as
[tpl-spot-vad](https://doc.sensory.com/tnl/7.8/models/tpl/tpl-spot-vad.md#tpl-spot-vad-type), [tpl-spot-vad-lvcsr](https://doc.sensory.com/tnl/7.8/models/tpl/tpl-spot-vad-lvcsr.md#tpl-spot-vad-lvcsr-type),
or [tpl-opt-spot-vad-lvcsr](https://doc.sensory.com/tnl/7.8/models/tpl/tpl-opt-spot-vad-lvcsr.md#tpl-opt-spot-vad-lvcsr-type)
the leading silence includes the trigger phrase.

**Also see these related items:** [include-wake-word-audio](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#include-wake-word-audio), [<-audio-pcm](https://doc.sensory.com/tnl/7.8/api/setting-keys/runtime.md#audio-pcm-out), [pass-through](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#pass-through)

### include-wake-word-audio
- configuration
- int
- read-write
<!-- tab: c -->

**C/C++**

```c
snsrSetInt(s, SNSR_INCLUDE_WAKE_WORD_AUDIO, value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setInt(Snsr.INCLUDE_WAKE_WORD_AUDIO, value);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_int(snsr.INCLUDE_WAKE_WORD_AUDIO, value)
```
<!-- /tab -->

Include the wake word audio in VAD output

When set to `1`, VAD templates [tpl-spot-vad](https://doc.sensory.com/tnl/7.8/models/tpl/tpl-spot-vad.md#tpl-spot-vad-type),
[tpl-spot-vad-lvcsr](https://doc.sensory.com/tnl/7.8/models/tpl/tpl-spot-vad-lvcsr.md#tpl-spot-vad-lvcsr-type),
and [tpl-opt-spot-vad-lvcsr](https://doc.sensory.com/tnl/7.8/models/tpl/tpl-opt-spot-vad-lvcsr.md#tpl-opt-spot-vad-lvcsr-type)
include the wake word in the audio output.
Set to `0` to return to the default behavior, where the output does
not include the wake word audio.

**Note:**

This setting is a synonym for [include-leading-silence](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#include-leading-silence) when used with
these templates. If you set both `include-wake-word-audio` and `include-leading-silence`,
`include-wake-word-audio` takes precedence.

**Also see these related items:** [include-leading-silence](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#include-leading-silence), [<-audio-pcm](https://doc.sensory.com/tnl/7.8/api/setting-keys/runtime.md#audio-pcm-out), [pass-through](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#pass-through)

### leading-silence
- configuration
- int
- read-write

<!-- tab: c -->

**C/C++**

```c
snsrSetInt(s, SNSR_LEADING_SILENCE, value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setInt(Snsr.LEADING_SILENCE, value);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_int(snsr.LEADING_SILENCE, value)
```
<!-- /tab -->

VAD leading silence time-out, in ms.

The VAD will invoke the [^silence](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#silence) event handler
if no speech is detected during the first `leading-silence` ms of
processed audio.

**Also see these related items:** [^silence](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#silence), [trailing-silence](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#trailing-silence)

### max-recording
- configuration
- int
- read-write

<!-- tab: c -->

**C/C++**

```c
snsrSetInt(s, SNSR_MAX_RECORDING, value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setInt(Snsr.MAX_RECORDING, value);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_int(snsr.MAX_RECORDING, value)
```
<!-- /tab -->

VAD maximum record duration, in ms.

The VAD will invoke the [^limit](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#limit) event handler
if the detected speech segment exceeds this value.

**Also see these related items:** [^limit](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#limit)

### pass-through
- configuration
- int
- read-write

<!-- tab: c -->

**C/C++**

```c
snsrSetInt(s, SNSR_PASS_THROUGH, value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setInt(Snsr.PASS_THROUGH, value);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_int(snsr.PASS_THROUGH, value)
```
<!-- /tab -->

VAD audio pass-through behavior.

If set to `0`, no audio from [->audio-pcm](https://doc.sensory.com/tnl/7.8/api/setting-keys/runtime.md#-audio-pcm) will be passed
through to [<-audio-pcm](https://doc.sensory.com/tnl/7.8/api/setting-keys/runtime.md#audio-pcm-out). The begin- and endpoint handlers will
still be invoked. The default value, `1`, passes speech-detected samples
to [<-audio-pcm](https://doc.sensory.com/tnl/7.8/api/setting-keys/runtime.md#audio-pcm-out).

**Also see these related items:** [include-leading-silence](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#include-leading-silence)

### trailing-silence
- configuration
- int
- read-write

<!-- tab: c -->

**C/C++**

```c
snsrSetInt(s, SNSR_TRAILING_SILENCE, value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setInt(Snsr.TRAILING_SILENCE, value);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_int(snsr.TRAILING_SILENCE, value)
```
<!-- /tab -->

VAD trailing silence time-out, in ms.

The VAD will invoke the [^end](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#end) event handler
once `trailing-silence` ms of silence has followed the last bit of speech.

**Also see these related items:** [^end](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#end), [hold-over](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#hold-over), [leading-silence](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#leading-silence)

## Wake word & command set

### delay
- configuration
- int
- read-only
- deprecated [6.16.0](https://doc.sensory.com/tnl/7.8/changes/version-6.md#v6.16.0)
<!-- tab: c -->

**C/C++**

```c
int value;
snsrGetInt(s, SNSR_SPOT_DELAY, &value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
int value = s.getInt(Snsr.SPOT_DELAY);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
value = s.get_int(snsr.SPOT_DELAY)
```
<!-- /tab -->

Phrase spotter delay in ms.

**Deprecated:**

Support for this setting will be removed from
the next major release of the TrulyNatural SDK.

First deprecated in release 6.16.0 (2021-06-06) and made
read-only in 7.0.0 (2023-11-20).

The cumulative recognition score for a wake word or command recognizer can
exceed the decision threshold before the end of the utterance. This
setting controls how long the recognizer will wait while the recognition
score is still increasing before reporting the event.

Longer delays can increase the time alignment accuracy of the end of the spotted phrase.

### duration-ms
- configuration
- double
- read-write

<!-- tab: c -->

**C/C++**

```c
snsrSetDouble(s, SNSR_DURATION_MS, value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setDouble(Snsr.DURATION_MS, value);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_double(snsr.DURATION_MS, value)
```
<!-- /tab -->

Low false-reject listening window.

Selects the time window in ms following a close false-reject that
smart wake words will use [low-fr-operating-point](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#low-fr-operating-point) instead of
[operating-point](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#operating-point).

 Defaults to `10` seconds if not explicitly set.

**Also see these related items:** [low-fr-operating-point](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#low-fr-operating-point), [operating-point](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#operating-point)

### listen-window
- configuration
- int
- read-write

<!-- tab: c -->

**C/C++**

```c
snsrSetInt(s, SNSR_LISTEN_WINDOW, value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setInt(Snsr.LISTEN_WINDOW, value);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_int(snsr.LISTEN_WINDOW, value)
```
<!-- /tab -->

 Phrase spot listening window in seconds or milliseconds.

 This is the duration that a spotter will listen for a command
 before timing out. Spotters with short listening windows
 are typically optimized to have lower false reject, but higher
 false accept rates.

 If this value is `120` or less it is in seconds. Values larger
 than `120` are in ms. In wake word spotters tuned for
 continuous listening this value is `0`.

**Note:**

     type: note
This value is only used when:

* Converting models to DSP format for embedded use.
* When the spotter is used in slot `1` of the
  [tpl-spot-sequential](https://doc.sensory.com/tnl/7.8/models/tpl/tpl-spot-sequential.md#tpl-spot-sequential-type) spotter template model.

In all other cases spotters listen continuously,
regardless of the value of `listen-window`.

**Also see these related items:** [tpl-spot-sequential](https://doc.sensory.com/tnl/7.8/models/tpl/tpl-spot-sequential.md#tpl-spot-sequential-type), [loop](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#loop), [What is a Command Set?](https://doc.sensory.com/tnl/7.8/faq.md#use-command-set)

### low-fr-operating-point
- configuration
- int
- read-write

<!-- tab: c -->

**C/C++**

```c
snsrSetInt(s, SNSR_LOW_FR_OPERATING_POINT, value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setInt(Snsr.LOW_FR_OPERATING_POINT, value);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_int(snsr.LOW_FR_OPERATING_POINT, value)
```
<!-- /tab -->

Low false-reject spotter operating point.

Selects the low false-reject fall-back operating point used by
smart wake words. This low false-reject operating
point is selected for [duration-ms](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#duration-ms) if a spot was rejected at
[operating-point](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#operating-point) but would have been accepted
at `low-fr-operating-point`.

**Also see these related items:** [duration-ms](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#duration-ms), [operating-point](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#operating-point)

### operating-point
- configuration
- int
- read-write

<!-- tab: c -->

**C/C++**

```c
snsrSetInt(s, SNSR_OPERATING_POINT, value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setInt(Snsr.OPERATING_POINT, value);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_int(snsr.OPERATING_POINT, value)
```
<!-- /tab -->

Spotter operating point.

Selects the trade-off between false accept and false reject errors
for wake word and command set recognizers.

**Higher-numbered points are more accepting.**

* The valid range is from `1` to `21` inclusive.
* Lower-numbered points have a lower false accept rate at the expense
  of higher false reject fraction.
* The false accept rate is expressed as the expected number of false accepts
  (where the recognizer mistakenly spots the trigger phrase) per time unit.
  For example, 1.2 false accepts per day.
* The false reject rate is the percentage of times the actual trigger phrase
  is spoken, but not recognized. For example, 4.5%.
* The default operating point is selected by Sensory during trigger
  development for a good balance between the these two error types.
* Not all operating points are necessarily valid. Use
  [operating-point-iterator](https://doc.sensory.com/tnl/7.8/api/setting-keys/iterators.md#operating-point-iterator) to find all the [available points](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#available-point).

**Also see these related items:** [operating-point-iterator](https://doc.sensory.com/tnl/7.8/api/setting-keys/iterators.md#operating-point-iterator), [low-fr-operating-point](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#low-fr-operating-point), [duration-ms](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#duration-ms)

### score-offset
- configuration
- double
- read-write

<!-- tab: c -->

**C/C++**

```c
snsrSetDouble(s, SNSR_SCORE_OFFSET, value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setDouble(Snsr.SCORE_OFFSET, value);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_double(snsr.SCORE_OFFSET, value)
```
<!-- /tab -->

**Reserved:**

Do not use unless recommended by Sensory.

### sv-threshold
- configuration
- double
- read-write

<!-- tab: c -->

**C/C++**

```c
snsrSetDouble(s, SNSR_SV_THRESHOLD, value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setDouble(Snsr.SV_THRESHOLD, value);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_double(snsr.SV_THRESHOLD, value)
```
<!-- /tab -->

Enrolled wake word speaker verification threshold.

Enrolled wake word results with a [sv-score](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#sv-score) less than this threshold are
not reported. Increase this threshold to reduce the chance that someone
other than the enrolled speaker triggers the phrase spotter.

**Also see these related items:** [^result](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#result), [sv-score](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#sv-score)

### threshold
- configuration
- int
- read-write
- deprecated [7.4.0](https://doc.sensory.com/tnl/7.8/changes/index.md#v7.4.0)
<!-- tab: c -->

**C/C++**

```c
snsrSetInt(s, SNSR_THRESHOLD, value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setInt(Snsr.THRESHOLD, value);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_int(snsr.THRESHOLD, value)
```
<!-- /tab -->

Dynamic operating point selection threshold.

**Deprecated:**

 Superseded by built-in support for smart wake words in
 TrulyNatural 7.4.0.

Selects the threshold used by `tpl-spot-dynop-1.4.0.snsr` to decide whether
to select the [low-fr-operating-point](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#low-fr-operating-point).

**Also see these related items:** [duration-ms](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#duration-ms), [low-fr-operating-point](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#low-fr-operating-point), [operating-point](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#operating-point)

## LVCSR & STT

### ac-prune-top-k
- configuration
- int
- read-write
_(TrulyNatural only)_ 
<!-- tab: c -->

**C/C++**

```c
snsrSetInt(s, SNSR_AC_PRUNE_TOP_K, value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setInt(Snsr.AC_PRUNE_TOP_K, value);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_int(snsr.AC_PRUNE_TOP_K, value)
```
<!-- /tab -->

Reduce LVCSR decoder CPU use

This setting trades CPU use for recognition accuracy.

A subset recognizers optimized for low resource use created by [VoiceHub](https://doc.sensory.com/tnl/7.8/reference/voicehub.md#voicehub) allow
reducing the CPU cycles used in search decoding at the expense of an
increased recognition error rate.

Set to `0` to disable.

### am-size
- configuration
- double
- read-only
- STT only
<!-- tab: c -->

**C/C++**

```c
double value;
snsrGetDouble(s, SNSR_RES_AM_SIZE, &value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
double value = s.getDouble(Snsr.RES_AM_SIZE);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
value = s.get_double(snsr.RES_AM_SIZE)
```
<!-- /tab -->

Size of STT acoustic model, in bytes.

**Note:**

Not supported for all STT models.

**Also see these related items:** [lm-size](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#lm-size), [nlu-size](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#nlu-size), [slm-size](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#slm-size)

### backlog-interval
- configuration
- double
- read-write
_(TrulyNatural only)_ _(STT only)_ 
<!-- tab: c -->

**C/C++**

```c
snsrSetDouble(s, SNSR_BACKLOG_INTERVAL, value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setDouble(Snsr.BACKLOG_INTERVAL, value);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_double(snsr.BACKLOG_INTERVAL, value)
```
<!-- /tab -->

Partial result update interval used while processing an audio backlog.

This setting overrides [partial-result-interval](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#partial-result-interval) when recognizing audio
that precedes a wake word, enabled by setting [wake-word-at-end](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#wake-word-at-end) to
`1` or `2`. By default `backlog-interval = 0` for the lowest recognition
result latency.

**Also see these related items:** [partial-result-interval](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#partial-result-interval), [wake-word-at-end](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#wake-word-at-end), [tpl-opt-spot-vad-lvcsr](https://doc.sensory.com/tnl/7.8/models/tpl/tpl-opt-spot-vad-lvcsr.md#tpl-opt-spot-vad-lvcsr-type), [tpl-spot-vad-lvcsr](https://doc.sensory.com/tnl/7.8/models/tpl/tpl-spot-vad-lvcsr.md#tpl-spot-vad-lvcsr-type)

### complete-only
- configuration
- int
- read-write
- TrulyNatural only
<!-- tab: c -->

**C/C++**

```c
snsrSetInt(s, SNSR_COMPLETE_ONLY, value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setInt(Snsr.COMPLETE_ONLY, value);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_int(snsr.COMPLETE_ONLY, value)
```
<!-- /tab -->

Controls whether incomplete LVCSR results are accepted.

The [text](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#text) result available in the [^result](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#result)
callback for LVCSR recognizers reports the recognition result that
best matches the acoustic evidence the recognizer saw.
With `complete-only = 0` the behavior is to show incomplete results,
even if they are not accepted by the grammar specification.
For example, if a custom recognizer uses

```
grammar = <s> 1 2 3 4 5 6 7 8 9 10 </s>;
```
and the audio contains only "1 2 3 4", then the final result will be
"1 2 3 4".

If this behavior is not desirable, setting `complete-only = 1`
will suppress such incomplete results. The [^result](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#result) callback
will still happen, but [text](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#text) will be `<no-match/>`.
The [^nlu-intent](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#nlu-intent) and [^nlu-slot](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#nlu-slot) events will not be invoked.

 If `complete-only` isn't explicitly set it defaults to `1`.

**Also see these related items:** [^result](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#result), [text](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#text)

### custom-vocab
- configuration
- string
- read-write
- STT only
<!-- tab: c -->

**C/C++**

```c
snsrSetString(s, SNSR_CUSTOM_VOCAB, "text");
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setString(Snsr.CUSTOM_VOCAB, "text");
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_string(snsr.CUSTOM_VOCAB, "text")
```
<!-- /tab -->

Custom STT vocabulary.

STT recognizers occasionally do not have full vocabulary
coverage for low-frequency words, proper names, trade marks, and such.
Use this custom vocabulary setting to add new words to a recognizer.

**Note:**

Use custom vocabulary to address minor recognition issues. For more
than a couple of hundred entries you'll get better performance with a
domain-specific STT model. Contact your Sensory sales representative
to explore options.

Map format:
```
output word or phrase [, incorrect result [, incorrect result [, ...]]]
...
```

* New vocabulary word or phrase,
* followed by zero or more mis-recognized examples,
  each prefixed with a `,` separator.
* Vocabulary entries are separated by `\r`, `\n` or `;`

**Example custom vocabulary:**

**`custom-vocab.txt`**

```sh
voice genie #(1)!
voice genie, voice jenny #(2)!
armadillo, i'm adello, amadello #(3)!
```

1. New vocabulary phrase, without any mis-recognized alternates. If "voice genie" is one of the alternates
   the recognizer is considering this will increase the likelihood that it is selected as the result.
2. If the STT engine were to recognize "voice jenny" it will be rewritten to "voice genie"
3. If the STT engine recognizes "i'm adello" or "amadello" these will both be rewritten as "armadillo" in the result.

**Example:**

```console
% snsr-eval -t model/stt-enUS-automotive-medium-2.3.15-pnc.snsr \
            -s partial-result-interval=0 \
            data/enrollments/armadillo-1-4-c.wav
NLU intent: no_command = an anlla record a video
400   1720 an anlla record a video

% snsr-eval -t model/stt-enUS-automotive-medium-2.3.15-pnc.snsr \
            -s partial-result-interval=0 \
            -s 'custom-vocab="armadillo, an anlla; jackalope"' \
            data/enrollments/armadillo-1-4-c.wav
NLU intent: no_command = armadillo record a video
400   1720 armadillo record a video
```

### lm-size
- configuration
- double
- read-only
- STT only
<!-- tab: c -->

**C/C++**

```c
double value;
snsrGetDouble(s, SNSR_RES_LM_SIZE, &value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
double value = s.getDouble(Snsr.RES_LM_SIZE);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
value = s.get_double(snsr.RES_LM_SIZE)
```
<!-- /tab -->

Size of STT language model, in bytes.

**Note:**

Not supported for all STT models.

**Also see these related items:** [am-size](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#am-size), [nlu-size](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#nlu-size), [slm-size](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#slm-size)

### partial-result-interval
- configuration
- double
- read-write
_(TrulyNatural only)_ _(STT only)_
<!-- tab: c -->

**C/C++**

```c
snsrSetDouble(s, SNSR_PARTIAL_RESULT_INTERVAL, value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setDouble(Snsr.PARTIAL_RESULT_INTERVAL, value);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_double(snsr.PARTIAL_RESULT_INTERVAL, value)
```
<!-- /tab -->

Partial result update interval.

The current preliminary result is emitted every `partial-result-interval`
milliseconds. Set to `0` to disable partial result reporting.

**Warning:**

Do not change `partial-result-interval` from an event handler,
or while a model is running.

Using `partial-result-interval` values below 120 ms adds significant CPU overhead.

**Note:**

In STT models this also sets the interval at which the model is
evaluated. Less frequent updates trade preliminary result latency for
lower average CPU use. Set to `0` for the lowest possible evaluation rate
and CPU use.

**Also see these related items:** [^result-partial](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#result-partial)

### ram-limit
- configuration
- double
- read-write
_(TrulyNatural only)_ 
<!-- tab: c -->

**C/C++**

```c
snsrSetDouble(s, SNSR_RAM_LIMIT, value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setDouble(Snsr.RAM_LIMIT, value);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_double(snsr.RAM_LIMIT, value)
```
<!-- /tab -->

Limit LVCSR decoder memory use

The amount of heap RAM to allocate to LVCSR search decoding, in bytes.

A subset recognizers optimized for low resource use created by [VoiceHub](https://doc.sensory.com/tnl/7.8/reference/voicehub.md#voicehub) allow
limiting the amount of heap RAM to allocate to search decoding.
This setting modifies this limit. Lower values can increase error rates,
so set this to as large a value as constraints allow.
Set to `0` to disable the limit.

**Also see these related items:** [ac-prune-top-k](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#ac-prune-top-k)

### result-max
- configuration
- int
- read-write
- TrulyNatural only
<!-- tab: c -->

**C/C++**

```c
snsrSetInt(s, SNSR_RESULT_MAX, value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setInt(Snsr.RESULT_MAX, value);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_int(snsr.RESULT_MAX, value)
```
<!-- /tab -->

The maximum number of alternate phrase results to consider

Limits the number of alternate phrases returned by LVCSR models.

If `result-max > 1`, [phrase-iterator](https://doc.sensory.com/tnl/7.8/api/setting-keys/iterators.md#phrase-iterator) will return phrase-level
recognition results in order of likelihood.

The default is `result-max == 1`, which returns only the
most likely result.

Limitations

- [word-iterator](https://doc.sensory.com/tnl/7.8/api/setting-keys/iterators.md#word-iterator) and [phone-iterator](https://doc.sensory.com/tnl/7.8/api/setting-keys/iterators.md#phone-iterator) are available for the
  most likely result only.
- Time alignments are accurate for the most likely result only.
- [score](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#score) values are not usable when `result-max > 1`.
- Silence markup is elided from all but the top scoring phrase. An
  empty [text](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#text) result indicates that silence was the best
  match to the acoustic input.

**Warning:**

N-best processing is computationally expensive, frequently
prohibitively so. Contact Sensory for guidance before using this
feature in production.

**Also see these related items:** [^result](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#result), [phrase-iterator](https://doc.sensory.com/tnl/7.8/api/setting-keys/iterators.md#phrase-iterator)

### search.frame-nota
- configuration
- double
- read-write
- TrulyNatural only
<!-- tab: c -->

**C/C++**

```c
snsrSetDouble(s, SNSR_OOV_REJECT, value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setDouble(Snsr.OOV_REJECT, value);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_double(snsr.OOV_REJECT, value)
```
<!-- /tab -->

Out-of-vocabulary rejection sensitivity.

This setting controls out-of-vocabulary rejection in custom
LVCSR recognizers.

Custom LVCSR recognizers report `<no-match/>` for words or phrases
that are not in the grammar. With an `search.frame-nota` value of `0` the
recognizer will never report `<no-match/>`, it will return the closest
match instead. With `search.frame-nota` at `1.0`, almost all input will return
`<no-match/>`.

The optimal value for `search.frame-nota` depends on the vocabulary used. A
reasonable value to start testing with is `0.2`.

**Note:**

Do not change `search.frame-nota` for models that include statistical language
model components. These models typically have either `-broad-` or
`-background-` in the model name, and are configured to use the language
model to recognize utterances not covered by the custom grammar.

**Also see these related items:** [grammar-stream](https://doc.sensory.com/tnl/7.8/api/setting-keys/runtime.md#grammar-stream)

### show-silence
- configuration
- int
- read-write
- TrulyNatural only
<!-- tab: c -->

**C/C++**

```c
snsrSetInt(s, SNSR_SHOW_SILENCE, value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setInt(Snsr.SHOW_SILENCE, value);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_int(snsr.SHOW_SILENCE, value)
```
<!-- /tab -->

Include silence in recognizer results.

When set to `1`, LVCSR recognition results include word-pause `<wp>`,
sentence-begin `<s>`, and sentence-end `</s>` markup. The default value
is `0`, which elides these from results.

**Also see these related items:** [^result](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#result), [^result-partial](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#result-partial)

### stt-profile
- configuration
- string
- read-write
_(STT only)_ 
<!-- tab: c -->

**C/C++**

```c
snsrSetString(s, SNSR_STT_PROFILE, "text");
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setString(Snsr.STT_PROFILE, "text");
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_string(snsr.STT_PROFILE, "text")
```
<!-- /tab -->

Select STT speed vs accuracy trade-off.

Default value is `accurate`, set to `fast` to reduce CPU load at the expense
of recognition accuracy.

**Also see these related items:** [^result](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#result), [^result-partial](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#result-partial)

## NLU & SLM

### nlu-match-max
- configuration
- int
- read-write
- TrulyNatural only
<!-- tab: c -->

**C/C++**

```c
snsrSetInt(s, SNSR_NLU_RES_MAX, value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setInt(Snsr.NLU_RES_MAX, value);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_int(snsr.NLU_RES_MAX, value)
```
<!-- /tab -->

The maximum number of alternate NLU matches to consider

Limits the number of [^nlu-slot](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#nlu-slot) callbacks issued
in case of multiple valid NLU matches to the recognition result.
The default value is `1`, limiting NLU results to the best-scoring
match only.

**Also see these related items:** [^nlu-slot](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#nlu-slot), [nlu-match-index](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#nlu-match-index), [nlu-slot-count](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#nlu-slot-count)

### nlu-size
- configuration
- double
- read-only
- STT only
<!-- tab: c -->

**C/C++**

```c
double value;
snsrGetDouble(s, SNSR_RES_NLU_SIZE, &value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
double value = s.getDouble(Snsr.RES_NLU_SIZE);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
value = s.get_double(snsr.RES_NLU_SIZE)
```
<!-- /tab -->

Size of STT NLU model, in bytes.

**Note:**

Not supported for all STT models.

**Also see these related items:** [am-size](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#am-size), [lm-size](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#lm-size), [slm-size](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#slm-size)

### slm-enabled
- configuration
- int
- read-write
_(STT only)_ 
<!-- tab: c -->

**C/C++**

```c
snsrSetInt(s, SNSR_SLM_ENABLED, value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setInt(Snsr.SLM_ENABLED, value);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_int(snsr.SLM_ENABLED, value)
```
<!-- /tab -->

Enable optional SLM component.

Set to `0` to turn the SLM component off, `1` to turn on.

**Also see these related items:** [^slm-start](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#slm-start), [^slm-result](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#slm-result), [^slm-result-partial](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#slm-result-partial), [slm-turn-limit](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#slm-turn-limit)

### slm-size
- configuration
- double
- read-only
_(STT only)_ 
<!-- tab: c -->

**C/C++**

```c
double value;
snsrGetDouble(s, SNSR_RES_SLM_SIZE, &value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
double value = s.getDouble(Snsr.RES_SLM_SIZE);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
value = s.get_double(snsr.RES_SLM_SIZE)
```
<!-- /tab -->

Size of STT SLM, in bytes.

**Note:**

Not supported for all STT models.

**Also see these related items:** [am-size](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#am-size), [lm-size](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#lm-size), [nlu-size](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#nlu-size)

### slm-turn-limit
- configuration
- int
- read-write
_(STT only)_ 
<!-- tab: c -->

**C/C++**

```c
snsrSetInt(s, SNSR_SLM_TURN_LIMIT, value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setInt(Snsr.SLM_TURN_LIMIT, value);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_int(snsr.SLM_TURN_LIMIT, value)
```
<!-- /tab -->

Configure SLM history behavior.

If `slm-turn-limit >= 0` the optional SLM component limits
the number of conversational turns in the model history.
The default `-1`, which keeps all history.

Writing to `slm-turn-limit` discards existing history.

**Note:**

Values larger than `0` increases the SLM result latency and CPU use.

**Also see these related items:** [^slm-result](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#slm-result), [^slm-result-partial](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#slm-result-partial), [slm-enabled](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#slm-enabled)

## Templates & slots

### 0.
- configuration
- stream
- read-write

<!-- tab: c -->

**C/C++**

```c
snsrSetStream(s, SNSR_SLOT_0, stream);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setStream(Snsr.SLOT_0, stream);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_stream(snsr.SLOT_0, stream)
```
<!-- /tab -->

Template slot `0`.

The first slot in a template task.

Template slots expect a [Stream](https://doc.sensory.com/tnl/7.8/api/io.md#stream) opened on a `.snsr` model file.

You can also use this string value as an argument with [slot](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#slot).

**Also see these related items:** [slot](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#slot)

### 1.
- configuration
- stream
- read-write

<!-- tab: c -->

**C/C++**

```c
snsrSetStream(s, SNSR_SLOT_1, stream);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setStream(Snsr.SLOT_1, stream);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_stream(snsr.SLOT_1, stream)
```
<!-- /tab -->

Template slot `1`.

The second slot in a template task.

Template slots expect a [Stream](https://doc.sensory.com/tnl/7.8/api/io.md#stream) opened on a `.snsr` model file.

You can also use this string value as an argument with [slot](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#slot).

**Also see these related items:** [slot](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#slot)

### include-model
- configuration
- int
- read-write

<!-- tab: c -->

**C/C++**

```c
snsrSetInt(s, SNSR_INCLUDE_MODEL, value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setInt(Snsr.INCLUDE_MODEL, value);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_int(snsr.INCLUDE_MODEL, value)
```
<!-- /tab -->

Debug log includes a copy of the model.

This boolean value controls whether the [debug-log-file](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#debug-log-file) includes
a copy of the task model (the `.snsr` file).

The default value is `1`. Set `include-model=0` for
smaller (but less complete) debug log files.

**Also see these related items:** [debug-log-file](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#debug-log-file)

### loop
- configuration
- int
- read-write

<!-- tab: c -->

**C/C++**

```c
snsrSetInt(s, SNSR_LOOP, value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setInt(Snsr.LOOP, value);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_int(snsr.LOOP, value)
```
<!-- /tab -->

Control template looping behavior.

In [tpl-spot-sequential](https://doc.sensory.com/tnl/7.8/models/tpl/tpl-spot-sequential.md#tpl-spot-sequential-type), setting this
value to `1` changes _when_ the listening focus returns to slot [0](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#0).
Instead of immediately returning to slot [0](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#0) after a spot in slot [1](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#1), it
resets the expiration timer, and only a [1](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#1).[listen-window](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#listen-window)
timeout returns to slot [0](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#0).

This allows for a wake word followed by zero or more commands from a
command set. The default behavior (`loop = 0`) is to allow at most one command
before requiring another wake word utterance.

 Setting `loop = 2` pins the listening focus to slot [1](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#1).
Use this, for example, if an application needs to gate a command set recognizer with
a wake word or an external event such as a push-to-talk button.

**Also see these related items:** [tpl-spot-sequential](https://doc.sensory.com/tnl/7.8/models/tpl/tpl-spot-sequential.md#tpl-spot-sequential-type), [listen-window](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#listen-window)

### slot
- configuration
- string
- read-write

<!-- tab: c -->

**C/C++**

```c
snsrSetString(s, SNSR_SLOT, "text");
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setString(Snsr.SLOT, "text");
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_string(snsr.SLOT, "text")
```
<!-- /tab -->

Template slot selector.

Use with [tpl-spot-select](https://doc.sensory.com/tnl/7.8/models/tpl/tpl-spot-select.md#tpl-spot-select-type) and
[tpl-opt-spot-vad-lvcsr](https://doc.sensory.com/tnl/7.8/models/tpl/tpl-opt-spot-vad-lvcsr.md#tpl-opt-spot-vad-lvcsr-type)
to select the active slot.

**Also see these related items:** [0](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#0), [1](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#1), [phrasespot](https://doc.sensory.com/tnl/7.8/api/setting-keys/values.md#phrasespot), [lvcsr](https://doc.sensory.com/tnl/7.8/api/setting-keys/values.md#lvcsr)

### wake-word-at-end
- configuration
- int
- read-write
<!-- tab: c -->

**C/C++**

```c
snsrSetInt(s, SNSR_WAKE_WORD_AT_END, value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setInt(Snsr.WAKE_WORD_AT_END, value);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_int(snsr.WAKE_WORD_AT_END, value)
```
<!-- /tab -->

Support for trailing wake words.

Setting this to `1` or `2` enables support for recognizing utterances gated by
a wake word at the end of an utterance, in addition to gating by a wake word
at the start. `1` does not include the wake word audio, but `2` does. `0` turns
this feature off.

**Note:**

This feature requires an [audio-stream-size](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#audio-stream-size) large enough to hold the entire
utterance. Enabling `wake-word-at-end` will increase this to ten seconds if
it starts out smaller.

If the utterance before the wake word does not fit into the `audio-stream-size`
ring buffer, the VAD will invoke the [^limit](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#limit) event instead of [^end](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#end)

**Also see these related items:** [backlog-interval](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#backlog-interval), [tpl-opt-spot-vad-lvcsr](https://doc.sensory.com/tnl/7.8/models/tpl/tpl-opt-spot-vad-lvcsr.md#tpl-opt-spot-vad-lvcsr-type), [tpl-spot-vad-lvcsr](https://doc.sensory.com/tnl/7.8/models/tpl/tpl-spot-vad-lvcsr.md#tpl-spot-vad-lvcsr-type), [tpl-spot-vad](https://doc.sensory.com/tnl/7.8/models/tpl/tpl-spot-vad.md#tpl-spot-vad-type), [use-trailing-wake-word](https://doc.sensory.com/tnl/7.8/models/tpl/tpl-opt-spot-vad-lvcsr.md#use-trailing-wake-word)

## Enrollment & adaptation

### accuracy
- configuration
- double
- read-write

<!-- tab: c -->

**C/C++**

```c
snsrSetDouble(s, SNSR_ACCURACY, value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setDouble(Snsr.ACCURACY, value);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_double(snsr.ACCURACY, value)
```
<!-- /tab -->

Enrollment accuracy.

Trades accuracy of the enrolled model for enrollment speed.
The default accuracy is `1.0`, for the best accuracy at the slowest
enrollment speed. Valid range is `0.0` to `1.0`.

**Also see these related items:** [^adapted](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#adapted), [^enrolled](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#enrolled)

### ctx-enroll
- configuration
- int
- read-write

<!-- tab: c -->

**C/C++**

```c
snsrSetInt(s, SNSR_ENROLLMENT_CONTEXT, value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setInt(Snsr.ENROLLMENT_CONTEXT, value);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_int(snsr.ENROLLMENT_CONTEXT, value)
```
<!-- /tab -->

Number of enrollments with trailing context.

The recommended number of enrollments where the phrase is followed by
additional speech. For example: "Hey Sensory will it rain tomorrow?"

### enrollment-task-index
- configuration
- int
- read-write

<!-- tab: c -->

**C/C++**

```c
snsrSetInt(s, SNSR_ENROLLMENT_TASK_INDEX, value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setInt(Snsr.ENROLLMENT_TASK_INDEX, value);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_int(snsr.ENROLLMENT_TASK_INDEX, value)
```
<!-- /tab -->

The index of the sub-task to enroll.

For enrollment tasks that contain multiple sub-tasks (for example,
a user-defined trigger and an enrolled fixed trigger), this integer
value selects which of the sub-tasks the enrollments should be applied to.

See the documentation delivered with the task file for the sub-task mapping.

**Note:**

For most enrollment tasks the only supported task index is `0`.

### interactive
- configuration
- int
- read-write

<!-- tab: c -->

**C/C++**

```c
snsrSetInt(s, SNSR_INTERACTIVE_MODE, value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setInt(Snsr.INTERACTIVE_MODE, value);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_int(snsr.INTERACTIVE_MODE, value)
```
<!-- /tab -->

Interactive enrollment mode.

This changes the enrollment task behavior: When set to `0`, enrollment
for the current phrase will continue until the end of the stream.

**Also see these related items:** [^adapted](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#adapted), [^enrolled](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#enrolled)

### max-users
- configuration
- int
- read-write

<!-- tab: c -->

**C/C++**

```c
snsrSetInt(s, SNSR_MAX_USERS, value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setInt(Snsr.MAX_USERS, value);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_int(snsr.MAX_USERS, value)
```
<!-- /tab -->

Maximum number of users to adapt to.

Sets a limit to the number of distinct users a continuously adapting
fixed-phrase spotter will enroll.

### req-enroll
- configuration
- int
- read-write

<!-- tab: c -->

**C/C++**

```c
snsrSetInt(s, SNSR_ENROLLMENT_TARGET, value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setInt(Snsr.ENROLLMENT_TARGET, value);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_int(snsr.ENROLLMENT_TARGET, value)
```
<!-- /tab -->

Enrollment target.

The recommended number of enrollments for each user. Using either more or
fewer enrollments will reduce overall spotter performance.

**Also see these related items:** [user-iterator](https://doc.sensory.com/tnl/7.8/api/setting-keys/iterators.md#user-iterator), [enrollment-count](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#enrollment-count)

### save-enroll-audio
- configuration
- int
- read-write

<!-- tab: c -->

**C/C++**

```c
snsrSetInt(s, SNSR_SAVE_ENROLLMENT_AUDIO, value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setInt(Snsr.SAVE_ENROLLMENT_AUDIO, value);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_int(snsr.SAVE_ENROLLMENT_AUDIO, value)
```
<!-- /tab -->

Include enrollment audio in the enrollment context.

Set to `1` to include the enrollment audio in enrollment contexts,
`0` to exclude.

**Also see these related items:** [RUNTIME](https://doc.sensory.com/tnl/7.8/api/inference.md#fm_runtime), [enrollment-iterator](https://doc.sensory.com/tnl/7.8/api/setting-keys/iterators.md#enrollment-iterator)

### user
- configuration
- string
- read-write

<!-- tab: c -->

**C/C++**

```c
snsrSetString(s, SNSR_USER, "text");
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setString(Snsr.USER, "text");
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_string(snsr.USER, "text")
```
<!-- /tab -->

Enrolling user tag.

Sets the tag for the current enrollment. This should be a unique
alphanumeric phrase, without spaces. It is the phrase returned
as a recognition result.

If enrolling more than one phrase for any of the users, the
tag *must* contain one `/` that separates a user-specific part
from the phrase part. For example:  `user1/phrase1`, `user2/phrase1`,
`user2/phrase2`.

**Also see these related items:** [^adapted](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#adapted), [^enrolled](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#enrolled)

## Push / pull execution

### push-buffer-backlog
- configuration
- int
- read-write

<!-- tab: c -->

**C/C++**

```c
snsrSetInt(s, SNSR_RES_PUSH_BUFFER_BACKLOG, value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setInt(Snsr.RES_PUSH_BUFFER_BACKLOG, value);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_int(snsr.RES_PUSH_BUFFER_BACKLOG, value)
```
<!-- /tab -->

Reports the number of bytes of deferred [push](https://doc.sensory.com/tnl/7.8/api/inference.md#push) data.

If [push](https://doc.sensory.com/tnl/7.8/api/inference.md#push) is used with a [push-duration-limit](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#push-duration-limit), this setting reports
the number of bytes deferred for processing in subsequent calls
to [push](https://doc.sensory.com/tnl/7.8/api/inference.md#push).

**Also see these related items:** [push](https://doc.sensory.com/tnl/7.8/api/inference.md#push), [push-buffer-size](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#push-buffer-size), [push-duration-limit](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#push-duration-limit)

### push-buffer-size
- configuration
- int
- read-write

<!-- tab: c -->

**C/C++**

```c
snsrSetInt(s, SNSR_PUSH_BUFFER_SIZE, value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setInt(Snsr.PUSH_BUFFER_SIZE, value);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_int(snsr.PUSH_BUFFER_SIZE, value)
```
<!-- /tab -->

The size of the internal ring buffers used by [push](https://doc.sensory.com/tnl/7.8/api/inference.md#push).

If [push](https://doc.sensory.com/tnl/7.8/api/inference.md#push) is used with a [push-duration-limit](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#push-duration-limit), processing will
require deferral if the duration limit is reached. In this case, [push](https://doc.sensory.com/tnl/7.8/api/inference.md#push)
will allocate a ring buffer to hold these data. This setting configures
the size of this buffer, in bytes.

The default buffer size is sufficient to defer up to 250 ms of audio data.

**Also see these related items:** [push](https://doc.sensory.com/tnl/7.8/api/inference.md#push), [push-duration-limit](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#push-duration-limit), [push-buffer-backlog](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#push-buffer-backlog)

### push-duration-limit
- configuration
- double
- read-write

<!-- tab: c -->

**C/C++**

```c
snsrSetDouble(s, SNSR_PUSH_DURATION_LIMIT, value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setDouble(Snsr.PUSH_DURATION_LIMIT, value);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_double(snsr.PUSH_DURATION_LIMIT, value)
```
<!-- /tab -->

Sets a limit to the maximum processing time [push](https://doc.sensory.com/tnl/7.8/api/inference.md#push) should consume.

This setting is the maximum number of milliseconds any call to [push](https://doc.sensory.com/tnl/7.8/api/inference.md#push)
should spend processing data before returning control to the caller.

The default value is `0`, which disables the processing limit.

**Note:**

This requires a valid real-time clock function, see [CONFIG_CLOCK_FUNC](https://doc.sensory.com/tnl/7.8/api/library-config.md#config_clock_func).

TrulyNatural SDK libraries for Android, Linux, macOS, iOS,
C, Java, and Python
include real-time clock functions and require no additional configuration.

You should use a `push-duration-limit` if:

* You're using [push](https://doc.sensory.com/tnl/7.8/api/inference.md#push), and
* you collect live audio on the same thread as the recognizer, and
* you will drop audio packets if you don't return from [push](https://doc.sensory.com/tnl/7.8/api/inference.md#push)
  before the next packet is available.

`push-duration-limit` adds a cap to the amount of CPU used in
each call to [push](https://doc.sensory.com/tnl/7.8/api/inference.md#push). This requires and allocates an additional
input ring buffer that's [push-buffer-size](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#push-buffer-size) bytes in size.

If you have a separate thread, or interrupt-driven live audio recording
and you want to maximize throughput, increase the size of the audio ring
buffer instead of using a `push-duration-limit`.

Recommendations:

* Use 15 ms audio chunks.
* The audio recording buffer size determines the longest time the average
  recognizer throughput can fall behind real time.
* With a 30 ms buffer only two 15 ms blocks fit, which means that every
  SDK processing call must return within 15 ms, or a block or
  partial block will be lost.
* Using a 300 ms buffer relaxes this. 20 blocks mean that the recognizer can fall up
  to 18 blocks (270 ms) behind before losing audio.

**Also see these related items:** [push](https://doc.sensory.com/tnl/7.8/api/inference.md#push), [push-buffer-size](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#push-buffer-size), [push-buffer-backlog](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#push-buffer-backlog), [CLOCK_FUNC](https://doc.sensory.com/tnl/7.8/api/library-config.md#config_clock_func)

## Logging & diagnostics

### cache-file
- configuration
- string
- read-write

<!-- tab: c -->

**C/C++**

```c
snsrSetString(s, SNSR_CACHE_FILE, "text");
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setString(Snsr.CACHE_FILE, "text");
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_string(snsr.CACHE_FILE, "text")
```
<!-- /tab -->

Continuous Adaptation cache file name.

When set, enrolled user data will be saved to, and loaded from
this file. If not set, enrolled user data are discarded when
the spotter session is released.

This setting is only available in fixed-phrase spotters that
support continuous adaptation.

If you need more control over how or when the enrollment context is saved
you can do this from the [^adapted](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#adapted) callback handler.

**Also see these related items:** [^adapted](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#adapted)

### debug-log-file
- configuration
- string
- read-write

<!-- tab: c -->

**C/C++**

```c
snsrSetString(s, SNSR_DEBUG_LOG_FILE, "text");
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setString(Snsr.DEBUG_LOG_FILE, "text");
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_string(snsr.DEBUG_LOG_FILE, "text")
```
<!-- /tab -->

Debug log filename.

The name of the log file [tpl-spot-debug](https://doc.sensory.com/tnl/7.8/models/tpl/tpl-spot-debug.md#tpl-spot-debug-type) writes to.
This value is required, and no default is defined in the template. The directory
the log file is in must exist, and must be writable.

These optional and mutually exclusive character sequences are
substituted with the time stamp when the log file is first opened:

* `%@` - year-month-day_hour-minute-second.milliseconds (UTC)
* `%#` - milliseconds since the [epoch][].

**Example:**

<!-- tab: c -->

**C/C++**

```c
snsrSetString(session, SNSR_DEBUG_LOG_FILE, "debug-%#.log");
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
session.setString(Snsr.DEBUG_LOG_FILE, "debug-%#.log");
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
session.set_string(snsr.DEBUG_LOG_FILE, "debug-%#.log")
```
<!-- /tab -->

### fex-hash
- configuration
- string
- read-only
- pre-release
<!-- tab: c -->

**C/C++**

```c
const char * value;
snsrGetString(s, SNSR_FEATURE_HASH, &value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
String value = s.getString(Snsr.FEATURE_HASH);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
value = s.get_string(snsr.FEATURE_HASH)
```
<!-- /tab -->

Feature extractor hash.

**Pre-release:**

This is an experimental feature. Do not use unless recommended by Sensory.

This is a unique string that identifies the feature type used by the task.

## Identity & metadata

### task-name
- configuration
- string
- read-only
- deprecated [6.14.0](https://doc.sensory.com/tnl/7.8/changes/version-6.md#v6.14.0)
<!-- tab: c -->

**C/C++**

```c
const char * value;
snsrGetString(s, SNSR_TASK_NAME, &value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
String value = s.getString(Snsr.TASK_NAME);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
value = s.get_string(snsr.TASK_NAME)
```
<!-- /tab -->

Task name.

**Deprecated:**

Support for this setting will be removed from
the next major release of this SDK.

**Do not use this in new code.**

### task-type
- configuration
- string
- read-only

<!-- tab: c -->

**C/C++**

```c
const char * value;
snsrGetString(s, SNSR_TASK_TYPE, &value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
String value = s.getString(Snsr.TASK_TYPE);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
value = s.get_string(snsr.TASK_TYPE)
```
<!-- /tab -->

Task type.

<!-- To do, list task types here -->
This, together with [task-version](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#task-version), describes the model behavior:
Which [setting keys](https://doc.sensory.com/tnl/7.8/api/setting-keys/index.md#setting-keys) and [streams](https://doc.sensory.com/tnl/7.8/api/io.md#stream) it supports.

Examples include: [enroll](https://doc.sensory.com/tnl/7.8/api/setting-keys/values.md#enroll), [lvcsr](https://doc.sensory.com/tnl/7.8/api/setting-keys/values.md#lvcsr), [phrasespot](https://doc.sensory.com/tnl/7.8/api/setting-keys/values.md#phrasespot), [phrasespot-vad](https://doc.sensory.com/tnl/7.8/api/setting-keys/values.md#phrasespot-vad),
and [vad](https://doc.sensory.com/tnl/7.8/api/setting-keys/values.md#vad).

**Also see these related items:** [Values](https://doc.sensory.com/tnl/7.8/api/setting-keys/values.md#values), [task-version](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#task-version), [require](https://doc.sensory.com/tnl/7.8/api/inference.md#require)

### task-type-and-version-list
- configuration
- string
- write-only

<!-- tab: c -->

**C/C++**

```c
snsrSetString(s, SNSR_TASK_TYPE_AND_VERSION_LIST, "text");
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
s.setString(Snsr.TASK_TYPE_AND_VERSION_LIST, "text");
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
s.set_string(snsr.TASK_TYPE_AND_VERSION_LIST, "text")
```
<!-- /tab -->

Verifies that a model matches one of list of types and versions.

When used with [require](https://doc.sensory.com/tnl/7.8/api/inference.md#require), the value argument must be
a semicolon-separated list of [task-type](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#task-type) and
[task-version](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#task-version) values. This list must have at least one element.

A task will match the requirement if one of the [task-type](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#task-type) fields
match, and the corresponding [task-version](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#task-version) is satisfied.

If no [task-type](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#task-type) matches, [require](https://doc.sensory.com/tnl/7.8/api/inference.md#require) returns [REQUIRE_MISMATCH](https://doc.sensory.com/tnl/7.8/api/inference.md#rc).

If a [task-type](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#task-type) matches, but the
associated [task-version](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#task-version) is not satisfied, [require](https://doc.sensory.com/tnl/7.8/api/inference.md#require) returns
[VERSION_MISMATCH](https://doc.sensory.com/tnl/7.8/api/inference.md#rc).

**Example:**

<!-- tab: c -->

**C/C++**

```c
snsrRequire(session, SNSR_TASK_TYPE_AND_VERSION_LIST,
            SNSR_PHRASESPOT " ~0.5.0 || 1.0.0;"
            SNSR_LVCSR " 1.0.0");
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
session.require(Snsr.TASK_TYPE_AND_VERSION_LIST,
                Snsr.PHRASESPOT + " ~0.5.0 || 1.0.0;" +
                Snsr.LVCSR + " 1.0.0");
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
session.require(
    snsr.TASK_TYPE_AND_VERSION_LIST,
    f"{snsr.PHRASESPOT} ~0.5.0 || 1.0.0;{snsr.LVCSR} 1.0.0",
)
```
<!-- /tab -->

**Also see these related items:** [require](https://doc.sensory.com/tnl/7.8/api/inference.md#require)

### task-version
- configuration
- string
- read-only

<!-- tab: c -->

**C/C++**

```c
const char * value;
snsrGetString(s, SNSR_TASK_VERSION, &value);
```
<!-- /tab -->

<!-- tab: java -->

**Java**

```java
String value = s.getString(Snsr.TASK_VERSION);
```
<!-- /tab -->

<!-- tab: py -->

**Python**

```python
value = s.get_string(snsr.TASK_VERSION)
```
<!-- /tab -->

Model task version.

These version strings follow [semantic versioning](http://semver.org/) rules.

**Also see these related items:** [task-type](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#task-type), [require](https://doc.sensory.com/tnl/7.8/api/inference.md#require)

<!-- Reference definitions from includes/links.md -->
[epoch]: https://en.wikipedia.org/wiki/Unix_time "Unix time"
[THF Micro]: https://doc.sensory.com/thf-micro/ "THF Micro documentation"

<!-- Abbreviation definitions from includes/abbreviations.md -->
*[API]: Application Programming Interface
*[FR]: False Reject: the recognizer did not trigger when the target phrase was spoken
*[LVCSR]: Large Vocabulary Continuous Speech Recognition model, feed-forward neural net acoustic model with FST decoder
*[NLU]: Natural Language Understanding model
*[RAM]: Random Access Memory
*[SDK]: Software Development Kit
*[SLM]: Generative Small Language Model
*[STT]: Speech To Text: transformers with language model and CTC decoding
*[THF]: TrulyHandsfree, Sensory's wake word and command recognition technology
*[TNL]: TrulyNatural, Sensory's large-vocabulary speech recognition technology
*[VAD]: Voice Activity Detector
