The chain
$0.068 for the whole chain, at each model’s list price:
- Audition three voices x 3: $0.0082 ($0.04 per 1,000 characters, 3 jobs)
- Story line: $0.0114 ($0.08 per 1,000 characters)
- Two-character conversation: $0.0136 ($0.08 per 1,000 characters)
- Combat barks x 40: $0.024 ($0.04 per 1,000 characters, 40 jobs)
- The story line in German: $0.0108 ($0.08 per 1,000 characters)
summer api estimate <model> --input '<json>', or POST /v1/estimate with the same body as the job. Prices come from GET /v1/models and change only when the provider’s price does.
Voice is priced by the character, so a short bark costs a small fraction of a story line, and a whole bark sheet costs about as much as a few long speeches.
Before you start
Sign in once, so your agent or your terminal can run jobs on your Summer account:Step 1: cast from the voice list
Every voice model has its own list of voices. Print it, with thevoiceId of each voice:
summer_api_models({ model: "voice/expressive-v4" }). The Expressive, Multilingual and Flash models and the dialogue model share one game cast, so a voice you cast on one works on all of them. A few, by role:
Never guess an id: an id that is not in the list is refused. Now audition. Write one line that shows the character, and run it in three voices that fit the card: Roger, Harry and Bill for the captain.
voiceId. Every later line reads its voice from that file, and two characters never share a voice.
Step 2: story lines, directed in the text
A story line is heard once, with the player’s full attention, so it gets the best model and three takes. You direct it in the text itself:- Full stops make clear pauses. Commas make short ones.
- An ellipsis trails off:
Twenty years... - A dash cuts a word short:
I never meant to- - Capitals stress one word:
You SHALL not pass.Use it once per line at most. - Stage words in square brackets change the delivery on the Expressive models:
[tired],[whispering],[pause],[laughs],[sigh],[shouting]. Put each one right before the words it changes.
(angrily) Get out! is read aloud as “angrily, get out”. Other models use their own marks: MiniMax Speech 2.8 HD reads (laughs) and a pause written <#0.4#>, and xAI TTS reads [pause] and [sigh]. Each model’s page has samples that show its marks.
Fine-tune with voiceSettings when the words alone are not enough: lower stability for a more expressive read, higher for a steadier one, speed from 0.7 to 1.2. On the Expressive models, stability works best at 0, 0.5 or 1. Fix the text first: a new stage word changes more than any number. Names the model does not know are spelled the way they sound: Caelthorne becomes KAYL-thorn.
Step 3: conversations with the dialogue model
When two characters talk in a linear scene (a cutscene, radio chatter, an argument the player overhears), make the whole exchange in one job. The dialogue model hears every line before it speaks, so the turn-taking and the reactions sound like people listening to each other. Each line is{ "text", "voiceId" }, up to 40 lines per job.
Step 4: barks, by the hundred
Barks are the short lines enemies and allies shout in play: “Over here!”, “Reloading!”, “Man down!”. They are the opposite of story lines:
Write a bark sheet: eight situations (spotted the player, lost the player, reloading, hit, ally down, flanking, retreating, victory) times five variants is 40 lines. Vary the words, not only the take: “Over here!”, “There! By the wall!”, “Found him!”. Carry the energy in punctuation, which every voice model reads, so the bark sheet can move to a cheaper model without a rewrite. Then send them as one batch:
summer_api_batch({ jobs: [...], out: "audio/voice/barks" }). A batch takes up to 500 jobs, is priced up front and runs all or none (batches).
For crowds of nameless enemies, Inworld TTS-1.5 Max is the lowest price here ($0.01 per 1,000 characters) and has game voices of its own, such as Dominus (en) and Hades (en) for villains. Its voice ids differ from the Expressive cast, so cast those enemies from its own list.
Step 5: other languages
Write the line in the target language, and keep the samevoiceId. Multilingual v2 speaks many languages with one voice, so the captain is still the captain in German. Translate first (a native speaker or your agent), then check the length: German and French lines often run longer, which matters for subtitles and lip timing.
Johanna (de), Asuka (ja) and Diego (es). Qwen Audio 3.0 TTS is strong in Chinese, Japanese and Korean. Name files by locale (hodge_gate_01.de.mp3) so the game picks the right one.
Put it in your game
- Name files by character, situation and take:
hodge_story_gate_01.mp3,hodge_bark_spotted_03.mp3. Your code finds every take of a bark by its prefix. - Play barks at random, never twice in a row, and add a short cool-down per situation, so one guard does not shout “Reloading!” three times in five seconds.
- Mix. Voice on its own bus at full level. Lower the music about 6 dB while anyone speaks. Barks from an enemy in the world play positionally (
AudioStreamPlayer3Din Summer Engine), with a range of about 15 m, so distant guards stay quiet. - Subtitles come from the same text. Keep one script file (id, character, text,
voiceId, file name) as the source for the batch, the subtitles and the translations. - Inside Summer Engine. The voice line skill casts with you, saves the cast to the project and wires each line to the right bus. For mouths that move with the line on a 3D face, see the facial and lip-sync skill.
Common problems
Questions
Can I clone my own voice or an actor’s? Not on the Summer API. Every voice comes from a model’s voice list. How long can one line be? Up to 5,000 characters on most voice models and 2,000 on some; each model’s input lists its limit. Shorter lines give more control. Do I need a voice model for grunts and screams? No: those are sounds. Make them with a sound effects job,male grunt of pain, mid-thirties, short. See sound effects for your game.
Can I ship the voices in a commercial game? Yes. Every model on the Summer API allows commercial use of what it makes.
