High-quality voice cloning with more samples and advanced management capabilities.
import { ElevenLabsClient } from "@elevenlabs/elevenlabs-js";
const client = new ElevenLabsClient({ apiKey: "your-api-key" });
// Access this API via: client.voices.pvcCreates a new PVC voice with metadata only. Audio samples must be added separately via client.voices.pvc.samples.create().
/**
* Create voice with professional voice cloning (metadata only, no samples)
* @returns Voice ID of the created voice
*/
client.voices.pvc.create(
request: CreatePvcVoiceRequest,
requestOptions?: RequestOptions
): HttpResponsePromise<AddVoiceResponseModel>;
interface CreatePvcVoiceRequest {
/** Name for the voice */
name: string;
/** Language of the voice (required) */
language: string;
/** Voice description */
description?: string;
/** Labels/tags as key-value pairs */
labels?: Record<string, string | undefined>;
}
interface AddVoiceResponseModel {
/** ID of the created voice */
voice_id: string;
}Workflow: After creating a PVC voice, add audio samples using client.voices.pvc.samples.create(voice_id, ...). Typically 25+ samples are needed for best quality.
Edit PVC voice metadata.
/**
* @param voice_id - Voice ID to update
* @param request - Updated voice metadata
* @param requestOptions - Optional request configuration
* @returns Voice ID
* @throws UnprocessableEntityError if request fails
*/
client.voices.pvc.update(
voice_id: string,
request?: BodyEditPvcVoiceV1VoicesPvcVoiceIdPost,
requestOptions?: RequestOptions
): HttpResponsePromise<AddVoiceResponseModel>;
interface BodyEditPvcVoiceV1VoicesPvcVoiceIdPost {
/** The name that identifies this voice */
name?: string;
/** Language used in the samples */
language?: string;
/** Description to use for the created voice */
description?: string;
/** Serialized labels dictionary for the voice */
labels?: Record<string, string>;
}Start PVC training process for a voice.
/**
* @param voice_id - Voice ID to train
* @param request - Training configuration
* @param requestOptions - Optional request configuration
* @returns Training status
* @throws UnprocessableEntityError if request fails
*/
client.voices.pvc.train(
voice_id: string,
request?: BodyRunPvcTrainingV1VoicesPvcVoiceIdTrainPost,
requestOptions?: RequestOptions
): HttpResponsePromise<StartPvcVoiceTrainingResponseModel>;
interface BodyRunPvcTrainingV1VoicesPvcVoiceIdTrainPost {
/** The model ID to use for the conversion */
model_id?: string;
}
interface StartPvcVoiceTrainingResponseModel {
/** Status of the training request ('ok' if successful) */
status: string;
}For complete PVC workflow, see: