Àkọsílẹ̀ API

Ṣàfikún TTS.ai nínú àwọn ìṣàmúlò-ètò rẹ̀ láti inú REST API wa. Ìṣàmúlò-ètò OpenAI-ọ̀fẹ̀ fun ìjánu-ìjánú rọ́ọ̀nù.

REST API Àwọn Ìṣàmúlò-ètò Àwọn ìṣàfihàn JSON Àwọn Ìṣàmúlò-ètò

Àwọn ìṣàmúlò-ètò

TTS.ai API náà náà gba ìwọlé ìṣàmúlò-ètò fún àwọn àbùdá àwọn ààyè-iṣẹ́ gbogbó: àkọlé-si-ìbàlẹ̀, àkọlé-si-ìbàlẹ̀, ìṣàfarawe-ìbàlẹ̀, ìṣàfihàn àwọn àwòrán, àti àwọn mìíràn. API náà náà ló àwọn ìṣàmúlò-ètò REST ìṣàfarawe-ètò láti mú àwọn ẹ̀yàn ìṣàfihàn/ìjánú ìṣàfihàn JSON.

Bọ́tìnì API

Gba àwọn bọ́tìnì API rẹ̀ láti Àwọn Ààtòjú Àwọn Àwọn Àwọn Àwọn Àwọn Àwọn Àwọn Àwọn. Wa ni Pro ati Enterprise plans.

URL Ìdálẹ̀

https://api.tts.ai/v1/

Àwọn Àmì-ìwé

Àwọn Ìṣàmúlò-ètò Authorization àwọn àmì-ìwé

Àwọn Ìṣàmúlò-ètò

Àwọn ìpele àìfẹ́fẹ́ — kò ní bọ́tìnì kan tí a fẹ́. Àwọn àkọlé àìdálẹ̀ /v1/tts/ iṣẹ́ laisi àwọn ẹ̀yàn, lọ́wọ́lọ́wọ́ si 5,000 àwọn àmì-àṣírí/ọ̀jọ̀ kan nípa IP kan, nípa lòjútó àwọn módè́lì ọ̀fẹ́ wa (piper, vits, melotts, kokoro). Ṣabẹwo fun kaadi iroyin ọfẹ lati gba awọn aami 15,000 ti o dara julọ ati wọle si awọn awoṣe premium.

Fun àwọn ìṣàmúlò-ètò àti àwọn ìpéjúwé ìṣàmúlò-ètò tí o gà jú, ṣàfihàn láti ló tókè Béèrì nínú Authorization àwọn àmì-ìwé.

Àwọn Àmì-ìwé HTTP
Authorization: Bearer sk-tts-your-api-key-here
Fi àwọn bọ́tìnì API rẹ pamọ́. Kò pẹ̀lú àwọn ìṣàmúlò-ètò ààyè-iṣẹ́, àwọn ìpamọ́ àwọn alábòójútó alábòójútó, tàbí àwọn ìṣàmúlò-ètò. Àwọn bọ́tìnì ìṣàfihàn láti inú àtòjọ-ẹ̀yàn rẹ̀.

Àwọn SDK

SDKs Oṣójọ́lẹ̀ ṣé ìmọ̀ràn láti fi TTS.ai pamọ́ sínú ìṣàmúlò-ètò rẹ̀. Wọ́n ní afẹ́fẹ́ àwọn ìṣàmúlò-ètò náà, àti àwọn náà ní a lè gba nípa GitHub.

Python

pip install ttsai
from tts_ai import TTSClient

client = TTSClient(api_key="sk-tts-...")
audio = client.generate(
    text="Hello world!",
    model="kokoro"
)
client.save(audio, "output.wav")
GitHub

JavaScript / Node.js

npm install @ttsainpm/ttsai
const { TTSClient } = require('@ttsainpm/ttsai');

const client = new TTSClient({
  apiKey: 'sk-tts-...'
});
const audio = await client.generate({
  input: 'Hello world!',
  model: 'kokoro'
});
await client.saveToFile(audio, 'output.wav');
GitHub

URL Ìdálẹ̀

URL Ìdálẹ̀: https://api.tts.ai/v1/

Àwọn ààyè-iṣẹ́ ìparí gbogbó ní pàtó nípa URL̀ ìtọ́nà yìí. Fun ààyè-iṣẹ́ ìparí TTS ni:

POST https://api.tts.ai/v1/tts/

Àwọn Ìdálẹ̀ Ìjánu-ìṣàmúlò-ètò

Àwọn ìdájọ́ àwọn ìṣàmúlò-ètò API nípa àwọn ìṣàmúlò-ètò:

Àwọn ààyè-iṣẹ́ Àwọn Ìtàn/minútùù Àwọn ìṣàfarawé Ìgbà pípẹ́ àkọlé pípẹ́ jú
Àìfẹ́ 10 2 Àwọn àmì-ìwé 500
Àwọn Ìṣàmúlò-ètò 30 3 Àwọn àmì-ìwé 1,000,000
Àwọn Àwọn Àwọn 60 5 Àwọn àmì-ìwé 1,000,000
Àwọn Ìṣàfilọ́lẹ̀ 300 20 Àwọn àmì-ìwé 50,000

Àwọn àmì-ìwé-ìwé ìdáràn nínú àwọn ìsàlẹ̀-ilà gbogbo: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset.

Àwọn Ìṣàmúlò-ètò

