Skip to main content

Overview

Prisma v3.0 is Gnani’s multilingual speech-to-text model. You send it audio of someone speaking and it returns the words as text. What sets it apart from Prisma v2.5, the model most existing integrations use today:
  • One model for ten languages. Nine Indian languages and English are covered by a single model. You do not need a separate model or a separate request per language.
  • It can identify the language for you. If you do not know which language a caller will speak, you can ask the model to work it out. The response then tells you which language it heard (see Language detection).
  • It handles mixed-language speech. People often switch between languages mid-sentence, for example Hindi with English words. You choose how those words are written (see Output styles).
  • It accepts hints. You can pass names, brand terms, the topic of the conversation or the previous part of a recording to help the model get difficult words right (see Context).
  • You always get one transcript back. The response contains a single transcript, not one per language.
Prisma v3.0 is opt-in. If a request does not ask for it, the API uses Prisma v2.5 as before. Nothing changes for existing integrations until you add model=prisma-v3.0 to your requests. For all models, see Models.

Quick facts

Selecting Prisma v3.0

Send model=prisma-v3.0 to run Prisma v3.0. Where you put it depends on the API (see Where you can use it). Leave it out on REST or Realtime to run Prisma v2.5, the default. The 3 in /stt/v3 is the URL version, not the model version. How models and URLs relate, and how to select each model, is explained on the Models page.

Where you can use it

Gnani offers several ways to send audio. Prisma v3.0 works with all of them. Pick the one that matches how your audio is produced.

Try it

This request sends one audio file and asks the model to identify the language automatically. Replace <API_KEY> with your Gnani API key and clip.wav with your own file (up to 30 seconds).
A successful response looks like this:

Languages

Use these codes in language_code (or lang_code when streaming). Each code is a language followed by a region, for example hi-IN for Hindi as spoken in India.
indic-auto (Prisma v3.0 only). Send language_code=indic-auto to let the model identify the language itself. It is not a language: the reply carries the language it heard in detected_language_code. See Language detection.
Languages outside this list, such as Assamese (as-IN), are not supported by Prisma v3.0. You tell the model which languages to expect by sending indic-auto, or one to four language codes. They are explained under Language detection.

Language detection

Prisma v3.0 always detects the language from the audio. The transcript follows the language that is actually spoken, and detected_language_code reports it. The tag is worked out from the script of the final transcript (see Reading detected_language_code). language_code (REST and Batch) or lang_code (streaming) tells the model which languages to expect. It doesn’t force the output into a language.

Good to know

  • What you send is a hint, not a lock. Passing hi-IN doesn’t guarantee a Hindi transcript. If the speaker uses Tamil, you get Tamil, and the tag says ta-IN.
  • You can send up to 4 languages. Order doesn’t matter.
  • When to list languages: if you know the likely languages, list them. It helps most with short clips and with languages that share a script, such as Hindi and Marathi.
  • When to use auto: use indic-auto when you don’t know what the caller will speak.
  • Always check detected_language_code to see which language was transcribed.

Auto-detect the language

The response names the language it heard:

Send one language

Send one code when you expect a single language. The model listens for that language first. If the speaker uses another language, the transcript and detected_language_code follow it:

Send several languages

Hindi and English are both likely:

Reading detected_language_code

The model transcribes but does not report which language it heard. For every request except format=transliterate, the API adds detected_language_code, derived from the script of the final transcript. The same logic runs whatever you send. Only the languages it starts from differ.
  • It describes what the transcript is written in, not what the model was told. If you send ta-IN and the speaker answers in English, the tag is en-IN. If you send hi-IN and the text comes back in Tamil script, the tag is ta-IN.
  • The tag reports what was written, even when it is outside the languages you sent.
  • Empty transcripts, transcripts of digits or punctuation only, and text in a script the API does not map (for example Urdu or Odia) have no tag.
  • With format=transliterate there is no tag. The text is always in Latin letters, so there is nothing to judge a language from.
  • Code-mixed output keeps its native-language tag while native-script letters make up at least 30 % of the letters. A transcript that is mostly English with a short native phrase can be tagged en-IN.
  • Hindi vs Marathi: both use Devanagari, so very short utterances (a greeting, a name, a number) may be tagged hi-IN. Sending only the one you expect, hi-IN or mr-IN, settles it.
  • When streaming, the tag is judged per committed utterance, so it can change from one message to the next when the speaker switches language.
Streaming. Add x-model: prisma-v3.0 and lang_code: indic-auto (or a list such as hi-IN,en-IN) to the connection headers. The full connection example is on the Realtime page.
Each committed transcript message then carries detected_language_code. A missing language_code (422, except with format=transliterate), INVALID_LANGUAGE_CODE and MODEL_UNSUPPORTED_LANGUAGE are listed in Error Reference.

Output styles

The same audio can be written four ways. Set it with format (REST), config.format (Batch) or x-format (streaming). The last column shows where each style is available. What you get when you omit format (REST) An explicit format always wins. That includes transliterate, which also overrides enable_itn. When streaming, the style is chosen per session. See Output style when streaming.
A single hi-IN or en-IN with no format returns digits on v3.0. On v2.5 the default was verbatim. Send format explicitly when moving over, to keep your current output.

Romanised output (transliterate)

