A voice profile is the central object in the Voices tab of PeachDesk Voice Studio. It captures everything Voice Studio needs to speak as a particular voice: the engine/model, the language, optional reference audio for cloning, an avatar, a default effects chain, and an optional personality. There are three kinds of profile:
  • Clone from audio (voice_type: "cloned") — a custom voice built from one or more reference samples you upload.
  • Built-in voice (voice_type: "preset") — a hosted voice selected from a model’s preset catalog. vaani-indic (VAANI-INDIC) is the one served engine that ships built-in speakers. The model runs on PeachDesk’s GPU infrastructure; you simply pick it from a dropdown.
  • Designed voice (voice_type: "designed") — a voice generated from a text design_prompt.
All endpoints below are exposed through the PeachDesk API under the base path /api/voice. For example, POST /profiles is called as POST /api/voice/profiles. Every request must include your PeachDesk API key in the X-API-Key header (an interactive session token in Authorization: Bearer also works — see Authentication):

Object: Voice Profile

The VoiceProfileResponse shape is returned by most endpoints on this page.
string
Unique profile identifier.
string
Display name shown in the Voices tab.
string | null
Optional free-text description.
string
ISO language code (e.g. en, es, ja).
string | null
Internal path to the avatar image, if one has been uploaded. Fetch it via the avatar endpoint.
EffectConfig[] | null
Default effects chain applied to takes from this voice, or null if none.
string
One of cloned, preset, or designed.
string | null
For built-in voices, the engine the preset belongs to.
string | null
For built-in voices, the selected preset voice id.
string | null
For designed voices, the prompt used to generate the voice.
string | null
Default generation engine for this profile.
string | null
Optional personality description used by the compose feature.
integer
Number of generations produced with this profile.
integer
Number of reference samples attached to this profile.
string (date-time)
Creation timestamp.
string (date-time)
Last update timestamp.
An EffectConfig is { "type": string, "enabled": boolean, "params": object }.

Managing profiles

Create a profile

POST /api/voice/profiles Create a new voice profile. The profile starts empty; for a Clone from audio voice you then add one or more reference samples (see below).
string
required
Display name (1–100 characters).
string
Optional description (max 500 characters).
string
default:"en"
Language code. Defaults to en.
string
default:"cloned"
One of cloned, preset, or designed.
string
Engine name when voice_type is preset (max 50 chars).
string
Built-in voice id when voice_type is preset (max 100 chars).
string
Prompt describing the voice when voice_type is designed (max 2000 chars).
string
Default generation engine for this profile (max 50 chars).
string
Optional personality used by the compose feature (max 2000 chars).
Returns a Voice Profile object.

List profiles

GET /api/voice/profiles List all voice profiles for your workspace. Returns an array of Voice Profile objects.

Get a profile

GET /api/voice/profiles/ Fetch a single profile by id.
string
required
The profile id.
Returns a Voice Profile object, or 404 if not found.

Update a profile

PUT /api/voice/profiles/ Update a profile’s fields. The body is the same shape as Create a profile.
string
required
The profile id.
Returns the updated Voice Profile object.

Delete a profile

DELETE /api/voice/profiles/ Permanently delete a profile and its samples.
string
required
The profile id.
Response

Built-in voices

Built-in voices are hosted models that run on PeachDesk’s GPU infrastructure. You don’t install or download anything — pick an engine and voice from the dropdown in the Voices tab, or query the catalog below.

List built-in voices for an engine

GET /api/voice/profiles/presets/ Return the catalog of preset voices for a given engine. vaani-indic (VAANI-INDIC) is the only engine with built-in speakers — 16 of them, a female and a male for each of eight Indian languages. The other served engines clone from a reference clip and ship no speaker table, so they return an empty list, as does an unknown engine.
string
required
Engine name. Use vaani-indic for the built-in catalog.
string
The engine you queried.
object[]
Array of voices, each { "voice_id", "name", "gender", "language", "description" }. description is a short use-case line, or null where none is curated.
Response
Use a voice_id from this list as the preset_voice_id when creating a built-in voice profile.

List the curated built-in catalog

GET /api/voice/profiles/presets/curated Return the same built-in voices grouped for a language-first picker: a voices array plus a languages index carrying the count per language code, sorted by descending count then code.
object[]
Every curated voice, each { "name", "engine", "voice_id", "gender", "language", "persona" }.
object[]
Per-language counts, each { "language", "count" }.

