Otobong Okoko

VoiceGen

Write the script, mark how it should sound, download the voice-over.

VoiceGen turns a written script into expressive speech, in the voice and accent you pick. You direct the delivery with short cues written into the text, or let an AI voice director add them, then export a finished WAV.

Status
Live
Category
AI audio tool
Platform
Web app
Started as
Google AI Studio prototype
Rebuilt with
Claude Code
Speech model
Gemini 2.5 TTS

The narrated tour, 48 seconds. Captions are available.

Same words, two takes

The plain read is the script as typed. The directed take adds three cues and a persona, nothing else.

Plain

Fenrir · Neutral · no cues

Good morning, everyone. Todays workshop starts at ten, and yes, there will be cake.

0:00 / 0:06

Directed

Kore · Nigerian · 3 cues

[happy] Good morning, everyone! [pause] Today's workshop starts at ten, [whisper] and yes, there will be cake.

0:00 / 0:10
voices, five male and five female
10
personas, accents and styles
7
expression cues in four groups
22
top speed, from 0.5x, baked into the file
2x
characters per script
10,000

What it does

Five steps from script to master, each shown in the states it really has. Pick a state to see it.

Cue palette

Direct the delivery inline

Mark how a line should sound right where it sits. A cue applies to the sentence it opens, so [whisper] whispers that sentence and nothing else.

FROM THE CODE

22 cues in four groups: Timing, Emotion, Delivery and Style. The palette starts collapsed, so it stays out of the way until you want it.

Cue palette, Hover state

Prepare copy

Let the AI direct it for you

One pass groups the script into contexts, one per topic, and adds cues where the words call for them. Tick Review my copy and it also fixes grammar, spelling and flow.

FROM THE CODE

Every wording edit is logged with the original, the replacement and the reason, and one Undo restores your script.

Prepare copy, Prepared state

Persona

Pick an accent or a style

Choose how the voice should come across: Nigerian, African, British or American, Storyteller or Corporate, or Neutral.

FROM THE CODE

The persona instruction is sent with every chunk of a long render, so the accent still holds in the last paragraph.

Persona, Open state

Voice picker

Hear a voice before you choose it

Ten voices, each labelled by tone. Press play on any row to hear it in the persona you picked, without changing your selection.

FROM THE CODE

Every audition speaks the same short line, so you compare voices and nothing else, and each one is cached after the first play.

Voice picker, Playing state

Player and export

Preview, then export a WAV

Listen to a short preview of your own script, then render the full master and download it. A progress bar tracks the render, and you can cancel it at any point.

FROM THE CODE

Speed runs from 0.5x to 2x and is baked into the export, a 16-bit mono WAV at 24 kHz. Each finished master is saved to your script history.

Player and export, Playing state

How I built it

VoiceGen started as a prototype in Google AI Studio. When it outgrew that, I wrote a port plan and rebuilt it as its own codebase with Claude Code, moving features across one at a time. These are the calls that shaped it.

5 DECISIONS SCROLL

Rendering moved into the browser

A Vercel function stops at 60 seconds and a long script takes minutes to voice. Each call renders one span of text, the browser runs them with bounded concurrency, and it stitches the 24 kHz audio into a single WAV.

Span sizes came from measurement

In real calls, 400 characters took about 13 seconds and 600 took 10 to 12, while anything near 1,000 could run past three minutes. So the app starts big and steps down only when a span times out.

One voice across independent calls

Every span is a fresh generation, so the voice drifted between paragraphs. A seed from the text, voice and persona, a temperature of 0.55 and the persona instruction re-sent with every chunk brought it back to one speaker.

The API key stays on the server

The browser only calls VoiceGen's own routes, which hold the Gemini key. The same engine is also open to other services through a private, key-protected API: one call in, one WAV out.

An easy path and a power path

Prepare Copy does the directing for you. The cue palette gives precise control, collapsed by default so the sidebar isn't a wall of buttons.

Why I built it

The community I volunteer for had moved to video announcements, and producing them took up to six hours every weekend between scheduling, recording and editing. A voice-over generated from a script, in the community's own accent, removed that bottleneck and the cost of a voice subscription.

I also wanted direction to live in the script, the way a director pencils notes onto a page, and a long script to sound like one person in one take.

What I learned

  • Direction written into the script beats a settings panel. It is readable, editable and travels with the text.
  • Measure the model before designing around it. My guesses about span timing were wrong.
  • Split work across independent AI calls and consistency becomes an engineering job.
  • The product is right and the compute model is next. A job queue is where rendering should go.

STACK

  • React 19
  • Vite
  • TypeScript
  • Tailwind
  • Vercel Functions
  • Gemini 2.5 TTS
  • Gemini 2.5 Flash
  • Firebase Auth
  • Firestore