> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ollama.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Speech

> Turn text into spoken audio with text-to-speech models.

Speech models read text aloud. Ollama streams the audio as it is generated, so playback can start before the whole text has been spoken.

## Setup

Start [Ollama](/quickstart.md) v0.40.8 or later, then download [Phonon](https://ollama.com/library/phonon):

```shell setup.sh theme={"system"}
ollama pull phonon
```

Phonon speaks English with four voices: `Freya` (the default), `Harper`, `Sterling`, and `Toby`. Voice names are case-sensitive.

## Speak from the terminal

`ollama run` plays the audio through your computer's speakers:

```shell examples.sh theme={"system"}
# Speak some text
ollama run phonon "Hello from Ollama."

# Choose a voice
ollama run phonon --voice Toby "Hi, this is Toby."

# Speak text from another program
echo "Text from another program works too." | ollama run phonon

# Speak a chat model's answer
ollama run gemma4 --hidethinking "Tell me a fun fact about owls in two sentences." | ollama run phonon
```

Piped text is spoken as it arrives, so a chat model's answer starts playing after its first sentence or two.

Run `ollama run phonon` without any text to type lines at a `>>>` prompt. Each line is spoken when you press Enter. Press Ctrl+C to stop speaking, and type `/bye` or press Ctrl+D to exit.

Audio plays with your system's built-in player: `afplay` on macOS, the first of `paplay`, `pw-play`, `aplay`, or `ffplay` that is installed on Linux, and PowerShell on Windows.

### Save audio to a file

When the output is redirected, `ollama run` writes a WAV file instead of playing it. This also works on servers without speakers:

```shell theme={"system"}
ollama run phonon "Save this to a file." > speech.wav
```

To hear a remote server, run `ollama` on your own computer and point it at the server. The audio plays where the command runs:

```shell theme={"system"}
OLLAMA_HOST=my-server:11434 ollama run phonon "Hello from the server."
```

## Generate speech with the API

Use the OpenAI-compatible `/v1/audio/speech` endpoint:

**cURL**

```shell theme={"system"}
curl http://localhost:11434/v1/audio/speech \
  -H "Content-Type: application/json" \
  -d '{
    "model": "phonon",
    "input": "Hello from Ollama.",
    "voice": "Freya"
  }' --output speech.wav
```

**Python**

```python theme={"system"}
from openai import OpenAI

client = OpenAI(base_url="http://localhost:11434/v1", api_key="ollama")

with client.audio.speech.with_streaming_response.create(
    model="phonon",
    voice="Freya",
    input="Hello from Ollama.",
    response_format="wav",
) as response:
    response.stream_to_file("speech.wav")
```

**JavaScript**

```javascript theme={"system"}
import fs from 'node:fs'
import OpenAI from 'openai'

const openai = new OpenAI({ baseURL: 'http://localhost:11434/v1', apiKey: 'ollama' })

const response = await openai.audio.speech.create({
  model: 'phonon',
  voice: 'Freya',
  input: 'Hello from Ollama.',
  response_format: 'wav',
})
fs.writeFileSync('speech.wav', Buffer.from(await response.arrayBuffer()))
```

The response streams while audio is generated, so you can start playing it right away:

```shell theme={"system"}
curl -sN http://localhost:11434/v1/audio/speech \
  -H "Content-Type: application/json" \
  -d '{"model": "phonon", "input": "Playback starts while the rest is still being generated."}' \
  | ffplay -nodisp -autoexit -loglevel error -
```

### Audio formats

| `response_format` | Output |
| - | - |
| `wav` (default) | A WAV file: 16-bit, mono, 24 kHz. The header is written before the length is known, so its size fields hold the maximum value. |
| `pcm` | Raw 16-bit little-endian samples, mono, 24 kHz, with no header. |

### Limits

* `input` can be up to 4,096 characters per request. `ollama run` splits longer text at paragraph and sentence breaks for you.
* Text is spoken as written. Numbers, dates, and abbreviations are not expanded into words, so write them out (`twenty-one`, not `21`) for predictable results. Emoji, bullet characters, and `*` emphasis markers are skipped.
* Options the model doesn't support, such as other formats, speeds, or `instructions`, return a `400` error instead of being ignored. An unknown voice returns a `400` error that lists the available voices.
* Speech models only generate speech: chat, completion, and embedding requests to them return a `400` error.

`ollama show phonon` and `/api/show` list the model's capabilities as `speech`. See [OpenAI compatibility](/api/openai-compatibility.md) for every supported field.
