Skip to content

STT providers

Every STT plugin here is a wire protocol over the shared @kuralle-syrinx/stt-core lifecycle — reconnect, the interim/final funnel, and usage billing all work identically regardless of which one you pick.

The flagship cascade STT. Silence-based endpointing with a Finalize handshake state machine for accurate turn boundaries.

import { DeepgramSTTPlugin } from '@kuralle-syrinx/deepgram';
const stt = new DeepgramSTTPlugin(socketFactory);
await stt.initialize(bus, {
api_key: process.env.DEEPGRAM_API_KEY!,
model: 'nova-3',
language: 'en-US',
sample_rate: 16000,
endpointing: 300,
keyterm: ['Syrinx', 'onboarding'],
});
KeyDefaultNotes
api_keyRequired.
modelnova-3
languageen-US
sample_rate16000
endpointing300Silence, in ms, before a turn is considered finished.
keytermRepeatable; biases recognition toward domain terms.
encodinglinear16

Supports mid-call reconfigure (keyterms, endpointing, language) via a reconnect at the turn boundary.

A turn-aware model — one API call handles transcription and semantic end-of-turn, so you don’t need a local endpointer. Runs over a plain WebSocket, which makes it the only semantic-EOT option available on the Cloudflare Workers edge.

import { DeepgramFluxSTTPlugin } from '@kuralle-syrinx/deepgram';
const stt = new DeepgramFluxSTTPlugin(socketFactory);
await stt.initialize(bus, {
api_key: process.env.DEEPGRAM_API_KEY!,
eot_threshold: 0.7,
eager_eot_threshold: 0.5,
eot_timeout_ms: 5000,
});
KeyDefaultNotes
api_keyRequired.
modelflux-general-en
eot_threshold0.7Confidence required to fire EndOfTurn.
eager_eot_thresholdunsetSet to enable eager mode — an early, retractable end-of-turn signal for speculative generation.
eot_timeout_ms5000
keyterm
language_hintSoft language bias — see languageHints vs language.

Supports mid-call reconfigure (keyterms, EOT thresholds, language hints) in-band, without a reconnect.

import { ElevenLabsSTTPlugin } from '@kuralle-syrinx/elevenlabs';
const stt = new ElevenLabsSTTPlugin(socketFactory);
await stt.initialize(bus, {
api_key: process.env.ELEVENLABS_API_KEY!,
sample_rate: 16000,
});
KeyDefaultNotes
api_keyRequired.
sample_rate16000

Owns its own endpointing (provider_stt) — you don’t need a separate VAD or endpointer alongside it.

import { GoogleSTTPlugin } from '@kuralle-syrinx/google';
const stt = new GoogleSTTPlugin(socketFactory);
await stt.initialize(bus, {
api_key: process.env.GOOGLE_API_KEY!,
project_id: process.env.GOOGLE_PROJECT_ID!,
language: 'en-US',
model: 'latest_long',
confidence_threshold: 0,
});
KeyDefaultNotes
api_keyRequired.
project_idRequired.
language / language_codesen-USlanguage_codes accepts multiple for auto-detect.
modellatest_long
locationglobal
recognizer_
confidence_threshold0Results below this confidence are dropped rather than emitted.
encodingLINEAR16
import { GrokSTTPlugin } from '@kuralle-syrinx/grok/stt';
const stt = new GrokSTTPlugin(socketFactory);
await stt.initialize(bus, {
api_key: process.env.XAI_API_KEY!,
language: 'en',
sample_rate: 16000,
});
KeyDefaultNotes
api_keyRequired.
languageen
sample_rate16000
  • Turn-taking already solved and want to run on the Workers edge? Deepgram Flux is the only semantic-EOT provider that doesn’t need a local ONNX model.
  • Want the most battle-tested silence-based endpointing? Deepgram Nova.
  • Already on ElevenLabs for TTS? ElevenLabs STT shares your account and billing.
  • On GCP already? Google Cloud Speech-to-Text v2.

See STT reconfigure for which of these support mid-call biasing, and Usage & pricing for cited rates.