My terminal learned my voice from one recording
I gave sayneat one recording. The next terminal message came back in my own voice, generated locally without Python, a GPU, or an account.
- Published
- Reading time
- 10 min read
This is now a valid terminal command:
sayneat --model pocket --clone recording.mp3 --voice my-voice
After it finishes, the new voice behaves like any other voice in sayneat:
sayneat --model pocket --voice my-voice \
"The stubborn build finally passed"
That is almost absurdly little interface for what happened. A recording became a reusable voice. No training job appeared. There was no Python environment, GPU service, model server, web form, or account. The 98 MB local model and the recording stayed on the machine.
This is the third step in a habit that began with a shell suffix. In March, I wrote I gave my terminal a voice worth listening to about saynice, a Bash wrapper around OpenAI speech. Last week, Why my terminal now sounds like a person introduced sayneat and compared macOS say, saynice, and four local models.
The next request was obvious: if a terminal can use a good local voice, why not let it use mine?
--clone was the missing toy. With no recording file, sayneat gives me a short passage, waits for Enter, and records the default microphone. Hearing it speak a sentence I never recorded, in something recognizably close to my own voice, is strange and delightful. I wanted that experience to take one command, then leave me with a voice I could use anywhere else in the CLI.
Cloning here means conditioning, not training
“Voice cloning” suggests that sayneat trains and saves a new model. It does not.
Pocket TTS is a zero-shot text-to-speech model. During synthesis, it derives speaker and style information from a reference recording and conditions generated speech on that information. The model weights remain unchanged. sayneat stores a prepared reference WAV and supplies it again when Pocket starts.
That distinction explains both the speed and one current limitation. Creating a clone mostly means decoding and cleaning audio, so it finishes quickly. On each fresh sayneat process, Pocket still has to derive its voice state from the reference. A longer recording can capture more of the speaker, but it also makes that first synthesis slower.
The saved object is a clean voice recording selected specifically because a model can reproduce its speaker. Keeping that reference as an ordinary WAV makes the mechanism easy to inspect, copy, and delete.
Pocket is unusually suitable for a terminal tool. Kyutai’s current Pocket TTS project describes a 100 million parameter model designed for CPU use, with low-latency streaming and voice cloning from a WAV reference. sayneat uses a January 2026 int8 ONNX conversion through sherpa-onnx. That package is about 98 MB and runs locally without a Python runtime.
This is what makes the short command possible. The simplicity does not come from a thin wrapper around a service. The model, audio decoder, microphone capture, sample preparation, synthesis, playback, and file output live behind one native executable.
Open source voice cloning is no longer one project
As of August 2026, there is no shortage of capable voice-cloning code. Comparing the projects is fun because they make noticeably different choices about size, language coverage, style control, and licensing.
Coqui XTTS v2 helped make short-reference multilingual cloning accessible. Its model card says it can clone from a six-second clip and speak 17 languages. The Coqui TTS code uses MPL-2.0, while XTTS weights use the separate Coqui Public Model License. Reading the repository license alone does not answer whether a product may use the model.
OpenVoice takes a different position. Its V1 and V2 code and models are MIT-licensed, including commercial use, and it focuses on tone-color cloning, style control, and cross-lingual output.
F5-TTS publishes its code under MIT. Its pretrained weights use CC BY-NC because the Emilia training data is non-commercial. Again, open code does not make the ready-to-run model commercially usable.
Chatterbox is MIT-licensed and spans English, multilingual, low-latency, and smaller CPU-oriented variants. It also makes a notable product decision: generated audio includes Resemble AI’s PerTh neural watermark, and the repository includes detection instructions.
Pocket brings the size down far enough for the command I wanted. Its repository code uses MIT and explicitly prohibits unauthorized, deceptive, fraudulent, and privacy-invasive cloning. The specific sherpa-onnx conversion package bundled by sayneat contains CC BY 4.0 terms, while its package README also says the conversion is non-commercial. Those statements do not fit together neatly. sayneat therefore describes this specific Pocket package as non-commercial unless upstream clarifies its status.
That survey changed how I think about an OSS voice model. At least four separate questions matter:
- Is the inference code available under an open-source license?
- Are the model weights available, and under which terms?
- Do the training data impose additional restrictions on those weights?
- Do I have permission to use the reference speaker’s identity for this purpose?
The last question does not disappear when every repository says MIT. A software license cannot grant another person’s consent.
A cloned voice changes what a recording proves
Voice cloning has wonderful uses. Someone who is losing speech can preserve a familiar voice. A creator can correct narration without reconstructing a recording setup. An accessibility tool can speak in a voice its user identifies as their own. My terminal can report a finished task without sounding like a generic system voice.
The same mechanism can produce convincing impersonation. The US Federal Trade Commission’s Voice Cloning Challenge explored synthetic-speech detection, source-audio protection, authentication at recording time, and real-time deepfake detection. Its useful conclusion was that no single detector solves the problem.
A familiar voice is therefore no longer proof of who made a call or recording. That fact exists independently of sayneat, and it is worth remembering as these models become ordinary software.
The command keeps its own message short:
Clone only a voice you own or have explicit permission to use.
That matches how I want to play with the feature. I can clone my own voice, compare different rooms and microphones, and hear how much of an accent or speaking style Pocket picks up from thirty seconds.
Published clone audio should say what it is
The EU AI Act’s Article 50 transparency rules started to apply on August 2, 2026. The European Commission’s Article 50 guidance covers machine-readable marking of synthetic output and disclosure of deepfake audio where the provision applies.
sayneat does not watermark generated audio. Pocket through sherpa-onnx does not provide the PerTh mechanism that Chatterbox ships, and ordinary conversion can remove simple file metadata. For my private terminal notifications, that distinction is academic. If I turn a clone into published audio, I will say that it is synthetic.
The one-line command cleans up the recording
Raw recordings vary more than the model API suggests. A stereo phone recording may start with silence, contain a loud click, run for several minutes, or have one clear section surrounded by room noise. Sending the first fixed number of seconds would make the interface simple and the results arbitrary.
sayneat decodes the source and downmixes all channels to mono. It bounds analysis to the first 45 seconds for Pocket and 180 seconds for ElevenLabs, which prevents a large podcast file from becoming an unbounded allocation.
It then measures RMS energy in 20 millisecond frames. Frames above a threshold derived from the loudest part count as active speech. sayneat trims leading and trailing silence while keeping 150 milliseconds of margin. If the active recording remains too long, a sliding energy calculation selects the clearest high-energy window rather than blindly taking the beginning.
Pocket keeps at most 30 seconds. ElevenLabs keeps at most 120 seconds. A Pocket reference needs at least 0.75 seconds of clear audio. ElevenLabs needs ten seconds, and its own guidance favors one to two minutes.
Normalization raises the peak toward 0.9 but caps gain at four times. That limit is deliberate. Turning a nearly silent, noisy recording up by twenty times would satisfy a level check while making a worse reference. Clipping, echo, background speakers, and aggressive noise remain the user’s responsibility because simple amplitude code cannot repair them honestly.
Finally, sayneat resamples the prepared audio to 24 kHz and writes 16-bit mono PCM. Pocket and ElevenLabs receive the same predictable sample shape even when the input was an MP3 from a phone or a microphone using another rate.
A clone becomes an ordinary voice
A supplied Pocket name may contain one to 64 ASCII letters, digits, hyphens, or underscores. If no name is given, sayneat creates a non-identifying pet name such as mossy-otter. That avoids pretending an unverified sample establishes the identity written on its filename.
Pocket references live below the platform application-data directory, separate from downloadable model weights. Cache cleanup can remove a hydrated model without deleting a user’s voice. On Unix, sayneat restricts the voice directory to mode 0700.
Saving uses a temporary file in that directory, flushes it, and persists without replacing an existing name. If the name exists in an interactive terminal, sayneat asks for a bare Enter before replacing it atomically. A noninteractive process refuses replacement. This protects a personal recording from an unnoticed script collision.
Saved names appear through the existing voice interface:
sayneat --model pocket --voices
A name or numeric position can then be passed through --voice. The rest of sayneat does not need a second concept for clones.
The same preparation code can upload a longer sample for ElevenLabs Instant Voice Cloning when I want its remote voices. Pocket is the part I am most excited about because the complete loop stays on my laptop and needs no account.
My terminal can sound like me
The original goal remains modest. I want a deeply buried terminal to speak when work finishes. saynice made that voice pleasant. sayneat made it local. --clone now makes it personal.
some-long-running-task; \
sayneat --model pocket --voice my-voice \
"task is done, exited $?"
The first version of sayneat let me choose a much better voice. This release lets me make one. That changes the project from a catalog of speech models into something personal, and I have already lost time happily trying different microphones, passages, and reference lengths to hear what Pocket preserves.
I built --clone because it sounded like a fun feature and because voice cloning should not require assembling a Python environment before I can play with it. Now it is one flag in the same command I already use every day. Record a voice, give it a name, and let the terminal surprise you.