Preview a built-in voice

GET /api/voice/profiles/presets///preview Serve a short pre-rendered sample WAV for a built-in voice, in that voice’s own language. The first request renders and caches the sample; later ones are served straight from cache.
string
required
Engine name, e.g. vaani-indic.
string
required
Built-in voice id, e.g. ta_male.
  • Response: audio/wav. Returns 404 if the voice is unknown or has no preview, and 503 with a Retry-After header if the render is temporarily unavailable.

Reference samples (cloning)

Reference samples are the short clips of audio that a Clone from audio profile learns from. Each sample pairs an audio file with the exact text spoken in it.

Add a sample

POST /api/voice/profiles//samples Upload a reference clip and its transcript. The request is multipart/form-data.
string
required
The profile to attach the sample to.
file
required
Audio file. Accepted formats: wav, mp3, m4a, ogg, flac, aac, webm, opus. Max 50 MB.
string
required
Exact transcript of the clip (1–1000 characters).
Returns a ProfileSampleResponse:
string
Sample id.
string
Parent profile id.
string
Internal storage path of the processed audio.
string
The transcript you provided.
Files larger than 50 MB are rejected with 413 Payload Too Large. Keep reference clips short and clean — a few seconds of clear speech works best.

List samples

GET /api/voice/profiles//samples Return all samples attached to a profile.
string
required
The profile id.
Returns an array of ProfileSampleResponse objects.

Update a sample’s transcript

PUT /api/voice/profiles/samples/ Correct the reference_text of an existing sample.
string
required
The sample id.
string
required
New transcript (1–1000 characters).
Returns the updated ProfileSampleResponse, or 404 if the sample is not found.

Delete a sample

DELETE /api/voice/profiles/samples/ Remove a single sample.
string
required
The sample id.
Response

Avatars

Each voice can have an avatar image, shown beside the voice in the Voices tab.

Upload an avatar

POST /api/voice/profiles//avatar Upload or replace the avatar image. Request is multipart/form-data.
string
required
The profile id.
file
required
Image file.
Returns the updated Voice Profile object (with avatar_path set).

Get an avatar

GET /api/voice/profiles//avatar Return the avatar image binary. Responds 404 if the profile has no avatar.
string
required
The profile id.

Delete an avatar

DELETE /api/voice/profiles//avatar Remove the avatar from a profile.
string
required
The profile id.
Response

Default effects

Voice Studio applies effects as versioned takes. A profile can carry a default effects chain so every generation from that voice starts with the same processing applied.

Set or clear the default effects chain

PUT /api/voice/profiles//effects Set the default effects chain, or pass null to clear it. The chain is validated before it is saved.
string
required
The profile id.
EffectConfig[] | null
required
An ordered list of effects, or null to remove the default chain. Each entry is { "type": string, "enabled": boolean, "params": object }.
Returns the updated Voice Profile object. An invalid chain returns 400.

Channel assignment

Profiles can be assigned to channels so the right voice is used in the right context.

Get a profile’s channels

GET /api/voice/profiles//channels Return the channel ids a profile is assigned to.
string
required
The profile id.
Response

Set a profile’s channels

PUT /api/voice/profiles//channels Replace the set of channels assigned to a profile.
string
required
The profile id.
string[]
required
The complete list of channel ids to assign.
Response

Compose in character

If a profile has a personality, Voice Studio can generate a fresh in-character utterance you can edit before speaking — this is what the Compose button in the Generation tab produces.

Compose an utterance

POST /api/voice/profiles//compose Produce a fresh utterance in the profile’s character voice. Takes no body.
string
required
The profile id. The profile must have a personality set.
string
The generated in-character utterance.
string
The size of the model that produced the text.
Response
There is no standalone rewrite endpoint. To rewrite text in character during synthesis, call the generation endpoint with personality=true instead.

Import & export

Profiles can be moved between workspaces as a single ZIP archive that bundles the profile metadata and its samples.

Export a profile

GET /api/voice/profiles//export Download a profile as a ZIP archive (application/zip). The response is a file attachment named profile-<name>.peachdesk.zip.
string
required
The profile id.

Import a profile

POST /api/voice/profiles/import Create a profile from a previously exported ZIP archive. Request is multipart/form-data.
file
required
The exported ZIP archive. Max 100 MB.
Returns the newly created Voice Profile object. Files over 100 MB return 400.