> 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 choose audio formats

> Input and output audio formats for the Sarvam AI Voice Cloning API. Supported reference codecs, output codecs, sample rates, and file-size guidance.

## Input formats

The `ref_audio` file accepts the following codecs:

| Codec      | Notes                                                                                |
| ---------- | ------------------------------------------------------------------------------------ |
| `WAV`      | Recommended. Uncompressed; fastest to decode and avoids lossy compression artifacts. |
| `MP3`      | Widely available; ensure bitrate ≥ 128 kbps for cleaner clones.                      |
| `FLAC`     | Lossless compression; equivalent quality to WAV with smaller file size.              |
| `OPUS`     | Modern codec with good speech quality at low bitrates.                               |
| `AAC`      | Common in mobile recordings.                                                         |
| `LINEAR16` | Raw 16-bit PCM.                                                                      |
| `MULAW`    | 8-bit μ-law (telephony). Quality is limited by the codec.                            |
| `ALAW`     | 8-bit A-law (telephony). Quality is limited by the codec.                            |

For best cloning quality, use WAV or FLAC. Telephony codecs (MULAW, ALAW) work but cap the achievable fidelity at the source.

## Output formats

Specify the output codec via `output_audio_codec`. The default is `wav`.

| Codec value | Description                                                        |
| ----------- | ------------------------------------------------------------------ |
| `wav`       | Uncompressed WAV. Default. Best quality for downstream processing. |
| `mp3`       | MP3-encoded audio. Smaller file size; suitable for web playback.   |
| `flac`      | Lossless compression.                                              |
| `opus`      | Low-bitrate codec ideal for streaming.                             |
| `aac`       | Common in mobile and broadcast.                                    |
| `linear16`  | Raw 16-bit PCM.                                                    |
| `mulaw`     | 8-bit μ-law. Use for IVR/telephony pipelines.                      |
| `alaw`      | 8-bit A-law. Use for IVR/telephony pipelines.                      |

**OPUS restricts the sample rate.** When `output_audio_codec` is `opus` and `speech_sample_rate` is explicitly set, it must be one of 8000, 16000, 24000, or 48000 Hz. Other rates fail with `400 Bad Request`. When `speech_sample_rate` is omitted, opus output is returned at the native 24000 Hz.

## Sample rate

Use `speech_sample_rate` to set the output sample rate in Hz:

`8000`, `16000`, `22050`, `24000`, `32000`, `44100`, `48000`

If omitted, the API returns audio at the model's native rate (24,000 Hz). Set the sample rate to match your downstream pipeline:

| Pipeline            | Recommended sample rate |
| ------------------- | ----------------------- |
| Telephony / IVR     | 8000                    |
| Voice agents / VoIP | 16000                   |
| Web playback        | 24000 (default)         |
| Broadcast / studio  | 44100 or 48000          |

Sample rates above 24000 Hz (32000, 44100, 48000) are supported for broadcast-quality output, matching the Bulbul v3 REST API.

## File size guidance

Higher sample rates and uncompressed codecs produce larger output files. As a rough guide for a 10-second clip:

| Codec            | Sample rate | Approximate size |
| ---------------- | ----------- | ---------------- |
| `wav`            | 24000       | \~470 KB         |
| `wav`            | 48000       | \~940 KB         |
| `mp3` (128 kbps) | 24000       | \~160 KB         |
| `opus` (32 kbps) | 24000       | \~40 KB          |
| `mulaw`          | 8000        | \~80 KB          |

For high-volume API usage, choose a compressed codec (mp3, opus, aac) unless your downstream pipeline specifically requires uncompressed audio.

## Decoding the response

The `audio` field is a base64-encoded string of the raw bytes for the codec you requested. Decode it and write it to a file with the appropriate extension:

```bash
curl -s -X POST "https://api.sarvam.ai/voices/clone" \
  -H "api-subscription-key: $SARVAM_API_KEY" \
  -F "text=Hello world" \
  -F "language_code=en-IN" \
  -F "ref_audio=@reference.wav" \
  -F "output_audio_codec=wav" \
  -o response.json

# Decode audio into a file; use the extension matching your output_audio_codec
python3 -c "import base64, json; open('output.wav', 'wb').write(base64.b64decode(json.load(open('response.json'))['audio']))"
```

```javascript
import fs from "fs";

const form = new FormData();
form.append("text", "Hello world");
form.append("language_code", "en-IN");
form.append("output_audio_codec", "wav");
form.append("ref_audio", new Blob([fs.readFileSync("reference.wav")]), "reference.wav");

const response = await fetch("https://api.sarvam.ai/voices/clone", {
  method: "POST",
  headers: { "api-subscription-key": process.env.SARVAM_API_KEY },
  body: form,
});
const result = await response.json();

if (!response.ok) {
  console.error(`Voice cloning failed (${response.status}):`, result.error?.message);
  process.exit(1);
}

const audioBytes = Buffer.from(result.audio, "base64");
fs.writeFileSync("output.wav", audioBytes);
```

The API is multipart/form-data. From Node 18+, `FormData` and `Blob` are available globally, so no extra library is needed to build the request body.

## Next steps

#### [Prepare Reference Audio](/api/api-guides-tutorials/voice-cloning/how-to/prepare-reference-audio)

Reference clip guidelines and technical specs.