← Back to home

Human-Sounding Voiceover with Claude Code — MiniMax Voice Cloning + a Script Methodology

Long-Form Video · EP0026 June 1, 2026 10:02
What this episode covers

That Nano Banana intro at the top of the video — the narration isn't me reading into a mic. It's my own voice, cloned, with Claude Code calling MiniMax's TTS to perform it. You can hear that it's unlike the obviously-fake AI voices we're used to: there's sibilance, there's breath, and the pauses feel natural.

This episode walks through the whole method: how to hook it up and configure it (MiniMax has a China platform and an international one; get a key and drag it over to Claude Code), which model to use (speech-2.8-hd), and how to clone your own voice. But the real substance is a script preparation methodology — don't sprinkle pauses randomly, let emotion run on auto, use embedded tags selectively, pin homographs with pinyin, spell out digits. None of it is in the official docs; it's what I learned by using this daily, and I've written it up as a document in the downloads section.

Companion downloads · Feed them to your Claude Code

Start with that first stretch of the video.

That’s an intro to the third generation of Nano Banana, Google’s image tool, just released. But listen closely to the narrator’s voice — it isn’t me reading into a microphone. It’s my own voice, cloned, generated by Claude Code calling MiniMax’s TTS.

It’s a bit different from the AI voices we’re used to hearing: the timbre carries a lot more sibilance, the rhythm and pauses of the speech feel natural, and there’s a sense of breath between the sentences.

Why MiniMax

Everyone knows MiniMax, and it isn’t just large language models — their TTS voice model is the best one I’ve tested to date.

Step 1: setup and configuration

MiniMax has a China platform and an international one, and I’ve put both addresses in the video.

Once you’re in: top up, generate an API key from the access page, save that key string to a local notepad file, then drag that file into the Claude Code window and you can start making calls.

The best-performing model is speech-2.8-hd. It’ll show you how to call it, but we don’t have to learn any of that ourselves — just find the text to speech (T2A) documentation page on MiniMax’s site and copy the contents, or hand Claude Code the URL directly, and it works out how to call it in code on its own.

What actually matters: how you prepare the script

To make the voice more convincing, MiniMax calls support a lot of custom parameters. This part is the real substance, and it’s what isn’t in the official docs — what I figured out the hard way.

Pauses. Use a marker like <#seconds#> to insert pauses between punctuation, at sentence transitions, and at points of emphasis. MiniMax adds small pauses on its own, but not enough, so I worked out a scheme — an extra 0.2 to 0.3 seconds at the ends of long sentences and wherever emphasis is needed. Careful not to scatter them randomly; the more you add, the faker it sounds.

Speed. From my testing, 1.2x to 1.3x is the most comfortable.

Emotion. Leave it unspecified and it runs in auto mode, matching emotion to the meaning of the text, and auto is usually great. You can also pick happy, sad, disgusted, or surprised, but in testing they all come out a bit overdone and aren’t useful — what is useful is auto, natural, and calm.

Embedded tags. The API supports a lot of parenthetical tags that add “humanness.” What tested well is (breath), plus inhales, a dismissive snort, a lip smack, that family. The ones on the right side of the list — laughs, throat-clearing — pull you right out of it; they sound unnatural, so avoid them. So when I explain the logic to Claude Code, I tell it explicitly which tags it can weave in and which it can’t.

Homographs. You can pin a pronunciation using pinyin plus a tone number. Take a surname like Shan in “Shan laoshi” — the TTS may pick the wrong reading for the character; pinyin plus a tone digit corrects it. For characters it consistently gets wrong, you can also substitute a homophone.

Compound words read as one unit. I used to do a lot of medical-explainer voiceover, and I constantly hit very long terms — semaglutide, omeprazole enteric-coated capsules. Long words like those need to be wrapped in double pound signs so the model reads them as one unbroken unit.

Digits spelled out. Long number strings, phone numbers, and years frequently get read wrong. Just have Claude Code convert the digits into written-out Chinese before sending, and you avoid it. Which of the two Chinese words for “two” to use in a given context, and how to chunk long text for streaming output, are in there too.

I’ve written the whole thing up as a document and put it in the downloads section. Download it, hand it to your Claude Code, and it has learned my whole approach to generating speech.

Demo: one sentence, one finished voiceover

With the key and this methodology in place, all I have to say inside Claude Code is:

Generate me a random 200-character short story, use the MiniMax speech-2.8-hd model with my own voice and our speech-generation methodology, turn it into an audio file, and play it as soon as it’s converted.

It came back fast — a short story about a late-night secondhand bookstore, its owner Old Zhou, and a gray-covered notebook, read in my voice.

How to clone your own voice

Simple: record ten or twenty seconds of your own voice on your phone with no background noise, drag it into the Claude Code window, and tell it to go clone that voice on MiniMax. It clones it right there.

One thing to watch: voices cloned through the API are only kept for 7 days, and get cleaned up if unused within that window. No big deal though — as long as you keep the original audio file, you can re-clone any time.

One easter egg

You may have heard it too: when my Claude Code finishes a task, it plays a clip saying “task complete, awaiting instructions” — also generated with MiniMax, wired in through hooks. That way, with several windows open, one listen tells me something finished and it’s time to go look.

That’s it for today. Questions in the comments.

What actually decides whether it sounds human isn't the API, it's how you prepare the script — and none of this comes from the official docs, it's what I learned from using it every day.