Àwọn Àṣẹ Àwọn Irinṣẹ́ Àwọn Ìgúnrégé
TTS (Móòdù Fẹ́ẹ̀: Piper, VITS, MeloTTS) Àwọn àyọkà 1,000 fún àwọn àmì-àṣírí 1,000
TTS (Móòdù ìpèwọ̀n: Kokoro, CosyVoice 2, abbl.) Àwọn àyọkà 2,000 fún àwọn àmì-àṣírí 1,000
TTS (Móòdù Premium: Tortoise, Chatterbox, abbl.) Àwọn ìṣàmúlò-ètò fún àwọn àmì-àṣírí 1,000
Àwọn Àmì-ìwé Àwọn àyọkà 2,000 Àwọn àwọn àwòrán
Àwọn Àmì-ìwé Àwọn ìṣàmúlò-ètò fún àwọn àmì-àṣírí 1,000
Àtòjọ-ẹ̀yàn Àwọn Àmì-ìwé Àwọn àyọkà 3,000 Àwọn àwọn àwòrán
Àwọn ìṣàfarawé àwòrán Àwọn àyọkà 2,000 Àwọn àwọn àwòrán
Ìjádè àwọn àmì-ìwé / Ìjádé àwọn àmì-ìwé Àwọn àyọkà 3,000-4,000 Àwọn àwọn àwòrán
Àwọn ìṣàfarawé kọ̀ǹpútà Àwọn àyọkà 5,000 Àwọn àwọn àwòrán
Àkọlé àwòrán Àwọn àyọkà 3,000 Àwọn ìṣàfarawé àwọn ààyè-iṣẹ́
Alábòójútó Bọ́tìnì BPM Àìfẹ́ --
Àwọn Ìjánu-ìṣàmúlò-ètò Àìfẹ́ --

Àkọlé sí Àkọ́kọ́

POST /v1/tts/

Ṣàfikún àyọkà náà sí àwòrán àkọlé. Ṣàfikún fáìlì àwòrán nínú ìrísí-lẹ́tà tí a beere.

Àwọn ìṣàmúlò-ètò

Àwọn ìkúndùǹÀwọn Ìṣàmúlò-ètòTí a fẹ́Àkóónú
model string No ID Móòdù (gẹ́gẹ́ bí kokoro, chatterbox, piper). Tí a bá fi pà, a á yan móòdù tí ó bá jẹ́ ìrànwọ́ àwọn àkànṣe tí a bì - kokoro fún en/ja/zh/ko/fr/de/it/pt/es/hi/ru, piper fún àwọn àkànṣe mìíràn tí a bá jẹ́ ìrànwọ́ (ar/pl/nl/cs/da/fi/el/hu/tr/uk/vi/etc.).
text string Yà Àkọlé tí a fẹ́ láti yipada sí ìṣàfarawé (àwọn àmì-ìwé 100,000 lórí ìtàn)
voice string Yà Àtòjọ Àwọn Àwòrán (lo /v1/voices/ láti ṣàfihàn àwọn àwòrán tí a ní)
format string No Àwọn ìṣàmúlò-ètò àwọn ààtò: mp3 (ò̀tọ́), wav, flac, ogg
speed float No Àwọn ìṣàfarawé ìpele ìṣàfihàn. Àwọn ìpéwọ̀n: 1.0. Àwọn ìpele: 0.5 sí 2.0
language string No Àtòjọ-ètò ìtàn (gẹ́gẹ́ bíi, en, es). Àtòjọ-ètò ìṣàfilọ́lẹ̀ láti inú ìṣàfilọ́lẹ̀.
instructions string No Àwọn àwọn àgbékalẹ̀/àfilọ́lẹ̀ (àtí àwọn àmì-ìwé ≤500). e.g. \
pronunciations object | array No Àwọn ìṣàfarawé àwọn ìṣàfihàn-nípa-ìgbègbè. Àwọn {\
stream boolean No Fún àwọn àgbéwọlé ìjánu-ìjánu-ìjánu-ìjánu-ìjánu-ìjánu-ìjánu-ìjánu-ìjánu-ìjánu-ìjánu-ìjánu-ìjánu-ìjánu-ìjánu-ìjánu-ìjánu-ìjánu-ìjánu-ìjánu-ìjánu-ìjánu-ìjánu-ìjánu-ìjánu-ìjánu-ìjánu-ìjánu-ìjánu-ìjánu-ìjánu-ìjánu-ìjánu-ìjánu-ìjánu-ìjánu

Àwọn ìṣàmúlò-ètò

cURL
curl -X POST https://api.tts.ai/v1/tts/ \
  -H "Authorization: Bearer sk-tts-your-key" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "kokoro",
    "text": "Hello from TTS.ai! This is a test.",
    "voice": "af_bella",
    "format": "mp3"
  }' \
  --output output.mp3

Àwọn àmì-ìwé SSML

Wrap numbers, dates, currency, phone numbers, and acronyms in <say-as interpret-as="..."> tags so the model speaks them naturally instead of guessing.

Àwọn àkọléÀwọn Ìjánu-ìwéTí a Fi Wí
cardinal1234one thousand two hundred thirty-four
ordinal21twenty-first
date1999-12-31December thirty-first, nineteen ninety-nine
time14:30two thirty PM
telephone+1-555-867-5309plus one five five five eight six seven…
currency$1,234.56one thousand two hundred thirty-four dollars and fifty-six cents
spell-outNASAN A S A

Date format defaults to mdy for English and dmy elsewhere; override with format="ymd|mdy|dmy". Currency auto-detects $/€/£/¥; pass currency="USD|EUR|GBP|JPY|CAD|AUD|MXN|INR|CNY" to set it explicitly. Tags work in any language; English is fully supported, other languages use num2words where available.

Àwọn Ààyè-iṣẹ́
{
  "model": "kokoro",
  "voice": "af_bella",
  "text": "Your appointment is on <say-as interpret-as=\"date\">2026-04-26</say-as> at <say-as interpret-as=\"time\">14:30</say-as>. Please call <say-as interpret-as=\"telephone\">+1-555-867-5309</say-as> if you need to reschedule."
}

Àwọn ìsàlẹ̀-ilà

The TTS endpoint queues your request and returns a JSON response with a job UUID. You then poll for the result.

Step 1: Submit request

Response (JSON)
{
  "uuid": "77b71db532874ce98e84a69a2d740d4c",
  "job_id": "f21316bb-aefa-480d-8523-701d1e3184ce",
  "status": "queued",
  "credits_used": 11,
  "credits_remaining": 15000
}

