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
Sendmodel=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).
Languages
Use these codes inlanguage_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.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. Thetranscript 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-INdoesn’t guarantee a Hindi transcript. If the speaker uses Tamil, you get Tamil, and the tag saysta-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-autowhen you don’t know what the caller will speak. - Always check
detected_language_codeto see which language was transcribed.
Auto-detect the language
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, thetranscript 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-INand the speaker answers in English, the tag isen-IN. If you sendhi-INand the text comes back in Tamil script, the tag ista-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=transliteratethere 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-INormr-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.
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.
transcript message then carries detected_language_code.
Related language errors
A missinglanguage_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 withformat (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.
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) andlang_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 asindic-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_textandspeaker_nameswork as usual. Write them in Latin letters to match the output.
The same clip in all four styles
Output style when streaming
Streaming supports all four styles. The model writes the style you ask for, exactly as it does on REST, so atranscribe session returns the same text as REST. There is no separate number-formatting step afterwards.
itn_native_numeralsandx-itn-native-numeralshave no effect onprisma-v3.0, on REST or when streaming. The model writes numbers itself.x-format: transliterateworks as described in Romanised output:lang_codeis optional (it defaults toindic-auto), a list of languages is ignored, anddetected_language_codeis not sent. You can switch into and out of it withupdate_settings. When you leave it, the session’s own language applies again.output.literalis not returned forprisma-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.
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
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_namesis 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_channelsetting for true multi-channel audio. - Languages outside the ten listed above, for example
as-IN.
- REST accepts clips of up to 30 seconds. Use the Batch Jobs API for longer recordings.
- Realtime streaming does not support
topic,previous_textorspeaker_names(topicandspeaker_nameswork on REST and Batch;previous_textworks on REST only), and does not offer token-by-token streaming. Usekeyterms(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 fortopic; 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
- Models: all Speech-to-Text models and how to choose between them.
- Speech-to-Text overview: what works on REST, Realtime and Batch.
- Reference: REST, Realtime and Batch.
- Error Reference and Limits.