Kloning suara Qwen menggunakan model ekstraksi fitur untuk mengkloning suara tanpa pelatihan. Cukup berikan klip audio berdurasi 10 hingga 20 detik untuk menghasilkan suara kustom yang sangat mirip dan terdengar alami. Kloning suara dan sintesis suara merupakan dua langkah berurutan. Dokumen ini mencakup parameter dan detail antarmuka kloning suara. Untuk sintesis suara, lihat Sintesis suara Real-time - Qwen atau Sintesis suara - Qwen.
Panduan pengguna: Untuk deskripsi model dan rekomendasi pemilihan, lihat Sintesis suara Real-time - Qwen atau Sintesis suara - Qwen.
Dokumen ini hanya berlaku untuk antarmuka kloning suara Qwen. Jika Anda menggunakan model CosyVoice, lihat API kloning suara CosyVoice.
Persyaratan audio
Audio input berkualitas tinggi sangat penting untuk hasil kloning optimal.
Item | Persyaratan |
Format yang didukung | WAV (16-bit), MP3, M4A |
Durasi audio | Disarankan: 10–20 detik. Maksimum: 60 detik. |
Ukuran file | < 10 MB |
Tingkat sampel | ≥ 24 kHz |
Saluran suara | Mono |
Konten | Audio harus berisi minimal 3 detik ucapan jelas yang berkelanjutan tanpa kebisingan latar belakang. Sisa durasi boleh mencakup jeda pendek (≤ 2 detik). Hindari musik latar, kebisingan, atau suara lain di seluruh klip untuk memastikan konten ucapan inti berkualitas tinggi. Gunakan audio ucapan normal sebagai input. Jangan unggah lagu atau audio bernyanyi untuk memastikan hasil kloning akurat dan dapat digunakan. |
Bahasa | Chinese (zh), English (en), German (de), Italian (it), Portuguese (pt), Spanish (es), Japanese (ja), Korean (ko), French (fr), Russian (ru) |
Memulai: Dari kloning hingga sintesis
1. Alur kerja
Kloning suara dan sintesis suara adalah dua langkah terpisah namun saling terkait yang mengikuti alur kerja "buat dulu, gunakan kemudian":
Buat suara
Panggil antarmuka Buat suara dan unggah klip audio. Sistem menganalisis audio dan membuat suara kloning kustom. Anda harus menentukan
target_model, yang menentukan model sintesis suara yang akan menggerakkan suara yang dibuat.Jika Anda sudah memiliki suara (periksa dengan memanggil antarmuka Daftar suara), lewati langkah ini dan lanjutkan ke langkah berikutnya.
Gunakan suara untuk sintesis ucapan
Panggil antarmuka sintesis suara dan masukkan suara dari langkah sebelumnya. Model sintesis suara yang ditentukan di sini harus sesuai dengan
target_modeldari langkah sebelumnya.
2. Konfigurasi model dan persiapan
Pilih model yang sesuai dan lengkapi persiapan yang diperlukan.
Konfigurasi model
Tentukan dua model berikut untuk kloning suara:
Model kloning suara: qwen-voice-enrollment
Model sintesis suara yang menggerakkan suara:
Qwen3-TTS-VC-Realtime (lihat Sintesis suara Real-time - Qwen):
qwen3-tts-vc-realtime-2026-01-15
qwen3-tts-vc-realtime-2025-11-27
Qwen3-TTS-VC (lihat Sintesis suara - Qwen):
qwen3-tts-vc-2026-01-22
Persiapan
Dapatkan Kunci API: Dapatkan Kunci API. Untuk keamanan, atur Kunci API Anda sebagai Variabel lingkungan.
Instal SDK: Pastikan Anda telah menginstal SDK DashScope versi terbaru.
Persiapkan audio untuk kloning: Audio harus memenuhi persyaratan audio.
3. Contoh end-to-end
Contoh berikut menunjukkan cara menggunakan suara kloning kustom dalam sintesis suara untuk menghasilkan output yang sangat mirip dengan suara aslinya.
Prinsip utama:
target_model(model sintesis suara yang menggerakkan suara) yang ditentukan saat kloning suara harus sesuai dengan model yang digunakan dalam panggilan sintesis suara. Jika tidak, sintesis akan gagal.Contoh ini menggunakan file audio lokal
voice.mp3untuk kloning suara. Gantilah dengan file Anda sendiri saat menjalankan kode.
Sintesis streaming dua arah
Berlaku untuk model seri Qwen3-TTS-VC-Realtime. Untuk informasi lebih lanjut, lihat Sintesis suara Real-time - Qwen.
Python
# coding=utf-8
# Petunjuk instalasi pyaudio:
# APPLE Mac OS X
# brew install portaudio
# pip install pyaudio
# Debian/Ubuntu
# sudo apt-get install python-pyaudio python3-pyaudio
# atau
# pip install pyaudio
# CentOS
# sudo yum install -y portaudio portaudio-devel && pip install pyaudio
# Microsoft Windows
# python -m pip install pyaudio
import pyaudio
import os
import requests
import base64
import pathlib
import threading
import time
import dashscope # Versi SDK Python DashScope minimal 1.23.9
from dashscope.audio.qwen_tts_realtime import QwenTtsRealtime, QwenTtsRealtimeCallback, AudioFormat
# ======= Konstanta =======
DEFAULT_TARGET_MODEL = "qwen3-tts-vc-realtime-2026-01-15" # Gunakan model yang sama untuk kloning suara dan sintesis suara
DEFAULT_PREFERRED_NAME = "guanyu"
DEFAULT_AUDIO_MIME_TYPE = "audio/mpeg"
VOICE_FILE_PATH = "voice.mp3" # Jalur relatif ke file audio lokal untuk kloning suara
TEXT_TO_SYNTHESIZE = [
'Right? I really love this kind of supermarket,',
'especially during Chinese New Year',
'when I go shopping',
'I feel',
'super super happy!',
'I want to buy so many things!'
]
def create_voice(file_path: str,
target_model: str = DEFAULT_TARGET_MODEL,
preferred_name: str = DEFAULT_PREFERRED_NAME,
audio_mime_type: str = DEFAULT_AUDIO_MIME_TYPE) -> str:
"""
Buat suara dan kembalikan parameter suara
"""
# Kunci API berbeda antara wilayah Singapura dan Beijing. Dapatkan Kunci API Anda: https://www.alibabacloud.com/help/zh/model-studio/get-api-key
# Ganti dengan Kunci API Studio Model Anda jika variabel lingkungan belum dikonfigurasi: api_key = "sk-xxx"
api_key = os.getenv("DASHSCOPE_API_KEY")
file_path_obj = pathlib.Path(file_path)
if not file_path_obj.exists():
raise FileNotFoundError(f"File audio tidak ditemukan: {file_path}")
base64_str = base64.b64encode(file_path_obj.read_bytes()).decode()
data_uri = f"data:{audio_mime_type};base64,{base64_str}"
# URL wilayah Singapura. Ganti dengan https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization untuk model wilayah Beijing
url = "https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization"
payload = {
"model": "qwen-voice-enrollment", # Jangan ubah nilai ini
"input": {
"action": "create",
"target_model": target_model,
"preferred_name": preferred_name,
"audio": {"data": data_uri}
}
}
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
resp = requests.post(url, json=payload, headers=headers)
if resp.status_code != 200:
raise RuntimeError(f"Pembuatan suara gagal: {resp.status_code}, {resp.text}")
try:
return resp.json()["output"]["voice"]
except (KeyError, ValueError) as e:
raise RuntimeError(f"Gagal mengurai respons suara: {e}")
def init_dashscope_api_key():
"""
Inisialisasi Kunci API SDK DashScope
"""
# Kunci API berbeda antara wilayah Singapura dan Beijing. Dapatkan Kunci API Anda: https://www.alibabacloud.com/help/zh/model-studio/get-api-key
# Ganti dengan Kunci API Studio Model Anda jika variabel lingkungan belum dikonfigurasi: dashscope.api_key = "sk-xxx"
dashscope.api_key = os.getenv("DASHSCOPE_API_KEY")
# ======= Kelas callback =======
class MyCallback(QwenTtsRealtimeCallback):
"""
Callback streaming TTS kustom
"""
def __init__(self):
self.complete_event = threading.Event()
self._player = pyaudio.PyAudio()
self._stream = self._player.open(
format=pyaudio.paInt16, channels=1, rate=24000, output=True
)
def on_open(self) -> None:
print('[TTS] Koneksi berhasil dibuat')
def on_close(self, close_status_code, close_msg) -> None:
self._stream.stop_stream()
self._stream.close()
self._player.terminate()
print(f'[TTS] Koneksi ditutup kode={close_status_code}, msg={close_msg}')
def on_event(self, response: dict) -> None:
try:
event_type = response.get('type', '')
if event_type == 'session.created':
print(f'[TTS] Sesi dimulai: {response["session"]["id"]}')
elif event_type == 'response.audio.delta':
audio_data = base64.b64decode(response['delta'])
self._stream.write(audio_data)
elif event_type == 'response.done':
print(f'[TTS] Respons selesai, ID Respons: {qwen_tts_realtime.get_last_response_id()}')
elif event_type == 'session.finished':
print('[TTS] Sesi berakhir')
self.complete_event.set()
except Exception as e:
print(f'[Error] Kesalahan menangani event callback: {e}')
def wait_for_finished(self):
self.complete_event.wait()
# ======= Logika eksekusi utama =======
if __name__ == '__main__':
init_dashscope_api_key()
print('[System] Menginisialisasi Qwen TTS Realtime ...')
callback = MyCallback()
qwen_tts_realtime = QwenTtsRealtime(
model=DEFAULT_TARGET_MODEL,
callback=callback,
# URL wilayah Singapura. Ganti dengan wss://dashscope.aliyuncs.com/api-ws/v1/realtime untuk model wilayah Beijing
url='wss://dashscope-intl.aliyuncs.com/api-ws/v1/realtime'
)
qwen_tts_realtime.connect()
qwen_tts_realtime.update_session(
voice=create_voice(VOICE_FILE_PATH), # Ganti parameter suara dengan suara kustom hasil kloning
response_format=AudioFormat.PCM_24000HZ_MONO_16BIT,
mode='server_commit'
)
for text_chunk in TEXT_TO_SYNTHESIZE:
print(f'[Mengirim teks]: {text_chunk}')
qwen_tts_realtime.append_text(text_chunk)
time.sleep(0.1)
qwen_tts_realtime.finish()
callback.wait_for_finished()
print(f'[Metric] session_id={qwen_tts_realtime.get_session_id()}, '
f'first_audio_delay={qwen_tts_realtime.get_first_audio_delay()}s')
Java
Anda perlu mengimpor dependensi Gson. Jika menggunakan Maven atau Gradle, tambahkan dependensi sebagai berikut:
Maven
Tambahkan berikut ke pom.xml Anda:
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.13.1</version>
</dependency>
Gradle
Tambahkan berikut ke build.gradle Anda:
// https://mvnrepository.com/artifact/com.google.code.gson/gson
implementation("com.google.code.gson:gson:2.13.1")
import com.alibaba.dashscope.audio.qwen_tts_realtime.*;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import javax.sound.sampled.*;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.file.*;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.Queue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicReference;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicBoolean;
public class Main {
// ===== Konstanta =====
// Gunakan model yang sama untuk kloning suara dan sintesis suara
private static final String TARGET_MODEL = "qwen3-tts-vc-realtime-2026-01-15";
private static final String PREFERRED_NAME = "guanyu";
// Jalur relatif ke file audio lokal untuk kloning suara
private static final String AUDIO_FILE = "voice.mp3";
private static final String AUDIO_MIME_TYPE = "audio/mpeg";
private static String[] textToSynthesize = {
"Right? I really love this kind of supermarket",
"especially during Chinese New Year",
"when I go shopping",
"I feel",
"super super happy!",
"I want to buy so many things!"
};
// Hasilkan data URI
public static String toDataUrl(String filePath) throws IOException {
byte[] bytes = Files.readAllBytes(Paths.get(filePath));
String encoded = Base64.getEncoder().encodeToString(bytes);
return "data:" + AUDIO_MIME_TYPE + ";base64," + encoded;
}
// Panggil API untuk membuat suara
public static String createVoice() throws Exception {
// Kunci API berbeda antara wilayah Singapura dan Beijing. Dapatkan Kunci API Anda: https://www.alibabacloud.com/help/zh/model-studio/get-api-key
// Ganti dengan Kunci API Studio Model Anda jika variabel lingkungan belum dikonfigurasi: String apiKey = "sk-xxx"
String apiKey = System.getenv("DASHSCOPE_API_KEY");
String jsonPayload =
"{"
+ "\"model\": \"qwen-voice-enrollment\"," // Jangan ubah nilai ini
+ "\"input\": {"
+ "\"action\": \"create\","
+ "\"target_model\": \"" + TARGET_MODEL + "\","
+ "\"preferred_name\": \"" + PREFERRED_NAME + "\","
+ "\"audio\": {"
+ "\"data\": \"" + toDataUrl(AUDIO_FILE) + "\""
+ "}"
+ "}"
+ "}";
HttpURLConnection con = (HttpURLConnection) new URL("https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization").openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Authorization", "Bearer " + apiKey);
con.setRequestProperty("Content-Type", "application/json");
con.setDoOutput(true);
try (OutputStream os = con.getOutputStream()) {
os.write(jsonPayload.getBytes(StandardCharsets.UTF_8));
}
int status = con.getResponseCode();
System.out.println("Kode status HTTP: " + status);
try (BufferedReader br = new BufferedReader(
new InputStreamReader(status >= 200 && status < 300 ? con.getInputStream() : con.getErrorStream(),
StandardCharsets.UTF_8))) {
StringBuilder response = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
response.append(line);
}
System.out.println("Konten respons: " + response);
if (status == 200) {
JsonObject jsonObj = new Gson().fromJson(response.toString(), JsonObject.class);
return jsonObj.getAsJsonObject("output").get("voice").getAsString();
}
throw new IOException("Pembuatan suara gagal: " + status + " - " + response);
}
}
// Kelas pemutar audio PCM real-time
public static class RealtimePcmPlayer {
private int sampleRate;
private SourceDataLine line;
private AudioFormat audioFormat;
private Thread decoderThread;
private Thread playerThread;
private AtomicBoolean stopped = new AtomicBoolean(false);
private Queue<String> b64AudioBuffer = new ConcurrentLinkedQueue<>();
private Queue<byte[]> RawAudioBuffer = new ConcurrentLinkedQueue<>();
// Konstruktor untuk menginisialisasi format audio dan saluran audio
public RealtimePcmPlayer(int sampleRate) throws LineUnavailableException {
this.sampleRate = sampleRate;
this.audioFormat = new AudioFormat(this.sampleRate, 16, 1, true, false);
DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat);
line = (SourceDataLine) AudioSystem.getLine(info);
line.open(audioFormat);
line.start();
decoderThread = new Thread(new Runnable() {
@Override
public void run() {
while (!stopped.get()) {
String b64Audio = b64AudioBuffer.poll();
if (b64Audio != null) {
byte[] rawAudio = Base64.getDecoder().decode(b64Audio);
RawAudioBuffer.add(rawAudio);
} else {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
});
playerThread = new Thread(new Runnable() {
@Override
public void run() {
while (!stopped.get()) {
byte[] rawAudio = RawAudioBuffer.poll();
if (rawAudio != null) {
try {
playChunk(rawAudio);
} catch (IOException e) {
throw new RuntimeException(e);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
} else {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
});
decoderThread.start();
playerThread.start();
}
// Putar potongan audio dan blokir hingga pemutaran selesai
private void playChunk(byte[] chunk) throws IOException, InterruptedException {
if (chunk == null || chunk.length == 0) return;
int bytesWritten = 0;
while (bytesWritten < chunk.length) {
bytesWritten += line.write(chunk, bytesWritten, chunk.length - bytesWritten);
}
int audioLength = chunk.length / (this.sampleRate*2/1000);
// Tunggu hingga audio di buffer selesai diputar
Thread.sleep(audioLength - 10);
}
public void write(String b64Audio) {
b64AudioBuffer.add(b64Audio);
}
public void cancel() {
b64AudioBuffer.clear();
RawAudioBuffer.clear();
}
public void waitForComplete() throws InterruptedException {
while (!b64AudioBuffer.isEmpty() || !RawAudioBuffer.isEmpty()) {
Thread.sleep(100);
}
line.drain();
}
public void shutdown() throws InterruptedException {
stopped.set(true);
decoderThread.join();
playerThread.join();
if (line != null && line.isRunning()) {
line.drain();
line.close();
}
}
}
public static void main(String[] args) throws Exception {
QwenTtsRealtimeParam param = QwenTtsRealtimeParam.builder()
.model(TARGET_MODEL)
// URL wilayah Singapura. Ganti dengan wss://dashscope.aliyuncs.com/api-ws/v1/realtime untuk model wilayah Beijing
.url("wss://dashscope-intl.aliyuncs.com/api-ws/v1/realtime")
// Kunci API berbeda antara wilayah Singapura dan Beijing. Dapatkan Kunci API Anda: https://www.alibabacloud.com/help/zh/model-studio/get-api-key
// Ganti dengan Kunci API Studio Model Anda jika variabel lingkungan belum dikonfigurasi: .apikey("sk-xxx")
.apikey(System.getenv("DASHSCOPE_API_KEY"))
.build();
AtomicReference<CountDownLatch> completeLatch = new AtomicReference<>(new CountDownLatch(1));
final AtomicReference<QwenTtsRealtime> qwenTtsRef = new AtomicReference<>(null);
// Buat instance pemutar audio real-time
RealtimePcmPlayer audioPlayer = new RealtimePcmPlayer(24000);
QwenTtsRealtime qwenTtsRealtime = new QwenTtsRealtime(param, new QwenTtsRealtimeCallback() {
@Override
public void onOpen() {
// Tangani koneksi berhasil dibuat
}
@Override
public void onEvent(JsonObject message) {
String type = message.get("type").getAsString();
switch(type) {
case "session.created":
// Tangani sesi dibuat
break;
case "response.audio.delta":
String recvAudioB64 = message.get("delta").getAsString();
// Putar audio secara real-time
audioPlayer.write(recvAudioB64);
break;
case "response.done":
// Tangani respons selesai
break;
case "session.finished":
// Tangani sesi berakhir
completeLatch.get().countDown();
default:
break;
}
}
@Override
public void onClose(int code, String reason) {
// Tangani koneksi ditutup
}
});
qwenTtsRef.set(qwenTtsRealtime);
try {
qwenTtsRealtime.connect();
} catch (NoApiKeyException e) {
throw new RuntimeException(e);
}
QwenTtsRealtimeConfig config = QwenTtsRealtimeConfig.builder()
.voice(createVoice()) // Ganti parameter suara dengan suara kustom hasil kloning
.responseFormat(QwenTtsRealtimeAudioFormat.PCM_24000HZ_MONO_16BIT)
.mode("server_commit")
.build();
qwenTtsRealtime.updateSession(config);
for (String text:textToSynthesize) {
qwenTtsRealtime.appendText(text);
Thread.sleep(100);
}
qwenTtsRealtime.finish();
completeLatch.get().await();
// Tunggu hingga pemutaran audio selesai dan matikan pemutar
audioPlayer.waitForComplete();
audioPlayer.shutdown();
System.exit(0);
}
}
Sintesis non-streaming/streaming satu arah
Berlaku untuk model seri Qwen3-TTS-VC. Untuk detailnya, lihat Sintesis suara - Qwen.
Contoh ini merujuk pada kode contoh SDK DashScope non-streaming untuk sintesis suara menggunakan suara sistem. Contoh ini mengganti parameter voice dengan suara kloning kustom. Untuk sintesis streaming satu arah, lihat Sintesis suara - Qwen.
Python
import os
import requests
import base64
import pathlib
import dashscope
# ======= Konfigurasi konstanta =======
DEFAULT_TARGET_MODEL = "qwen3-tts-vc-2026-01-22" # Gunakan model yang sama untuk kloning suara dan sintesis suara
DEFAULT_PREFERRED_NAME = "guanyu"
DEFAULT_AUDIO_MIME_TYPE = "audio/mpeg"
VOICE_FILE_PATH = "voice.mp3" # Jalur relatif ke file audio lokal yang digunakan untuk kloning suara
def create_voice(file_path: str,
target_model: str = DEFAULT_TARGET_MODEL,
preferred_name: str = DEFAULT_PREFERRED_NAME,
audio_mime_type: str = DEFAULT_AUDIO_MIME_TYPE) -> str:
"""
Buat suara dan kembalikan parameter suara.
"""
# Kunci API berbeda antara wilayah Singapura dan Beijing. Dapatkan Kunci API Anda: https://www.alibabacloud.com/help/zh/model-studio/get-api-key
# Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan: api_key = "sk-xxx"
api_key = os.getenv("DASHSCOPE_API_KEY")
file_path_obj = pathlib.Path(file_path)
if not file_path_obj.exists():
raise FileNotFoundError(f"File audio tidak ada: {file_path}")
base64_str = base64.b64encode(file_path_obj.read_bytes()).decode()
data_uri = f"data:{audio_mime_type};base64,{base64_str}"
# URL berikut untuk wilayah Singapura. Jika Anda menggunakan model di wilayah Beijing, ganti URL dengan: https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization
url = "https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization"
payload = {
"model": "qwen-voice-enrollment", # Jangan ubah nilai ini
"input": {
"action": "create",
"target_model": target_model,
"preferred_name": preferred_name,
"audio": {"data": data_uri}
}
}
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
resp = requests.post(url, json=payload, headers=headers)
if resp.status_code != 200:
raise RuntimeError(f"Gagal membuat suara: {resp.status_code}, {resp.text}")
try:
return resp.json()["output"]["voice"]
except (KeyError, ValueError) as e:
raise RuntimeError(f"Gagal mengurai respons suara: {e}")
if __name__ == '__main__':
# URL berikut untuk wilayah Singapura. Jika Anda menggunakan model di wilayah Beijing, ganti URL dengan: https://dashscope.aliyuncs.com/api/v1
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'
text = "How's the weather today?"
# Penggunaan antarmuka SpeechSynthesizer: dashscope.audio.qwen_tts.SpeechSynthesizer.call(...)
response = dashscope.MultiModalConversation.call(
model=DEFAULT_TARGET_MODEL,
# Kunci API berbeda antara wilayah Singapura dan Beijing. Dapatkan Kunci API Anda: https://www.alibabacloud.com/help/zh/model-studio/get-api-key
# Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan: api_key = "sk-xxx"
api_key=os.getenv("DASHSCOPE_API_KEY"),
text=text,
voice=create_voice(VOICE_FILE_PATH), # Ganti parameter suara dengan suara kustom hasil kloning
stream=False
)
print(response)Java
Tambahkan dependensi Gson. Jika menggunakan Maven atau Gradle, tambahkan dependensi sebagai berikut:
Maven
Tambahkan konten berikut ke pom.xml Anda:
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.13.1</version>
</dependency>Gradle
Tambahkan konten berikut ke build.gradle Anda:
// https://mvnrepository.com/artifact/com.google.code.gson/gson
implementation("com.google.code.gson:gson:2.13.1")Saat menggunakan suara kustom hasil kloning suara untuk sintesis suara, atur suara sebagai berikut:
MultiModalConversationParam param = MultiModalConversationParam.builder()
.parameter("voice", "your_voice") // Ganti parameter suara dengan suara kustom hasil kloning
.build();import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversation;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationParam;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationResult;
import com.alibaba.dashscope.utils.Constants;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.file.*;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class Main {
// ===== Definisi konstanta =====
// Gunakan model yang sama untuk kloning suara dan sintesis suara
private static final String TARGET_MODEL = "qwen3-tts-vc-2026-01-22";
private static final String PREFERRED_NAME = "guanyu";
// Jalur relatif ke file audio lokal yang digunakan untuk kloning suara
private static final String AUDIO_FILE = "voice.mp3";
private static final String AUDIO_MIME_TYPE = "audio/mpeg";
// Hasilkan URI data
public static String toDataUrl(String filePath) throws IOException {
byte[] bytes = Files.readAllBytes(Paths.get(filePath));
String encoded = Base64.getEncoder().encodeToString(bytes);
return "data:" + AUDIO_MIME_TYPE + ";base64," + encoded;
}
// Panggil API untuk membuat suara
public static String createVoice() throws Exception {
// Kunci API berbeda antara wilayah Singapura dan Beijing. Dapatkan Kunci API Anda: https://www.alibabacloud.com/help/zh/model-studio/get-api-key
// Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan: String apiKey = "sk-xxx"
String apiKey = System.getenv("DASHSCOPE_API_KEY");
String jsonPayload =
"{"
+ "\"model\": \"qwen-voice-enrollment\"," // Jangan ubah nilai ini
+ "\"input\": {"
+ "\"action\": \"create\","
+ "\"target_model\": \"" + TARGET_MODEL + "\","
+ "\"preferred_name\": \"" + PREFERRED_NAME + "\","
+ "\"audio\": {"
+ "\"data\": \"" + toDataUrl(AUDIO_FILE) + "\""
+ "}"
+ "}"
+ "}";
// URL berikut untuk wilayah Singapura. Jika Anda menggunakan model di wilayah Beijing, ganti URL dengan: https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization
String url = "https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization";
HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Authorization", "Bearer " + apiKey);
con.setRequestProperty("Content-Type", "application/json");
con.setDoOutput(true);
try (OutputStream os = con.getOutputStream()) {
os.write(jsonPayload.getBytes(StandardCharsets.UTF_8));
}
int status = con.getResponseCode();
System.out.println("Kode status HTTP: " + status);
try (BufferedReader br = new BufferedReader(
new InputStreamReader(status >= 200 && status < 300 ? con.getInputStream() : con.getErrorStream(),
StandardCharsets.UTF_8))) {
StringBuilder response = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
response.append(line);
}
System.out.println("Konten respons: " + response);
if (status == 200) {
JsonObject jsonObj = new Gson().fromJson(response.toString(), JsonObject.class);
return jsonObj.getAsJsonObject("output").get("voice").getAsString();
}
throw new IOException("Gagal membuat suara: " + status + " - " + response);
}
}
public static void call() throws Exception {
MultiModalConversation conv = new MultiModalConversation();
MultiModalConversationParam param = MultiModalConversationParam.builder()
// Kunci API berbeda antara wilayah Singapura dan Beijing. Dapatkan Kunci API Anda: https://www.alibabacloud.com/help/zh/model-studio/get-api-key
// Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan: .apikey("sk-xxx")
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
.model(TARGET_MODEL)
.text("How's the weather today?")
.parameter("voice", createVoice()) // Ganti parameter suara dengan suara kustom hasil kloning
.build();
MultiModalConversationResult result = conv.call(param);
String audioUrl = result.getOutput().getAudio().getUrl();
System.out.print(audioUrl);
// Unduh file audio secara lokal
try (InputStream in = new URL(audioUrl).openStream();
FileOutputStream out = new FileOutputStream("downloaded_audio.wav")) {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = in.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead);
}
System.out.println("\nFile audio diunduh secara lokal: downloaded_audio.wav");
} catch (Exception e) {
System.out.println("\nKesalahan mengunduh file audio: " + e.getMessage());
}
}
public static void main(String[] args) {
try {
// URL berikut untuk wilayah Singapura. Jika Anda menggunakan model di wilayah Beijing, ganti URL dengan: https://dashscope.aliyuncs.com/api/v1
Constants.baseHttpApiUrl = "https://dashscope-intl.aliyuncs.com/api/v1";
call();
} catch (Exception e) {
System.out.println(e.getMessage());
}
System.exit(0);
}
}Referensi API
Saat menggunakan API berbeda, pastikan Anda menggunakan akun yang sama.
Buat suara
Unggah audio untuk kloning dan buat suara kustom.
URL
Tiongkok Daratan:
POST https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customizationInternasional:
POST https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customizationHeader permintaan
Parameter
Tipe
Wajib
Deskripsi
Authorization
string
Token autentikasi dalam format
Bearer <your_api_key>. Ganti "<your_api_key>" dengan Kunci API Anda yang sebenarnya.Content-Type
string
Jenis media data yang dikirimkan dalam badan permintaan. Tetap sebagai
application/json.Body permintaan
Badan permintaan berisi semua parameter permintaan. Abaikan bidang opsional jika tidak diperlukan.
PentingPerhatikan parameter berikut:
model: Model kloning suara, tetap sebagaiqwen-voice-enrollmenttarget_model: Model sintesis suara yang menggerakkan suara. Harus sesuai dengan model sintesis suara yang digunakan dalam panggilan sintesis suara berikutnya. Jika tidak, sintesis akan gagal.
{ "model": "qwen-voice-enrollment", "input": { "action": "create", "target_model": "qwen3-tts-vc-realtime-2026-01-15", "preferred_name": "guanyu", "audio": { "data": "https://xxx.wav" }, "text": "Opsional. Masukkan teks yang sesuai dengan audio.data.", "language": "Opsional. Masukkan bahasa audio.data, seperti zh." } }Parameter permintaan
Parameter
Tipe
Bawaan
Wajib
Deskripsi
model
string
-
Model kloning suara, tetap sebagai
qwen-voice-enrollment.action
string
-
Jenis operasi, tetap sebagai
create.target_model
string
-
Model sintesis suara yang menggerakkan suara. Model yang didukung meliputi (dua jenis):
Qwen3-TTS-VC-Realtime (lihat Sintesis suara Real-time - Qwen):
qwen3-tts-vc-realtime-2026-01-15
qwen3-tts-vc-realtime-2025-11-27
Qwen3-TTS-VC (lihat Sintesis suara - Qwen):
qwen3-tts-vc-2026-01-22
Harus sesuai dengan model sintesis suara yang digunakan dalam panggilan sintesis suara berikutnya. Jika tidak, sintesis akan gagal.
preferred_name
string
-
Berikan nama yang mudah dikenali untuk suara tersebut (maksimal 16 karakter: angka, huruf, dan garis bawah saja). Gunakan pengenal yang terkait dengan peran atau skenario.
Kata kunci ini muncul dalam nama suara hasil kloning. Misalnya, jika kata kuncinya adalah "guanyu", nama suara akhirnya adalah "qwen-tts-vc-guanyu-voice-20250812105009984-838b".
audio.data
string
-
Audio untuk kloning (ikuti Panduan perekaman saat merekam, dan pastikan audio memenuhi Persyaratan audio).
Kirimkan data audio dengan salah satu cara berikut:
Format:
data:<mediatype>;base64,<data><mediatype>: Jenis MIMEWAV:
audio/wavMP3:
audio/mpegM4A:
audio/mp4
<data>: String yang dienkripsi Base64 dari audioPengkodean Base64 memperbesar ukuran berkas. Pastikan ukuran berkas asli dikontrol agar data terkode tetap di bawah 10 MB.
Contoh:
data:audio/wav;base64,SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU4LjI5LjEwMAAAAAAAAAAAAAAA//PAxABQ/BXRbMPe4IQAhl9
URL audio (kami merekomendasikan mengunggah audio ke OSS)
Ukuran file tidak boleh melebihi 10 MB.
URL harus dapat diakses publik dan tidak memerlukan autentikasi.
text
string
-
Teks yang sesuai dengan konten
audio.data.Jika disediakan, server akan membandingkan audio dengan teks ini. Jika keduanya berbeda secara signifikan, server akan mengembalikan Audio.PreprocessError.
language
string
-
Bahasa audio
audio.data.Bahasa yang didukung:
zh(Chinese),en(English),de(German),it(Italian),pt(Portuguese),es(Spanish),ja(Japanese),ko(Korean),fr(French),ru(Russian).Jika menggunakan parameter ini, pastikan bahasa yang ditentukan sesuai dengan bahasa audio.
Parameter respons
Parameter utama:
Parameter
Tipe
Deskripsi
voice
string
Nama suara. Gunakan langsung sebagai parameter
voicedalam antarmuka sintesis suara.target_model
string
Model sintesis suara yang menggerakkan suara. Model yang didukung meliputi (dua jenis):
Qwen3-TTS-VC-Realtime (lihat Sintesis suara Real-time - Qwen):
qwen3-tts-vc-realtime-2026-01-15
qwen3-tts-vc-realtime-2025-11-27
Qwen3-TTS-VC (lihat Sintesis suara - Qwen):
qwen3-tts-vc-2026-01-22
Harus sesuai dengan model sintesis suara yang digunakan dalam panggilan sintesis suara berikutnya. Jika tidak, sintesis akan gagal.
request_id
string
ID permintaan.
count
integer
Jumlah operasi "buat suara" yang ditagih untuk permintaan ini. Biayanya adalah $
. Untuk pembuatan suara, count selalu 1.
Kode contoh
PentingPerhatikan parameter berikut:
model: Model kloning suara, tetap sebagaiqwen-voice-enrollmenttarget_model: Model sintesis suara yang menggerakkan suara. Harus sesuai dengan model sintesis suara yang digunakan dalam panggilan sintesis suara berikutnya. Jika tidak, sintesis akan gagal.
cURL
Jika Anda belum mengonfigurasi Kunci API sebagai variabel lingkungan, ganti
$DASHSCOPE_API_KEYdalam contoh dengan Kunci API Anda yang sebenarnya.https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization<a data-init-id="9f104f338c7kz" href="https://poc-dashscope.aliyuncs.com/api/v1/services/audio/tts/customization" id="35ebbc67890ds">https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization</a># ======= Catatan penting ======= # URL berikut untuk wilayah Singapura. Jika Anda menggunakan model di wilayah Beijing, ganti URL dengan: https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization # Kunci API berbeda antara wilayah Singapura dan Beijing. Dapatkan Kunci API Anda: https://www.alibabacloud.com/help/zh/model-studio/get-api-key # === Hapus komentar ini sebelum eksekusi === curl -X POST <a data-init-id="9f104f338c7kz" href="https://poc-dashscope.aliyuncs.com/api/v1/services/audio/tts/customization" id="35ebbc67890ds">https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization</a> \ -H "Authorization: Bearer $DASHSCOPE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "qwen-voice-enrollment", "input": { "action": "create", "target_model": "qwen3-tts-vc-realtime-2026-01-15", "preferred_name": "guanyu", "audio": { "data": "https://xxx.wav" } } }'Python
import os import requests import base64, pathlib target_model = "qwen3-tts-vc-realtime-2026-01-15" preferred_name = "guanyu" audio_mime_type = "audio/mpeg" file_path = pathlib.Path("input.mp3") base64_str = base64.b64encode(file_path.read_bytes()).decode() data_uri = f"data:{audio_mime_type};base64,{base64_str}" # Kunci API berbeda antara wilayah Singapura dan Beijing. Dapatkan Kunci API Anda: https://www.alibabacloud.com/help/zh/model-studio/get-api-key # Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan: api_key = "sk-xxx" api_key = os.getenv("DASHSCOPE_API_KEY") # URL berikut untuk wilayah Singapura. Jika Anda menggunakan model di wilayah Beijing, ganti URL dengan: https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization url = "https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization" payload = { "model": "qwen-voice-enrollment", # Jangan ubah nilai ini "input": { "action": "create", "target_model": target_model, "preferred_name": preferred_name, "audio": { "data": data_uri } } } headers = { "Authorization": f"Bearer {api_key}", "Content-Type": "application/json" } # Kirim permintaan POST resp = requests.post(url, json=payload, headers=headers) if resp.status_code == 200: data = resp.json() voice = data["output"]["voice"] print(f"Parameter suara yang dihasilkan: {voice}") else: print("Permintaan gagal:", resp.status_code, resp.text)Java
import com.google.gson.Gson; import com.google.gson.JsonObject; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.nio.file.*; import java.util.Base64; public class Main { private static final String TARGET_MODEL = "qwen3-tts-vc-realtime-2026-01-15"; private static final String PREFERRED_NAME = "guanyu"; private static final String AUDIO_FILE = "input.mp3"; private static final String AUDIO_MIME_TYPE = "audio/mpeg"; public static String toDataUrl(String filePath) throws Exception { byte[] bytes = Files.readAllBytes(Paths.get(filePath)); String encoded = Base64.getEncoder().encodeToString(bytes); return "data:" + AUDIO_MIME_TYPE + ";base64," + encoded; } public static void main(String[] args) { // Kunci API berbeda antara wilayah Singapura dan Beijing. Dapatkan Kunci API Anda: https://www.alibabacloud.com/help/zh/model-studio/get-api-key // Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan: String apiKey = "sk-xxx" String apiKey = System.getenv("DASHSCOPE_API_KEY"); // URL berikut untuk wilayah Singapura. Jika Anda menggunakan model di wilayah Beijing, ganti URL dengan: https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization String apiUrl = "https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization"; try { // Bangun badan permintaan JSON (hindari tanda kutip internal) String jsonPayload = "{" + "\"model\": \"qwen-voice-enrollment\"," // Jangan ubah nilai ini + "\"input\": {" + "\"action\": \"create\"," + "\"target_model\": \"" + TARGET_MODEL + "\"," + "\"preferred_name\": \"" + PREFERRED_NAME + "\"," + "\"audio\": {" + "\"data\": \"" + toDataUrl(AUDIO_FILE) + "\"" + "}" + "}" + "}"; HttpURLConnection con = (HttpURLConnection) new URL(apiUrl).openConnection(); con.setRequestMethod("POST"); con.setRequestProperty("Authorization", "Bearer " + apiKey); con.setRequestProperty("Content-Type", "application/json"); con.setDoOutput(true); // Kirim badan permintaan try (OutputStream os = con.getOutputStream()) { os.write(jsonPayload.getBytes("UTF-8")); } int status = con.getResponseCode(); InputStream is = (status >= 200 && status < 300) ? con.getInputStream() : con.getErrorStream(); StringBuilder response = new StringBuilder(); try (BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"))) { String line; while ((line = br.readLine()) != null) { response.append(line); } } System.out.println("Kode status HTTP: " + status); System.out.println("Konten respons: " + response.toString()); if (status == 200) { // Uraikan JSON Gson gson = new Gson(); JsonObject jsonObj = gson.fromJson(response.toString(), JsonObject.class); String voice = jsonObj.getAsJsonObject("output").get("voice").getAsString(); System.out.println("Parameter suara yang dihasilkan: " + voice); } } catch (Exception e) { e.printStackTrace(); } } }
Daftar suara
Menjalankan kueri terpaginasi untuk mencantumkan suara yang telah Anda buat.
URL
Tiongkok Daratan:
POST https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customizationInternasional:
POST https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customizationHeader permintaan
Parameter
Tipe
Wajib
Deskripsi
Authorization
string
Token autentikasi dalam format
Bearer <your_api_key>. Ganti "<your_api_key>" dengan Kunci API Anda yang sebenarnya.Content-Type
string
Jenis media data yang dikirimkan dalam badan permintaan. Tetap sebagai
application/json.Request body
Badan permintaan berisi semua parameter permintaan. Abaikan bidang opsional jika tidak diperlukan.
Pentingmodel: Model kloning suara, tetap sebagaiqwen-voice-enrollment. Jangan ubah.{ "model": "qwen-voice-enrollment", "input": { "action": "list", "page_size": 2, "page_index": 0 } }Parameter permintaan
Parameter
Tipe
Bawaan
Wajib
Deskripsi
model
string
-
Model kloning suara, tetap sebagai
qwen-voice-enrollment.action
string
-
Jenis operasi, tetap sebagai
list.page_index
integer
0
Indeks halaman. Rentang: [0, 1000000].
page_size
integer
10
Entri per halaman. Rentang: [0, 1000000].
Parameter respons
Parameter utama:
Parameter
Tipe
Deskripsi
voice
string
Nama suara. Gunakan langsung sebagai parameter
voicedalam antarmuka sintesis suara.gmt_create
string
Waktu pembuatan suara.
target_model
string
Model sintesis suara yang menggerakkan suara. Model yang didukung meliputi (dua jenis):
Qwen3-TTS-VC-Realtime (lihat Sintesis suara Real-time - Qwen):
qwen3-tts-vc-realtime-2026-01-15
qwen3-tts-vc-realtime-2025-11-27
Qwen3-TTS-VC (lihat Sintesis suara - Qwen):
qwen3-tts-vc-2026-01-22
Harus sesuai dengan model sintesis suara yang digunakan dalam panggilan sintesis suara berikutnya. Jika tidak, sintesis akan gagal.
request_id
string
ID permintaan.
count
integer
Jumlah operasi "buat suara" yang ditagih untuk permintaan ini. Biayanya adalah $
. Pencantuman daftar suara gratis. Oleh karena itu,
countselalu 0.Kode contoh
Pentingmodel: Model kloning suara, tetap sebagaiqwen-voice-enrollment. Jangan ubah.cURL
Jika Anda belum mengonfigurasi Kunci API sebagai variabel lingkungan, ganti
$DASHSCOPE_API_KEYdalam contoh dengan Kunci API Anda yang sebenarnya.# ======= Catatan penting ======= # URL berikut untuk wilayah Singapura. Jika Anda menggunakan model di wilayah Beijing, ganti URL dengan: https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization # Kunci API berbeda antara wilayah Singapura dan Beijing. Dapatkan Kunci API Anda: https://www.alibabacloud.com/help/zh/model-studio/get-api-key # === Hapus komentar ini sebelum eksekusi === curl --location --request POST 'https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization' \ --header 'Authorization: Bearer $DASHSCOPE_API_KEY' \ --header 'Content-Type: application/json' \ --data '{ "model": "qwen-voice-enrollment", "input": { "action": "list", "page_size": 10, "page_index": 0 } }'Python
import os import requests # Kunci API berbeda antara wilayah Singapura dan Beijing. Dapatkan Kunci API Anda: https://www.alibabacloud.com/help/zh/model-studio/get-api-key # Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan: api_key = "sk-xxx" api_key = os.getenv("DASHSCOPE_API_KEY") # URL berikut untuk wilayah Singapura. Jika Anda menggunakan model di wilayah Beijing, ganti URL dengan: https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization url = "https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization" payload = { "model": "qwen-voice-enrollment", # Jangan ubah nilai ini "input": { "action": "list", "page_size": 10, "page_index": 0 } } headers = { "Authorization": f"Bearer {api_key}", "Content-Type": "application/json" } response = requests.post(url, json=payload, headers=headers) print("Kode status HTTP:", response.status_code) if response.status_code == 200: data = response.json() voice_list = data["output"]["voice_list"] print("Daftar suara yang ditemukan:") for item in voice_list: print(f"- Suara: {item['voice']} Waktu pembuatan: {item['gmt_create']} Model: {item['target_model']}") else: print("Permintaan gagal:", response.text)Java
import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; public class Main { public static void main(String[] args) { // Kunci API berbeda antara wilayah Singapura dan Beijing. Dapatkan Kunci API Anda: https://www.alibabacloud.com/help/zh/model-studio/get-api-key // Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan: String apiKey = "sk-xxx" String apiKey = System.getenv("DASHSCOPE_API_KEY"); // URL berikut untuk wilayah Singapura. Jika Anda menggunakan model di wilayah Beijing, ganti URL dengan: https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization String apiUrl = "https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization"; // Badan permintaan JSON (versi Java lama tidak mendukung string multiline """) String jsonPayload = "{" + "\"model\": \"qwen-voice-enrollment\"," // Jangan ubah nilai ini + "\"input\": {" + "\"action\": \"list\"," + "\"page_size\": 10," + "\"page_index\": 0" + "}" + "}"; try { HttpURLConnection con = (HttpURLConnection) new URL(apiUrl).openConnection(); con.setRequestMethod("POST"); con.setRequestProperty("Authorization", "Bearer " + apiKey); con.setRequestProperty("Content-Type", "application/json"); con.setDoOutput(true); try (OutputStream os = con.getOutputStream()) { os.write(jsonPayload.getBytes("UTF-8")); } int status = con.getResponseCode(); BufferedReader br = new BufferedReader(new InputStreamReader( status >= 200 && status < 300 ? con.getInputStream() : con.getErrorStream(), "UTF-8")); StringBuilder response = new StringBuilder(); String line; while ((line = br.readLine()) != null) { response.append(line); } br.close(); System.out.println("Kode status HTTP: " + status); System.out.println("Respons JSON: " + response.toString()); if (status == 200) { Gson gson = new Gson(); JsonObject jsonObj = gson.fromJson(response.toString(), JsonObject.class); JsonArray voiceList = jsonObj.getAsJsonObject("output").getAsJsonArray("voice_list"); System.out.println("\n Daftar suara yang ditemukan:"); for (int i = 0; i < voiceList.size(); i++) { JsonObject voiceItem = voiceList.get(i).getAsJsonObject(); String voice = voiceItem.get("voice").getAsString(); String gmtCreate = voiceItem.get("gmt_create").getAsString(); String targetModel = voiceItem.get("target_model").getAsString(); System.out.printf("- Suara: %s Waktu pembuatan: %s Model: %s\n", voice, gmtCreate, targetModel); } } } catch (Exception e) { e.printStackTrace(); } } }
Hapus suara
Menghapus suara tertentu untuk membebaskan kuotanya.
URL
Tiongkok Daratan:
POST https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customizationInternasional:
POST https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customizationHeader permintaan
Parameter
Tipe
Wajib
Deskripsi
Authorization
string
Token autentikasi dalam format
Bearer <your_api_key>. Ganti "<your_api_key>" dengan Kunci API Anda yang sebenarnya.Content-Type
string
Jenis media data yang dikirimkan dalam badan permintaan. Tetap sebagai
application/json.Isi pesan
Badan permintaan berisi semua parameter permintaan. Abaikan bidang opsional jika tidak diperlukan:
Pentingmodel: Model kloning suara, tetap sebagaiqwen-voice-enrollment. Jangan ubah.{ "model": "qwen-voice-enrollment", "input": { "action": "delete", "voice": "yourVoice" } }Parameter permintaan
Parameter
Tipe
Bawaan
Wajib
Deskripsi
model
string
-
Model kloning suara, tetap sebagai
qwen-voice-enrollment.action
string
-
Jenis operasi, tetap sebagai
delete.voice
string
-
Suara yang akan dihapus.
Parameter respons
Parameter utama:
Parameter
Tipe
Deskripsi
request_id
string
ID permintaan.
count
integer
Jumlah operasi "buat suara" yang ditagih untuk permintaan ini. Biayanya adalah $
. Penghapusan suara gratis. Oleh karena itu,
countselalu 0.Kode contoh
Pentingmodel: Model kloning suara, tetap sebagaiqwen-voice-enrollment. Jangan ubah.cURL
Jika Anda belum mengonfigurasi Kunci API sebagai variabel lingkungan, ganti
$DASHSCOPE_API_KEYdalam contoh dengan Kunci API Anda yang sebenarnya.# ======= Catatan penting ======= # URL berikut untuk wilayah Singapura. Jika Anda menggunakan model di wilayah Beijing, ganti URL dengan: https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization # Kunci API berbeda antara wilayah Singapura dan Beijing. Dapatkan Kunci API Anda: https://www.alibabacloud.com/help/zh/model-studio/get-api-key # === Hapus komentar ini sebelum eksekusi === curl --location --request POST 'https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization' \ --header 'Authorization: Bearer $DASHSCOPE_API_KEY' \ --header 'Content-Type: application/json' \ --data '{ "model": "qwen-voice-enrollment", "input": { "action": "delete", "voice": "yourVoice" } }'Python
import os import requests # Kunci API berbeda antara wilayah Singapura dan Beijing. Dapatkan Kunci API Anda: https://www.alibabacloud.com/help/zh/model-studio/get-api-key # Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan: api_key = "sk-xxx" api_key = os.getenv("DASHSCOPE_API_KEY") # URL berikut untuk wilayah Singapura. Jika Anda menggunakan model di wilayah Beijing, ganti URL dengan: https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization url = "https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization" voice_to_delete = "yourVoice" # Suara yang akan dihapus (ganti dengan nilai sebenarnya) payload = { "model": "qwen-voice-enrollment", # Jangan ubah nilai ini "input": { "action": "delete", "voice": voice_to_delete } } headers = { "Authorization": f"Bearer {api_key}", "Content-Type": "application/json" } response = requests.post(url, json=payload, headers=headers) print("Kode status HTTP:", response.status_code) if response.status_code == 200: data = response.json() request_id = data["request_id"] print(f"Penghapusan berhasil") print(f"ID Permintaan: {request_id}") else: print("Permintaan gagal:", response.text)Java
import com.google.gson.Gson; import com.google.gson.JsonObject; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; public class Main { public static void main(String[] args) { // Kunci API berbeda antara wilayah Singapura dan Beijing. Dapatkan Kunci API Anda: https://www.alibabacloud.com/help/zh/model-studio/get-api-key // Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan: String apiKey = "sk-xxx" String apiKey = System.getenv("DASHSCOPE_API_KEY"); // URL berikut untuk wilayah Singapura. Jika Anda menggunakan model di wilayah Beijing, ganti URL dengan: https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization String apiUrl = "https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization"; String voiceToDelete = "yourVoice"; // Suara yang akan dihapus (ganti dengan nilai sebenarnya) // Bangun badan permintaan JSON (penggabungan string untuk kompatibilitas Java 8) String jsonPayload = "{" + "\"model\": \"qwen-voice-enrollment\"," // Jangan ubah nilai ini + "\"input\": {" + "\"action\": \"delete\"," + "\"voice\": \"" + voiceToDelete + "\"" + "}" + "}"; try { // Buat koneksi POST HttpURLConnection con = (HttpURLConnection) new URL(apiUrl).openConnection(); con.setRequestMethod("POST"); con.setRequestProperty("Authorization", "Bearer " + apiKey); con.setRequestProperty("Content-Type", "application/json"); con.setDoOutput(true); // Kirim badan permintaan try (OutputStream os = con.getOutputStream()) { os.write(jsonPayload.getBytes("UTF-8")); } int status = con.getResponseCode(); BufferedReader br = new BufferedReader(new InputStreamReader( status >= 200 && status < 300 ? con.getInputStream() : con.getErrorStream(), "UTF-8")); StringBuilder response = new StringBuilder(); String line; while ((line = br.readLine()) != null) { response.append(line); } br.close(); System.out.println("Kode status HTTP: " + status); System.out.println("Respons JSON: " + response.toString()); if (status == 200) { Gson gson = new Gson(); JsonObject jsonObj = gson.fromJson(response.toString(), JsonObject.class); String requestId = jsonObj.get("request_id").getAsString(); System.out.println("Penghapusan berhasil"); System.out.println("ID Permintaan: " + requestId); } } catch (Exception e) { e.printStackTrace(); } } }
Sintesis suara
Untuk detail penggunaan suara kloning kustom dalam sintesis suara personalisasi, lihat Memulai: Dari kloning hingga sintesis.
Model khusus kloning suara (seperti qwen3-tts-vc-realtime-2026-01-15) adalah model khusus yang hanya mendukung suara kloning kustom. Model ini tidak mendukung suara sistem seperti Chelsie, Serena, Ethan, atau Cherry.
Kuota suara dan aturan pembersihan
Batas total: 1.000 suara per akun
Antarmuka saat ini tidak menyediakan fitur kueri jumlah suara. Panggil antarmuka Daftar suara untuk menghitung jumlah suara Anda sendiri.
Pembersihan otomatis: Jika suara tidak digunakan dalam permintaan sintesis suara apa pun selama lebih dari satu tahun, sistem akan menghapusnya secara otomatis.
Rincian penagihan
Kloning suara dan sintesis suara ditagih secara terpisah:
Kloning suara: Membuat suara dikenai biaya $0,01 per suara. Pembuatan yang gagal tidak dikenai biaya.
CatatanRincian kuota gratis (hanya tersedia di Alibaba Cloud China Website (www.aliyun.com) wilayah Beijing dan Alibaba Cloud International Website (www.alibabacloud.com) wilayah Singapura):
Dalam 90 hari setelah mengaktifkan Alibaba Cloud Model Studio, Anda mendapatkan 1.000 kali percobaan gratis membuat suara.
Pembuatan yang gagal tidak mengurangi kuota gratis.
Menghapus suara tidak mengembalikan kuota gratis.
Setelah kuota gratis habis atau periode validitas 90 hari berakhir, pembuatan suara ditagih sebesar $0,01 per suara.
Sintesis suara menggunakan suara kloning kustom: Ditagih berdasarkan volume (jumlah karakter). Untuk detailnya, lihat Sintesis suara Real-time - Qwen atau Sintesis suara - Qwen.
Hak cipta dan legalitas
Anda bertanggung jawab atas kepemilikan dan hak hukum atas suara yang Anda berikan. Harap baca Ketentuan Layanan.
Panduan perekaman
Perangkat
Kami merekomendasikan menggunakan mikrofon dengan peredaman kebisingan atau merekam dengan ponsel Anda dari jarak dekat di lingkungan yang tenang untuk memastikan audio bersih.
Lingkungan
Lokasi
Rekam di ruang tertutup seluas 10 meter persegi atau kurang.
Utamakan ruangan dengan bahan penyerap suara (seperti busa akustik, karpet, atau gorden).
Hindari ruang besar yang bergema seperti aula, ruang rapat, atau kelas.
Kontrol kebisingan
Kebisingan luar ruangan: Tutup jendela dan pintu untuk memblokir lalu lintas, konstruksi, dan gangguan lainnya.
Kebisingan dalam ruangan: Matikan AC, kipas, dan ballast lampu neon. Rekam kebisingan latar dengan ponsel Anda dan putar kembali dengan volume tinggi untuk mengidentifikasi sumber kebisingan.
Kontrol gema
Gema menyebabkan audio terdengar buram dan tidak jelas.
Kurangi pantulan: Tarik gorden, buka pintu lemari, dan tutup meja atau lemari dengan pakaian atau seprai.
Gunakan benda tidak beraturan (seperti rak buku atau furnitur berlapis kain) untuk menyebarkan suara.
Naskah
Konten naskah fleksibel. Sesuaikan dengan skenario target Anda (misalnya, gunakan gaya dialog layanan pelanggan untuk skenario layanan pelanggan). Pastikan tidak mengandung konten sensitif atau ilegal (seperti materi politik, pornografi, atau kekerasan), karena hal ini akan menyebabkan kloning gagal.
Hindari frasa pendek (seperti "Halo" atau "Ya"). Gunakan kalimat lengkap.
Pertahankan koherensi semantik. Hindari jeda yang sering (usahakan minimal 3 detik ucapan berkelanjutan).
Anda dapat mengadopsi emosi target (seperti ramah atau serius), tetapi hindari pembacaan yang terlalu dramatis. Pertahankan secara alami.
Kiat operasional
Menggunakan kamar tidur khas sebagai contoh:
Tutup jendela dan pintu untuk memblokir kebisingan eksternal.
Matikan AC, kipas, dan peralatan listrik lainnya.
Tarik gorden untuk mengurangi pantulan.
Letakkan pakaian atau selimut di meja untuk mengurangi pantulan.
Pahami naskah Anda. Tentukan nada karakter Anda dan sampaikan secara alami.
Pertahankan jarak sekitar 10 cm dari perangkat perekam untuk menghindari ledakan udara atau sinyal lemah.
Pesan kesalahan
Jika Anda mengalami kesalahan, lihat Pesan kesalahan untuk troubleshooting.