Python text to speech: save audio as a WAV file

Rene, Kabir Goel 
Python text to speech: save audio as a WAV file

To convert text to speech in Python, send a transcript to a speech model and save the returned audio. This guide uses Cartesia’s Python SDK to generate a WAV file with Sonic.

You’ll need Python 3.9 or later, an internet connection, and a Cartesia account with API access. The example below targets SDK version 4.2.0.1 It calls a hosted API: your text leaves your machine. If you need offline synthesis, use a local speech engine instead.

Install the Python SDK

Create a virtual environment in your project directory:

python -m venv .venv

On macOS or Linux, activate it with:

source .venv/bin/activate

On Windows PowerShell, use:

.venv\Scripts\Activate.ps1

Then install the version used in this guide:

python -m pip install "cartesia==4.2.0"

If your system uses python3 rather than python, use that command to create the environment. Pinning the SDK keeps the example’s method names stable. When you upgrade, check the SDK release notes for changes.

Set your API key

Create an API key in the Cartesia Playground. Give it the permissions needed for text-to-speech generation. Set the key in the terminal where you’ll run Python.

On macOS or Linux:

export CARTESIA_API_KEY="your-api-key"

On Windows PowerShell:

$env:CARTESIA_API_KEY = "your-api-key"

Replace your-api-key with your own key. Treat it like a password: don’t commit it to Git, paste it into a public notebook, or put it in browser code. For a deployed application, store it in your server’s secret manager. If a key is exposed, revoke it and create a new one.

Generate and save a WAV file

Save this as speak.py:

import os
from pathlib import Path

from cartesia import Cartesia

api_key = os.environ.get("CARTESIA_API_KEY")
if not api_key:
    raise SystemExit("Set CARTESIA_API_KEY before running this script.")

output_path = Path("hello.wav")

with Cartesia(api_key=api_key) as client:
    response = client.tts.generate(
        model_id="sonic-latest",
        transcript="Hello from Python. Your first audio file is ready.",
        voice="e07c00bc-4134-4eae-9ea4-1a55fb45746b",
        output_format={
            "container": "wav",
            "encoding": "pcm_f32le",
            "sample_rate": 44100,
        },
    )
    response.write_to_file(output_path)

print(f"Saved audio to {output_path.resolve()}")

Run it from the same terminal:

python speak.py

After a successful request, open hello.wav in an audio player that supports floating-point PCM WAV. The script prints its full path, so you don’t have to guess which directory Python used. It saves audio; it does not play it automatically. Running it again overwrites hello.wav and makes another API request.

The request follows the SDK’s published usage example.1 The voice ID is the example voice from that reference. You can replace it with a voice ID available to your account.

Choose the voice, model, and audio format

The transcript is the text Sonic should speak. Start with one sentence before sending a long document. Use text you’re comfortable sending to the API, and avoid logging private transcripts in application logs.

The voice selects the speaker. Try a sentence in the voice generator, then use your chosen voice’s ID in the request. A display name is not a voice ID. If you’re using a cloned voice, make sure you have permission to use the speaker’s voice.

The example uses sonic-latest, as the SDK reference does. A model alias can change independently of your installed SDK. For repeatable production tests, choose a specific supported model ID from the model documentation and record it alongside the voice ID and test text.

The output format describes the audio file:

FieldValue in this exampleMeaning
containerwavWraps the audio in a WAV file with a header.
encodingpcm_f32leStores samples as 32-bit little-endian floating-point PCM.
sample_rate44100Uses 44,100 audio samples per second.

Raw PCM has no WAV header. Renaming a raw PCM file to .wav does not turn it into a WAV file. If you’re sending audio to a phone system or another service, check its required container, encoding, and sample rate before generating speech.

Fix common errors

SymptomWhat to check
ModuleNotFoundError: No module named 'cartesia'Activate the environment where you installed the SDK. Run python -m pip show cartesia with the same Python interpreter that runs the script.
Set CARTESIA_API_KEY before running this script.Set the environment variable in the current terminal, then rerun the script. An editor or notebook may use a different environment.
Authentication or permission errorCheck that the key is active, belongs to the intended account, and has the required permissions. Never paste the key into an error report.
An error about the model, voice, or output formatCheck the current API reference and confirm the voice is available to your account. Copy IDs exactly.
Rate-limit errorCheck your account limits and reduce request concurrency. Avoid an immediate retry loop.
AttributeError involving generateCheck the installed SDK version. Older examples may use client.tts.bytes; this guide uses client.tts.generate in version 4.2.0.
The file exists but won’t playConfirm the request uses container="wav" and that your player supports floating-point PCM. Check that the file is nonempty.

When you ask for help, include your Python and SDK versions, the status code, and any request ID returned with the error. Remove API keys and private text first.

When to use streaming instead

Saving a WAV file is useful for narration, voiceovers, and checking an integration. A conversational application may need to play audio before a full response is ready, or accept text as an LLM generates it.

For that case, install WebSocket support in the same environment:

python -m pip install "cartesia[websockets]==4.2.0"

Then start with the SDK’s streaming-input WebSocket example.1 You’ll also need audio playback, buffering, and interruption handling. Writing arriving chunks to disk alone does not make the application speak in real time.

Once the short example works, replace the transcript with a sentence from your application. Listen for names, numbers, and abbreviations before generating a larger batch. Check API pricing and keep the model and voice IDs with your test results.

Footnotes

  1. Cartesia, Python SDK 4.2.0 on PyPI and SDK usage reference, checked September 13, 2026. ↩ ↩2 ↩3

FAQs

How do I convert text to speech in Python?

Install the Cartesia Python SDK, set CARTESIA_API_KEY in your environment, and call client.tts.generate with a transcript, model, voice, and output format. Call response.write_to_file to save the returned audio. This guide uses SDK version 4.2.0.

Does this Python text-to-speech example work offline?

No. The Cartesia SDK sends the transcript to Cartesia's API and requires an internet connection and API access. You can play the saved WAV file offline. If text must stay on your machine, choose a local speech engine instead.

Is the Cartesia Python SDK free to use?

Installing the SDK does not grant unlimited speech generation. API usage is subject to your account's plan and limits. Check the current pricing before running a batch of requests.

Can I stream speech instead of saving a file?

Yes. The SDK supports streaming responses and WebSocket input. Saving a completed WAV file is a simpler first test, but it is not a real-time playback implementation. For incremental text input, install the cartesia[websockets] extra and see the SDK's WebSocket example.