Difficulty: Beginner • Category: Skill Showcase
Imagine typing a sentence your mouth has never formed, hitting Enter, and a few seconds later hearing your own voice read it back — your timbre, your cadence, the slight rasp at the end of a long day. No studio. No subscription. No upload to someone else’s cloud. Just ten seconds of reference audio, an open-source model on your own GPU, and a single curl command.
This is not hypothetical. Kokoro and OmniVoice are two open-source text-to-speech models you can run on a consumer graphics card, and together they make a local voice-cloning server you can drive entirely from the command line. This is the shortest path from a fresh install to hearing yourself say something you never said.
What Kokoro and OmniVoice Are
Two models, two jobs, one server.
Kokoro is an 82-million-parameter TTS model. Its selling point is speed: on a modest GPU it synthesizes far faster than real time, which makes it the pick for long-form narration, articles, and quick prototypes using its built-in voices (a common default is af_sky) — no cloning required.
OmniVoice is a roughly 0.6-billion-parameter model built for voice cloning and voice design. You give it a short reference clip, it captures the speaker’s identity, and you can then synthesize arbitrary new text in that voice. The reference becomes a saved voice the server keeps around so you never re-upload it.
Both run locally. The reference setup for this guide is a Windows machine with an RTX 3060 Ti, the model hub listening on port 5175, and a small REST API in front of it. Nothing leaves your network.
Step 1: Get the Server Running
Install the model hub on the GPU machine and start it bound to localhost:5175, following the project’s setup instructions for your platform. Once it is up, the API is the same regardless of host OS.
Verify it is alive:
curl -s http://localhost:5175/health
A healthy server returns a small JSON status object. Then check which models are actually loaded — a model can report installed in the registry while its runtime is missing, so confirm with a real call:
curl -s http://localhost:5175/api/models
And list the voices OmniVoice currently knows:
curl -s http://localhost:5175/api/voices/omnivoice
If OmniVoice is in the models list and the voices endpoint responds, you are ready to clone.
Step 2: Record a 10-Second Reference Clip
Cloning does not need a studio session, but it is ruthlessly sensitive to one thing: the reference clip. Ten to fifteen seconds of clean, single-speaker speech is enough. Use a quiet room, a decent mic or headset, and read a few neutral sentences at your normal pace. Save it as a short lossless WAV or FLAC.
How the clip becomes a saved voice depends on your hub’s UI — most builds expose a “create saved voice” action where you upload the file and name it. For this guide, assume the server stored it as recording_55 (a real saved-voice ID from one of our running servers). After saving, it appears in the voices list from Step 1, and you never touch the raw audio again — you just reference it by name.
Two things quietly ruin clones: background music or a second speaker in the clip, and a recording so quiet the noise floor dominates. Fix the room before you fix the model.
Step 3: Submit Text and Download the Audio
Now the fun part. The job runs asynchronously: you POST to create it, poll for completion, then download.
curl -s -X POST http://localhost:5175/api/jobs \
-H "Content-Type: application/json" \
-d '{
"model_id": "omnivoice",
"input": { "text": "I never actually said this, but here I am saying it anyway." },
"voice": { "voice_id": "saved:recording_55" },
"generation_settings": {
"saved_voice_id": "recording_55",
"language": "en",
"num_step": 16,
"denoise": true,
"postprocess_output": true,
"speed": 1.0
},
"output_name": "my_first_clone"
}'
What to know about that payload:
model_idpicks the engine:omnivoicefor cloning,kokorofor fast synthesis with a built-in voice.voice.voice_idtakes thesaved:form for a cloned voice, or a bare name likeaf_skyfor Kokoro presets.num_stepis OmniVoice’s diffusion step count — more steps means higher quality and longer latency. 16 is a sane default.denoiseandpostprocess_outputclean the reference clip’s noise and smooth the output. Leave them on unless you have a reason not to.
The response carries a job_id. Poll until status reads completed or partially_completed; if it reads failed, the response’s errors array tells you why.
curl -s http://localhost:5175/api/jobs/
Then pull the file:
curl -s http://localhost:5175/api/jobs//audio -o my_first_clone.wav
Play it. That is the moment.
The AHA Moment
The first time you do this, it lands differently than you expect. You typed the words. The server did some work. And then a voice that is unmistakably yours says something you have never spoken out loud — fluently, with your prosody, your breath, your slight accent on the vowels. There is a small, real jolt of recognition. You will replay it three or four times.
What makes it click is not the model’s quality in isolation. It is the loop: a sentence you composed in your head ten seconds ago is now in your ears in a voice you have heard your whole life. That is the moment the abstraction of “voice cloning” becomes a concrete thing you own — and once you feel it, you start hearing use cases everywhere: narration in your own voice for videos you have not recorded, voicemail greetings you never had to speak, audiobook chapters drafted entirely from text.
Tips Before You Go Further
- Use Kokoro for speed, OmniVoice for identity.
kokorowithaf_skygives you audio in a fraction of the time;omnivoicewith a saved voice is what makes it yours. Prototype with Kokoro, ship with OmniVoice. - The reference clip is the whole game. A clean 10-second clip beats a noisy 30-second clip every time. Re-record until it is quiet and single-speaker.
- Keep saved voices, not raw audio. Once saved, reference it by ID. Do not re-upload the source for every job.
- Verify with a real generation, not the registry. A model can list as
installedwhile its runtime is broken. The only proof that counts is a completed job with non-empty audio. - Multi-speaker is the natural next step. The single-speaker payload above is the building block — multiple
voiceentries in one job is how you stage a conversation. Get one voice perfect before adding a second. - Keep it on your network. Part of the point is that the reference audio never leaves your machine. Do not expose the server through a public reverse proxy unless you have thought through who can submit jobs.
Conclusion
You now have a local, scriptable voice-cloning server that turns ten seconds of audio into a reusable voice you can drive from any terminal. The whole loop — record, submit, poll, download — fits in a handful of curl commands, runs on your own hardware, and produces audio indistinguishable enough from your real voice to make you double-take the first time you hear it.
The barrier to voice cloning has not been model quality for a while now. It has been that the good models lived behind an API key. They no longer do. The next sentence you type is one curl away from being spoken in a voice only you own — go say something you have never said.