Step 2: Poll for result

GET /v1/speech/results/?uuid=<job_uuid>

Poll this endpoint every 1-2 seconds until status is completed or failed.

Polling response (completed)
{
  "status": "completed",
  "result_url": "https://api.tts.ai/static/downloads/77b71db5.../output.mp3"
}
Polling response (still processing)
{
  "status": "processing"
}

Step 3: Download audio

Fetch the result_url from the completed response to download the audio file.

Full example

Python
import requests, time

API_KEY = "sk-tts-your-key"
BASE = "https://api.tts.ai"

# 1. Submit TTS request
resp = requests.post(f"{BASE}/v1/tts/", json={
    "model": "kokoro",
    "text": "Hello from TTS.ai!",
    "voice": "af_bella"
}, headers={"Authorization": f"Bearer {API_KEY}"})
data = resp.json()
uuid = data["uuid"]

# 2. Poll for result
while True:
    result = requests.get(f"{BASE}/v1/speech/results/",
        params={"uuid": uuid}).json()
    if result["status"] == "completed":
        # 3. Download audio
        audio = requests.get(result["result_url"])
        with open("output.mp3", "wb") as f:
            f.write(audio.content)
        break
    elif result["status"] == "failed":
        raise Exception(result.get("error", "Generation failed"))
    time.sleep(1.5)

Streaming alternative: For supported models (Kokoro, MeloTTS), use POST /v1/tts/stream/ for real-time Server-Sent Events (SSE) streaming — no polling needed.

Àwọn Àmì-ìwé

POST /v1/stt/

Ṣàfihàn àwòrán láti inú àkọsílẹ̀. Ṣàfihàn àwọn ètò 99 láti inú ìṣàfilọ́lẹ̀ àtòjọ-ètò.

Àwọn ìṣàmúlò-ètò (multipart/form-data)

Àwọn ìkúndùǹÀwọn Ìṣàmúlò-ètòTí a fẹ́Àkóónú
file file Yà Fáìlì àwòrán (MP3, WAV, FLAC, OGG, M4A, MP4, WebM). Max 100MB.
model string No Àwọn àwọn àwòrán STT: whisper (pípálẹ̀), faster-whisper, sensevoice
language string No Àtòjọ-ẹ̀yàn. àtòjọ-ẹ̀yàn fún ìṣàfihàn-àtòjọ-ẹ̀yàn (píríǹtì).
timestamps boolean No Ṣàfikún àwọn àkóónú àkóónú. Àtòjọ-ẹ̀yàn: fáìlì
diarize boolean No Mú ìṣàfilọ́lẹ̀ àwọn àkọlé àwòrán ṣiṣẹ́. Àtòjọ-ẹ̀yàn: fáìlì

Àwọn ìsàlẹ̀-ilà

Àwọn ìṣàfihàn JSON
{
  "text": "Hello, this is a transcription test.",
  "language": "en",
  "duration": 3.5,
  "segments": [
    {
      "start": 0.0,
      "end": 1.8,
      "text": "Hello, this is",
      "speaker": "SPEAKER_00"
    },
    {
      "start": 1.8,
      "end": 3.5,
      "text": "a transcription test.",
      "speaker": "SPEAKER_00"
    }
  ]
}

Àwọn Àmì-ìwé

POST /v1/tts/clone/

Ṣẹ̀dà àkọlé nínú àwòrán. Lọ́ọ̀kan àwòrán àti àyọkà ìṣàfilọ́lẹ̀.

Àwọn ìṣàmúlò-ètò (multipart/form-data)

Àwọn ìkúndùǹÀwọn Ìṣàmúlò-ètòTí a fẹ́Àkóónú
reference_audio file Yà Àwọn àwòrán àwòrán ìṣàfihàn (10-30 àwọn ìsàlẹ̀-ilà). Max 20MB.
text string Yà Àkọlé láti sọ nínú ìrànwọ́ ìṣàfarawé.
model string No Àwọn àwọn àwòrán: chatterbox (píríǹtì), cosyvoice2, gpt-sovits
format string No Àwọn ìṣàmúlò-ètò àwọn ààtò: mp3 (pípálẹ̀), wav, flac
language string No Àtòjọ-ètò ìsàlẹ̀-ilà. Ò ní ìyànfàn láti inú àwọn móòdù tí a yàn.

Àwọn ìsàlẹ̀-ilà

Fi fáìlì ìsàlẹ̀-ilà àwọn ìṣàmúlò-ètò àwọn ìṣàmúlò-ètò àwọn ìṣàmúlò-ètò TTS padà.

Àtòjọ-ẹ̀yàn Àwọn Àmì-ìwé

POST /v1/voice-convert/

Ṣàfikún àwòrán láti jẹ́ àwòrán ìṣàmúlò-ètò mìíràn. Ṣàfikún àwòrán ìṣàmúlò-ètò náà láti yan àwòrán ìṣàmúlò-ètò.

Àwọn ìṣàmúlò-ètò (multipart/form-data)

Àwọn ìkúndùǹÀwọn Ìṣàmúlò-ètòTí a fẹ́Àkóónú
file file Yà Fáìlì ìrísí-lẹ́tà (MP3, WAV, FLAC). Max 50MB.
target_voice string Yà Àtòjọ-ẹ̀yàn àwòrán tí a fẹ́ láti yipada sí (lo /v1/voices/ láti ṣàfihàn àwòrán tí a nì)
model string No Móòdù ìyipadà àwòrán: openvoice (píríǹtì), knn-vc
format string No Àwọn ìṣàmúlò-ètò àtòjọ-ẹ̀yàn: wav (píríǹtì), mp3, flac

Àwọn ìṣàmúlò-ètò

cURL
curl -X POST https://api.tts.ai/v1/voice-convert/ \
  -H "Authorization: Bearer sk-tts-your-key" \
  -F "file=@source_audio.mp3" \
  -F "target_voice=af_bella" \
  -F "model=openvoice" \
  -o converted.wav

