Skip to content

Version 7 changes (current)

TrulyNatural version 7 introduced support for STT and is fully backwards compatible with version 6 models and code.

This library uses semantic versioning.

7.9.0 (2026-08-08)

  • Added
    • Models with support for grammar-import-path:
      • tpl-spot-concurrent-1.6.0.snsr
      • tpl-spot-debug-1.6.0.snsr
      • tpl-spot-select-1.6.0.snsr
      • tpl-spot-sequential-1.6.0.snsr
      • tpl-spot-vad-3.14.0.snsr
      • tnl tpl-opt-spot-vad-lvcsr-1.29.0.snsr
      • tnl tpl-spot-vad-lvcsr-3.24.0.snsr
      • tnl tpl-vad-lvcsr-3.18.0.snsr
    • spot-voicegenie-enUS-6.6.0-m.snsr with support for the confidence-score result.
    • tnl lvcsr-build-enUS-14.2.0-5MB.snsr with improved accuracy, and in-grammar acoustic confidence scores.
    • stt Grammar-based recognition with grammar-stream, including runtime and in-grammar classes, <dictation/> hand-off, and <unknown/> wildcard support.
    • stt stt-enUS-general-medium-2.4.5-pnc.snsr with support for grammar-stream.
    • tnl stt Grammar-based recognition also accepts BNF+EM v2.1 grammars (auto-detected by a #BNF+EM header) for the supported subset, easing migration from Cerence-style grammars.
    • tnl stt Grammar-based recognition also accepts W3C SRGS 1.0 ABNF grammars (auto-detected by an #ABNF header) for the supported subset, easing migration from SRGS ABNF grammars.
    • tnl stt Native grammars accept a bounded-repeat postfix quantifier, x{m,n} (with x{m}, x{m,}, and x{,n} variants), for repeating a symbol or group a specific number of times. See grammar syntax.
    • tnl stt Native grammars accept a group weight suffix, ( ... )/w, which attaches a weight to a whole group; on an alternative branch it biases the recognizer without changing which utterances match. See grammar syntax.
    • tnl stt Native grammars accept the <void/> special symbol: an unmatchable alternative that no input can traverse, useful as a placeholder branch. It is the native equivalent of BNF+EM <VOID> and SRGS $VOID. See grammar syntax.
    • tnl stt A grammar rule referenced with the ~ sigil is compiled into an in-grammar recognition class, so common classes can be defined directly in the grammar text without a separate grammar-stream. The same rule referenced with $ is still inlined. An in-grammar definition is an overridable default: an external stream still takes precedence, and existing grammars are unaffected. See grammar syntax.
    • tnl stt Native grammars can be split across files and share rules with import, from ... import, and export directives. import "m"; brings a module's exported names in verbatim (import "m" as ns; prefixes them with ns.); export name; and the export prefix*; glob control visibility and re-export, so an aggregator module can re-export many sub-modules under one prefix. Imported rules are inlined with $name or become in-grammar classes with ~name. Existing single-file grammars are unaffected. See modules and imports.
    • tnl stt New grammar-import-path configuration setting: a :-separated directory search path for resolving bare grammar import references. Defaults to the current working directory. See modules and imports.
    • tnl stt Native grammars may declare a dialect version with an optional #SNSR MAJOR.MINOR header on the first line, for example #SNSR 2.0. The compiler rejects a grammar that declares a newer version than it implements, so a grammar that relies on features from a later dialect fails clearly instead of misparsing. A grammar with no header, or a bare #SNSR, is treated as the current version, so existing grammars are unaffected. See grammar syntax.
    • tnl stt Native grammars may declare their language with a language directive, for example language en-US; — a two- or three-letter language with an optional two-letter region (a subset of BCP 47), matched case-insensitively. The declaration is advisory and does not change which utterances match; a build may use it to sanity-check the grammar against the acoustic model. It is preserved across the native and SRGS formats. See grammar syntax.
  • Changed
    • Improved load speed.
    • fromAudioFile can now read single-channel FLAC files.
    • The confidence-score result setting is no longer deprecated. It reports a calibrated true-accept probability for fixed-phrase wake words and its documentation describes the SNR range over which the probabilities were measured.
    • CMake integration now locates the SDK with find_package(SnsrLibrary CONFIG) and requires CMake 3.15 or later (previously include(SnsrLibrary) with CMake 3.10). See Integrate with your build ยง CMake.
    • tnl The LVCSR phrase-level recognition score now reports the geometric mean of the per-word scores instead of their length-biased product, and models built for it report a normalized in-grammar acoustic confidence.
    • tnl stt A grammar rule referenced with the ~ sigil now defaults to an in-grammar recognition class built from that rule. This changes an edge case: a grammar that both defined a rule a and referenced ~a, for example a = 1 | 2 | 3; b = <s> say ~a </s>;, previously left ~a undefined until supplied at runtime; ~a now defaults to 1 | 2 | 3. A runtime grammar-stream still overrides it.
    • tnl stt A ~name class that is referenced but never defined (in the grammar or through an external stream) now produces an advisory warning when the grammar is built or run. It is not an error, since any class can still be filled at runtime, but it usually indicates an oversight. Define the class, or use name = <void/>; to keep it intentionally empty without the warning. An undefined system class (~s.*) remains a hard error. See grammar syntax.
    • tnl stt grammar-stream and nlu-grammar-stream are now readable. Reading one back returns the grammar most recently set, flattened into a single self-contained grammar in native SNSR format: import references are resolved and merged in, aggregators are expanded, comments are preserved, and a BNF+EM or SRGS source grammar is converted to the native format. See modules and imports.
    • stt <unknown/> in STT grammars expands to primitive wildcard symbols. Word-level STT recognizers use <unknown-start/> followed by zero or more <unknown-cont/>; character-level recognizers use <unknown-start/> or <unknown-cont/>. Grammar-specified weights on unknown symbols are preserved.
    • stt The phrase-level recognition score now reports a normalized recognition confidence instead of a length-biased product of per-word scores.
  • Deprecated
    • tnl Binary class libraries (LVCSR-only, pre-built .snsr class repositories such as lvcsr-lib-enUS-14.0.2.snsr) are deprecated, and Sensory no longer publishes new ones. Existing LVCSR models that load a binary class library continue to work. For new grammars, reference the classes you need and import their definitions with import, so the same grammar runs on both STT and LVCSR without loading a separate class-library model. See grammar syntax.
  • Removed
    • spot-voicegenie-enUS-6.5.1-m.snsr
    • tpl-spot-concurrent-1.5.0.snsr
    • tpl-spot-debug-1.5.1.snsr
    • tpl-spot-select-1.4.0.snsr
    • tpl-spot-sequential-1.5.0.snsr
    • tpl-spot-vad-3.13.0.snsr
    • tnl tpl-opt-spot-vad-lvcsr-1.28.0.snsr
    • tnl tpl-spot-vad-lvcsr-3.23.0.snsr
    • tnl tpl-vad-lvcsr-3.17.0.snsr
    • tnl lvcsr-build-enUS-14.0.2-5MB.snsr
    • tnl lvcsr-lib-enUS-14.0.2.snsr Existing binary class libraries still load on LVCSR models, but new grammars should import class modules instead.
    • stt stt-enUS-automotive-medium-2.3.15-pnc.snsr. A variant of this model is available for download.
  • Fixed
    • snsrStreamFromAudioFile mishandled the variadic arguments that follow a non-default StreamAudioFormat, so formats requiring extra parameters (such as sample rate) were read incorrectly.
    • stt NLU wildcard echo markers are resolved before grammar minimization, so matched OOV words are preserved instead of appearing as literal . tokens.
    • stt snsr-eval-batch now reports a character error rate (CER) for languages without word delimiters, such as Japanese and Chinese. Previously it applied word error rate (WER) to these languages, whose ambiguous word segmentation produced misleading rates. Space-delimited languages still report WER. See character error rate.

7.8.0 (2026-05-30)

  • Added
    • License key introspection: LICENSE_INFO, LICENSE_SUPPORT, LICENSE_OVERRIDE_NOT_VALID.
    • profile:samples.
    • Python language binding: platform-specific snsr wheel (ctypes over the C API) for Python 3.10 and later, with sample projects in sample/python/ and documentation (Python examples, Integrate with your build ยง Python, and the Python tab in Your first program).
    • snsr-eval -i flag to support batch processing.
    • LLM-friendly documentation Markdown bundle for coding agents and RAG pipelines. Each page is mirrored on the site at the same path as its source fileโ€”section roots as <dir>/index.md beside <dir>/index.html, leaf pages as <dir>/<page>.md beside <dir>/<page>/index.htmlโ€”and the entry point is llms.txt:
      • llms.txt โ€” discoverable index following the llmstxt.org convention; lists every page with one-line summaries plus a ## Symbols section deep-linking C/Java identifiers to their documenting headings.
      • manifest.json โ€” JSON index of every member with path, source_path, bytes, title, canonical_url, an optional H2/H3 outline on reference pages, and an optional ISO 8601 UTC last_modified so indexers can do incremental re-ingest.
      • llms-full.txt โ€” every page concatenated with <!-- FILE: โ€ฆ --> per-page separators (path and canonical URL in each header) for one-shot ingestion.
      • agent-docs.zip โ€” same files packaged as a single archive for vendored or air-gapped use; agents with network access should crawl the loose mirror instead.
    • tnl lvcsr-build-enUS-14.0.2-5MB.snsr with improved recognition accuracy.
    • tnl lvcsr-lib-enUS-14.0.2.snsr class library compatible with lvcsr-build-enUS-14.0.2-5MB.snsr.
  • Changed
    • The library-info summary includes text for LICENSE_SUPPORT.
    • fromCode checks that the SnsrCodeModel data were compiled with compatible struct packing.
    • snsr-eval -p reports the real-time fraction required to run models in template slots.
    • spot-eval-batch renamed to snsr-eval-batch with support for commands, LVCSR and STT models.
    • Setting keys reorganized by concern (configuration, runtime, results, events, iterators) with new groups for LVCSR & STT, wake word & command set, and THF Micro DSP. Per-key anchors (e.g. #listen-window, #partial-result-interval) are stable; cross-references and bookmarks continue to resolve.
    • macOS installers built for Apple Silicon (arm64) only. Contact Technical Support for Intel (x86_64) macOS installers. Both installer packages include libraries for arm64 and x86_64.
    • stt nlu-grammar-stream overrides machine-learned NLU only if it detects no NLU matches.
  • Removed
    • lib/ios/libsnsr.a, use XCFramework instead.
    • tnl lvcsr-build-enUS-12.13.1-5MB.snsr
    • tnl lvcsr-lib-enUS-1.2.0.snsr
    • stt CRF++ and fastText dependencies used for NLU in legacy STT models.
  • Fixed
  • Security
    • On Windows, using filenames longer than 256 characters with fromFileName or fromAudioFile could cause out-of-bounds heap access.
    • Reading or changing an unknown setting on a model built with deeply-nested templates could access freed heap memory when reporting the error.

7.7.0 (2026-01-24)

7.6.1 (2025-11-25)

  • Changed
  • Fixed
    • Higher than expected CPU use in wake words and command sets. This addresses a regression introduced in 7.5.0.
    • snsr-debug mistakenly used tpl-opt-spot-vad-lvcsr and stt-enUS-automotive-medium model versions from an earlier SDK release.
    • Some of the C examples failed to build on Windows.
  • Security
    • profile could access released memory if called on a Session instance where the model, or a filled template slot, was replaced with another model at runtime.

7.6.0 (2025-09-15)

7.5.0 (2025-06-12)

7.4.1 (2025-03-13)

  • Fixed
    • stt Using custom-vocab to map multi-word sequences could result in missed NLU entities.

7.4.0 (2025-01-22)

7.3.0 (2024-07-29)

  • Added
    • New FAQ section: How do I take action on an NLU result?
    • Support for adding this SDK to projects that use CMake. See C examples.
    • Real-time clock implementation for Windows, enables profile:real-time.
    • Support for multi-phrase spotter models with lower false accept rates.
    • arm-none-eabi library with NEON built with gcc 13.3.1.
    • tnl VAD template models with settings backoff and max-recording optimized for STT. The defaults are now 300 ms for audio backoff, and 60 seconds for the maximum recording duration.
      • tpl-opt-spot-vad-lvcsr-1.12.0.snsr
      • tpl-spot-vad-lvcsr-3.11.0.snsr
      • tpl-vad-lvcsr-3.10.0.snsr
    • stt Improved STT recognition speed and accuracy, and reduced ^result and ^nlu-intent latency when used with a VAD.
    • stt STT support for arm-linux-gnueabihf, aarch64-linux-gnu, and x86_64-windows-msvc.
    • stt stt-enUS-automotive-small_medium-2.2.13-BBB-ff.snsr
      • 100 MiB total size compared to 299 MiB in previous version.
      • Improved NLU inference speed.
      • Improved accuracy.
  • Changed
    • arm-linux-gnueabihf and aarch64-linux-gnu libraries built with gcc 10.3.1.
    • tnl Optimized machine-learned NLU models. On average these now run about ten times faster.
  • Removed
    • Windows ports: x86-windows-2008, x86-windows-2015, x86_64-windows-2008, x86_64-windows-2015, x86_64-windows-mingw.
    • arm-buildroot-linux-uclibcgnueabihf library.
    • arm-ca7-linux-gnueabihf library.
    • tnl VAD template models:
      • tpl-opt-spot-vad-lvcsr-1.11.0.snsr
      • tpl-spot-vad-lvcsr-3.10.0.snsr
      • tpl-vad-lvcsr-3.9.0.snsr
    • stt stt-enUS-automotive-small_medium-2.0.8-BBB-ff.snsr
  • Fixed
    • Certain low false-accept spotter models reported an internal validation error when used with tpl-spot-sequential-1.4.0.snsr
    • spot-convert -c produced incorrect code output for recent low false-accept models.
    • The iOS sample app mistakenly embedded snsr.xcframework, leading to TestFlight rejection due to asset validation errors.
    • The TrulyNatural SDK linked against -landroid, making it incompatible with the Vendor Native Development Kit.
    • stt Duplicate entities and typographic errors in the documentation for stt-enUS-automotive-small_medium-2.2.13-BBB-ff.snsr
  • Security
    • stt NLU models could cause out-of-bounds memory access on very long (hundreds of words) recognition results.

7.2.0 (2024-04-11)

7.1.1 (2024-02-13)

  • Fixed
    • Linking against the Android static libraries could suppress the output of calls to __android_log_print(), __android_log_vprint(), and __android_log_write() in the entire application.
    • The AAR file for Android once again links against -llog.
    • tnl tpl-spot-vad-lvcsr-3.8.0.snsr would keep listening for LVCSR audio if enough silence after the wake word lead to ^silence.
      • This happened only for LVCSR recognizers (including those made with VoiceHub) and did not affect STT ones.
      • Regression from 7.0.0.

7.1.0 (2024-01-11)

  • Added
    • tnl Simplified NLU API
    • tnl Models updated to support simplified NLU API:
      • lvcsr-background-enUS-1.2.1.snsr
      • lvcsr-build-enUS-2.7.0.snsr
      • tpl-opt-spot-vad-lvcsr-1.9.0.snsr
      • tpl-spot-lvcsr-1.5.0.snsr
      • tpl-spot-vad-lvcsr-3.8.0.snsr
    • stt Support for machine-learned NLU intent and entity classifiers.
    • stt custom-vocab
    • stt stt-v2-enUS-automotive-0.2.11-BT-400ms.snsr
  • Changed
    • AAR file for Android is no longer linked against -landroid and -llog. This allows it to be used in an AOSP system image.
  • Removed
    • Energy-only VAD models superseded by machine-learned versions:
      • tpl-spot-vad-2.4.0.snsr
      • tpl-spot-vad-2.0.1.snsr
      • tnl tpl-spot-vad-lvcsr-2.4.0.snsr
      • tnl tpl-vad-lvcsr-2.5.0.snsr
    • tnl Models updated to support simplified NLU API:
      • lvcsr-background-enUS-1.1.0.snsr
      • lvcsr-build-enUS-2.6.0.snsr
      • tpl-opt-spot-vad-lvcsr-1.8.0.snsr
      • tpl-spot-lvcsr-1.4.0.snsr
      • tpl-spot-vad-lvcsr-3.7.0.snsr
      • tpl-vad-lvcsr-3.7.0.snsr
    • stt stt-v1-en-1.0.1-400ms.snsr
  • Fixed

7.0.0 (2023-11-20)

  • Added
    • CONFIG_PRUNED and SOURCE_PRUNED reduce the size of serialized models by removing configuration options such as unused operating-point values.
    • snsr-edit -p option reduces phrasespot model sizes by removing operating points other than the currently selected operating-point.
    • stt STT support with improved accuracy suitable for command-and-control and dictation tasks.
      • This initial release includes STT support on Android, macOS, and x86_64-linux only.
      • Includes Open Source modules, see open source licenses.
      • Requires linking against a C++ runtime, see Integrate with your build.
      • Using STT models do not require any API changes. These are drop-in replacements for older LVCSR models on supported platforms.
      • STT recognition models
        • stt-v1-en-1.0.1-400ms.snsr
        • Contact your Sensory Sales representative for additional languages.
      • New settings: oss-components, STT_SUPPORT.
  • Changed
    • The deprecated delay setting is read-only.
    • DSP library (for creating embedded spotter models) version 7.4.0.
    • tnl The effects of : terminal rewrites @b are now visible in ^result text values.
    • tnl The lightweight NLU processor scoring algorithm no longer considers :inserted and removed: words when ranking result parses. This potentially changes the primary NLU result, or the order in which NLU results are presented when nlu-match-max > 1, for grammars that use the : rewrite feature to better match expectations.
    • tnl If the time required to compute a partial LVCSR result exceeds the push-duration-limit, the ^result-partial callback does not happen.
    • tnl The grammar-based recognition grammars support the literal use of special tokens by escaping them with a backslash.
  • Deprecated
  • Removed
    • tnl References to the <- slot assignment operator in grammar-based recognition. This had been a symbol reserved for internal use only.
    • tnl lvcsr-broad-enUS-3.1.0-t5.snsr
  • Fixed
  • Security
    • This sequence of operations could lead to getString returning an unterminated string:
      • Use setStream to set a configuration value to a sequence of bytes that does not include \0.
      • Save the model to persistent storage.
      • Load the modified model from persistent storage.
      • Access the configuration value with getString.
    • In the Java language binding fromMemory and fromString could potentially access the underlying byte[] memory after it was garbage-collected.