Pulse STT: diarization response shape correction and rewrite
Fixed two things the Speaker diarization page and the streaming WS spec got wrong, plus tightened the page for developers rather than marketing.
speaker is an integer on both batch and streaming. The page previously claimed the batch API returned string labels (speaker_0, speaker_1, …) while streaming returned integers. Live: both return integers, zero-indexed. Example values in the docs and the response-fields table are updated. The stt-live-ws.yaml spec had speaker typed as string on the streaming word/utterance schemas; corrected to integer with example: 0 on both.
Improved Pulse STT release - stronger repeated-entity dictation and background-speaker handling
Pulse STT has been updated with an improved English model. The Pulse Performance page (/models/documentation/speech-to-text-pulse/benchmarks/performance) has been refreshed with new WER for the standard public benchmarks - FLEURS, HuggingFace ESB, and WildASR - and improves on every one of them. WildASR sees the largest single-benchmark move, driven by big gains on the harder degradation subsets (Far-field, Clipping, Reverberation, Noise Gap).
Pulse STT streaming: external_session_id correlation parameter
The streaming STT WebSocket now documents the external_session_id query parameter (available on both /waves/v1/stt/live and /waves/v1/pulse/get_text).
Pass your own session identifier — e.g. a call or conversation ID — and it is stored on the session’s usage/analytics record, so you can join STT usage back to your own systems. Only alphanumeric characters, hyphens, underscores, and dots allowed; max 128 characters. It never affects transcription. Mirrors the TTS session_id correlation contract.
Pulse STT: European streaming Beta, redaction English/Hindi-only
European streaming languages tagged Beta. The 7 European codes on the streaming endpoint (de, es, ru, it, fr, nl, pt) now carry a Beta badge on the Pulse model card.
Pre-recorded language list trimmed. Removed da, lv, et, mt from the batch language table (not offered on batch). New counts: 22 pre-recorded, 31 total, 21 streaming unchanged. multi-eu aggregator now covers 17 European codes and is pre-recorded only.
Pulse STT keyword boosting: 100-keyword cap, softer intensifiers, cased matching
Documentation refresh for the streaming keywords query parameter.
Session limit is 100 keywords.
Intensifier guidance rewritten. Default is 1.0. Recommended tuning range is 1 to 3. Values above 5 push the model into hallucination and repetition; keep keywords at 1 and only raise a specific one if it is still being missed.
Pulse STT documentation cleanup, multi-indic restored, redact language scope
Small STT docs corrections surfaced by customer reports and post-#251 audit.
multi-indic restored on pre-recorded. Documented as a pre-recorded aggregator (India region only) covering en, hi, gu, mr, bn, or. Streaming still uses north_indic for the same coverage; multi-indic is not supported on the streaming endpoint. Aligns the docs with what the platform actually accepts on POST /waves/v1/stt/.
Pulse STT endpointing now on by default
Pulse STT streaming finalizes each turn on trailing silence by default. When the speaker stops, the server emits is_final: true promptly instead of waiting for the model’s internal finalization cadence. Transcript accuracy is unchanged.
To restore the previous finalization behavior, set endpointing=false on the WebSocket URL:
Pulse STT Beta tag on South Indian streaming languages
Tamil, Telugu, Kannada, and Malayalam (plus the multi-south-indic aggregator) are now marked Beta on the Pulse model card and the STT overview. Accuracy improvements are ongoing. These codes remain India-region only (wss://api.smallest.ai/waves/v1/stt/live); the US endpoint continues to reject them with LANGUAGE_NOT_ENABLED_IN_REGION.
Also cleaned up stale multi (bare) language references in the pulse-stt-ws-overrides.yml enum, the pulse-stt API reference, and the voice-cloning-openapi.yaml language example. multi was replaced by the current multi-eu / multi-asian / north_indic / multi-south-indic aggregators when the streaming enum was revised. Pre-recorded aggregators (multi-eu, multi-asian) are unchanged.
Pulse STT - per-word `confidence` documented in transcription output
The per-word confidence score is now documented across the Speech-to-Text API reference. These fields were already returned by the API - this makes them explicit in the reference.
- Sync REST (
POST /waves/v1/stt): thewords[]entries (returned whenword_timestamps=true) carryword,start,end, and aconfidencescore from 0.0 to 1.0. Theconfidencefield is now described in theWordschema, and theword_timestampsparameter documents the full per-word shape it surfaces. - Streaming (
WSS /waves/v1/stt/live): thewords[]schema now listsconfidence, plusspeaker_confidence(returned alongsidespeakerwhendiarize=true).
Pulse STT - streaming now supports ta / te / kn / ml + `multi-south-indic` aggregator (India region)
The Pulse streaming Speech-to-Text API now supports four South Indian languages: Tamil (ta), Telugu (te), Kannada (kn), and Malayalam (ml). The multi-south-indic aggregator is also available for unknown South Indian audio - it auto-detects across the same four-language set plus English code-switching.
These five language values are served from the India region only - connect to wss://api.smallest.ai/waves/v1/stt/live?model=pulse (or the legacy wss://api.smallest.ai/waves/v1/pulse/get_text). Requesting any of them on the US host (wss://api.us.smallest.ai/...) returns an error:
Pulse STT - streaming now supports ja / yue / zh / ko + `multi-asian` aggregator (US region)
The Pulse streaming Speech-to-Text API now supports four Asian languages: Japanese (ja), Cantonese (yue), Mandarin (zh), and Korean (ko). The multi-asian aggregator is also available for unknown East Asian audio - it auto-detects across the same four-language set.
These five language values are served from the US region only - connect to wss://api.us.smallest.ai/waves/v1/stt/live?model=pulse (or the legacy wss://api.us.smallest.ai/waves/v1/pulse/get_text) instead of the default wss://api.smallest.ai/... host. Requesting any of them on the default (ap-south-1) host closes the connection without a transcription frame.
Streaming vs Pre-Recorded language framing across Pulse docs
The Pulse STT supported-languages story is now consistent end-to-end. Each surface labels its mode and points readers at the right neighbour:
- Overview page (
/models/documentation/speech-to-text-pulse/overview): split the single Supported Languages table into two - Streaming (Real-Time, WebSocket) and Non-Streaming (Pre-Recorded, HTTP). Same 39-language set in both, matching the Pulse model card. - API Reference - Pre-Recorded (HTTP):
languagequery param now declares an explicitenumof 39 single-language codes (en,hi,es, …) plusmulti-eu/multi-indicaggregators. Description labels the endpoint as Pre-Recorded and points at the streaming WebSocket endpoint for the live mode. - API Reference - Streaming (WebSocket): same enum and labelling, applied via the AsyncAPI override so it renders correctly. The page-top Note labels it as Streaming and points at the HTTP endpoint for pre-recorded.
Pulse STT WebSocket - `finalize` operation restored on the API reference
The Pulse STT WebSocket API reference now correctly renders both control-message operations on docs.smallest.ai:
sendFinalize- payload{"type":"finalize"}- flushes the current audio buffer and emits anis_final: truetranscript while keeping the session open. Useful for per-turn finalization in agentic pipelines.sendCloseStream- payload{"type":"close_stream"}- flushes any buffered audio, emits the terminalis_final: true+is_last: truetranscript, then closes the session.
STT WebSocket - `sendFinalize` added to unified `/stt/live` API reference + doc fixes
The unified Speech-to-Text WebSocket API reference page now documents both control messages with their correct semantics:
sendFinalize- turn-boundary signal. Flushes the current audio buffer, runs ITN, and emits oneis_final: truetranscript for that turn. The WebSocket stays open for the next user turn. Use this once per turn in any multi-turn flow.sendClose- session-end signal. Flushes remaining audio, emits the terminalis_final: true+is_last: truetranscript, then closes the WebSocket. Use this once at the end of the session.
Unified Speech-to-Text endpoint, Pulse Pro model
The Speech-to-Text API now lives at the unified path /waves/v1/stt/, mirroring the unified TTS shape. The model is selected via the ?model= query parameter. Two models are live today:
?model=pulse: multilingual (17 streaming + 26 pre-recorded languages), HTTP + WebSocket streaming.?model=pulse-pro: leaderboard-ranked English STT (5.42% ESB avg WER, tied #2 on the public Open ASR Leaderboard). HTTP only.
Pulse STT - full feature parity over HTTP and WebSocket
The full Pulse STT feature set is now available on both HTTP (pre-recorded) and WebSocket (realtime) modes with consistent flag names and response shapes.
What this means in practice:
- Same query parameters and request body fields work the same way on
POST /waves/v1/pulse/get_text(pre-recorded) andwss://api.smallest.ai/waves/v1/pulse/get_text(realtime). - Speaker diarization, word timestamps, sentence-level utterances, emotion detection, gender detection, keyword boosting, redaction, punctuation, and inverse text normalisation all behave identically across modes.
- The full per-feature documentation is on the Features pages.
Pulse STT - `numerals` query parameter removed from the WS API reference
The legacy numerals query parameter on the Pulse STT WebSocket has been removed from the API reference, navigation, and feature pages. The 2026-05-06 deprecation note on this changelog feed flagged this for two weeks; today’s clean-up drops it from the documented surface area.
What changed in the docs
numeralsremoved from the Pulse WS AsyncAPI spec + v4 override.- The “Numeric formatting” feature page and its nav entry are gone.
- The “Convert numerals” cards on
realtime/features.mdxandpre-recorded/features.mdxare gone. - The ITN feature page no longer lists
numeralsin its precedence table.
Pulse STT - `encoding` query param now documented on the pre-recorded REST endpoint
The pre-recorded REST endpoint (POST /waves/v1/pulse/get_text) now lists the encoding query parameter alongside the streaming WebSocket. Same 6-value enum: linear16, linear32, alaw, mulaw, opus, ogg_opus. Default is linear16.
When omitted, the server falls back to detecting the format from the file’s container header (works for .wav, .mp3, .flac, .ogg, .m4a, .webm).
Pulse STT - `age_detection` removed from the pre-recorded HTTP API
The age_detection query parameter and the corresponding top-level age field in the response have been removed from the Pulse STT pre-recorded HTTP API (POST /waves/v1/pulse/get_text). Gender detection (gender_detection / gender) and emotion detection (emotion_detection / emotions) are unaffected.
Specs and reference docs updated:
Pulse STT - recommend `itn_normalize` over `numerals` for new integrations
The numerals query parameter on the Pulse STT WebSocket API still works and continues to behave as documented. For new integrations we now recommend itn_normalize=true instead - it covers digits as well as dates, currencies, phone numbers, and other spoken-form entities, and gives more consistent results across languages.
Existing code that uses numerals does not need to change.