Àwọn ìsàlẹ̀-ilà

Fi fáìlì àwòrán tí a yipadà padà sí bí àwọn ààtòjọ-ẹ̀yàn àìṣàfilọ́lẹ̀.

Àwọn ìṣàfarawé kọ̀ǹpútà

POST /v1/speech-translate/

Ṣàfihàn àwòrán tí a sọ láti inú ede kan sí mìíràn. Ṣàfihàn àwọn àkọlé-si-àkọlé, àwọn ìtumọ̀, àwọn àkọlé-si-àkọlé nínú awájú kan.

Àwọn ìṣàmúlò-ètò (multipart/form-data)

Àwọn ìkúndùǹÀwọn Ìṣàmúlò-ètòTí a fẹ́Àkóónú
file file Yà Fáìlì ìṣàmúlò-ètò ìsàlẹ̀-ètò nínú ìrísí-lẹ́tà ìṣàfarawé. Max 100MB.
target_language string Yà Àtòjọ-ètò ìsàlẹ̀-ilà (gẹ́gẹ́ bíi es, fr, de, ja)
voice string No Àwọn àwọn àyọkà ìṣàfihàn tí a tì tumọ̀. A yan nípa ìṣàfihàn látì jẹ́ pé a tì yọ̀.
preserve_voice boolean No Àwọn ààyè-iṣẹ́ àwọn ìṣàfarawé àwọn àkọlé

Àwọn ìsàlẹ̀-ilà

Àwọn ìṣàfihàn JSON
{
  "original_text": "Hello, how are you?",
  "translated_text": "Hola, como estas?",
  "source_language": "en",
  "target_language": "es",
  "audio_url": "https://api.tts.ai/v1/results/translate_abc123.mp3",
  "credits_used": 5
}

Àwọn Àkọlé

POST /v1/speech-to-speech/

Ṣàfikún àwọn ìṣàmúlò-ètò ìṣàfihàn, àwọn ìrànwọ́, tàbí ìgbàdálẹ̀ nígbà tí o bá tọju àwọn ìṣàfihàn. Lòòròlò fún ìṣàfihàn àwọn ìṣàfihàn, àwọn ìṣàfihàn, àwọn ìṣàfihàn.

Àwọn ìṣàmúlò-ètò (multipart/form-data)

Àwọn ìkúndùǹÀwọn Ìṣàmúlò-ètòTí a fẹ́Àkóónú
file file Yà Fáìlì àwòrán ìṣàfihàn. Max 50MB.
voice string Yà Àwọn àwọn àmì-ìwé àwọn àmì-ìwé àwọn àwọn àmì-ìwé
model string No Àwọn ìṣàmúlò-ètò: openvoice (píríǹtì), chatterbox
emotion string No Àkọ́lé àwòrán: ọ̀fẹ́, ọ̀fẹ́, ọ̀pọ̀lú, ọ̀pọ̀lú, ọ̀pọ̀lú
speed float No Àwọn ìṣàmúlò-ètò ìṣàfarawé ìrànwọ́. Àwọn ìpéwọ̀n: 1.0. Àwọn ìjánu-ìsún: 0.5 sí 2.0

Àwọn ìsàlẹ̀-ilà

Fi fáìlì àwòrán tí a tì yipadà padà sí bí àwọn ààtòjọ-ìdákọ àwọn ìṣàfarawé.

Àwọn Àtòjọ-ẹ̀yàn Àkọsílẹ̀

Àwọn ààyè-iṣẹ́ ìparí ìṣàfarawé àwòrán fún ìṣàfarawé, ìjánu-ìṣàmúlò-ètò, ìjánu-ìṣàfilọ́lẹ̀, àti àwọn mìíràn mìíràn.

POST /v1/audio/enhance/

Ṣàfihàn àwọn ìṣàmúlò-ètò àwòrán: denoise, ìṣàfihàn ìwọ̀n, àwọn ìṣàfihàn nla.

file fileFáìlì àwòrán tí a fẹ́ mú
denoise booleanṢàfikún àwọn ìṣàmúlò-ètò tí a kò fẹ́ (òrò: òótọ́)
enhance_clarity booleanṢẹ̀dà ìròyìn àkọlé ( ìpéwọ̀n: òótọ́)
super_resolution booleanÌdáràn àwọn ìṣàmúlò-ètò ìṣàfarawé àwọn ìṣàmúlò-ètò
strength integer1-3 (ìwọ̀n, ìsàlẹ̀-ilà, ìpéwọ̀n). Àtòjọ-ẹ̀yàn: 2
POST /v1/audio/separate/

Ṣàfarawe àwọn àwòrán láti inú àwọn àkọlé (àwọ̀n àwòrán) tàbí fi àwọn àwọn àgbèwọlé pamọ́.

file fileFáìlì àwòrán láti ṣí
model stringdemucs (Àwọn ìpéwọ̀n) tabi spleeter
stems integerÀwọn àwọn ìṣàmúlò-ètò: 2, 4, 5, tàbí 6 (òòrò: 2)
format stringÀwọn ìṣàmúlò-ètò ìjánu-ìṣàfilọ́lẹ̀: wav, mp3, flac
POST /v1/audio/dereverb/

Ṣàfikún àgbègbè àti àgbègbè láti inú àwọn àkọsílẹ̀ àwòrán.

file fileFáìlì àwòrán láti ṣe ìṣàfarawé
type stringecho or reverb (default: both)
intensity integer1-5 (default: 3)
POST /v1/audio/analyze/ Àìfihàn

Ṣàfihàn àwòrán láti ṣàfihàn bọ́tìnì, BPM, àti àwọn ìṣàmúlò-ètò àwọn ìṣàfihàn àkókò.

