Package: com.alibaba.dashscope.audio.ttsv2.enrollment.VoiceEnrollmentServicePurpose: Manage the lifecycle of Qwen-Audio-TTS, Qwen-Audio-Realtime, and CosyVoice cloned voices (create, query, update, and delete).
The target model that uses the voice. It must match the model used in subsequent requests with this voice; otherwise, the requests fail.
prefix
String
Yes
A prefix for the voice name. Only alphanumeric characters are allowed, with a maximum length of 10 characters. The resulting voice name follows this format: {target_model}-{prefix}-{unique_id}.
url
String
Yes
Reference audio for voice cloning. Accepts a publicly accessible URL or a Base64 Data URI, such as data:audio/wav;base64,....
Package: com.alibaba.dashscope.audio.ttsv2.enrollment.VoiceEnrollmentParamBuild parameter objects using the builder pattern.
Method
Type
Description
model(String)
String
The voice cloning model. The value must be "voice-enrollment".
languageHints(List<String>)
List<String>
Helps the model identify the language of the sample audio to extract voice features more accurately and improve cloning quality. If the specified language doesn't match the actual audio language (for example, setting en when the audio is in Chinese), the system ignores this value and detects the language automatically. This parameter is an array and must contain exactly one element. Note: Applies to qwen-audio-3.1-tts-plus, qwen-audio-3.1-tts-flash, qwen-audio-3.0-tts-plus, qwen-audio-3.0-tts-flash, qwen-audio-3.1-realtime-plus, qwen-audio-3.0-realtime-plus, qwen-audio-3.0-realtime-flash, cosyvoice-v3.5-plus, cosyvoice-v3.5-flash, cosyvoice-v3-plus, cosyvoice-v3-flash (cosyvoice-v3.5-plus and cosyvoice-v3.5-flash are available only in China North 2 (Beijing)).
The maximum duration (in seconds) of the reference audio after preprocessing. Valid values: [3.0, 30.0]. Default: 10.0. Note: Applies to qwen-audio-3.1-tts-plus, qwen-audio-3.1-tts-flash, qwen-audio-3.0-tts-plus, qwen-audio-3.0-tts-flash, qwen-audio-3.1-realtime-plus, qwen-audio-3.0-realtime-plus, qwen-audio-3.0-realtime-flash, cosyvoice-v3.5-plus, cosyvoice-v3.5-flash, cosyvoice-v3-flash (cosyvoice-v3.5-plus and cosyvoice-v3.5-flash are available only in China North 2 (Beijing)).
parameter(String, Object)
Object
Sets custom parameters, such as parameter("language_hints", Arrays.asList("en")), parameter("max_prompt_audio_length", 10.0f), parameter("enable_preprocess", false), and parameter("enable_volume_normalization", "false").
Whether to enable audio preprocessing (noise reduction, audio enhancement, and volume normalization). Enable this for recordings with background noise. Disable it for recordings in quiet environments to preserve the original voice characteristics. Default: false. Note: Applies to qwen-audio-3.1-tts-plus, qwen-audio-3.1-tts-flash, qwen-audio-3.0-tts-plus, qwen-audio-3.0-tts-flash, qwen-audio-3.1-realtime-plus, qwen-audio-3.0-realtime-plus, qwen-audio-3.0-realtime-flash, cosyvoice-v3.5-plus, cosyvoice-v3.5-flash, cosyvoice-v3-flash (cosyvoice-v3.5-plus and cosyvoice-v3.5-flash are available only in China North 2 (Beijing)).
enable_volume_normalization
String
No
Whether to normalize the volume of the sample audio used for voice cloning. Valid values are "true" and "false". When enabled, audio synthesized with the created voice may have a different volume than audio synthesized with a voice created with this parameter disabled. Default: "false".
import com.alibaba.dashscope.audio.ttsv2.enrollment.Voice;import com.alibaba.dashscope.audio.ttsv2.enrollment.VoiceEnrollmentParam;import com.alibaba.dashscope.audio.ttsv2.enrollment.VoiceEnrollmentService;import com.alibaba.dashscope.utils.Constants;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.util.Arrays;public class Main { private static final Logger logger = LoggerFactory.getLogger(Main.class); public static void main(String[] args) { // Singapore (ap-southeast-1). For another region, replace ap-southeast-1 in the URL. // API keys are region-specific. See https://docs.qwencloud.com/developer-guides/getting-started/regions Constants.baseHttpApiUrl = "https://ap-southeast-1.maas.qwencloudapi.com/api/v1"; String apiKey = System.getenv("DASHSCOPE_API_KEY"); String targetModel = "qwen-audio-3.0-tts-flash"; String prefix = "myvoice"; String fileUrl = "https://your-audio-file-url"; String cloneModelName = "voice-enrollment"; try { VoiceEnrollmentService service = new VoiceEnrollmentService(apiKey); Voice myVoice = service.createVoice( targetModel, prefix, fileUrl, VoiceEnrollmentParam.builder() .model(cloneModelName) .parameter("language_hints", Arrays.asList("en")) // .parameter("max_prompt_audio_length", 10.0f) // .parameter("enable_preprocess", false) // .parameter("enable_volume_normalization", "false") .build()); logger.info("Voice creation submitted. Request ID: {}", service.getLastRequestId()); logger.info("Generated Voice ID: {}", myVoice.getVoiceId()); } catch (Exception e) { logger.error("Failed to create voice", e); } }}
For a local WAV file, add the following assignment inside the try block above, before calling createVoice. To update a voice, also pass the Data URI through the url parameter of updateVoice. Replace sample.wav with your local audio path.
This example requires the third-party library com.google.gson.Gson.
Copy
import com.alibaba.dashscope.audio.ttsv2.enrollment.Voice;import com.alibaba.dashscope.audio.ttsv2.enrollment.VoiceEnrollmentService;import com.alibaba.dashscope.exception.InputRequiredException;import com.alibaba.dashscope.exception.NoApiKeyException;import com.alibaba.dashscope.utils.Constants;import com.google.gson.Gson;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class Main { public static String apiKey = System.getenv("DASHSCOPE_API_KEY"); // Replace with your API key if not using an environment variable private static String prefix = "myvoice"; // Replace with your actual value private static final Logger logger = LoggerFactory.getLogger(Main.class); public static void main(String[] args) throws NoApiKeyException, InputRequiredException { // Singapore (ap-southeast-1). For another region, replace ap-southeast-1 in the URL. // API keys are region-specific. See https://docs.qwencloud.com/developer-guides/getting-started/regions Constants.baseHttpApiUrl = "https://ap-southeast-1.maas.qwencloudapi.com/api/v1"; VoiceEnrollmentService service = new VoiceEnrollmentService(apiKey); // List voices Voice[] voices = service.listVoice(prefix, 0, 10); logger.info("List successful. Request ID: {}", service.getLastRequestId()); logger.info("Voices Details: {}", new Gson().toJson(voices)); }}
This example requires the third-party library com.google.gson.Gson.
Copy
import com.alibaba.dashscope.audio.ttsv2.enrollment.Voice;import com.alibaba.dashscope.audio.ttsv2.enrollment.VoiceEnrollmentService;import com.alibaba.dashscope.exception.InputRequiredException;import com.alibaba.dashscope.exception.NoApiKeyException;import com.alibaba.dashscope.utils.Constants;import com.google.gson.Gson;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class Main { public static String apiKey = System.getenv("DASHSCOPE_API_KEY"); // Replace with your API key if not using an environment variable private static String voiceId = "qwen-audio-3.0-tts-flash-myvoice-xxx"; // Replace with your actual value private static final Logger logger = LoggerFactory.getLogger(Main.class); public static void main(String[] args) throws NoApiKeyException, InputRequiredException { // Singapore (ap-southeast-1). For another region, replace ap-southeast-1 in the URL. // API keys are region-specific. See https://docs.qwencloud.com/developer-guides/getting-started/regions Constants.baseHttpApiUrl = "https://ap-southeast-1.maas.qwencloudapi.com/api/v1"; VoiceEnrollmentService service = new VoiceEnrollmentService(apiKey); Voice voice = service.queryVoice(voiceId); logger.info("Query successful. Request ID: {}", service.getLastRequestId()); logger.info("Voice Details: {}", new Gson().toJson(voice)); }}
import com.alibaba.dashscope.audio.ttsv2.enrollment.VoiceEnrollmentService;import com.alibaba.dashscope.exception.InputRequiredException;import com.alibaba.dashscope.exception.NoApiKeyException;import com.alibaba.dashscope.utils.Constants;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class Main { public static String apiKey = System.getenv("DASHSCOPE_API_KEY"); // Replace with your API key if not using an environment variable private static String fileUrl = "https://your-audio-file-url"; // Replace with your actual value private static String voiceId = "qwen-audio-3.0-tts-flash-myvoice-xxx"; // Replace with your actual value private static final Logger logger = LoggerFactory.getLogger(Main.class); public static void main(String[] args) throws NoApiKeyException, InputRequiredException { // Singapore (ap-southeast-1). For another region, replace ap-southeast-1 in the URL. // API keys are region-specific. See https://docs.qwencloud.com/developer-guides/getting-started/regions Constants.baseHttpApiUrl = "https://ap-southeast-1.maas.qwencloudapi.com/api/v1"; VoiceEnrollmentService service = new VoiceEnrollmentService(apiKey); // Update the voice service.updateVoice(voiceId, fileUrl); logger.info("Update submitted. Request ID: {}", service.getLastRequestId()); }}
import com.alibaba.dashscope.audio.ttsv2.enrollment.VoiceEnrollmentService;import com.alibaba.dashscope.exception.InputRequiredException;import com.alibaba.dashscope.exception.NoApiKeyException;import com.alibaba.dashscope.utils.Constants;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class Main { public static String apiKey = System.getenv("DASHSCOPE_API_KEY"); // Replace with your API key if not using an environment variable private static String voiceId = "qwen-audio-3.0-tts-flash-myvoice-xxx"; // Replace with your actual value private static final Logger logger = LoggerFactory.getLogger(Main.class); public static void main(String[] args) throws NoApiKeyException, InputRequiredException { // Singapore (ap-southeast-1). For another region, replace ap-southeast-1 in the URL. // API keys are region-specific. See https://docs.qwencloud.com/developer-guides/getting-started/regions Constants.baseHttpApiUrl = "https://ap-southeast-1.maas.qwencloudapi.com/api/v1"; VoiceEnrollmentService service = new VoiceEnrollmentService(apiKey); // Delete the voice service.deleteVoice(voiceId); logger.info("Deletion submitted. Request ID: {}", service.getLastRequestId()); }}