Skip to navigation

Pulse STT: one language value for all ten Indian languages on streaming

Streaming Pulse now accepts language=indic. One model auto-detects English, Hindi, Marathi, Gujarati, Bengali, Odia, Tamil, Telugu, Kannada, and Malayalam, so you no longer have to choose between north_indic and multi-south-indic before the call starts.

  • Mid-call switching: a caller can start in Hindi and continue in Tamil in the same session. north_indic and multi-south-indic can’t transcribe languages outside their own group.
  • Detected language per utterance: each final transcript reports the language it heard in language and languages.
  • Where: wss://api.smallest.ai/waves/v1/stt/live?model=pulse and wss://api.smallest.ai/waves/v1/pulse/get_text. Streaming only.
  • Region: India only. On api.us.smallest.ai, the connection closes with LANGUAGE_NOT_ENABLED_IN_REGION.

Pulse STT: start and duration on live transcripts

Every transcription message on /waves/v1/stt/live (interim, final, finalize and is_last) now carries two fields, in seconds of the audio you sent:

  • start: where the current segment began. Interim results within one utterance share it.
  • duration: start + duration is how much of your audio has been processed so far.

Updated Pulse benchmarks for Indic languages

Pulse benchmark results for Indic languages have been updated to reflect the latest Pulse Indic models. The updated word error rate (WER) results cover FLEURS and the per-dataset tables, including Kathbath, IndicVoices and Vistaar.

→ Indic languages benchmarks

Hindi number normalization on hi and hi-dev

With itn_normalize=true on the streaming endpoint, the two Hindi codes handle numbers differently:

languageSpoken in Hindi: पच्चीस हज़ार रुपएSpoken in English: twenty five thousand rupees
hi₹25,000₹25,000
hi-dev₹25,000Devanagari words (not converted)

Use hi when callers mix English numbers into Hindi speech and you want digits back. Output uses digit grouping (₹25,000), not ₹25000 as an earlier version of the docs said.

Opt out of the ITN formatting delay

With itn_normalize=true, a number still being dictated at the end of a final is held back and emitted with the next one, so it is normalized whole — I have 4,000 + dollars becomes $4,000 instead of two separately normalized halves. That hold is on by default whenever ITN is enabled.

Pass no_format_delay=true to give it up and have every final emitted as soon as it is ready. Text is never dropped either way: a held fragment rides the next final, and finalize / close_stream flush instead of holding.

Pulse STT: live response fields match what the API sends

Corrections to the Speech-to-Text response fields so the docs match what the API sends.

from_finalize does not depend on ITN. Every manual {"type":"finalize"} produces exactly one final with from_finalize: true, with itn_normalize on or off. Its transcript is empty if no audio was pending. The field is now on the /waves/v1/stt/live TranscriptionEvent schema and the realtime response format page too.

Pulse STT: East Asian languages on pre-recorded in every region (correction)

Pre-recorded Pulse STT (POST /waves/v1/stt/?model=pulse and the legacy POST /waves/v1/pulse/get_text) supports Mandarin (zh), Japanese (ja), Korean (ko), and the multi-asian aggregator in every region: api.smallest.ai, api.us.smallest.ai, and api.india.smallest.ai. Cantonese (yue) is not available on pre-recorded and returns 400 with LANGUAGE_NOT_ENABLED_IN_REGION in every region.

Pulse 2.0 launch: built-in end-of-turn detection, emotion, and gender

New model: Pulse 2.0. English-only, streaming-only speech to text on the unified live endpoint. Select it with ?model=pulse-2 on wss://api.smallest.ai/waves/v1/stt/live - the same endpoint Pulse streams on.

Built-in end-of-turn (EOT) detection. Finals close on turn boundaries instead of a fixed silence timeout or word count, so finals are fewer and longer. There are no tuning knobs. eou_timeout_ms, finalize_on_words, and max_words are ignored by default on model=pulse-2 - don’t send them. If you do, they still take effect and compete with end-of-turn detection. Finals closed by EOT carry eot_finalized: true.

Pulse STT: finalization guide, eou_timeout_ms defaults, and error bodies

One page for streaming finalization. The Endpointing page is now Finalization and Endpointing. It lists every condition that produces an is_final: true transcript and gives recommended setups for the LiveKit plugin, Pipecat, custom clients, and fixed-buffer streaming.

eou_timeout_ms defaults corrected. With endpointing=true (the default), eou_timeout_ms sets the trailing-silence window, which is 600 ms when unset. The 800 ms default applies only with endpointing=false.

Pulse STT: European language codes removed from public batch enum

The 14 European codes previously listed on the pre-recorded (batch) endpoint (uk, pl, cs, sk, lv, et, ro, fi, sv, bg, hu, da, lt, mt) are removed from the customer-facing batch enum on POST /waves/v1/stt/ and POST /waves/v1/pulse/get_text.

Batch now advertises 12 single-language codes: en, hi, de, es, ru, it, fr, nl, pt, zh, ja, ko, plus the multi-eu, multi-asian, and multi-indic regional aggregators.

Pulse Pro model card: diarization Capability removed; `eou_timeout_ms` range documented

Two small corrections on the Waves STT surface.

Pulse Pro model card no longer claims speaker diarization. The Capability block previously said “Multi-speaker identification with per-word speaker labels”, which contradicted the API reference and the Speaker diarization page. Live: POST /waves/v1/stt/?model=pulse-pro&diarize=true returns a transcript-only response with no speaker fields on words[] and no utterances[]. The Capability is dropped from the card. Route diarization traffic to ?model=pulse.

Pulse STT: keyword boosting on the pre-recorded endpoint

Keyword boosting now works on the pre-recorded HTTP endpoint (POST /waves/v1/pulse/get_text and POST /waves/v1/stt/?model=pulse). Pass keywords as a query parameter with the same KEYWORD:INTENSIFIER format as the realtime WebSocket. Max 100 keywords per request; sending more returns 400 with keywords too large (max 100) in errors[].

Intensifier guidance updated. Default 1, recommended 1 to 3. Above 10 is not recommended: higher values increase the chance of hallucinating the keyword when it was not spoken.

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.