Voice-over in every language
Each lesson script is translated by a chat model and voiced by a speech model. Both calls carry the course as the customer tag, so the cost of every language version is known before it ships.
Request
POST https://api.tovano.ai/v1/tasks Authorization: Bearer $TOVANO_API_KEY Content-Type: application/json X-Tovano-Customer: course-7781 Idempotency-Key: lesson-12-fr-FR-v2 { "model": "audio/demo-tts-1", "input": { "text": "Bienvenue dans le module douze. Dans cette leçon, nous verrons comment lire un bilan en moins de dix minutes…", "voice": "mia" } }
Response
Waiting for the run to finish.
{
"id": "tsk_437a2c848dd2",
"model": "audio/demo-tts-1",
"status": "completed",
"customer": "course-7781",
"input": {
"text": "Bienvenue dans le module douze. Dans cette leçon, …",
"voice": "mia"
},
"output": {
"audio": {
"url": "https://files.tovano.ai/tsk_437a2c848dd2/0.wav?sig=…",
"content_type": "audio/wav",
"duration_s": 143
}
},
"unit": "1k_chars",
"units": 2.14,
"charged_micro": 64200,
"error": null,
"created_at": "2026-11-12T09:14:03Z",
"completed_at": "2026-11-12T09:14:24Z"
}Tasks
8 tasks
-
Completed $0.067288
fr-FR · Lesson 12
tsk_437a2c848dd2 · copy + image
-
Completed $0.072584
de-DE · Lesson 12
tsk_19f40823b58e · copy + image
-
Completed $0.0648
es-ES · Lesson 12
tsk_dd181552e59b · copy + image
-
Completed $0.066664
it-IT · Lesson 12
tsk_c3a591d99fe6 · copy + image
-
Completed $0.065732
pt-BR · Lesson 12
tsk_5ec57a301259 · copy + image
-
Completed $0.03486
ja-JP · Lesson 12
tsk_5566979f3df1 · copy + image
-
Completed $0.069156
nl-NL · Lesson 12
tsk_988b6e4e87a0 · copy + image
-
Completed $0.068532
pl-PL · Lesson 12
tsk_80561f5515d6 · copy + image
Output
Events
- 0:00.0POST /v1/tasks · 8 tasks queued
- 0:21.0tsk_437a2c848dd2 completed · $0.067288
- 0:25.0tsk_dd181552e59b completed · $0.0648
- 0:25.5tsk_19f40823b58e completed · $0.072584
- 0:29.5tsk_c3a591d99fe6 completed · $0.066664
- 0:31.0tsk_5ec57a301259 completed · $0.065732
- 0:36.5tsk_5566979f3df1 completed · $0.03486
- 0:37.0tsk_988b6e4e87a0 completed · $0.069156
- 0:40.5tsk_80561f5515d6 completed · $0.068532
- 0:44.5Done · 8 tasks · $0.509616 charged
A played-back run with realistic requests, responses and charges. No API call is made and no key is used. Times are compressed.
Cost of this run
$0.509616 for 8 tasks
| Model | Usage | Amount | |
|---|---|---|---|
| Demo Chat 1 text/demo-chat-15,120 input tokens × $1.00 / 1M input tokens | $0.00512 | ||
| Demo Chat 1 text/demo-chat-15,224 output tokens × $4.00 / 1M output tokens | $0.020896 | ||
| Demo Voice 1 audio/demo-tts-116,120 characters × $0.030 / 1K characters | $0.4836 | ||
| Total | $0.509616 |
Unit prices from the model catalogue, in US dollars, excluding tax. Agent jobs are charged per step at each step model's price.
At your volume
What a month costs
List prices. Committed-volume pricing, invoicing and an SLA are agreed in your contract. Talk to sales
How it works
Three calls you would write anyway.
- 1
Translate
A chat completion turns the source script into the target language. Charged for the tokens in and out, a fraction of a cent per lesson.
- 2
Voice
The translated text goes to the speech model as a task. Charged per 1,000 characters, so the cost is known before the call.
- 3
Cost per course
Both calls send the course ID as the customer tag. /v1/usage?group_by=customer gives the production cost of each course, every language included.
The code
Copy it, add your key, run it.
The same request in curl, TypeScript and Python. The TypeScript client is tovano on npm.
# 1. Translate the script (OpenAI-compatible chat endpoint) curl https://api.tovano.ai/v1/chat/completions \ -H "Authorization: Bearer $TOVANO_API_KEY" \ -H "Content-Type: application/json" \ -H "X-Tovano-Customer: course-7781" \ -d '{ "model": "text/demo-chat-1", "messages": [ { "role": "system", "content": "Translate this lesson script into French. Keep the tone and the length." }, { "role": "user", "content": "Welcome to module twelve. In this lesson..." } ] }' # 2. Voice the translation curl https://api.tovano.ai/v1/tasks \ -H "Authorization: Bearer $TOVANO_API_KEY" \ -H "Content-Type: application/json" \ -H "X-Tovano-Customer: course-7781" \ -H "Idempotency-Key: lesson-12-fr-FR-v2" \ -d '{ "model": "audio/demo-tts-1", "input": { "text": "Bienvenue dans le module douze...", "voice": "mia" } }'
import Tovano from "tovano"; const tovano = new Tovano(); const customer = "course-7781"; const script = await loadScript("lesson-12"); // your source text for (const lang of ["fr-FR", "de-DE", "es-ES", "ja-JP"]) { const translation = await tovano.chat.completions.create({ model: "text/demo-chat-1", customer, messages: [ { role: "system", content: `Translate this lesson script into ${lang}. Keep the tone and the length.` }, { role: "user", content: script }, ], }); const voice = await tovano.tasks.create( { model: "audio/demo-tts-1", input: { text: translation.choices[0].message.content, voice: "mia" }, customer }, { idempotencyKey: `lesson-12-${lang}-v2` }, ); console.log(lang, voice.id); }
import os, requests API = "https://api.tovano.ai/v1" HEADERS = {"Authorization": f"Bearer {os.environ['TOVANO_API_KEY']}", "X-Tovano-Customer": "course-7781"} for lang in ["fr-FR", "de-DE", "es-ES", "ja-JP"]: chat = requests.post(f"{API}/chat/completions", headers=HEADERS, json={ "model": "text/demo-chat-1", "messages": [ {"role": "system", "content": f"Translate this lesson script into {lang}. Keep the tone and the length."}, {"role": "user", "content": script}, ], }).json() text = chat["choices"][0]["message"]["content"] task = requests.post( f"{API}/tasks", headers={**HEADERS, "Idempotency-Key": f"lesson-12-{lang}-v2"}, json={"model": "audio/demo-tts-1", "input": {"text": text, "voice": "mia"}}, ).json() print(lang, task["id"])
More examples
What else teams run at volume.
Run it on your volume, with your contract.
Committed-volume pricing, monthly invoices, higher limits and a named contact for teams that run AI in production.