语音模型朗读文本。Ollama 在生成音频时对其进行流式传输,因此可以在整段文本读完之前开始播放。

设置

启动 Ollama v0.40.9 或更高版本,然后下载 Phonon:

setup.sh
ollama pull phonon

Phonon 使用 Gradium 的 31M 英语检查点,并附带 Gradium 的英语声音,例如 Zoey、Easton 和 Freya。如果没有指定声音,它将使用检查点自带的声音 default。ollama show phonon 会列出所有可用的声音。声音名称不区分大小写,且是否包含重音符号均可。

从终端说话

ollama run 通过计算机扬声器播放音频:

examples.sh
# Speak some text
ollama run phonon "Hello from Ollama."

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

# 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

管道传入的文本会在到达时立即被朗读,因此聊天模型的回答在输出第一两句后就开始播放。

运行不带任何文本的 ollama run phonon,可在 >>> 提示符下输入行。每按一次 Enter 键,该行就会被朗读。按 Ctrl+C 停止朗读,输入 /bye 或按 Ctrl+D 退出。

音频使用系统内置播放器播放:macOS 上使用 afplay,Linux 上使用已安装的第一个可用工具(paplay、pw-play、aplay 或 ffplay),Windows 上使用 PowerShell。

将音频保存到文件

当输出被重定向时,ollama run 会写入 WAV 文件而不是播放它。这也适用于没有扬声器的服务器:

ollama run phonon "Save this to a file." > speech.wav

若要收听远程服务器的音频,请在自己的计算机上运行 ollama 并将其指向服务器。音频将在命令运行的位置播放:

OLLAMA_HOST=my-server:11434 ollama run phonon "Hello from the server."

使用 API 生成语音

使用兼容 OpenAI 的 /v1/audio/speech 端点:

cURL

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

Python

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="default",
    input="Hello from Ollama.",
    response_format="wav",
) as response:
    response.stream_to_file("speech.wav")

JavaScript

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: 'default',
  input: 'Hello from Ollama.',
  response_format: 'wav',
})
fs.writeFileSync('speech.wav', Buffer.from(await response.arrayBuffer()))

响应在生成音频的同时进行流式传输,因此您可以立即开始播放:

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 -

音频格式

response_format输出
wav(默认)WAV 文件:16-bit,单声道,24 kHz。头部在长度已知之前写入,因此其大小字段保留最大值。
pcm原始 16-bit 小端样本,单声道,24 kHz,无头部。

限制

  • 每次请求的 input 最多可包含 4,096 个字符。ollama run 会自动在段落和句子断点处拆分较长的文本。
  • 价格、数字、符号、电子邮件地址和 URL 在朗读前会被拼读出来,因此 $4.59 会被读作“4 dollars and 59 cents”。时间和数字日期按原样读取,因此请写出完整日期(如 October 23 而非 10/23)以获得自然的朗读效果。Emoji、项目符号字符以及 markdown 标记(如 * 和 #)会被跳过。
  • 模型不支持的选项(如其他格式、速度或 instructions)会返回 400 错误而不是被忽略。未知声音会返回一个列出可用声音的 400 错误。
  • 语音模型仅用于生成语音:向其发送聊天、补全和嵌入请求会返回 400 错误。

ollama show phonon 和 /api/show 将模型的功能列为 speech,以及其语音(在 /api/show 中为 voices)。有关所有支持的字段,请参阅 OpenAI compatibility。