跳到主要内容

语音合成与转写

两者都遵循 OpenAI 的 Audio API,所以 OpenAI SDK 里的 client.audio.speech 和 client.audio.transcriptions 改一下基础地址就能用。下面两个示例都是真实的文件,发布前我们都会实际运行一遍。

语音合成​

# pip install openai
# Text to speech. `voice` is required and its names belong to the model:
# af_heart is one of hexgrad/kokoro-82m's voices.
import os
from openai import OpenAI

client = OpenAI(
base_url=os.getenv("OCEANTOKEN_BASE_URL", "https://api.oceantoken.ai/v1"),
api_key=os.environ["OCEANTOKEN_API_KEY"],
)

with client.audio.speech.with_streaming_response.create(
model="hexgrad/kokoro-82m",
voice="af_heart",
input="Welcome aboard. The ferry leaves at nine.",
response_format="mp3",
) as response:
response.stream_to_file("speech.mp3")
print("saved speech.mp3")

POST /v1/audio/speech 直接返回音频。

字段作用
model语音合成模型的 ID。
input要朗读的文字。
voice必填。 模型自己的音色名称,见音色。
response_formatmp3 最稳妥,下表中除特别注明的以外都支持。url 返回一个链接而不是音频(见下文)。
speed、instructions语速(0.25 到 4)和语气说明(比如"平静、慢一点"),适用于支持它们的模型。

语音合成按 input 的字符数计费(计费方式)。请发送 Idempotency-Key,这样超时后的重试不会把同一段音频生成(并扣费)两次(错误)。

音色​

音色名称由模型决定。不带 voice 的请求会以 400 被拒绝,模型不认识的名称会导致请求失败。第二列的音色已在线上服务实测可用(2026-09-26):

模型实测可用的音色发布方列出的其他音色
hexgrad/kokoro-82maf_heartaf_bella、am_michael、bf_emma、bm_george
deepgram/aura-2aura-2-thalia-enaura-2-andromeda-en、aura-2-apollo-en、aura-2-asteria-en、aura-2-helena-en、aura-2-orion-en、aura-2-zeus-en
canopylabs/orpheus-3b-0.1-fttaraleah、jess、leo、dan、mia、zac、zoe
sesame/csm-1bconversational_aconversational_b
x-ai/grok-voice-tts-1.0AraRex、Sal、Eve、Leo
microsoft/mai-voice-2en-US-Jasper:MAI-Voice-1
fish-audio/s1、fish-audio/s2-pro、fish-audio/s2.1-pro、fish-audio/s2.1-pro-free:freealloy
google/gemini-3.1-flash-tts-previewKore(不要发送 response_format;它返回 WAV)Puck、Charon、Fenrir、Aoede、Leda、Orus、Zephyr

其他语音合成模型,请使用其发布方文档中的音色名称。

设置 "response_format": "url" 时,返回的是带有 MP3 链接的 JSON,而不是音频字节,方便直接交给浏览器或下一个请求使用:

{"url": "https://...", "content_type": "audio/mpeg", "bytes": 48213, "usage": {"input_characters": 41}}

请在 24 小时内下载。这段音频也会出现在控制台的生成记录里。

语音转写​

# pip install openai
# Audio file to text. This transcribes speech.mp3, the file the text-to-speech
# sample writes; use any mp3, m4a, wav or webm of your own.
import os
from openai import OpenAI

client = OpenAI(
base_url=os.getenv("OCEANTOKEN_BASE_URL", "https://api.oceantoken.ai/v1"),
api_key=os.environ["OCEANTOKEN_API_KEY"],
)

with open("speech.mp3", "rb") as audio:
transcript = client.audio.transcriptions.create(model="openai/gpt-4o-mini-transcribe", file=audio)
print(transcript.text)

POST /v1/audio/transcriptions 接收 multipart 上传:

字段作用
file音频文件:mp3、m4a、wav、webm 等常见格式。
model语音转写模型的 ID。
language音频的语言,用 ISO-639-1 代码,比如 en 或 zh。可选;知道语言时填上能提高准确率。
prompt可能出现的人名、专有名词的写法。可选。
response_formatjson(默认)返回 {"text": "..."};text 返回纯文本;verbose_json 额外返回带时间戳的分段;srt 和 vtt 返回字幕。各模型支持的格式不同。

用 curl 发送:

curl https://api.oceantoken.ai/v1/audio/transcriptions \
-H "Authorization: Bearer $OCEANTOKEN_API_KEY" \
-F model="openai/gpt-4o-mini-transcribe" \
-F file=@meeting.mp3
  • 请求最大 10 MB(限制)。更长的录音请切分或压缩:64 kbit/s 的 MP3,10 MB 大约能装 20 分钟。
  • 语音转写按音频分钟数计费(计费方式)。
  • 文件必须上传;用 URL 代替文件不会被下载。

下一步​

  • 视频:给视频配上旁白。
  • 所有语音合成和语音转写模型的价格见 oceantoken.ai。