> For clean Markdown of any page, append `.md` to the page URL.
> For a complete documentation index, see https://docs.sarvam.ai/llms.txt.
> For full documentation content in one file, see https://docs.sarvam.ai/llms-full.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.sarvam.ai/_mcp/server.

# How to control translation tone

> Use the register parameter to control formality and style in Sarvam Dubbing translations: formal, common-indic, classic-colloquial, modern-colloquial, academic, or auto.

`register` controls the formality and style of the translation. It shapes how the translation system prompt is built, so the same source line can come back sounding like a news anchor, a college lecturer, or a YouTube creator.

| Parameter  | Type   | Default                | Notes                       |
| ---------- | ------ | ---------------------- | --------------------------- |
| `register` | string | auto-detected by genre | One of the six values below |

`register` takes priority over the legacy `genre` field. If you have an older integration still sending `genre`, move to `register`, which is the supported way to control translation style and gives you finer-grained control.

## Available registers

The "Use for" column is suggested guidance from us, not API-defined behaviour. The API validates the enum value only, and does not restrict a register to any content type.

| Value                | Character                                                 | Use for                                                          |
| -------------------- | --------------------------------------------------------- | ---------------------------------------------------------------- |
| `formal`             | Polished, respectful, no slang                            | Corporate comms, policy videos, institutional announcements      |
| `common-indic`       | Neutral register with widely-understood shared vocabulary | Pan-India content aimed at the broadest possible audience        |
| `classic-colloquial` | Traditional, literary everyday speech                     | Devotional content, period drama, folk narration                 |
| `modern-colloquial`  | Contemporary, casual, urban                               | Creator content, Reels and Shorts, marketing, entertainment      |
| `academic`           | Precise, terminology-preserving                           | Lectures, tutorials, technical training, EdTech                  |
| `auto`               | Let the service pick                                      | You don't know the content mix, or you're batching mixed sources |

Register matches **tone**, not topic. A physics lecture aimed at a general YouTube audience may do better on `modern-colloquial` than on `academic`, so pick the register that matches how you want it to *sound*, not the subject matter.

## Example

#### cURL

```bash
BASE="<DUBBING_API_BASE_URL>"

RESP=$(curl -sS -X POST "$BASE/jobs" \
  -H "api-subscription-key: <YOUR_SARVAM_API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{
    "job_name": "diwali-campaign-cut",
    "src_lang": "en-IN",
    "target_langs": ["hi-IN", "ta-IN"],
    "num_speakers": 1,
    "voice_cloning": true,
    "register": "modern-colloquial",
    "export_options": ["video", "srt"],
    "disable_watermark": true
  }')

JOB_ID=$(echo "$RESP" | jq -r '.data.job_id')
UPLOAD_URL=$(echo "$RESP" | jq -r '.data.upload_url')

# Upload the media to the signed URL (required)
curl -sS -X PUT "$UPLOAD_URL" \
  -H "Content-Type: video/mp4" \
  -H "x-ms-blob-type: BlockBlob" \
  --data-binary @video.mp4

# Start the pipeline
curl -sS -X POST "$BASE/jobs/$JOB_ID/start" \
  -H "api-subscription-key: <YOUR_SARVAM_API_KEY>"
```

#### Python

```python
BASE = "<DUBBING_API_BASE_URL>"

resp = requests.post(
    f"{BASE}/jobs",
    headers={"api-subscription-key": "YOUR_SARVAM_API_KEY", "Content-Type": "application/json"},
    json={
        "job_name": "diwali-campaign-cut",
        "src_lang": "en-IN",
        "target_langs": ["hi-IN", "ta-IN"],
        "num_speakers": 1,
        "voice_cloning": True,
        "register": "modern-colloquial",
        "export_options": ["video", "srt"],
        "disable_watermark": True,
    },
).json()

job_id = resp["data"]["job_id"]

# Upload the media to the signed URL (required)
with open("video.mp4", "rb") as f:
    requests.put(
        resp["data"]["upload_url"],
        headers={"Content-Type": "video/mp4", "x-ms-blob-type": "BlockBlob"},
        data=f,
    ).raise_for_status()

# Start the pipeline
requests.post(
    f"{BASE}/jobs/{job_id}/start",
    headers={"api-subscription-key": "YOUR_SARVAM_API_KEY"},
).raise_for_status()
```

#### JavaScript

```javascript
import fs from "node:fs";

const BASE = "<DUBBING_API_BASE_URL>";

const created = await fetch(`${BASE}/jobs`, {
  method: "POST",
  headers: { "api-subscription-key": "YOUR_SARVAM_API_KEY", "Content-Type": "application/json" },
  body: JSON.stringify({
    job_name: "diwali-campaign-cut",
    src_lang: "en-IN",
    target_langs: ["hi-IN", "ta-IN"],
    num_speakers: 1,
    voice_cloning: true,
    register: "modern-colloquial",
    export_options: ["video", "srt"],
    disable_watermark: true,
  }),
}).then((r) => r.json());

const jobId = created.data.job_id;

// Upload the media to the signed URL (required)
await fetch(created.data.upload_url, {
  method: "PUT",
  headers: { "Content-Type": "video/mp4", "x-ms-blob-type": "BlockBlob" },
  body: fs.readFileSync("video.mp4"),
});

// Start the pipeline
await fetch(`${BASE}/jobs/${jobId}/start`, {
  method: "POST",
  headers: { "api-subscription-key": "YOUR_SARVAM_API_KEY" },
});
```

## Picking a register for a content library

If you're dubbing a catalogue rather than a one-off, set the register per content type rather than per file:

These pairings are suggested guidance from us, not API-defined behaviour. Treat them as a starting point, and adjust to how you want the output to sound.

| Content type                        | Register             |
| ----------------------------------- | -------------------- |
| Recorded classroom lectures         | `academic`           |
| Product marketing and launch videos | `modern-colloquial`  |
| Compliance and HR training          | `formal`             |
| Devotional and mythological series  | `classic-colloquial` |
| Public-service announcements        | `common-indic`       |
| Mixed user-generated uploads        | `auto`               |

Register is fixed at creation time. To compare two registers on the same source, create two jobs, and the source file has to be uploaded separately to each.

## Related

* [Dubbing Overview](/api/api-guides-tutorials/dubbing/overview)
* [Choose Export Formats](/api/api-guides-tutorials/dubbing/how-to/choose-export-formats)