file fileFáìlì ìsàlẹ̀-ilà láti ṣàfihàn
Àwọn ìsàlẹ̀-ilà
{
  "key": "C",
  "scale": "Major",
  "bpm": 120.0,
  "time_signature": "4/4",
  "camelot": "8B",
  "compatible_keys": ["C Major", "G Major", "F Major", "A Minor"]
}
POST /v1/audio/convert/ Àìfihàn

Ṣàfikún àwòrán laarin àwọn ìrísí-lẹ́tà.

file fileFáìlì àwòrán láti yipada
format stringÀwọn ìgúnrégé àwọn àkọ́lé: mp3, wav, flac, ogg, m4a, aac
bitrate integerBítàrátì ìjánu-ìjánu nínú kbps: 64, 128, 192, 256, 320
sample_rate integerÀwọn ìṣàmúlò-ètò:
channels stringmono tabi stereo

Àkọlé àwòrán

POST /v1/voice-chat/

Fi àwòrán tàbí àkọlé pamọ́ ki o si gba ìjánu-íjánu AI nípa ìṣàfarawe-ìrọ̀.

Àwọn ìṣàmúlò-ètò (multipart/form-data tabi JSON)

Àwọn ìkúndùǹÀwọn Ìṣàmúlò-ètòTí a fẹ́Àkóónú
audio file No* Ààyè-iṣẹ́ àwòrán (yàni àwòrán tàbí àyọkà tí a fẹ́)
text string No* Àwọn ìṣàmúlò-ètò àyọkà (ọ̀kan ninu àwòrán tàbí àwòrán tí a fẹ́)
voice string No Àwòrán fún àgbékalẹ̀ AI. Àtòjọ-ẹ̀yàn: af_bella
tts_model string No Àwọn ìṣàmúlò-ètò TTS fún àgbékalẹ̀. Àtòjọ-ẹ̀yàn: kokoro
system_prompt string No Àwọn àgbèwọlé ìṣàmúlò-ètò fún AI
conversation_id string No Lọ́wọ́lọ́wọ́ àkọlé tí wa

Àwọn ìsàlẹ̀-ilà

Àwọn ìṣàfihàn JSON
{
  "conversation_id": "conv_abc123",
  "user_text": "What is the capital of France?",
  "ai_text": "The capital of France is Paris.",
  "audio_url": "https://api.tts.ai/v1/audio/tmp/resp_xyz.mp3",
  "credits_used": 3
}

Àwọn àwọn àwọn àwọn àwọn

POST /v1/tts/batch/

Fi àwọn àkọlé àwọn ìṣàmúlò-ètò láti fi pamọ́ fún ìṣàfihàn TTS. Lọ́wọ́lọ́wọ́ gba àgbègbè wẹ́ẹ̀bùhookù láti inú àwọn iṣẹ́ láti pari.

Àwọn Àtòjọ-ẹ̀yàn

Àwọn Àtòjọ-ẹ̀yànÀwọn Ìṣàmúlò-ètòÀwọn Àkọlé
textsarrayArray of objects: {text, model, voice}. Max 50 items.
webhook_urlstringOptional URL to POST results when batch completes.

Àwọn ìsàlẹ̀-ilà

Àwọn ìṣàfihàn JSON
{
  "batch_id": "abc123",
  "total": 3,
  "completed": 0,
  "status": "processing"
}

Àwọn ìṣàmúlò-ètò ìṣàfihàn àti GET /v1/tts/batch/result/?batch_id=abc123

Ìṣàfilọ́lẹ̀ Àwọn Àmì-ìwé

POST /v1/voice-embed/

Ṣàfikún ìṣàfilọ́lẹ̀ ìgbọ́ọ̀kan láti inú ìṣàfilọ́lẹ̀ ìgbọ́ọ̀kan. Lò àwọn àwọn ìṣàfilọ́lẹ̀_id tí a fi pamọ́ nínú àwọn ìtàn ìṣàfilọ́lẹ̀ ìgbọ́ọ̀kan láti mú ìṣàfilọ́lẹ̀ ìṣàfilọ́lẹ̀ láti inú ìṣàfilọ́lẹ̀.

Àwọn Àtòjọ-ẹ̀yàn

Àwọn Àtòjọ-ẹ̀yànÀwọn Ìṣàmúlò-ètòÀwọn Àkọlé
filefileReference audio file (WAV, MP3, FLAC).
modelstringCloning model (default: chatterbox). Supported: chatterbox, cosyvoice2, openvoice, gpt-sovits, spark, indextts2, qwen3-tts.

Àwọn ìsàlẹ̀-ilà

Àwọn ìṣàfihàn JSON
{
  "embed_id": "emb_abc123",
  "model": "chatterbox",
  "duration_ms": 450
}

Àwọn Àwọn Ààyè-iṣẹ́

GET /v1/health/

Ṣayẹwo ìṣàmúlò-ètò àwọn ààtò GPU, àwọn àwọn ìṣàmúlò-ètò àti ìwọ̀n ìṣàmúlò-ètò. Kò ní ìṣàfihàn ìṣàfihàn. A fi àwọn ìṣàfihàn pamọ́ fún àwọn ìṣísẹ̀ 30.

Àwọn ìsàlẹ̀-ilà

Àwọn ìṣàfihàn JSON
{
  "status": "online",
  "latency_ms": 45,
  "queue_size": 3,
  "models_loaded": ["kokoro", "chatterbox", "cosyvoice2"]
}

Àtòjọ àwọn ìṣàmúlò-ètò

GET /v1/models/

Ṣàfihàn àtòjọ àwọn ìṣàmúlò-ètò tó lè wa nínú àwọn ìṣàmúlò-ètò wọn.

Àwọn ìsàlẹ̀-ilà

Àwọn ìṣàfihàn JSON
{
  "models": [
    {
      "id": "kokoro",
      "name": "Kokoro",
      "type": "tts",
      "tier": "standard",
      "languages": ["en", "ja", "ko", "zh", "fr"],
      "supports_cloning": false,
      "supports_streaming": true,
      "credits_per_1k_chars": 2
    },
    {
      "id": "chatterbox",
      "name": "Chatterbox",
      "type": "tts",
      "tier": "premium",
      "languages": ["en"],
      "supports_cloning": true,
      "supports_streaming": true,
      "credits_per_1k_chars": 4
    }
  ]
}

