All Products
Search
Document Center

Alibaba Cloud Model Studio:Referensi API kloning suara Qwen

Last Updated:Feb 12, 2026

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.

Penting

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

image

1. Alur kerja

Kloning suara dan sintesis suara adalah dua langkah terpisah namun saling terkait yang mengikuti alur kerja "buat dulu, gunakan kemudian":

  1. 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.

  2. 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_model dari 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:

Persiapan

  1. Dapatkan Kunci API: Dapatkan Kunci API. Untuk keamanan, atur Kunci API Anda sebagai Variabel lingkungan.

  2. Instal SDK: Pastikan Anda telah menginstal SDK DashScope versi terbaru.

  3. 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.mp3 untuk 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")
Penting

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/customization

    Internasional:

    POST https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization
  • Header permintaan

    Parameter

    Tipe

    Wajib

    Deskripsi

    Authorization

    string

    Didukung

    Token autentikasi dalam format Bearer <your_api_key>. Ganti "<your_api_key>" dengan Kunci API Anda yang sebenarnya.

    Content-Type

    string

    Didukung

    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.

    Penting

    Perhatikan parameter berikut:

    • model: Model kloning suara, tetap sebagai qwen-voice-enrollment

    • target_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

    -

    Didukung

    Model kloning suara, tetap sebagai qwen-voice-enrollment.

    action

    string

    -

    Didukung

    Jenis operasi, tetap sebagai create.

    target_model

    string

    -

    Didukung

    Model sintesis suara yang menggerakkan suara. Model yang didukung meliputi (dua jenis):

    Harus sesuai dengan model sintesis suara yang digunakan dalam panggilan sintesis suara berikutnya. Jika tidak, sintesis akan gagal.

    preferred_name

    string

    -

    Didukung

    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

    -

    Didukung

    Audio untuk kloning (ikuti Panduan perekaman saat merekam, dan pastikan audio memenuhi Persyaratan audio).

    Kirimkan data audio dengan salah satu cara berikut:

    1. Data URL

      Format: data:<mediatype>;base64,<data>

      • <mediatype>: Jenis MIME

        • WAV: audio/wav

        • MP3: audio/mpeg

        • M4A: audio/mp4

      • <data>: String yang dienkripsi Base64 dari audio

        Pengkodean 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

        Lihat contoh kode

        import base64, pathlib
        
        # input.mp3 adalah file audio lokal untuk kloning suara. Ganti dengan jalur file audio Anda sendiri dan pastikan memenuhi persyaratan audio.
        file_path = pathlib.Path("input.mp3")
        base64_str = base64.b64encode(file_path.read_bytes()).decode()
        data_uri = f"data:audio/mpeg;base64,{base64_str}"
        import java.nio.file.*;
        import java.util.Base64;
        
        public class Main {
            /**
             * filePath adalah file audio lokal untuk kloning suara. Ganti dengan jalur file audio Anda sendiri dan pastikan memenuhi persyaratan audio.
             */
            public static String toDataUrl(String filePath) throws Exception {
                byte[] bytes = Files.readAllBytes(Paths.get(filePath));
                String encoded = Base64.getEncoder().encodeToString(bytes);
                return "data:audio/mpeg;base64," + encoded;
            }
        
            // Contoh penggunaan
            public static void main(String[] args) throws Exception {
                System.out.println(toDataUrl("input.mp3"));
            }
        }
    2. 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

    -

    Tidak

    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

    -

    Tidak

    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

    Lihat contoh respons

    {
        "output": {
            "voice": "yourVoice",
            "target_model": "qwen3-tts-vc-realtime-2026-01-15"
        },
        "usage": {
            "count": 1
        },
        "request_id": "yourRequestId"
    }

    Parameter utama:

    Parameter

    Tipe

    Deskripsi

    voice

    string

    Nama suara. Gunakan langsung sebagai parameter voice dalam antarmuka sintesis suara.

    target_model

    string

    Model sintesis suara yang menggerakkan suara. Model yang didukung meliputi (dua jenis):

    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

    Penting

    Perhatikan parameter berikut:

    • model: Model kloning suara, tetap sebagai qwen-voice-enrollment

    • target_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_KEY dalam 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/customization

    Internasional:

    POST https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization
  • Header permintaan

    Parameter

    Tipe

    Wajib

    Deskripsi

    Authorization

    string

    Didukung

    Token autentikasi dalam format Bearer <your_api_key>. Ganti "<your_api_key>" dengan Kunci API Anda yang sebenarnya.

    Content-Type

    string

    Didukung

    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.

    Penting

    model: Model kloning suara, tetap sebagai qwen-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

    -

    Didukung

    Model kloning suara, tetap sebagai qwen-voice-enrollment.

    action

    string

    -

    Didukung

    Jenis operasi, tetap sebagai list.

    page_index

    integer

    0

    Tidak didukung.

    Indeks halaman. Rentang: [0, 1000000].

    page_size

    integer

    10

    Tidak

    Entri per halaman. Rentang: [0, 1000000].

  • Parameter respons

    Lihat contoh respons

    {
        "output": {
            "voice_list": [
                {
                    "voice": "yourVoice1",
                    "gmt_create": "2025-08-11 17:59:32",
                    "target_model": "qwen3-tts-vc-realtime-2026-01-15"
                },
                {
                    "voice": "yourVoice2",
                    "gmt_create": "2025-08-11 17:38:10",
                    "target_model": "qwen3-tts-vc-realtime-2026-01-15"
                }
            ]
        },
        "usage": {
            "count": 0
        },
        "request_id": "yourRequestId"
    }

    Parameter utama:

    Parameter

    Tipe

    Deskripsi

    voice

    string

    Nama suara. Gunakan langsung sebagai parameter voice dalam antarmuka sintesis suara.

    gmt_create

    string

    Waktu pembuatan suara.

    target_model

    string

    Model sintesis suara yang menggerakkan suara. Model yang didukung meliputi (dua jenis):

    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, count selalu 0.

  • Kode contoh

    Penting

    model: Model kloning suara, tetap sebagai qwen-voice-enrollment. Jangan ubah.

    cURL

    Jika Anda belum mengonfigurasi Kunci API sebagai variabel lingkungan, ganti $DASHSCOPE_API_KEY dalam 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/customization

    Internasional:

    POST https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization
  • Header permintaan

    Parameter

    Tipe

    Wajib

    Deskripsi

    Authorization

    string

    Didukung

    Token autentikasi dalam format Bearer <your_api_key>. Ganti "<your_api_key>" dengan Kunci API Anda yang sebenarnya.

    Content-Type

    string

    Didukung

    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:

    Penting

    model: Model kloning suara, tetap sebagai qwen-voice-enrollment. Jangan ubah.

    {
        "model": "qwen-voice-enrollment",
        "input": {
            "action": "delete",
            "voice": "yourVoice"
        }
    }
  • Parameter permintaan

    Parameter

    Tipe

    Bawaan

    Wajib

    Deskripsi

    model

    string

    -

    Didukung

    Model kloning suara, tetap sebagai qwen-voice-enrollment.

    action

    string

    -

    Didukung

    Jenis operasi, tetap sebagai delete.

    voice

    string

    -

    Didukung

    Suara yang akan dihapus.

  • Parameter respons

    Lihat contoh respons

    {
        "usage": {
            "count": 0
        },
        "request_id": "yourRequestId"
    }

    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, count selalu 0.

  • Kode contoh

    Penting

    model: Model kloning suara, tetap sebagai qwen-voice-enrollment. Jangan ubah.

    cURL

    Jika Anda belum mengonfigurasi Kunci API sebagai variabel lingkungan, ganti $DASHSCOPE_API_KEY dalam 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.

    Catatan

    Rincian 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:

  1. Tutup jendela dan pintu untuk memblokir kebisingan eksternal.

  2. Matikan AC, kipas, dan peralatan listrik lainnya.

  3. Tarik gorden untuk mengurangi pantulan.

  4. Letakkan pakaian atau selimut di meja untuk mengurangi pantulan.

  5. Pahami naskah Anda. Tentukan nada karakter Anda dan sampaikan secara alami.

  6. 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.