Reson8 plugin for LiveKit Agents
Support for Reson8 speech-to-text, with server-side turn detection.
More information is available in the docs for the STT integration.
Installation
pip install livekit-plugins-reson8
Pre-requisites
You'll need an API key from Reson8. It can be set as an environment variable: RESON8_API_KEY
Usage
reson8.STT adapts to how LiveKit uses it:
- Streaming (
stream(), used by voice agents) connects to the turn-aware endpoint. Reson8 detects conversational turn boundaries server-side: it emits a preflight transcript (an eager guess that the turn is over) that your agent can start responding to. A later guess replaces it, and the last one becomes the final transcript when the turn ends. - Batch (
recognize()) transcribes pre-recorded audio and returns the full transcript.
from livekit.agents import AgentSession
from livekit.plugins import openai, reson8
session = AgentSession(
stt=reson8.STT(), # streaming + turn detection, language auto-detected
llm=openai.LLM(),
tts=openai.TTS(),
# "stt" hands turn detection to Reson8 and lets the agent start
# generating on the preflight transcript instead of the confirmation.
turn_handling={
"turn_detection": "stt",
"preemptive_generation": {"enabled": True},
},
)
By default LiveKit runs its own turn detector. Set turn_handling as above to
hand turn-taking to Reson8 instead.
Transcribing a file
event = await reson8.STT().recognize(audio_buffer)
print(event.alternatives[0].text)
Turn detection
Reson8 decides turn boundaries by confidence: it emits the preflight transcript
at turn.eager_probability and commits the turn at turn.final_probability.
The server default of 0.92 is tuned for conversational speech and is slow to
commit a one-word answer; lower it to commit sooner, at the risk of cutting off
longer utterances.
stt = reson8.STT(turn=reson8.TurnOptions(final_probability=0.7))
SpeechStream.flush() commits the current turn immediately, keeping
final_probability intact. LiveKit never calls it for you.
See Turns for how turn events work server-side.
Languages
Leave language unset to auto-detect the spoken language, or pin recognition
to one or more supported codes. You can pass a single code, a comma-string, or a
list — a list is normalized to Reson8's comma-joined form and any unsupported code
raises ValueError locally, before a request is made.
reson8.STT() # auto-detects the spoken language
reson8.STT(language="en") # English only
reson8.STT(language="nl,de") # Dutch or German
reson8.STT(language=["nl", "de"]) # same, as a list
Reson8 supports de, en, es, fr, fy (Frisian), it, nl, pl, pt
and sv — available as the reson8.SupportedLanguage type and the
reson8.SUPPORTED_LANGUAGES tuple. See
Languages.
Configuration
Settings are grouped into sections, each of which validates itself on construction:
stt = reson8.STT(
api_key="your-api-key", # or set RESON8_API_KEY
language="nl",
turn=reson8.TurnOptions(final_probability=0.7),
audio=reson8.AudioOptions(sample_rate=16000),
transcript=reson8.TranscriptOptions(words=True),
biasing=reson8.BiasingOptions(custom_model_id="my-model"),
)
TurnOptions
The main lever on end-of-turn latency. None leaves the server's default.
| Field | Default | |
|---|---|---|
eager_probability |
None (server: 0.5) |
confidence at which the preflight transcript is emitted |
final_probability |
None (server: 0.92) |
confidence at which the turn commits |
AudioOptions
Describes the audio sent to Reson8; it does not convert it. Streaming input is
resampled to sample_rate, but nothing remixes channels or transcodes samples,
so a pushed frame whose channel count disagrees with num_channels raises
rather than being relabelled.
| Field | Default | |
|---|---|---|
sample_rate |
16000 |
streaming input is resampled to this |
encoding |
"pcm_s16le" |
the only value; rtc.AudioFrame is signed 16-bit PCM and is forwarded unchanged |
num_channels |
1 |
channel count of the frames you push, 1 to 10 |
TranscriptOptions
| Field | Default | |
|---|---|---|
words |
False |
word-level results, each with its own timing |
language |
True |
the detected language code |
confidence |
False |
per-word confidence, batch recognition only |
filler_mode |
None (server: natural) |
clean removes filler words, natural lets the model decide, verbatim preserves them |
BiasingOptions
Use phrases for a handful of terms on a single request, a custom_model_id
for a vocabulary that is larger or reused across requests, and patterns for
structured tokens whose shape you know up front.
Biasing is not free: phrases and patterns can degrade transcription of audio that does not contain them, and stronger biasing introduces irrelevant terms.
| Field | Default | |
|---|---|---|
custom_model_id |
None |
a custom model to bias toward, for a vocabulary too large for phrases or reused across requests |
phrases |
None |
terms to bias toward, at most 250; needs no custom model |
strength |
None (server: 0.45) |
additive boost on the model's trained calibration. Raise only when expected terminology is not being recovered |
patterns |
None |
shapes for short alphanumeric tokens to recover, e.g. "AMZ[0-9]{6}" or "[0-9]{4,6}" |
# bias toward vocabulary the model would otherwise miss
stt = reson8.STT(biasing=reson8.BiasingOptions(phrases=["Reson8", "LiveKit"]))
# or recover a structured token, so its digits are not heard as words
stt = reson8.STT(biasing=reson8.BiasingOptions(patterns=["AMZ[0-9]{6}", "[0-9]{4,6}"]))
See custom models and patterns.
STT.update_options(...) takes the same sections and changes them at runtime.
Reson8 reads its configuration from the query string, so a live stream applies
new settings by reconnecting immediately — which abandons the audio already
sent for the turn in progress, since Reson8 holds turn state server-side. Change
options between turns, or accept losing the one in progress. AudioOptions is
fixed for the life of a stream, since the input resampler is built when the
stream opens.
Self-hosted deployments
base_url (or RESON8_BASE_URL) points the plugin at a Reson8 deployment other
than https://api.reson8.dev.
Documentation
Metadata
Release files for livekit-plugins-reson8 1.8.11
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| livekit_plugins_reson8-1.8.11.tar.gz | 18.7 kB | With provenance | Details for livekit_plugins_reson8-1.8.11.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| livekit_plugins_reson8-1.8.11-py3-none-any.whl | Python 3 | none | any | Details for livekit_plugins_reson8-1.8.11-py3-none-any.whl |
Total release size: 39.5 kB
Release files / livekit_plugins_reson8-1.8.11.tar.gz
| Download URL | livekit_plugins_reson8-1.8.11.tar.gz |
|---|---|
| Size | 18.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8251875c4762498bff295bc6c1c0ad82562bad70ee752738397ef091d63220c2
|
|
BLAKE2b-256 checksum How to use checksums |
15f5325fd6cc36974207310c39fece8fc50c96bb366f9710fadb4ec9fb9397b7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 5, 2026.
Transparency logRelease files / livekit_plugins_reson8-1.8.11-py3-none-any.whl
| Download URL | livekit_plugins_reson8-1.8.11-py3-none-any.whl |
|---|---|
| Size | 20.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
76a6499f506a29fdd31c6955df1d2cb865213eb065dc66e73ea55ff721a45a30
|
|
BLAKE2b-256 checksum How to use checksums |
5b3ea72736f60fd6be25f40988e092652342da0bf2794df63e073faa1c16497e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 5, 2026.
Transparency logSecurity for livekit-plugins-reson8 1.8.11
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for livekit_plugins_reson8-1.8.11.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 5, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.