Àwọn Àmì-ìwé Àtòjọ

GET /v1/voices/

Ṣàfihàn àtòjọ àwọn àwòrán tó lè wa ní pàtó, àti àwọn ìṣàmúlò-ètò ìṣàfihàn láti inú àwòrán tàbí àwòrán.

Àwọn Àlàyé Àwọn Àwọn Ààtò

Àwọn ìkúndùǹÀwọn Ìṣàmúlò-ètòÀkóónú
model string Píríǹtì láti inú ID ìṣàmúlò-ètò (gẹ́gẹ́ bíi kokoro)
language string Fi àwọn àmì-ìwé ìsàlẹ̀-ilà pamọ́ (gẹ́gẹ́ bíi en)
gender string Aṣàfilọ́lẹ̀ láti inú ìwọ̀n: ọmọkunrin, ọmọbinrin, ọ̀kan-ọ̀kan

Àwọn ìsàlẹ̀-ilà

Àwọn ìṣàfihàn JSON
{
  "voices": [
    {
      "id": "af_bella",
      "name": "Bella",
      "model": "kokoro",
      "language": "en",
      "gender": "female",
      "preview_url": "https://api.tts.ai/v1/voices/preview/af_bella.mp3"
    }
  ],
  "total": 142
}

Àwọn àkọlé (SRT / VTT) new

GET /v1/speech/subtitles/?uuid=<job_uuid>&format=srt|vtt&download=1

Generate synchronised subtitles for any completed TTS job. Runs Whisper alignment over the audio and returns SRT or WebVTT. Result is cached on disk so a second call for the same uuid is a disk read.

Àwọn Àlàyé Àwọn Àwọn Ààtò

Àwọn ìkúndùǹTí a fẹ́Àkóónú
uuidYàUUID iṣẹ́ tí /v1/tts/ tàbí /v1/voice-clone/ fi pamọ́.
formatNosrt (píríǹtì) tàbí vtt.
downloadNo1 lati fi Ìṣàfihàn-Ìdákọ́ọ̀kan: àtòjọ-ẹ̀yàn ranṣẹ ki awáròyìn náà fipamọ́ láti inú àwọn ìṣàfihàn.
languageNoÀwọn ìṣàmúlò-ètò fún àwọn móòdù ìṣàfarawé (tí a bá gbọ́ nípa ìṣàfihàn).
cURL
curl "https://api.tts.ai/v1/speech/subtitles/?uuid=$UUID&format=srt&download=1" -o subtitles.srt

Àwọn Àwọn Àkọlé new

GET POST DELETE /api/v1/pronunciations/

Fi àwọn àwọn àgbéwọlé tí a fi pamọ́ pamọ́ sínú àwọn àgbéwọlé TTS. Àwọn àgbéwọlé tí a fi pamọ́ láti lo nípa àwọn ìṣàfilọ́lẹ̀ TTS gbogbò tí o ṣe. Ìgbà ìṣàfilọ́lẹ̀ 200 fun àwọn àgbéwọlé kan.

Àwọn ìṣàmúlò-ètò (POST)

Àwọn ìkúndùǹÀwọn Ìṣàmúlò-ètòÀkóónú
wordstringWord to override (e.g. GIF, Anthropic). Word-boundary matched.
replacementstringBii o ṣe le sọ ọ̀rọ̀ rẹ̀ fun àwọn móòdù (gẹ́gẹ́ bi jiff, ann THROP ick).
languagestringÀwọn ìkúndùǹ ISO tí a fẹ́. Tí kò bá jẹ́ = lò fún gbogbo àwọn ìtàn.
case_sensitivebooleanDefault false. Match case exactly when true.
cURL
# Save an entry
curl -X POST https://tts.ai/api/v1/pronunciations/ \
  -H "Authorization: Bearer sk-tts-..." \
  -H "Content-Type: application/json" \
  -d '{"word": "GIF", "replacement": "jiff"}'

# List your entries
curl https://tts.ai/api/v1/pronunciations/ -H "Authorization: Bearer sk-tts-..."

# Delete entry by id
curl -X DELETE "https://tts.ai/api/v1/pronunciations/?id=42" -H "Authorization: Bearer sk-tts-..."

You can also pass per-request overrides without saving them — include pronunciations on any /v1/tts/ call as either an object or an array (see the TTS endpoint params).

Àwọn Àkọlé new

Drop a single <script> tag on any article page and visitors get a fixed reader bar that narrates the page on click. Auto-detects the article body, supports custom voice / model / position / accent color.

HTML
<script src="https://tts.ai/narrator.js"
    data-pk="pk-tts-your-publishable-key"
    data-voice="af_bella"
    data-model="kokoro"
    data-extract="auto"
    data-position="bottom"
    data-color="#e60000"
    data-locale="en"></script>

Àwọn Àtòjọ-ẹ̀yàn

Àwọn ìkúndùǹÀkóónú
data-pkBọ́tìnì àìfihàn (pk-tts-…). Àwọn ìdájọ́ dómìǹì tí a fi pamọ́ láti inú ààyè-iṣẹ́ àwọn_dómìǹì_tí a_fàyè gba bọ́tìnì náà.
data-voiceÀwọn àmì-ìwé àwòrán. af_bella ìpèwọ̀n.
data-modelTTS model ID. Default kokoro.
data-extractauto (default) — tries article/main/.post-content/.entry-content selectors, falls back to densest paragraph cluster. Or pass any CSS selector to target a specific element.
data-positionbottom (píríǹtì) tàbí top.
data-colorÀwọ́ àwọn àyọkà ìṣàfarawé (ọ̀kan àwòrán CSS). Àwọn ìpéwọ̀n #e60000.
data-min-chars / data-max-charsLọ́nà àkànṣe náà tí àkọlé bá jú àwọn àmì-àṣírí ìsàlẹ̀-ilà tó kéré jú (òkù ìpéwọ̀n 200). Fẹ́ àwọn àmì-àṣírí láti inú àwọn àmì-àṣírí ìparí (òkù ìpéwọ̀n 50,000).

