# Transcription

> The source language and the speech recognition engine.

```json
"transcription": { "@type": "Speechmatics", "language": "en" }
```

`transcription` says what language is spoken in the media and which engine recognises it.
`language` is required; `@type` may be left out to use the first engine that supports the
language ([Languages](/vod-express/configuration/languages)). Speaker diarization is always on, so a dub can give each
speaker their own voice.

## Engines

**Speechmatics**

The default for most languages; broad language coverage.

```json
{
  "@type": "Speechmatics",
  "language": "en",
  "filterProfanity": "keep",
  "filterDisfluency": true,
  "postprocessingDictionary": { "SyncWords": ["syncwords", "synchwords"] }
}
```

| Field | Default | |
|---|---|---|
| `filterDisfluency` | `true` | Drop "uh", "um" and similar. |
| `filterProfanity` | `"remove"` | `"keep"` to keep profanity in the transcript. |
| `punctuationSensitivity` | language default | 0–1; higher punctuates more. |
| `volumeThreshold` | none | 0–100; ignore audio quieter than this. |
| `dictionary` | your account's default | A dictionary of your account, by id or name; see [Your account's dictionaries](#your-accounts-dictionaries). |
| `postprocessingDictionary` | your account's default | Word replacements, see below. |
| `outputLabel` | the language name | Label written where the output has one. |

**Soniox**

Strong accuracy, and the engine for **mixed-language media** (`language: "mul"`).

```json
{ "@type": "Soniox", "language": "en", "extraPrompt": "Bass fishing show; terms: jig, crankbait, spinnerbait." }
```

| Field | Default | |
|---|---|---|
| `model` | `"stt-rt-v5"` | Soniox model. |
| `extraPrompt` | none | Context that guides recognition: topic, names, terminology. |
| `filterDisfluency` | `true` | |
| `dictionary` | your account's default | |
| `postprocessingDictionary` | your account's default | |

**Sarvam**

Specialised in Indian languages.

```json
{ "@type": "Sarvam", "language": "hi", "prompt": "Cricket commentary" }
```

| Field | Default | |
|---|---|---|
| `model` | `"saaras:v4"` | |
| `prompt` | none | Terminology hint applied to the final transcript. |
| `silenceDuration` | `"0.3"` | Pause (seconds) that ends an utterance. Shorter gives earlier, smaller chunks. |

## Mixed-language media

Set `language` to `mul` and list the languages to expect:

```json
{ "@type": "Soniox", "language": "mul", "expectedLanguages": ["en", "es"] }
```

## Fixing recurring words

`postprocessingDictionary` replaces words in the transcript before translation, which fixes a
brand or a name everywhere it appears, in every language. The key is the word you want; the value
lists what the engine writes instead, as literals or Java regular expressions. Matching ignores
case and applies to single words only, not phrases. An empty key deletes the words it lists.

```json
"postprocessingDictionary": {
  "SyncWords": ["syncwords", "synchwords"],
  "Newsmax": ["newsmacks", "newsmaxx?"],
  "": ["uh+", "um"]
}
```

## Your account's dictionaries

The dictionaries and glossaries you keep in SyncWords Live work here too: create, list and edit
them with the [Live API](/live/api-reference) (`/v2/dictionaries`, `/v2/postprocessing-dictionaries`,
`/v2/glossaries`) with the same API key, or in SyncWords Live, and name them in a project's config.

| Field | Engines | Takes |
|---|---|---|
| `dictionary` | Speechmatics, Soniox | A dictionary's id or name: words the engine should recognise, such as names and terminology. |
| `postprocessingDictionary` | Speechmatics, Soniox | A postprocessing dictionary's id or name, or the inline replacements above. |
| `glossary` of a translation's `engine` | every engine | A glossary's id, or inline terms ([Glossaries](/vod-express/configuration/translation#glossaries)). |

```json
"transcription": {
  "@type": "Speechmatics",
  "language": "en",
  "dictionary": "Fishing terms",
  "postprocessingDictionary": 42
}
```

The record must be your account's and in the transcription language (a glossary: from the
transcription language into the translation's), or the config is refused. A name is stored as the
record's id, so renaming it in Live does not lose it.

**Defaults.** A dictionary or postprocessing dictionary marked as your account's default for a
language applies to every project transcribing that language that leaves the field out. Send
`null` to apply none. Glossaries have no defaults.

**When the content is read.** A project reads the records each time it starts, so an edit in Live
reaches a running project when it is next started or its config changes, not at once. If a record
is deleted, or its language changed, the project processes without it, and the project's
`meta.messages` says so (`dictionary_not_applied`).

## Every option

The tables above are the options you are most likely to set. All of them, with their limits and
defaults: [Config reference: `transcription`](/vod-express/configuration/reference#transcription).
