Voices
Discover voices and upload a private reference recording.
Read as Markdown ↗GET /api/generate/voices
Requires read scope. Returns voice summaries with id and name, plus pagination data.
| Query | Default | Meaning |
|---|---|---|
scope | mine | Your owned private voices; explore lists approved public voices. |
page | 1 | Integer 1–10,000. Pages contain up to 50 voices. |
language | omitted | Optional supported voice language filter. |
curl 'https://letsgen.app/api/generate/voices?scope=explore&page=1' \
-H "Authorization: Bearer $LETSGEN_API_KEY"Use returned IDs in parameters.voiceProfileId for speech. Public catalog discovery does not make private voices public.
POST /api/generate/voices
Requires generate scope. Send multipart form data:
| Field | Required | Meaning |
|---|---|---|
file | yes | MP3, WAV, OGG, M4A, AAC, FLAC, or WebM audio, 1 byte–50 MiB. |
duration | yes | Recording duration in seconds, 15–300. |
rightsConfirmed | yes | Literal string true, only after permission is confirmed. |
curl https://letsgen.app/api/generate/voices \
-H "Authorization: Bearer $LETSGEN_API_KEY" \
-F 'file=@reference.wav;type=audio/wav' \
-F 'duration=30' \
-F 'rightsConfirmed=true'Let your HTTP client set the multipart boundary; do not set the Content-Type manually. Only attest rights when you own or have permission to clone the voice.
An accepted upload transcribes the recording and returns HTTP 201 with {voice: {id, name}}. The voice is an owned private draft for zero-shot cloning. This does not train or publish a voice, and does not start synthesis. Submit a separate audio request using the returned ID and operation: "voice_clone".
Voice upload does not support generation idempotency. Transcription must succeed for the upload to finish; do not automatically repeat an uncertain upload.