guaardvark / voice
Narration and text-to-speech on the user's machine through Guaardvark's Audio Foundry (Chatterbox, Kokoro, Piper) and consent-gated voice cloning from a reference clip. Use when the user wants a voiceover, narration of a script, a spoken line, or "make it sound like this voice".
Voice with Guaardvark
Read setup first. Expressive voices need the audio_foundry plugin running;
Piper works without it. B=${GUAARDVARK_URL:-http://localhost:5000}.
Which engine
| engine | route | when |
|---|---|---|
| Chatterbox | Audio Foundry backend: "chatterbox" | expressive, emotion presets, cloning |
| Kokoro | Audio Foundry backend: "kokoro" | fast, clean, 10+ built-in voices (af_heart default) |
| Piper | /api/voice/text-to-speech | offline fallback, no GPU |
GET $B/api/audio-foundry/voices lists what is installed. GET $B/api/voice/voices lists Piper voices.
Speak a line or a script
Over MCP, call generate_speech (text up to 3000 characters, optional voice such asaf_heart, engine auto | kokoro | chatterbox); it waits and returns the file with a download
link. Cloning is not offered over MCP. Without MCP, or for the Chatterbox knobs, use REST:
curl -s -X POST $B/api/audio-foundry/generate/voice -H 'Content-Type: application/json' -d '{
"text": "The line to speak.",
"backend": "auto", # auto | chatterbox | kokoro
"voice_id": "af_heart", # Kokoro voice, or omit
"emotion": "calm", # Chatterbox preset, or omit
"exaggeration": 0.5, "cfg_weight": 0.5, "temperature": 0.8, # Chatterbox knobs, optional
"seed": 7, "output_format": "wav", "async": true
}'Short text returns the file directly (
path,document_id). With"async": trueor long
text you get202 {"job_id"}: pollGET $B/api/audio-foundry/jobs/<job_id>untilstatus
isdone; the result haspathanddocument_id. Cancel:POST .../jobs/<job_id>/cancel.Multi-section narration with pauses:
POST $B/api/voice/narrate{"script": "...", "engine": "kokoro", "voice": "...", "pause_between_sections": 0.6, "output_format": "wav"}.- Piper only:
POST $B/api/voice/text-to-speech {"text", "voice": "libritts"}returnsaudio_url.
Clone a voice (consent-gated)
The reference must go through the upload route; that is what records consent. Arbitrary
file paths are refused with 403.`bash
curl -s -X POST $B/api/audio-foundry/voice-clips/upload -F file=@/abs/path/ref.wav -F name="Narrator sample"`
The response gives the stored path.GET $B/api/audio-foundry/voice-clipslists clips.- Generate with
"backend": "chatterbox", "reference_clip_path": "<that path>". Before uploading, ask whether the voice belongs to the user or someone who consented. Do not
clone a public figure or anyone who has not agreed. Refuse politely if unclear.
Rules
- 10 to 20 seconds of clean speech is enough for a clone; more is not better.
- Say which engine ran (the response reports it);
autofalls back to Kokoro on a Chatterbox error. - Audio files are local under
data/outputs/; they also appear in the Audio library page.