With format=transliterate the model writes Indic speech in Latin letters, for example तो ठीक है becomes to theek hai. It is available on REST and when streaming. Numbers come out as words.
  • language_code (REST) and lang_code (streaming) are optional. The model romanises whatever language it hears, so there is nothing to tell it. If you leave it out (or send it empty), the request is treated as indic-auto. For every other format it stays required.
  • If you do send a language, it is still checked. An unsupported locale (such as as-IN) is an error. It does not change what the model does.
  • A list of languages is ignored. One call returns one transcript.
  • The reply has no detected_language_code. The text is always in Latin letters, so there is nothing to judge a language from. If you need to know the language, take it from your own request.
  • keyterms, topic, previous_text and speaker_names work as usual. Write them in Latin letters to match the output.
The romanisation is written by the model, and its accuracy has not been measured. The output is always in Latin letters, but compare it with what you expect on your own audio before relying on it.

The same clip in all four styles

Example output for a clip containing a number and an English word (your text will differ):

Output style when streaming

Streaming supports all four styles. The model writes the style you ask for, exactly as it does on REST, so a transcribe session returns the same text as REST. There is no separate number-formatting step afterwards.
  • itn_native_numerals and x-itn-native-numerals have no effect on prisma-v3.0, on REST or when streaming. The model writes numbers itself.
  • x-format: transliterate works as described in Romanised output: lang_code is optional (it defaults to indic-auto), a list of languages is ignored, and detected_language_code is not sent. You can switch into and out of it with update_settings. When you leave it, the session’s own language applies again.
  • output.literal is not returned for prisma-v3.0, on REST or when streaming. There is no separate step that changes the text, so there is no “before formatting” text.

Context

Context is extra information sent with the audio — names, brands, what the call is about. There are four kinds. This section describes REST and Realtime. On Batch, keyterms, topic and speaker_names are config fields with stricter limits and fewer allowed combinations, and previous_text is not available. See Batch transcription. bias_list / x-bias-list still work on this model as the older name of keyterms. If both are sent, keyterms wins. bias_score is ignored. Combining fields. You can send any combination of the four fields, from none to all four, for example keyterms + previous_text, or topic + keyterms + speaker_names + previous_text. Each field keeps its own limits from the table above. In Gnani’s tests on 60 public clips per combination, every combination that included keyterms was more accurate than no context and none was worse. Unspoken speaker names were never inserted into the transcript, and topic or previous text was never copied into it. A value outside its limit returns 400 INVALID_CONTEXT before transcription starts, for example topic must be at most 1600 characters (got 1601). With format=transliterate, write the context in Latin letters to match the output. A value containing <| or |> is also rejected.

Keyterms prompting

  • Words or short phrases ("HDFC Bank", "खाता नंबर"); mixed scripts are fine; spelling need not be exact.
  • Send a JSON array (["खाता","HDFC Bank"]) or a comma-separated string. Use the JSON form when an item contains a comma.
  • A listed word that is not spoken should not appear in the output.
  • More than 200 items → 400 INVALID_CONTEXT.
  • In streaming headers, non-ASCII text must be JSON-escaped (["\u0916\u093e\u0924\u093e"]). A form field can carry it directly.
A model that was not trained on context can become less accurate when given one. Compare results with and without context on your own audio before relying on it.

Keyterms prompting example

Topic and keyterms together

Speaker names example

A long recording cut into pieces (previous_text)

Send the transcript of the previous piece with the next one. previous_text applies to the first part of that piece only.

All four kinds together

Compare with and without context

Streaming — keyterms only (topic, previous_text and speaker_names are not available when streaming):

How it differs from Prisma v2.5

If you already use Prisma v2.5, this table shows what behaves differently on Prisma v3.0. Everything else you send today keeps working. Before you switch, send a few representative recordings (with numbers, names and mixed-language speech) through both models using the same format, and compare the transcripts. Add keyterms or topic only after the plain result looks right, and compare again.

What it does not do

These are limits of the model itself. They apply on every API (REST, Realtime and Batch) unless noted.
  • Word-level timestamps (the time each word was spoken).
  • Speaker diarization by the model (labelling who said what) on REST and Realtime. Batch jobs separate speakers in their own pipeline step; see Batch transcription. Note that speaker_names is not diarization: it only helps the model spell names correctly.
  • Translation into another language.
  • Multi-channel audio on REST and Realtime. If your recording has several channels, mix it down to a single (mono) channel first. Batch has an is_multi_channel setting for true multi-channel audio.
  • Languages outside the ten listed above, for example as-IN.
Some restrictions depend on how you send the audio:
  • REST accepts clips of up to 30 seconds. Use the Batch Jobs API for longer recordings.
  • Realtime streaming does not support topic, previous_text or speaker_names (topic and speaker_names work on REST and Batch; previous_text works on REST only), and does not offer token-by-token streaming. Use keyterms (x-keyterms) to give hints when streaming.

Limits

These limits belong to the model’s inputs. They apply to REST and Realtime. Batch has a few stricter ones, such as a 30-character minimum for topic; see Batch transcription. Audio length, accepted formats, streaming session length, request rates and the number of live sessions are on Limits. The limits are the same for Prisma v3.0 and Prisma v2.5, including on Batch.

Next steps