Àkọlé àwòrán

Àwọn Àwọn Àtòjọ-ẹ̀yàn

Inline button-style embed. Renders next to its <script> tag and plays a button-triggered short snippet. Different shape from the Article Narrator above (which auto-injects a page-spanning bar and narrates the whole article).

HTML
<script src="https://tts.ai/widget.js"
    data-voice="af_bella"
    data-model="kokoro"
    data-style="full"
    data-theme="light"></script>

Àwọn Àwòrán Tí A Fi Pamọ́ (Àwọn Kọlọ̀nì Tí A Fẹ̀)

Fi àwòrán àwòrán ìṣàfihàn pamọ́ nígbà kan, gba àwòrán_àwòrán tí a tílẹ̀, láti rí àwòrán àwòrán náà nínú àwọn ìtàn TTS láti fi àwòrán àwòrán pamọ́ padà nígbà gbogbo. Ó jẹ́ ìṣàfihàn fún àwọn ìṣàfihàn ìpele-òkè.

Àwọn ìṣàmúlò-ètò Ìpamọ́ jẹ́ ọ̀fẹ́ (kò sí ìyàn ọjọ́, kò sí ìgbà ìpa. Ìfihàn: àwọn àmì-àṣírí 500 nígbà kan fún ohun kan. Ìlò-ìlò: àwọn àmì-àṣírí +50 tí a fi kun àwọn ìṣàfilọ́lẹ̀ TTS fún àwọn àwọn ìṣàfilọ́lẹ̀ tí a fi pamọ́, nínú àwọn àwọn àwọn àwọn àwọn ìṣàfilọ́lẹ̀ ìṣàfilọ́lẹ̀ ìṣàfilọ́lẹ̀. Fi àwọn àwòrán pamọ́ tí o kò fẹ́ nígbà yìí láti fi wọn pamọ́; pàtó wọn nígbà tí o bá fẹ́. Gbogbo àwọn ní àwọn awáròyìn API ọ̀fẹ́.

Fi àwòrán pamọ́

POST https://tts.ai/api/v1/user-voices/ Àwọn ìṣàfihàn

Multipart form. Fields: file (required, 5-30s audio), name (required), language (optional, default en), model (optional — auto-picks cosyvoice2 for zh/ja/ko else openvoice), consent_confirmed (required, any truthy value).

curl -X POST https://tts.ai/api/v1/user-voices/ \
  -H "Authorization: Bearer sk-tts-your-key" \
  -F "file=@reference.wav" \
  -F "name=My Narrator" \
  -F "language=en" \
  -F "consent_confirmed=true"

# Response:
{
  "public_id": "uv_a1b2c3d4e5f6",
  "id": 42,
  "name": "My Narrator",
  "model_name": "openvoice",
  "language": "en",
  "reference_audio_url": "https://tts.ai/media/user-voices/....wav",
  "storage_status": "active",
  "created_at": "2026-04-17T03:45:00+00:00"
}

Lo àwòrán tí a fi pamọ́ nínú TTS

POST sí /api/v1/tts/ (ÌṢẸ: wẹ́ẹ̀bù VPS ààyè, kò jẹ́ api.tts.ai) láti inú àwọn_àwòrán_àkọ́kọ́. A tí fi àwòrán tí a fi pamọ́ rẹ̀ pamọ́ sí ààyè ìṣàfarawé.

curl -X POST https://tts.ai/api/v1/tts/ \
  -H "Authorization: Bearer sk-tts-your-key" \
  -H "Content-Type: application/json" \
  -d '{"text":"Hello from my saved voice","user_voice_id":"uv_a1b2c3d4e5f6"}'

# Returns a queued job — poll /v1/speech/results/?uuid=... for the audio URL.

Àtòjọ/Pamu

GET    https://tts.ai/api/v1/user-voices/           # list your saved voices + quota info
DELETE https://tts.ai/api/v1/user-voices/?public_id=uv_a1b2c3d4e5f6

Àwọn àyọkà ìpamọ́/paṣẹ́ padà (laisí ẹ̀yàn)

Archived voices stay in your account but can't be used in TTS. Useful for dormant end users so your list stays clean.

POST https://tts.ai/api/v1/user-voices/uv_a1b2c3d4e5f6/archive/
POST https://tts.ai/api/v1/user-voices/uv_a1b2c3d4e5f6/reactivate/

Àwọn Ààtòjọ-ẹ̀yàn

Àkọlé sí Àkọ́kọ́

Python - requests
import requests

API_KEY = "sk-tts-your-key"

# Text to Speech
response = requests.post(
    "https://api.tts.ai/v1/tts/",
    headers={"Authorization": f"Bearer {API_KEY}"},
    json={
        "model": "kokoro",
        "text": "Hello from TTS.ai!",
        "voice": "af_bella",
        "format": "mp3"
    }
)

with open("output.mp3", "wb") as f:
    f.write(response.content)

print(f"Credits used: {response.headers.get('X-Credits-Used')}")

Àwọn Àmì-ìwé

Python - requests
# Speech to Text
with open("recording.mp3", "rb") as f:
    response = requests.post(
        "https://api.tts.ai/v1/stt/",
        headers={"Authorization": f"Bearer {API_KEY}"},
        files={"file": f},
        data={"model": "faster-whisper", "timestamps": "true"}
    )

result = response.json()
print(result["text"])

Àwọn Àmì-ìwé

Python - requests
# Voice Cloning
with open("reference.wav", "rb") as ref:
    response = requests.post(
        "https://api.tts.ai/v1/tts/clone/",
        headers={"Authorization": f"Bearer {API_KEY}"},
        files={"reference_audio": ref},
        data={
            "text": "This speech uses a cloned voice.",
            "model": "chatterbox"
        }
    )

with open("cloned_output.mp3", "wb") as f:
    f.write(response.content)

Àkọlé sí Àkọ́kọ́

JavaScript - fetch
const API_KEY = 'sk-tts-your-key';

// Text to Speech
const response = await fetch('https://api.tts.ai/v1/tts/', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${API_KEY}`,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    model: 'kokoro',
    text: 'Hello from TTS.ai!',
    voice: 'af_bella',
    format: 'mp3'
  })
});

const audioBlob = await response.blob();
const audioUrl = URL.createObjectURL(audioBlob);
const audio = new Audio(audioUrl);
audio.play();

Àwọn Àmì-ìwé

JavaScript - fetch
// Speech to Text
const formData = new FormData();
formData.append('file', audioFile);
formData.append('model', 'faster-whisper');

const response = await fetch('https://api.tts.ai/v1/stt/', {
  method: 'POST',
  headers: { 'Authorization': `Bearer ${API_KEY}` },
  body: formData
});

const result = await response.json();
console.log(result.text);

Àkọlé sí Àkọ́kọ́

cURL
# Text to Speech
curl -X POST https://api.tts.ai/v1/tts/ \
  -H "Authorization: Bearer sk-tts-your-key" \
  -H "Content-Type: application/json" \
  -d '{"model":"kokoro","text":"Hello!","voice":"af_bella","format":"mp3"}' \
  -o output.mp3

Àwọn Àmì-ìwé

cURL
# Speech to Text
curl -X POST https://api.tts.ai/v1/stt/ \
  -H "Authorization: Bearer sk-tts-your-key" \
  -F "file=@recording.mp3" \
  -F "model=faster-whisper" \
  -F "timestamps=true"

Àwọn Àmì-ìwé

cURL
# Voice Cloning
curl -X POST https://api.tts.ai/v1/tts/clone/ \
  -H "Authorization: Bearer sk-tts-your-key" \
  -F "reference_audio=@reference.wav" \
  -F "text=This uses a cloned voice." \
  -F "model=chatterbox" \
  -o cloned.mp3

Àwọn ìṣàfarawé àwòrán

cURL
# Audio Enhancement
curl -X POST https://api.tts.ai/v1/audio/enhance/ \
  -H "Authorization: Bearer sk-tts-your-key" \
  -F "file=@noisy_audio.mp3" \
  -F "denoise=true" \
  -F "enhance_clarity=true" \
  -o enhanced.mp3

Àwọn Àmì-ìwé Àṣìṣe

Àwọn àṣìṣe gbogbò náà ń fi àwọn àgbékalẹ̀ JSON pamọ́ sí error Àwọn ààyè-iṣẹ́

Àwọn Àwọn Àkọ́gbégbé
{
  "error": {
    "code": "insufficient_credits",
    "message": "You do not have enough characters for this request.",
    "characters_required": 4000,
    "characters_available": 2000
  }
}
Ààyè HTTPÀwọn ÀṣìṣeÀkóónú
400 bad_request Àwọn ìpéwọ̀n ìtàn tí kò tọ́. Wòye àkọlé àṣẹ fún àwọn ìròyìn.
401 unauthorized Bọ́tìnì API tí kò wa tàbí kò tọ́.
402 insufficient_credits Kò ní àwọn àmì-àṣírí tòjú. Ràwọ́lù nínú /pricing/.
403 forbidden O kò ní ìṣẹ̀dà láti gba ààyè-iṣẹ́ yìí (gẹ́gẹ́ bíi, ìṣàfihàn iṣẹ́ òǹlò mìíràn). Ààyè-iṣẹ́ API ní pàtó nínú àwọn ìṣàmúlò-ètò nípa.
404 not_found A kò rí àwọn ìṣàmúlò-ètò àti àwòrán.
413 file_too_large Àwọn fáìlì tí a fi pamọ́ tí wọ́ inú àwọn ìwọ̀n ìwọ̀n.
429 rate_limited Àwọn ìtàn tí o jù lọ. Ṣayẹwo àwọn àwọn àkọlé àwọn ìdájú àwọn ìṣàmúlò-ètò.
500 internal_error Àṣìṣe àwọn sáà. Wá lẹ́ẹ̀kan nínú ìtàn.
503 model_loading Àwọn àwọn àwọn àwọn àwọn àwọn àwọn àwọn àwọn àwọn àwọn àwọn àwọn àwọn àwọn àwọn àwọn àwọn àwọn àwọn àwọn àwọn àwọn àwọn àwọn àwọn àwọn àwọn àwọn àwọn àwọn àwọn àwọn

Àwọn wẹ́ẹ̀bù

Fún àwọn iṣẹ́ tí n lọ́wọ́lọ́wọ́ jú lọ́wọ́lọ́wọ́ lọ́wọ́lọ́wọ́, o lè ṣàfihàn ààtòjọ-ẹ̀yàn webhook_url. Nígbà tí iṣẹ́ náà bá parí, a á fi ààtòjọ-ẹ̀yàn náà pamọ́ sí URL rẹ̀.

Àwọn Ìṣàmúlò-ètò
{
  "event": "task.completed",
  "task_id": "task_abc123",
  "status": "success",
  "result_url": "https://api.tts.ai/v1/results/task_abc123",
  "credits_used": 12,
  "created_at": "2025-01-15T10:30:00Z",
  "completed_at": "2025-01-15T10:30:45Z"
}
Àwọn àwọn ìṣàmúlò-ètò Webhook tí wa nígbà tí a tí parí. Gẹ́gẹ́ bí a tí wa nígbà tí a bá gba wọn lọ́wọ́lọ́wọ́.

Tí O Tí Ìjánú Rẹ́?

Gba bọ́tìnì API rẹ̀ láti bẹrẹ ìdapọ TTS.ai nínú àwọn ìṣàmúlò-ètò rẹ̀.