---
source_path: "changes/version-5.md"
canonical_url: "https://doc.sensory.com/tnl/7.8/changes/version-5/"
---

# Version 5 beta changes

**Tip:**

Looking for the latest changes? See [Version 7 changes](https://doc.sensory.com/tnl/7.8/changes/index.md#v7-changes).

TrulyHandsfree version 5 introduced a new API and model file format, neither
of which were backwards compatible with TrulyHandsfree version 4.
The end of this beta release cycle resulted in stable release [v6.0.0](https://doc.sensory.com/tnl/7.8/changes/version-6.md#v6.0.0).

## 5.0.0-beta.18 (2018-03-09)
- **Added**
    - Live audio support in [fromAudioDevice](https://doc.sensory.com/tnl/7.8/api/io.md#fromaudiodevice) for macOS and iOS.
    - [snsr-log-split](https://doc.sensory.com/tnl/7.8/tools/snsr-log-split.md#snsr-log-split) computes average throughput and real-time factor.
- **Fixed**
    - User-Defined Trigger enrollments with a low phrase quality were rejected
      without providing sensible feedback.

## 5.0.0-beta.17 (2018-02-23)
- **Added**
    - Spotter debug logging:
        + Task model: [tpl-spot-debug](https://doc.sensory.com/tnl/7.8/models/tpl/tpl-spot-debug.md#tpl-spot-debug-type).
        + [snsr-log-split](https://doc.sensory.com/tnl/7.8/tools/snsr-log-split.md#snsr-log-split) utility.
        + [faq](https://doc.sensory.com/tnl/7.8/faq.md#faq) answer for [How do I diagnose wake word audio issues?](https://doc.sensory.com/tnl/7.8/faq.md#debug-wake-word-audio).
    - [audio-check](https://doc.sensory.com/tnl/7.8/tools/audio-check.md#audio-check) utility.
    - Android `SpotDebug` sample app. See [Android examples](https://doc.sensory.com/tnl/7.8/api/sample/android/index.md#android-examples).
    - Example Android [Stream](https://doc.sensory.com/tnl/7.8/api/io.md#stream) implementation
      `sample/android/misc/SnsrStreamAudioDeviceAndroid.java`
    - Example Java [Stream](https://doc.sensory.com/tnl/7.8/api/io.md#stream) implementation
      `sample/java/misc/SnsrStreamAudioDeviceGeneric.java`
    - iOS C library. [fromAudioDevice](https://doc.sensory.com/tnl/7.8/api/io.md#fromaudiodevice) does not,
      as yet, support live audio recording on iOS.
- **Changed**
    - DSP library (for creating embedded spotter models) version 4.4.2.
- **Fixed**
    - For Enrolled Fixed Triggers, incorrect enrollment phrases were reported once
      all enrollment recordings were complete. This error is now reported
      immediately after the failed recording.
    - Android [fromAudioDevice](https://doc.sensory.com/tnl/7.8/api/io.md#fromaudiodevice) can throw an `IllegalStateException`
      if the underlying audio device is busy. Now reported as an `IOException`.
    - The Android sample `Enroll.onResume()` method mistakenly returned `SnsrRC.ERROR`
      instead of `SnsrRC.STREAM` if `mAudio.open()` failed.

## 5.0.0-beta.16 (2018-01-25)
- **Changed**
    - Improved v4 fixed trigger false reject performance when the spotted phrase
      is repeated multiple times in quick succession.
    - Android libraries built with NDK 16.
- **Fixed**
    - Misleading detailed error message when attempting to load an incompatible
      spotter into a template.

## 5.0.0-beta.15 (2017-12-08)
- **Added**
    - Task model _vad-energy-1.0.3.snsr_ (removed in 5.0.0-beta.13) restored.
- **Changed**
    - DSP library (for creating embedded spotter models) version 4.4.1.
- **Fixed**
    - Cannot load a model created using the `tpl-spot-concurrent-1.0.3.snsr`
      template into the `tpl-spot-vad-1.0.3.snsr` template.
    - [noise-energy](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#noise-energy), [signal-energy](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#signal-energy), [snr](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#snr) are no longer updated once
      approximately `1000` seconds of audio have been processed.
    - The md5 and sha1 hashes for licensed models and libraries in the
      embedded Maven repository (_m2repository/_) do not match the actual files.
    - _spot-eval_ command-line tool does not flush `stdout` frequently enough.
    - _spot-eval_ not compatible with spotter model versions `0.5.0` through `0.7.0.`

## 5.0.0-beta.14 (2017-11-01)
- **Fixed**
    - _spot-eval_ command-line tool failed on models from earlier releases.

## 5.0.0-beta.13 (2017-10-31)
- **Added**
    - New [snsr-edit](https://doc.sensory.com/tnl/7.8/tools/snsr-edit.md#snsr-edit) command-line utility.
    - Support for [task templates](https://doc.sensory.com/tnl/7.8/models/tpl/index.md#template-type). This allows, for example, running
        two disparate phrase spotters at the same time, as a single spotter model.
    - [wake word](https://doc.sensory.com/tnl/7.8/models/types/wake-word.md#wake-word-type) settings: [^listen-begin](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#listen-begin), [^listen-end](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#listen-end).
    - [faq](https://doc.sensory.com/tnl/7.8/faq.md#faq) documentation section.
    - New task models:
        + _eft-hbg-enUS-23.0.0.3.snsr_
        + _spot-music-enUS-1.0.3-m.snsr_
        + _tpl-spot-concurrent-1.0.3.snsr_
        + _tpl-spot-sequential-1.0.3.snsr_
        + _tpl-spot-vad-1.0.3.snsr_
- **Changed**
    - _spot-eval_ supports [phrase spotter with VAD](https://doc.sensory.com/tnl/7.8/models/tpl/tpl-spot-vad.md#tpl-spot-vad-type) models.
    - [spot-convert](https://doc.sensory.com/tnl/7.8/tools/spot-convert.md#spot-convert) uses only the tail portion of the task model file path
      to determine the output file prefix.
    - Renamed Java package from `com.sensory.speech` to `com.sensory.speech.snsr`.
    - Renamed `SnsrStream.Plugin` to `SnsrStream.Provider`.
    - Most `SnsrStream.Provider` methods now throw `IOException`.
    - [segmentSpottedAudio.java](https://doc.sensory.com/tnl/7.8/api/sample/java/segmentSpottedAudio.md#segmentspottedaudiojava) sample uses _tpl-spot-vad-1.0.3.snsr_
      template for voice audio detection.
    - Support reading of RIFF wave files with padded format chunks (for example,
      those using a non-standard 48-byte header.)
    - Updated task models:
        + _spot-hbg-enUS-1.2.3-m.snsr_
        + _udt-enUS-12.0.10.3.snsr_
        + _udt-enUS-5.1.1.3.snsr_
    - _push-spot.c_ sample includes VAD audio processing.
- **Removed**
    - Task model:
        + _vad-energy-1.0.3.snsr_, use _tpl-spot-vad-1.0.3.snsr_ template instead.
- **Fixed**
    - [operating-point-iterator](https://doc.sensory.com/tnl/7.8/api/setting-keys/iterators.md#operating-point-iterator) did not return all operating points.
      Also apparent when running `#!sh spot-eval -v -v -t spot-hbg-enUS-1.2.3-m.snsr`
    - [setStream](https://doc.sensory.com/tnl/7.8/api/inference.md#setters) failed to set [<-audio-pcm](https://doc.sensory.com/tnl/7.8/api/setting-keys/runtime.md#audio-pcm-out) if the output stream
      was both readable and writable.
    - Java [write](https://doc.sensory.com/tnl/7.8/api/io.md#stream-write) method signatures did not match the documentation.
      These returned `void` instead of `long`.
    - Java [fromMemory](https://doc.sensory.com/tnl/7.8/api/io.md#frommemory) and [fromString](https://doc.sensory.com/tnl/7.8/api/io.md#fromstring) streams produced incorrect data
      for large source stores.
    - Java writable [fromMemory](https://doc.sensory.com/tnl/7.8/api/io.md#frommemory) streams did not modify the `byte[]` store.
    - Java [print](https://doc.sensory.com/tnl/7.8/api/io.md#stream-print) crashed with an assertion.
    - Java [Stream](https://doc.sensory.com/tnl/7.8/api/io.md#stream) methods [copy](https://doc.sensory.com/tnl/7.8/api/io.md#stream-copy), [open](https://doc.sensory.com/tnl/7.8/api/io.md#stream-open),
      [read](https://doc.sensory.com/tnl/7.8/api/io.md#stream-read) [skip](https://doc.sensory.com/tnl/7.8/api/io.md#stream-skip), [write](https://doc.sensory.com/tnl/7.8/api/io.md#stream-write),
      and [print](https://doc.sensory.com/tnl/7.8/api/io.md#stream-print) did not throw expected `IOException`s.
- **Security**
    - Java [fromMemory](https://doc.sensory.com/tnl/7.8/api/io.md#frommemory) and [fromString](https://doc.sensory.com/tnl/7.8/api/io.md#fromstring) streams could access memory
      that was no longer valid.

## 5.0.0-beta.12 (2017-09-05)
- **Added**
    - [VAD](https://doc.sensory.com/tnl/7.8/models/types/vad.md#vad-type) with:
        + Settings: [backoff](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#backoff), [^begin](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#begin), [^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), [include-leading-silence](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#include-leading-silence), [leading-silence](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#leading-silence),
          [^limit](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#limit), [max-recording](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#max-recording), [pass-through](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#pass-through),
          [^silence](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#silence), [skip-to-ms](https://doc.sensory.com/tnl/7.8/api/setting-keys/runtime.md#skip-to-ms), [skip-to-sample](https://doc.sensory.com/tnl/7.8/api/setting-keys/runtime.md#skip-to-sample),
          [trailing-silence](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#trailing-silence), [vad](https://doc.sensory.com/tnl/7.8/api/setting-keys/values.md#vad)
        + Stream: [<-audio-pcm](https://doc.sensory.com/tnl/7.8/api/setting-keys/runtime.md#audio-pcm-out).
    - The 64-bit Windows installer includes 32-bit libraries.
        + For MSVC 2008-2013 use _lib/x86-windows-2008/_
        + For MSVC 2015 and later, use _lib/x86-windows-2015/_
- **Changed**
    - Documentation for [audio-stream](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#audio-stream), [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), [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).
    - [live-segment.c](https://doc.sensory.com/tnl/7.8/api/sample/c/live-segment.md#live-segmentc) now uses the new VAD.
    - [segmentSpottedAudio.java](https://doc.sensory.com/tnl/7.8/api/sample/java/segmentSpottedAudio.md#segmentspottedaudiojava) now use the new VAD.
    - Noted `-24` [dBFS][] peak-to-peak audio recommendation.
- **Fixed**
    - [operating-point-iterator](https://doc.sensory.com/tnl/7.8/api/setting-keys/iterators.md#operating-point-iterator) did not return all operating
      points. Also apparent when running
      `#!sh spot-eval -v -v -t spot-hbg-enUS-1.2.3-m.snsr`

## 5.0.0-beta.11 (2017-06-29)
- **Added**
    - [VERSION_DSP](https://doc.sensory.com/tnl/7.8/api/constants.md#version_dsp).
    - [confidence-score](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#confidence-score).
    - Support for modular feature extractors.
    - Microsoft Visual Studio version-specific libraries and build files:
        + For MSVC 2008-2013 use _lib/x86_64-windows-2008/_
          and _sample/c/msvc-2008/_
        + For MSVC 2015 and later, use _lib/x86_64-windows-2015/_
          and _sample/c/msvc-2015/_
- **Changed**
    - [library-info](https://doc.sensory.com/tnl/7.8/api/setting-keys/library-information.md#library-info) includes [VERSION_DSP](https://doc.sensory.com/tnl/7.8/api/constants.md#version_dsp).
    - _spot-eval_ shows spotter [confidence scores](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#confidence-score),
      where available.
- **Fixed**
    - Mistaken spots when the input audio stream ends. The work-around
      in previous beta was to set [auto-flush](https://doc.sensory.com/tnl/7.8/api/setting-keys/runtime.md#auto-flush) to `0`.
    - [spot-convert](https://doc.sensory.com/tnl/7.8/tools/spot-convert.md#spot-convert) did not report output errors.

## 5.0.0-beta.10.3 (2017-06-22)
- **Added**
    - `mipsel-openwrt-linux-musl` support.

## 5.0.0-beta.10.2 (2017-05-13)
- **Added**
    - [auto-flush](https://doc.sensory.com/tnl/7.8/api/setting-keys/runtime.md#auto-flush) runtime library setting.
    - _push-spot.c_ sample.

## 5.0.0-beta.10.1 (2017-05-02)
- **Added**
    - `arm-ca7-linux-gnueabihf` support.
- **Changed**
    - The `arm-linux-gnueabi` library uses softfp `float-abi` (soft, previously.)
      This enables NEON optimization.
    - `x86_64-linux-gnu` library is built with gcc 4.8 for better compatibility
      with older Linux distributions.

## 5.0.0-beta.10 (2017-04-20)
- **Added**
    - Support for phrase spotters with multiple operating points in a single model.
    - [Wake word](https://doc.sensory.com/tnl/7.8/models/types/wake-word.md#wake-word-type) settings:
      [operating-point](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#operating-point), [operating-point-iterator](https://doc.sensory.com/tnl/7.8/api/setting-keys/iterators.md#operating-point-iterator),
      [available-point](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#available-point).
    - [SnsrEnrollmentTest.java](https://doc.sensory.com/tnl/7.8/api/sample/java/SnsrEnrollmentTest.md#snsrenrollmenttestjava) enrollment unit test sample.
- **Changed**
    - The `arm-linux-gnueabi` library now targets the ARMv7-a instruction set.
- **Fixed**
    - [C examples](https://doc.sensory.com/tnl/7.8/api/sample/c/index.md#c-examples) `make` `test` fails when the SDK is installed on
      a path containing spaces.
    - Installer on Windows failed on paths containing unicode characters.

## 5.0.0-beta.9.1 (2017-04-11)
- **Added**
    - `mipsel-buildroot-linux-uclibc` support.

## 5.0.0-beta.9 (2017-03-20)
- **Added**
    - [Wake word](https://doc.sensory.com/tnl/7.8/models/types/wake-word.md#wake-word-type) result settings:
      [noise-energy](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#noise-energy), [signal-energy](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#signal-energy) and [snr](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#snr).
    - [LIBRARY_TOO_OLD](https://doc.sensory.com/tnl/7.8/api/inference.md#rc).
    - [Wake word enrollment](https://doc.sensory.com/tnl/7.8/models/types/enroll.md#enroll-type) support for saving adapted enrollment contexts.
        - [^adapted](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#adapted), [re-adapt](https://doc.sensory.com/tnl/7.8/api/setting-keys/runtime.md#re-adapt).
        - [spot-enroll](https://doc.sensory.com/tnl/7.8/tools/spot-enroll.md#spot-enroll) has an `-a` option for saving adapted enrollment contexts.
- **Changed**
    - `SNSR_TECH_LEVEL`.
    - **Task file format.** Earlier betas are not compatible with the models
      included in this release.
    - [C examples](https://doc.sensory.com/tnl/7.8/api/sample/c/index.md#c-examples) Makefile uses adapted enrollment context in the
      `test-enroll-1` target.
    - [copy](https://doc.sensory.com/tnl/7.8/api/io.md#stream-copy), [getDelim](https://doc.sensory.com/tnl/7.8/api/io.md#stream-getDelim), [print](https://doc.sensory.com/tnl/7.8/api/io.md#stream-print),
      [read](https://doc.sensory.com/tnl/7.8/api/io.md#stream-read), [skip](https://doc.sensory.com/tnl/7.8/api/io.md#stream-skip), and [write](https://doc.sensory.com/tnl/7.8/api/io.md#stream-write)
      open the SnsrStream if it is not already open.
      Previous behavior was to return a [NOT_OPEN](https://doc.sensory.com/tnl/7.8/api/inference.md#rc) error or
      to throw a Java `IOException`.
    - Java [copy](https://doc.sensory.com/tnl/7.8/api/io.md#stream-copy), [getDelim](https://doc.sensory.com/tnl/7.8/api/io.md#stream-getDelim), [print](https://doc.sensory.com/tnl/7.8/api/io.md#stream-print),
      [read](https://doc.sensory.com/tnl/7.8/api/io.md#stream-read), [skip](https://doc.sensory.com/tnl/7.8/api/io.md#stream-skip), and [write](https://doc.sensory.com/tnl/7.8/api/io.md#stream-write)
      marked as `#!java throws IOException`.
- **Fixed**
    - Enrollment failures due to low SNR not reported.

## 5.0.0-beta.8.1 (2017-02-17)
- **Added**
    - `arm-buildroot-linux-uclibcgnueabihf` support.

## 5.0.0-beta.8 (2017-02-10)
- **Added**
    - `SNSR_TECH_LEVEL`.
    - Java `SnsrStream.fromPlugin()`.
    - [segmentSpottedAudio.java](https://doc.sensory.com/tnl/7.8/api/sample/java/segmentSpottedAudio.md#segmentspottedaudiojava) in [Java examples](https://doc.sensory.com/tnl/7.8/api/sample/java/index.md#java-examples) shows how to
      capture audio following a spotted phrase.
    - [live-segment.c](https://doc.sensory.com/tnl/7.8/api/sample/c/live-segment.md#live-segmentc) example shows how to capture audio following
      a spotted phrase.
- **Changed**
    - Changelog format based on [Keep a Changelog](http://keepachangelog.com/).
    - [sample-count](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#sample-count) type changed from `int` to `double` - potential
      incompatibility with earlier betas.
    - [fromAudioDevice](https://doc.sensory.com/tnl/7.8/api/io.md#fromaudiodevice) on Linux:
        + Uses larger capture buffer.
        + Tries to recover from transient capture errors.
    - [new](https://doc.sensory.com/tnl/7.8/api/inference.md#new) is a macro that checks [VERSION](https://doc.sensory.com/tnl/7.8/api/constants.md#version) found in `snsr.h`.
      This has to match the version of binary archive library, or
      initialization will fail with [LIBRARY_HEADER](https://doc.sensory.com/tnl/7.8/api/inference.md#rc).
- **Fixed**
    - On 32-bit CPUs, [run](https://doc.sensory.com/tnl/7.8/api/inference.md#run) mistakenly returns [ITERATION_LIMIT](https://doc.sensory.com/tnl/7.8/api/inference.md#rc)
      after processing 74.5 hours of audio without spotted phrases.
    - Spurious [EOF](https://doc.sensory.com/tnl/7.8/api/inference.md#rc_eof) reports from [fromAudioDevice](https://doc.sensory.com/tnl/7.8/api/io.md#fromaudiodevice) on Linux.
    - Java [load](https://doc.sensory.com/tnl/7.8/api/inference.md#load) method failed to throw any
      `Exceptions` on failure. This lead to misleading `Exception` messages
      produced by later library calls (e.g. `task type not found`).
    - [run](https://doc.sensory.com/tnl/7.8/api/inference.md#run) and [forEach](https://doc.sensory.com/tnl/7.8/api/inference.md#foreach) mistakenly reported certain
      callback-generated error codes, such as [INTERRUPTED](https://doc.sensory.com/tnl/7.8/api/inference.md#rc),
      as the generic [ERROR](https://doc.sensory.com/tnl/7.8/api/inference.md#rc).

## 5.0.0-beta.7 (2017-01-12)
- **Added**
    - [fromAudioDevice](https://doc.sensory.com/tnl/7.8/api/io.md#fromaudiodevice) supports live capture from Windows MME
      devices. This SnsrStream implementation is included in the C sample
      code as [wmme-stream.c](https://doc.sensory.com/tnl/7.8/api/sample/c/wmme-stream.md#wmme-streamc).
    - Support for building the [C examples](https://doc.sensory.com/tnl/7.8/api/sample/c/index.md#c-examples) code:
        + with [CMake][] on Linux, macOS and Windows.
        + with Microsoft Visual C++ on Windows.
    - [enrollUDT.java](https://doc.sensory.com/tnl/7.8/api/sample/java/enrollUDT.md#enrolludtjava) supports enrollments for multiple users/phrases.
- **Fixed**
    - Spotter alignment timestamps ([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), [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))
      wrapped around to `0` after approximately `1000` seconds.

## 5.0.0-beta.6 (2016-12-16)
- **Added**
    - Support for combined fixed, enrolled fixed, and user-defined triggers.
    - [Wake word enrollment](https://doc.sensory.com/tnl/7.8/models/types/enroll.md#enroll-type) configuration setting, [enrollment-task-index](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#enrollment-task-index).
    - Improved Java [Stream](https://doc.sensory.com/tnl/7.8/api/io.md#stream) module documentation.
- **Changed**
    - Renamed _live-spot-sample.c_ to [live-spot.c](https://doc.sensory.com/tnl/7.8/api/sample/c/live-spot.md#live-spotc).

## 5.0.0-beta.5 (2016-12-02)
- **Fixed**
    - Updated UDT model _udt-enUS-5.1.1.1.snsr._
    - Linux [fromAudioDevice](https://doc.sensory.com/tnl/7.8/api/io.md#fromaudiodevice) uses interleaved ALSA capture for
      improved compatiblity with PulseAudio.

## 5.0.0-beta.4 (2016-11-21)
- **Added**
    - Support enrollments with trailing context to improve performance.
        + Configuration settings: [req-enroll](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#req-enroll), [ctx-enroll](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#ctx-enroll), [add-context](https://doc.sensory.com/tnl/7.8/api/setting-keys/runtime.md#add-context).
        + Updated [wake word enrollment](https://doc.sensory.com/tnl/7.8/models/types/enroll.md#enroll-type).
    - Option to include enrollment audio in enrollment contexts.
        + Configuration setting: [save-enroll-audio](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#save-enroll-audio).
        + Iterator: [enrollment-iterator](https://doc.sensory.com/tnl/7.8/api/setting-keys/iterators.md#enrollment-iterator).
        + Result settings: [enrollment-id](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#enrollment-id), [begin-sample](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#begin-sample), [end-sample](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#end-sample).
        + Runtime settings: [audio-stream-first](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#audio-stream-first), [audio-stream-last](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#audio-stream-last),
          [audio-stream-from](https://doc.sensory.com/tnl/7.8/api/setting-keys/runtime.md#audio-stream-from), [audio-stream-to](https://doc.sensory.com/tnl/7.8/api/setting-keys/runtime.md#audio-stream-to).
    - [fromAudioDevice](https://doc.sensory.com/tnl/7.8/api/io.md#fromaudiodevice) supports high latency audio, with
      reduced CPU overhead. This is the now the default behavior.
    - [library-info](https://doc.sensory.com/tnl/7.8/api/setting-keys/library-information.md#library-info) setting.
    - _udt-enUS-5.1.1.0.snsr_ User-Defined Trigger task model
      for backwards compatibility.
        + Use this to produce enrolled spotter models for DSP ports of THF 3.x.
        + Not recommended for general use, as recognizers created
          using this model have reduced performance compared to
          _udt-enUS-12.2.5.snsr_.
- **Changed**
    - Improved User-Defined Trigger model, _udt-enUS-12.0.10.0.snsr_.
    - [getString](https://doc.sensory.com/tnl/7.8/api/inference.md#getters) supports reading task configuration keys (such as
      [task-type](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#task-type), [task-name](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#task-name), [task-version](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#task-version).)
    - _custom-stream.c_ sample renamed to [alsa-stream.c](https://doc.sensory.com/tnl/7.8/api/sample/c/alsa-stream.md#alsa-streamc).
    - [spot-enroll](https://doc.sensory.com/tnl/7.8/tools/spot-enroll.md#spot-enroll) prints a warning when the number of enrollment
      recordings per user is different from the recommended value,
      [req-enroll](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#req-enroll).
- **Removed**
    - Removed `SNSR_RES_ENROLLED_USER`. Use [user](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#user) instead.
- **Fixed**
    - Android sample app failed to open the audio device on Marshmallow (API
      level 23) and newer.
    - Java [open](https://doc.sensory.com/tnl/7.8/api/io.md#stream-open) and [load](https://doc.sensory.com/tnl/7.8/api/inference.md#load) methods marked as throwing `IOException`.
    - Small enrollment memory leak.
    - Removed duplicate C sample code.

## 5.0.0-beta.3 (2016-11-01)
- **Added**
    - [fromAudioDevice](https://doc.sensory.com/tnl/7.8/api/io.md#fromaudiodevice) supports live capture from a Linux ALSA source.
    - [C examples](https://doc.sensory.com/tnl/7.8/api/sample/c/index.md#c-examples) for Linux:
        + [spot-convert.c](https://doc.sensory.com/tnl/7.8/api/sample/c/spot-convert.md#spot-convertc), [spot-enroll.c](https://doc.sensory.com/tnl/7.8/api/sample/c/spot-enroll.md#spot-enrollc), _spot-eval.c_ sources.
        + [live-enroll.c](https://doc.sensory.com/tnl/7.8/api/sample/c/live-enroll.md#live-enrollc) interactive command-line enrollment.
        + _live-spot-sample.c_ simple one-shot spotter using live audio capture.
        + [live-spot-stream.c](https://doc.sensory.com/tnl/7.8/api/sample/c/live-spot-stream.md#live-spot-streamc) uses a custom SnsrStream implementation from
          _custom-stream.c_ to do live audio capture using ALSA.
- **Changed**
    - _spot-eval_ tool:
        + Supports live audio capture on Linux.
        + No longer shows speaker verification scores at the default
          verbosity level. Use `-v` to revert to previous behavior.
    - Allow setting [->audio-pcm](https://doc.sensory.com/tnl/7.8/api/setting-keys/runtime.md#-audio-pcm) to `NULL`, which can be
      used release a stream reference held by a [Session](https://doc.sensory.com/tnl/7.8/api/inference.md#session) instance.
    - `SnsrStreamAudioDeviceAndroid()` creates the `AudioRecord` instance in the
      `onOpen()` method, and releases it in `onClose()`. Previous behavior created
      the instance in the constructor and released it in `onRelease()`. The reduced
      `AudioRecord` lifespan improves audio resource contention on some Android
      implementations.
- **Fixed**
    - If [user](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#user) was not set before a [wake word enrollment](https://doc.sensory.com/tnl/7.8/models/types/enroll.md#enroll-type) task started, the
      value set in the initial [^next](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#next) callback was ignored.
    - [Wake word enrollment](https://doc.sensory.com/tnl/7.8/models/types/enroll.md#enroll-type) task documentation did not reference [^resume](https://doc.sensory.com/tnl/7.8/api/setting-keys/events.md#resume).
    - Phrase spotters with multiple enrolled phrases could return an incorrect
      result phrase with a [sv-score](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#sv-score) of `1.0`.
- **Security**
    - Using Java [Session](https://doc.sensory.com/tnl/7.8/api/inference.md#session) or [Stream](https://doc.sensory.com/tnl/7.8/api/io.md#stream) instances after calling the `release()`
      method now throws an exception, instead of generating a segmentation fault.

## 5.0.0-beta.2 (2016-10-09)
- **Added**
    - Java support for macOS, Linux on x86_64, i686 and Raspberry Pi, and 64-bit Windows.
    - Java code samples: [enrollUDT.java](https://doc.sensory.com/tnl/7.8/api/sample/java/enrollUDT.md#enrolludtjava) and [evalUDT.java](https://doc.sensory.com/tnl/7.8/api/sample/java/evalUDT.md#evaludtjava).
    - Optional input audio buffering in [wake word](https://doc.sensory.com/tnl/7.8/models/types/wake-word.md#wake-word-type) tasks.
        + Get segmented audio from recognition alignments.
        + Seamless trigger-to-search applications.
    - Settings:
        + [Wake word](https://doc.sensory.com/tnl/7.8/models/types/wake-word.md#wake-word-type) task: [audio-stream-size](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#audio-stream-size),
          [audio-stream-first](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#audio-stream-first), [audio-stream-last](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#audio-stream-last),
          [audio-stream-from](https://doc.sensory.com/tnl/7.8/api/setting-keys/runtime.md#audio-stream-from), [audio-stream-to](https://doc.sensory.com/tnl/7.8/api/setting-keys/runtime.md#audio-stream-to),
          [begin-sample](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#begin-sample), [end-sample](https://doc.sensory.com/tnl/7.8/api/setting-keys/results.md#end-sample).
    - Return codes: [BUFFER_OVERRUN](https://doc.sensory.com/tnl/7.8/api/inference.md#rc), [BUFFER_UNDERRUN](https://doc.sensory.com/tnl/7.8/api/inference.md#rc).
    - [describeError](https://doc.sensory.com/tnl/7.8/api/inference.md#describeerror).
    - [require](https://doc.sensory.com/tnl/7.8/api/inference.md#require) supports range operators when validating version numbers.
- **Changed**
    - Better `snsr.h` C++ compatibility: Opaque struct handles use unique struct names.
    - Improved Java stack traces for exceptions thrown in user callbacks.
    - Documentation for constants in the `com.sensory.speech.Snsr` Java class.
- **Removed**
    - Settings:
        + [Wake word](https://doc.sensory.com/tnl/7.8/models/types/wake-word.md#wake-word-type) task: SNSR_RES_SCORE, SNSR_RES_TOTAL_SCORE.
          These phrase spotting scores are highly non-linear and are not a
          measure of recognition confidence.

## 5.0.0-beta.1 (2016-07-12)
- **Added**
    - Produce phrase spotter models for Sensory's deeply embedded (DSP)
        targets:
        + [spot-convert](https://doc.sensory.com/tnl/7.8/tools/spot-convert.md#spot-convert) command-line tool.
        + [spot-convert.c](https://doc.sensory.com/tnl/7.8/api/sample/c/spot-convert.md#spot-convertc) source provided for reference.
        + Sample UDT and phrase spotter task models updated to support conversion
          to embedded formats.
        + Android sample app updated to show usage.
    - Settings:
        + Library: [license-exp-message](https://doc.sensory.com/tnl/7.8/api/setting-keys/library-information.md#license-exp-message).
        + All tasks: [task-version](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#task-version).
        + [Wake word](https://doc.sensory.com/tnl/7.8/models/types/wake-word.md#wake-word-type) task: [listen-window](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#listen-window),
          [dsp-target](https://doc.sensory.com/tnl/7.8/api/setting-keys/runtime.md#dsp-target), [dsp-header-stream](https://doc.sensory.com/tnl/7.8/api/setting-keys/runtime.md#dsp-header-stream),
          [dsp-search-stream](https://doc.sensory.com/tnl/7.8/api/setting-keys/runtime.md#dsp-search-stream), [dsp-acmodel-stream](https://doc.sensory.com/tnl/7.8/api/setting-keys/runtime.md#dsp-acmodel-stream).
        + [Wake word enrollment](https://doc.sensory.com/tnl/7.8/models/types/enroll.md#enroll-type) task: [accuracy](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#accuracy).
- **Changed**
    - [require](https://doc.sensory.com/tnl/7.8/api/inference.md#require) behavior for the [task-version](https://doc.sensory.com/tnl/7.8/api/setting-keys/configuration.md#task-version) key.
    - Documentation: [read](https://doc.sensory.com/tnl/7.8/api/io.md#stream-read) has non-blocking behavior on [fromBuffer](https://doc.sensory.com/tnl/7.8/api/io.md#frombuffer) streams.

## 5.0.0-beta.0 (2016-06-02)
- **Added**
    - Initial beta release of TrulyHandsfree 5.0.0.

<!-- Reference definitions from includes/links.md -->
[CMake]: https://cmake.org/ "CMake: A Powerful Software Build System"
[dBFS]: https://en.wikipedia.org/wiki/DBFS "Decibels relative to full scale"

<!-- Abbreviation definitions from includes/abbreviations.md -->
*[ALSA]: Advanced Linux Sound Architecture
*[API]: Application Programming Interface
*[SDK]: Software Development Kit
*[THF]: TrulyHandsfree, Sensory's wake word and command recognition technology
*[TNL]: TrulyNatural, Sensory's large-vocabulary speech recognition technology
*[UDT]: User-Defined Trigger: enrolled wake words and command sets
*[VAD]: Voice Activity Detector
*[WMME]: Windows Multimedia Extensions, the audio capture API on Windows
