全部产品
Search
文档中心

Alibaba Cloud Model Studio:Referensi API desain suara Qwen-TTS

更新时间:Jan 31, 2026

Desain suara menghasilkan suara kustom berdasarkan deskripsi teks. Fitur ini mendukung karakteristik suara multi-bahasa dan multi-dimensi, sehingga cocok untuk aplikasi seperti pengisi suara iklan, pembuatan karakter, dan produksi buku audio. Desain suara dan sintesis suara merupakan dua langkah berurutan. Dokumen ini berfokus pada parameter dan detail antarmuka desain suara. Untuk informasi lebih lanjut mengenai sintesis suara, lihat Sintesis suara Real-time - Qwen.

Panduan pengguna: Untuk pengenalan model dan rekomendasi pemilihan, lihat Sintesis suara Real-time - Qwen.

Bahasa yang didukung

Desain suara mendukung pembuatan suara dan sintesis suara dalam berbagai bahasa, termasuk: Bahasa Mandarin (zh), Bahasa Inggris (en), Bahasa Jerman (de), Bahasa Italia (it), Bahasa Portugis (pt), Bahasa Spanyol (es), Bahasa Jepang (ja), Bahasa Korea (ko), Bahasa Prancis (fr), Bahasa Rusia (ru).

Cara menulis deskripsi suara berkualitas tinggi

Batasan

Saat menulis deskripsi suara (voice_prompt), patuhi batasan berikut:

  • Batas panjang: voice_prompt tidak boleh melebihi 2.048 karakter.

  • Bahasa yang didukung: Teks deskripsi hanya boleh dalam Bahasa Mandarin atau Bahasa Inggris.

Prinsip inti

Deskripsi suara berkualitas tinggi (voice_prompt) merupakan kunci untuk menciptakan suara ideal Anda. Deskripsi ini berperan sebagai cetak biru yang secara langsung memandu model menghasilkan suara dengan karakteristik tertentu.

Ikuti prinsip inti berikut saat mendeskripsikan suara:

  1. Bersifat spesifik, bukan samar: Gunakan kata-kata yang secara jelas menggambarkan ciri vokal, seperti "berat", "jernih", atau "cepat". Hindari istilah subjektif dan tidak informatif seperti "terdengar bagus" atau "biasa saja."

  2. Bersifat multidimensi, bukan satu dimensi: Deskripsi yang efektif menggabungkan beberapa dimensi, seperti jenis kelamin, usia, dan emosi, sebagaimana dijelaskan di bawah. Deskripsi satu dimensi, seperti "suara perempuan", terlalu luas untuk menghasilkan suara yang khas.

  3. Bersifat objektif, bukan subjektif: Fokuslah pada fitur fisik dan persepsi suara itu sendiri, bukan preferensi pribadi. Misalnya, gunakan "tinggi dan energetik" alih-alih "suara favorit saya."

  4. Bersifat orisinal, bukan imitatif: Gambarkan ciri vokal alih-alih meminta peniruan orang tertentu, seperti selebriti. Permintaan semacam ini melibatkan risiko hak cipta, dan model tidak mendukung peniruan langsung.

  5. Bersifat ringkas, bukan berulang: Pastikan setiap kata memberikan makna. Hindari pengulangan sinonim atau penggunaan penguat yang tidak berarti, seperti "suara yang sangat sangat bagus."

Referensi dimensi deskripsi

Dimensi

Contoh deskripsi

Jenis kelamin

Laki-laki, perempuan, netral

Usia

Anak (5–12 tahun), remaja (13–18 tahun), dewasa muda (19–35 tahun), paruh baya (36–55 tahun), lansia (55+ tahun)

Pitch

Tinggi, sedang, rendah, agak tinggi, agak rendah

Kecepatan berbicara

Cepat, sedang, lambat, agak cepat, agak lambat

Emosi

Ceria, tenang, lembut, serius, hidup, tenang, menenangkan

Karakteristik

Magnetis, jernih, serak, halus, manis, kaya, kuat

Kasus penggunaan

Berita siaran, pengisi suara iklan, buku audio, karakter animasi, asisten suara, narasi dokumenter

Perbandingan contoh

✅ Contoh yang direkomendasikan

  • "Suara perempuan muda yang hidup dengan kecepatan berbicara cepat dan intonasi naik yang jelas, cocok untuk memperkenalkan produk fesyen."

    Analisis: Deskripsi ini menggabungkan usia, kepribadian, kecepatan berbicara, dan intonasi, serta menentukan kasus penggunaan, sehingga menciptakan gambaran yang jelas dan hidup.

  • "Suara laki-laki paruh baya yang tenang dengan kecepatan berbicara lambat, nada dalam dan magnetis, ideal untuk membaca berita atau narasi dokumenter."

    Analisis: Deskripsi ini secara jelas menentukan jenis kelamin, rentang usia, kecepatan berbicara, kualitas nada, dan domain aplikasi.

  • "Suara anak yang lucu, kira-kira perempuan berusia 8 tahun, dengan nada yang agak kekanak-kanakan, sempurna untuk pengisi suara karakter animasi."

    Analisis: Deskripsi ini menentukan usia pasti dan ciri vokal ("kekanak-kanakan"), dengan tujuan yang jelas.

  • "Suara perempuan yang lembut dan intelektual, sekitar usia 30 tahun, dengan nada tenang, cocok untuk narasi buku audio."

    Analisis: Deskripsi ini secara efektif menyampaikan kualitas emosional dan gaya melalui kata-kata seperti "intelektual" dan "tenang."

❌ Contoh yang tidak direkomendasikan beserta saran

Contoh

Masalah utama

Saran

Suara yang terdengar bagus

Terlalu samar dan subjektif. Tidak memiliki fitur yang dapat ditindaklanjuti.

Tambahkan dimensi spesifik, misalnya, "suara perempuan muda dengan nada jernih dan intonasi lembut."

Kedengarannya seperti selebriti tertentu

Melibatkan risiko hak cipta. Model tidak dapat meniru langsung orang tertentu.

Gambarkan ciri vokalnya, misalnya, "suara laki-laki dewasa yang magnetis dengan tempo stabil."

Suara perempuan yang sangat sangat sangat bagus

Berulang. Pengulangan kata tidak membantu mendefinisikan suara.

Hapus pengulangan dan tambahkan deskriptor bermakna, misalnya, "suara perempuan usia 20–24 tahun dengan nada ringan, ceria, dan timbre manis."

123456

Input tidak valid. Tidak dapat diurai sebagai karakteristik suara.

Berikan deskripsi teks yang bermakna. Untuk informasi lebih lanjut, lihat contoh yang direkomendasikan di atas.

Memulai: Dari desain suara hingga sintesis suara

image

1. Alur kerja

Desain suara dan sintesis suara adalah dua langkah yang saling terkait erat namun independen, mengikuti alur kerja "buat dulu, lalu gunakan":

  1. Persiapkan deskripsi suara dan teks pratinjau untuk desain suara.

    • Deskripsi suara (voice_prompt): Menentukan karakteristik suara target. Untuk panduan, lihat "Cara menulis deskripsi suara berkualitas tinggi."

    • Teks pratinjau (preview_text): Teks yang akan dibacakan oleh audio pratinjau, misalnya, "Halo semuanya, selamat datang di acara ini."

  2. Panggil API Buat suara untuk menghasilkan suara kustom dan mendapatkan nama serta audio pratinjaunya.

    Pada langkah ini, Anda harus menentukan target_model untuk menyatakan model sintesis suara mana yang akan menggerakkan suara yang dibuat.

    Dengarkan audio pratinjau untuk mengevaluasi apakah sesuai harapan Anda. Jika ya, lanjutkan. Jika tidak, rancang ulang suaranya.

    Jika Anda sudah memiliki suara yang dibuat—yang dapat Anda verifikasi menggunakan API Daftar suara—Anda dapat melewati langkah ini dan melanjutkan ke langkah berikutnya.

  3. Gunakan suara tersebut untuk sintesis suara.

    Panggil API sintesis suara dan masukkan suara yang diperoleh pada langkah sebelumnya. Model sintesis suara yang digunakan di sini harus sesuai dengan target_model yang ditentukan pada langkah sebelumnya.

2. Konfigurasi model dan persiapan

Pilih model yang sesuai dan selesaikan tugas penyiapan.

Konfigurasi model

Tentukan dua model berikut selama desain suara:

  • Model desain suara: qwen-voice-design

  • Model sintesis suara yang menggerakkan suara:

    • qwen3-tts-vd-realtime-2026-01-15

    • qwen3-tts-vd-realtime-2025-12-16

Persiapan

  1. Dapatkan Kunci API: Dapatkan dan Konfigurasikan Kunci API. Untuk keamanan, simpan Kunci API Anda dalam Variabel lingkungan.

  2. Instal SDK: Instal SDK DashScope versi terbaru.

3. Contoh Kode

  1. Hasilkan suara kustom dan dengarkan pratinjaunya. Jika puas, lanjutkan. Jika tidak, hasilkan ulang suaranya.

    Python

    import requests
    import base64
    import os
    
    def create_voice_and_play():
        # 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 menyetel variabel lingkungan, ganti baris di bawah ini dengan: api_key = "sk-xxx"
        api_key = os.getenv("DASHSCOPE_API_KEY")
        
        if not api_key:
            print("Error: Variabel lingkungan DASHSCOPE_API_KEY tidak ditemukan. Harap setel Kunci API Anda.")
            return None, None, None
        
        # Siapkan data permintaan
        headers = {
            "Authorization": f"Bearer {api_key}",
            "Content-Type": "application/json"
        }
        
        data = {
            "model": "qwen-voice-design",
            "input": {
                "action": "create",
                "target_model": "qwen3-tts-vd-realtime-2026-01-15",
                "voice_prompt": "A composed middle-aged male announcer with a deep, rich and magnetic voice, a steady speaking speed and clear articulation, is suitable for news broadcasting or documentary commentary.",
                "preview_text": "Dear listeners, hello everyone. Welcome to the evening news.",
                "preferred_name": "announcer",
                "language": "en"
            },
            "parameters": {
                "sample_rate": 24000,
                "response_format": "wav"
            }
        }
        
        # URL untuk wilayah Singapura. Untuk wilayah Beijing, gunakan: https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization
        url = "https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization"
        
        try:
            # Kirim permintaan
            response = requests.post(
                url,
                headers=headers,
                json=data,
                timeout=60  # Tambahkan pengaturan timeout
            )
            
            if response.status_code == 200:
                result = response.json()
                
                # Dapatkan nama suara
                voice_name = result["output"]["voice"]
                print(f"Nama suara: {voice_name}")
                
                # Dapatkan data audio pratinjau
                base64_audio = result["output"]["preview_audio"]["data"]
                
                # Dekode data audio Base64
                audio_bytes = base64.b64decode(base64_audio)
                
                # Simpan file audio secara lokal
                filename = f"{voice_name}_preview.wav"
                
                # Tulis data audio ke file lokal
                with open(filename, 'wb') as f:
                    f.write(audio_bytes)
                
                print(f"Audio disimpan ke file lokal: {filename}")
                print(f"Jalur file: {os.path.abspath(filename)}")
                
                return voice_name, audio_bytes, filename
            else:
                print(f"Permintaan gagal. Kode status: {response.status_code}")
                print(f"Tanggapan: {response.text}")
                return None, None, None
                
        except requests.exceptions.RequestException as e:
            print(f"Kesalahan permintaan jaringan: {e}")
            return None, None, None
        except KeyError as e:
            print(f"Kesalahan format tanggapan: bidang wajib tidak ditemukan: {e}")
            print(f"Tanggapan: {response.text if 'response' in locals() else 'Tidak ada tanggapan'}")
            return None, None, None
        except Exception as e:
            print(f"Kesalahan tak terduga: {e}")
            return None, None, None
    
    if __name__ == "__main__":
        print("Membuat suara...")
        voice_name, audio_data, saved_filename = create_voice_and_play()
        
        if voice_name:
            print(f"\nBerhasil membuat suara '{voice_name}'")
            print(f"File audio disimpan: '{saved_filename}'")
            print(f"Ukuran file: {os.path.getsize(saved_filename)} byte")
        else:
            print("\nPembuatan suara gagal")

    Java

    Anda perlu mengimpor dependensi Gson. Jika menggunakan Maven atau Gradle, tambahkan dependensi:

    Maven

    Tambahkan konten berikut ke pom.xml:

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

    // https://mvnrepository.com/artifact/com.google.code.gson/gson
    implementation("com.google.code.gson:gson:2.13.1")
    import com.google.gson.JsonObject;
    import com.google.gson.JsonParser;
    import java.io.*;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.util.Base64;
    
    public class Main {
        public static void main(String[] args) {
            Main example = new Main();
            example.createVoice();
        }
    
        public void createVoice() {
            // 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 menyetel variabel lingkungan, ganti baris di bawah ini dengan: String apiKey = "sk-xxx"
            String apiKey = System.getenv("DASHSCOPE_API_KEY");
    
            // Buat string badan permintaan JSON
            String jsonBody = "{\n" +
                    "    \"model\": \"qwen-voice-design\",\n" +
                    "    \"input\": {\n" +
                    "        \"action\": \"create\",\n" +
                    "        \"target_model\": \"qwen3-tts-vd-realtime-2026-01-15\",\n" +
                    "        \"voice_prompt\": \"A composed middle-aged male announcer with a deep, rich and magnetic voice, a steady speaking speed and clear articulation, is suitable for news broadcasting or documentary commentary.\",\n" +
                    "        \"preview_text\": \"Dear listeners, hello everyone. Welcome to the evening news.\",\n" +
                    "        \"preferred_name\": \"announcer\",\n" +
                    "        \"language\": \"en\"\n" +
                    "    },\n" +
                    "    \"parameters\": {\n" +
                    "        \"sample_rate\": 24000,\n" +
                    "        \"response_format\": \"wav\"\n" +
                    "    }\n" +
                    "}";
    
            HttpURLConnection connection = null;
            try {
                // URL untuk wilayah Singapura. Untuk wilayah Beijing, gunakan: https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization
                URL url = new URL("https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization");
                connection = (HttpURLConnection) url.openConnection();
    
                // Setel metode dan header permintaan
                connection.setRequestMethod("POST");
                connection.setRequestProperty("Authorization", "Bearer " + apiKey);
                connection.setRequestProperty("Content-Type", "application/json");
                connection.setDoOutput(true);
                connection.setDoInput(true);
    
                // Kirim badan permintaan
                try (OutputStream os = connection.getOutputStream()) {
                    byte[] input = jsonBody.getBytes("UTF-8");
                    os.write(input, 0, input.length);
                    os.flush();
                }
    
                // Dapatkan tanggapan
                int responseCode = connection.getResponseCode();
                if (responseCode == HttpURLConnection.HTTP_OK) {
                    // Baca konten tanggapan
                    StringBuilder response = new StringBuilder();
                    try (BufferedReader br = new BufferedReader(
                            new InputStreamReader(connection.getInputStream(), "UTF-8"))) {
                        String responseLine;
                        while ((responseLine = br.readLine()) != null) {
                            response.append(responseLine.trim());
                        }
                    }
    
                    // Uraikan tanggapan JSON
                    JsonObject jsonResponse = JsonParser.parseString(response.toString()).getAsJsonObject();
                    JsonObject outputObj = jsonResponse.getAsJsonObject("output");
                    JsonObject previewAudioObj = outputObj.getAsJsonObject("preview_audio");
    
                    // Dapatkan nama suara
                    String voiceName = outputObj.get("voice").getAsString();
                    System.out.println("Nama suara: " + voiceName);
    
                    // Dapatkan data audio dalam format Base64
                    String base64Audio = previewAudioObj.get("data").getAsString();
    
                    // Dekode data audio Base64
                    byte[] audioBytes = Base64.getDecoder().decode(base64Audio);
    
                    // Simpan audio ke file lokal
                    String filename = voiceName + "_preview.wav";
                    saveAudioToFile(audioBytes, filename);
    
                    System.out.println("Audio disimpan ke file lokal: " + filename);
    
                } else {
                    // Baca tanggapan kesalahan
                    StringBuilder errorResponse = new StringBuilder();
                    try (BufferedReader br = new BufferedReader(
                            new InputStreamReader(connection.getErrorStream(), "UTF-8"))) {
                        String responseLine;
                        while ((responseLine = br.readLine()) != null) {
                            errorResponse.append(responseLine.trim());
                        }
                    }
    
                    System.out.println("Permintaan gagal. Kode status: " + responseCode);
                    System.out.println("Tanggapan kesalahan: " + errorResponse.toString());
                }
    
            } catch (Exception e) {
                System.err.println("Kesalahan permintaan: " + e.getMessage());
                e.printStackTrace();
            } finally {
                if (connection != null) {
                    connection.disconnect();
                }
            }
        }
    
        private void saveAudioToFile(byte[] audioBytes, String filename) {
            try {
                File file = new File(filename);
                try (FileOutputStream fos = new FileOutputStream(file)) {
                    fos.write(audioBytes);
                }
                System.out.println("Audio disimpan ke: " + file.getAbsolutePath());
            } catch (IOException e) {
                System.err.println("Kesalahan menyimpan file audio: " + e.getMessage());
                e.printStackTrace();
            }
        }
    }
  2. Gunakan suara kustom yang dihasilkan pada langkah sebelumnya untuk sintesis suara.

    Contoh ini didasarkan pada "mode server commit" dari SDK DashScope untuk sintesis suara menggunakan suara sistem. Ganti parameter voice dengan suara kustom yang dihasilkan oleh desain suara.

    Prinsip Utama: Model yang digunakan selama desain suara (target_model) harus sama dengan model yang digunakan untuk sintesis suara selanjutnya (model). Jika tidak, sintesis akan gagal.

    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 base64
    import threading
    import time
    import dashscope  # Diperlukan SDK Python DashScope versi 1.23.9 atau lebih baru
    from dashscope.audio.qwen_tts_realtime import QwenTtsRealtime, QwenTtsRealtimeCallback, AudioFormat
    
    # ======= Konfigurasi Konstan =======
    TEXT_TO_SYNTHESIZE = [
        'Right? I just love this kind of supermarket,',
        'especially during the New Year.',
        'Going to the supermarket',
        'just makes me feel',
        'super, super happy!',
        'I want to buy so many things!'
    ]
    
    def init_dashscope_api_key():
        """
        Menginisialisasi 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
        # Jika Anda belum menyetel variabel lingkungan, ganti baris di bawah ini dengan: 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 terbentuk')
    
        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}, pesan={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] Tanggapan selesai, ID Tanggapan: {qwen_tts_realtime.get_last_response_id()}')
                elif event_type == 'session.finished':
                    print('[TTS] Sesi selesai')
                    self.complete_event.set()
            except Exception as e:
                print(f'[Error] Pengecualian saat memproses event callback: {e}')
    
        def wait_for_finished(self):
            self.complete_event.wait()
    
    # ======= Logika Eksekusi Utama =======
    if __name__ == '__main__':
        init_dashscope_api_key()
        print('[Sistem] Menginisialisasi Qwen TTS Realtime ...')
    
        callback = MyCallback()
        qwen_tts_realtime = QwenTtsRealtime(
            # Desain suara dan sintesis suara harus menggunakan model yang sama
            model="qwen3-tts-vd-realtime-2026-01-15",
            callback=callback,
            # URL untuk wilayah Singapura. Untuk wilayah Beijing, gunakan: wss://dashscope.aliyuncs.com/api-ws/v1/realtime
            url='wss://dashscope-intl.aliyuncs.com/api-ws/v1/realtime'
        )
        qwen_tts_realtime.connect()
        
        qwen_tts_realtime.update_session(
            voice="myvoice", # Ganti parameter voice dengan suara kustom yang dihasilkan oleh desain suara
            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'[Metrik] session_id={qwen_tts_realtime.get_session_id()}, '
              f'delay_audio_pertama={qwen_tts_realtime.get_first_audio_delay()}s')

    Java

    import com.alibaba.dashscope.audio.qwen_tts_realtime.*;
    import com.alibaba.dashscope.exception.NoApiKeyException;
    import com.google.gson.JsonObject;
    
    import javax.sound.sampled.*;
    import java.io.*;
    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 {
        // ===== Definisi Konstan =====
        private static String[] textToSynthesize = {
                "Right? I just love this kind of supermarket,",
                "especially during the New Year.",
                "Going to the supermarket",
                "just makes me feel",
                "super, super happy!",
                "I want to buy so many things!"
        };
    
        // Kelas pemutar audio 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 menginisialisasi format audio dan jalur 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();
            }
    
            // Memainkan chunk audio dan memblokir 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 dalam 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()
                    // Desain suara dan sintesis suara harus menggunakan model yang sama
                    .model("qwen3-tts-vd-realtime-2026-01-15")
                    // URL untuk wilayah Singapura. Untuk wilayah Beijing, gunakan: wss://dashscope.aliyuncs.com/api-ws/v1/realtime
                    .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
                    // Jika Anda belum menyetel variabel lingkungan, ganti baris di bawah ini dengan: .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 pembukaan koneksi
                }
                @Override
                public void onEvent(JsonObject message) {
                    String type = message.get("type").getAsString();
                    switch(type) {
                        case "session.created":
                            // Tangani pembuatan sesi
                            break;
                        case "response.audio.delta":
                            String recvAudioB64 = message.get("delta").getAsString();
                            // Putar audio secara real-time
                            audioPlayer.write(recvAudioB64);
                            break;
                        case "response.done":
                            // Tangani penyelesaian tanggapan
                            break;
                        case "session.finished":
                            // Tangani penyelesaian sesi
                            completeLatch.get().countDown();
                        default:
                            break;
                    }
                }
                @Override
                public void onClose(int code, String reason) {
                    // Tangani penutupan koneksi
                }
            });
            qwenTtsRef.set(qwenTtsRealtime);
            try {
                qwenTtsRealtime.connect();
            } catch (NoApiKeyException e) {
                throw new RuntimeException(e);
            }
            QwenTtsRealtimeConfig config = QwenTtsRealtimeConfig.builder()
                    .voice("myvoice") // Ganti parameter voice dengan suara kustom yang dihasilkan oleh desain suara
                    .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 lalu matikan pemutar
            audioPlayer.waitForComplete();
            audioPlayer.shutdown();
            System.exit(0);
        }
    }

Referensi API

Pastikan Anda menggunakan akun yang sama saat memanggil API yang berbeda.

Buat suara

Membuat suara kustom dengan menyediakan deskripsi suara dan teks pratinjau.

  • URL

    China (Beijing):

    POST https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization

    Internasional (Singapura):

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

    Parameter

    Tipe

    Wajib

    Deskripsi

    Authorization

    string

    Ya

    Token otentikasi. Format: Bearer <your_api_key>. Ganti "<your_api_key>" dengan Kunci API aktual Anda.

    Content-Type

    string

    Didukung

    Jenis media data yang dikirimkan dalam badan permintaan. Nilai tetap: application/json.

  • Isi permintaan

    Badan permintaan berisi semua parameter permintaan. Abaikan bidang opsional sesuai kebutuhan.

    Penting

    Perhatikan perbedaan antara parameter berikut:

    • model: Model desain suara. Nilainya tetap qwen-voice-design.

    • target_model: Model sintesis suara yang menggerakkan suara. Harus konsisten dengan model sintesis suara yang digunakan dalam panggilan API selanjutnya. Jika tidak, sintesis akan gagal.

    {
        "model": "qwen-voice-design",
        "input": {
            "action": "create",
            "target_model": "qwen3-tts-vd-realtime-2026-01-15",
            "voice_prompt": "A calm middle-aged male announcer with a deep, rich, and magnetic voice, steady speaking speed, and clear articulation, suitable for news broadcasting or documentary narration.",
            "preview_text": "Dear listeners, hello everyone. Welcome to the evening news.",
            "preferred_name": "announcer",
            "language": "en"
        },
        "parameters": {
            "sample_rate": 24000,
            "response_format": "wav"
        }
    }
  • Parameter permintaan

    Parameter

    Tipe

    Bawaan

    Wajib

    Deskripsi

    model

    string

    -

    Didukung

    Model desain suara. Nilai tetap: qwen-voice-design.

    action

    string

    -

    Ya

    Jenis operasi. Nilai tetap: create.

    target_model

    string

    -

    Ya

    Model sintesis suara yang menggerakkan suara. model yang didukung:

    • qwen3-tts-vd-realtime-2026-01-15

    • qwen3-tts-vd-realtime-2025-12-16

    Harus konsisten dengan model sintesis suara yang digunakan dalam panggilan API selanjutnya. Jika tidak, sintesis akan gagal.

    voice_prompt

    string

    -

    Didukung

    Deskripsi suara. Panjang maksimum: 2048 karakter.

    Hanya mendukung Bahasa Mandarin dan Bahasa Inggris.

    Untuk panduan menulis deskripsi suara, lihat "Cara menulis deskripsi suara berkualitas tinggi".

    preview_text

    string

    -

    Ya

    Teks untuk audio pratinjau. Panjang maksimum: 1024 karakter.

    Mendukung Bahasa Mandarin (zh), Bahasa Inggris (en), Bahasa Jerman (de), Bahasa Italia (it), Bahasa Portugis (pt), Bahasa Spanyol (es), Bahasa Jepang (ja), Bahasa Korea (ko), Bahasa Prancis (fr), Bahasa Rusia (ru).

    preferred_name

    string

    -

    Didukung

    Tetapkan nama yang mudah diidentifikasi untuk suara tersebut (hanya angka, huruf, dan garis bawah yang diizinkan; maksimal 16 karakter). Kami merekomendasikan menggunakan pengenal yang terkait dengan karakter atau skenario.

    Kata kunci akan muncul dalam nama suara yang dirancang. Misalnya, jika kata kuncinya adalah "announcer", nama suara akhirnya akan menjadi "qwen-tts-vd-announcer-voice-20251201102800-a1b2"

    language

    string

    zh

    Tidak

    Kode bahasa. Menentukan preferensi bahasa untuk suara yang dihasilkan. Parameter ini memengaruhi fitur linguistik dan kecenderungan pelafalan suara. Pilih kode yang sesuai dengan kasus penggunaan Anda.

    Jika Anda menggunakan parameter ini, bahasa harus sesuai dengan bahasa preview_text.

    Nilai yang valid: zh (Bahasa Mandarin), en (Bahasa Inggris), de (Bahasa Jerman), it (Bahasa Italia), pt (Bahasa Portugis), es (Bahasa Spanyol), ja (Bahasa Jepang), ko (Bahasa Korea), fr (Bahasa Prancis), ru (Bahasa Rusia).

    sample_rate

    int

    24000

    Tidak

    Laju sampel (dalam Hz) audio pratinjau yang dihasilkan oleh desain suara.

    Nilai yang valid:

    • 8000

    • 16000

    • 24000

    • 48000

    response_format

    string

    wav

    Tidak

    Format audio pratinjau yang dihasilkan oleh desain suara.

    Nilai yang valid:

    • pcm

    • wav

    • mp3

    • opus

  • Parameter respons

    Klik untuk melihat contoh respons

    {
        "output": {
            "preview_audio": {
                "data": "{base64_encoded_audio}",
                "sample_rate": 24000,
                "response_format": "wav"
            },
            "target_model": "qwen3-tts-vd-realtime-2026-01-15",
            "voice": "yourVoice"
        },
        "usage": {
            "count": 1
        },
        "request_id": "yourRequestId"
    }

    Parameter utamanya adalah:

    Parameter

    Tipe

    Deskripsi

    voice

    string

    Nama suara. Anda dapat menggunakannya langsung sebagai parameter voice dalam API sintesis suara.

    data

    string

    Data audio pratinjau yang dihasilkan oleh desain suara, dikembalikan sebagai string yang dienkode Base64.

    sample_rate

    int

    Laju sampel (dalam Hz) audio pratinjau yang dihasilkan oleh desain suara. Sesuai dengan laju sampel yang ditetapkan saat pembuatan suara. Nilai bawaannya adalah 24000 Hz.

    response_format

    string

    Format audio pratinjau yang dihasilkan oleh desain suara. Sesuai dengan format audio yang ditetapkan saat pembuatan suara. Nilai bawaannya adalah wav.

    target_model

    string

    Model sintesis suara yang menggerakkan suara. model yang didukung:

    • qwen3-tts-vd-realtime-2026-01-15

    • qwen3-tts-vd-realtime-2025-12-16

    Harus konsisten dengan model sintesis suara yang digunakan dalam panggilan API selanjutnya. Jika tidak, sintesis akan gagal.

    request_id

    string

    ID Permintaan.

    count

    integer

    Jumlah operasi "Buat suara" yang ditagih untuk permintaan ini. Biaya untuk permintaan ini adalah $ .

    Untuk pembuatan suara, count selalu 1.

  • Kode contoh

    Penting

    Perhatikan perbedaan antara parameter berikut:

    • model: Model desain suara. Nilainya tetap qwen-voice-design.

    • target_model: Model sintesis suara yang menggerakkan suara. Harus konsisten dengan model sintesis suara yang digunakan dalam panggilan API selanjutnya. Jika tidak, sintesis akan gagal.

    cURL

    Jika Anda belum menyetel Kunci API sebagai variabel lingkungan, ganti $DASHSCOPE_API_KEY dalam contoh dengan Kunci API aktual Anda.

    # ======= Penting =======
    # URL di bawah ini untuk wilayah Singapura. Untuk wilayah Beijing, gunakan: 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 https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization \
    -H "Authorization: Bearer $DASHSCOPE_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
        "model": "qwen-voice-design",
        "input": {
            "action": "create",
            "target_model": "qwen3-tts-vd-realtime-2026-01-15",
            "voice_prompt": "A calm middle-aged male announcer with a deep, rich, and magnetic voice, steady speaking speed, and clear articulation, suitable for news broadcasting or documentary narration.",
            "preview_text": "Dear listeners, hello everyone. Welcome to the evening news.",
            "preferred_name": "announcer",
            "language": "en"
        },
        "parameters": {
            "sample_rate": 24000,
            "response_format": "wav"
        }
    }'

    Python

    import requests
    import base64
    import os
    
    def create_voice_and_play():
        # 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 menyetel variabel lingkungan, ganti baris di bawah ini dengan: api_key = "sk-xxx"
        api_key = os.getenv("DASHSCOPE_API_KEY")
        
        if not api_key:
            print("Error: Variabel lingkungan DASHSCOPE_API_KEY tidak ditemukan. Harap setel Kunci API Anda.")
            return None, None, None
        
        # Siapkan data permintaan
        headers = {
            "Authorization": f"Bearer {api_key}",
            "Content-Type": "application/json"
        }
        
        data = {
            "model": "qwen-voice-design",
            "input": {
                "action": "create",
                "target_model": "qwen3-tts-vd-realtime-2026-01-15",
                "voice_prompt": "A composed middle-aged male announcer with a deep, rich and magnetic voice, a steady speaking speed and clear articulation, is suitable for news broadcasting or documentary commentary.",
                "preview_text": "Dear listeners, hello everyone. Welcome to the evening news.",
                "preferred_name": "announcer",
                "language": "en"
            },
            "parameters": {
                "sample_rate": 24000,
                "response_format": "wav"
            }
        }
        
        # URL untuk wilayah Singapura. Untuk wilayah Beijing, gunakan: https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization
        url = "https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization"
        
        try:
            # Kirim permintaan
            response = requests.post(
                url,
                headers=headers,
                json=data,
                timeout=60  # Tambahkan pengaturan timeout
            )
            
            if response.status_code == 200:
                result = response.json()
                
                # Dapatkan nama suara
                voice_name = result["output"]["voice"]
                print(f"Nama suara: {voice_name}")
                
                # Dapatkan data audio pratinjau
                base64_audio = result["output"]["preview_audio"]["data"]
                
                # Dekode data audio Base64
                audio_bytes = base64.b64decode(base64_audio)
                
                # Simpan file audio secara lokal
                filename = f"{voice_name}_preview.wav"
                
                # Tulis data audio ke file lokal
                with open(filename, 'wb') as f:
                    f.write(audio_bytes)
                
                print(f"Audio disimpan ke file lokal: {filename}")
                print(f"Jalur file: {os.path.abspath(filename)}")
                
                return voice_name, audio_bytes, filename
            else:
                print(f"Permintaan gagal. Kode status: {response.status_code}")
                print(f"Tanggapan: {response.text}")
                return None, None, None
                
        except requests.exceptions.RequestException as e:
            print(f"Kesalahan permintaan jaringan: {e}")
            return None, None, None
        except KeyError as e:
            print(f"Kesalahan format tanggapan: bidang wajib tidak ditemukan: {e}")
            print(f"Tanggapan: {response.text if 'response' in locals() else 'Tidak ada tanggapan'}")
            return None, None, None
        except Exception as e:
            print(f"Kesalahan tak terduga: {e}")
            return None, None, None
    
    if __name__ == "__main__":
        print("Membuat suara...")
        voice_name, audio_data, saved_filename = create_voice_and_play()
        
        if voice_name:
            print(f"\nBerhasil membuat suara '{voice_name}'")
            print(f"File audio disimpan: '{saved_filename}'")
            print(f"Ukuran file: {os.path.getsize(saved_filename)} byte")
        else:
            print("\nPembuatan suara gagal")

    Java

    import com.google.gson.JsonObject;
    import com.google.gson.JsonParser;
    import java.io.*;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.util.Base64;
    
    public class Main {
        public static void main(String[] args) {
            Main example = new Main();
            example.createVoice();
        }
    
        public void createVoice() {
            // 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 menyetel variabel lingkungan, ganti baris di bawah ini dengan: String apiKey = "sk-xxx"
            String apiKey = System.getenv("DASHSCOPE_API_KEY");
    
            // Buat string badan permintaan JSON
            String jsonBody = "{\n" +
                    "    \"model\": \"qwen-voice-design\",\n" +
                    "    \"input\": {\n" +
                    "        \"action\": \"create\",\n" +
                    "        \"target_model\": \"qwen3-tts-vd-realtime-2026-01-15\",\n" +
                    "        \"voice_prompt\": \"A composed middle-aged male announcer with a deep, rich and magnetic voice, a steady speaking speed and clear articulation, is suitable for news broadcasting or documentary commentary.\",\n" +
                    "        \"preview_text\": \"Dear listeners, hello everyone. Welcome to the evening news.\",\n" +
                    "        \"preferred_name\": \"announcer\",\n" +
                    "        \"language\": \"en\"\n" +
                    "    },\n" +
                    "    \"parameters\": {\n" +
                    "        \"sample_rate\": 24000,\n" +
                    "        \"response_format\": \"wav\"\n" +
                    "    }\n" +
                    "}";
    
            HttpURLConnection connection = null;
            try {
                // URL untuk wilayah Singapura. Untuk wilayah Beijing, gunakan: https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization
                URL url = new URL("https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization");
                connection = (HttpURLConnection) url.openConnection();
    
                // Setel metode dan header permintaan
                connection.setRequestMethod("POST");
                connection.setRequestProperty("Authorization", "Bearer " + apiKey);
                connection.setRequestProperty("Content-Type", "application/json");
                connection.setDoOutput(true);
                connection.setDoInput(true);
    
                // Kirim badan permintaan
                try (OutputStream os = connection.getOutputStream()) {
                    byte[] input = jsonBody.getBytes("UTF-8");
                    os.write(input, 0, input.length);
                    os.flush();
                }
    
                // Dapatkan tanggapan
                int responseCode = connection.getResponseCode();
                if (responseCode == HttpURLConnection.HTTP_OK) {
                    // Baca konten tanggapan
                    StringBuilder response = new StringBuilder();
                    try (BufferedReader br = new BufferedReader(
                            new InputStreamReader(connection.getInputStream(), "UTF-8"))) {
                        String responseLine;
                        while ((responseLine = br.readLine()) != null) {
                            response.append(responseLine.trim());
                        }
                    }
    
                    // Uraikan tanggapan JSON
                    JsonObject jsonResponse = JsonParser.parseString(response.toString()).getAsJsonObject();
                    JsonObject outputObj = jsonResponse.getAsJsonObject("output");
                    JsonObject previewAudioObj = outputObj.getAsJsonObject("preview_audio");
    
                    // Dapatkan nama suara
                    String voiceName = outputObj.get("voice").getAsString();
                    System.out.println("Nama suara: " + voiceName);
    
                    // Dapatkan data audio dalam format Base64
                    String base64Audio = previewAudioObj.get("data").getAsString();
    
                    // Dekode data audio Base64
                    byte[] audioBytes = Base64.getDecoder().decode(base64Audio);
    
                    // Simpan audio ke file lokal
                    String filename = voiceName + "_preview.wav";
                    saveAudioToFile(audioBytes, filename);
    
                    System.out.println("Audio disimpan ke file lokal: " + filename);
    
                } else {
                    // Baca tanggapan kesalahan
                    StringBuilder errorResponse = new StringBuilder();
                    try (BufferedReader br = new BufferedReader(
                            new InputStreamReader(connection.getErrorStream(), "UTF-8"))) {
                        String responseLine;
                        while ((responseLine = br.readLine()) != null) {
                            errorResponse.append(responseLine.trim());
                        }
                    }
    
                    System.out.println("Permintaan gagal. Kode status: " + responseCode);
                    System.out.println("Tanggapan kesalahan: " + errorResponse.toString());
                }
    
            } catch (Exception e) {
                System.err.println("Kesalahan permintaan: " + e.getMessage());
                e.printStackTrace();
            } finally {
                if (connection != null) {
                    connection.disconnect();
                }
            }
        }
    
        private void saveAudioToFile(byte[] audioBytes, String filename) {
            try {
                File file = new File(filename);
                try (FileOutputStream fos = new FileOutputStream(file)) {
                    fos.write(audioBytes);
                }
                System.out.println("Audio disimpan ke: " + file.getAbsolutePath());
            } catch (IOException e) {
                System.err.println("Kesalahan menyimpan file audio: " + e.getMessage());
                e.printStackTrace();
            }
        }
    }

Daftar suara

Menjalankan kueri terpaginasi untuk mencantumkan suara yang telah dibuat.

  • 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 otentikasi. Formatnya adalah Bearer <your_api_key>. Ganti "<your_api_key>" dengan Kunci API aktual Anda.

    Content-Type

    string

    Ya

    Jenis media data dalam badan permintaan. Nilainya tetap application/json.

  • Isi permintaan

    Badan permintaan berisi semua parameter permintaan. Anda dapat mengabaikan bidang opsional sesuai kebutuhan.

    Penting

    model: Model desain suara. Nilainya tetap qwen-voice-design. Jangan ubah nilai ini.

    {
        "model": "qwen-voice-design",
        "input": {
            "action": "list",
            "page_size": 10,
            "page_index": 0
        }
    }
  • Parameter permintaan

    Parameter

    Type

    Bawaan

    Wajib

    Deskripsi

    model

    string

    -

    Didukung

    Model desain suara. Nilai tetap: qwen-voice-design.

    action

    string

    -

    Didukung

    Jenis operasi. Nilai tetap: list.

    page_index

    integer

    0

    Tidak

    Indeks halaman. Rentang nilai: [0, 200].

    page_size

    integer

    10

    Tidak

    Jumlah entri data per halaman. Nilai harus lebih besar dari 0.

  • Parameter respons

    Klik untuk melihat contoh respons

    {
        "output": {
            "page_index": 0,
            "page_size": 2,
            "total_count": 26,
            "voice_list": [
                {
                    "gmt_create": "2025-12-10 17:04:54",
                    "gmt_modified": "2025-12-10 17:04:54",
                    "language": "en",
                    "preview_text": "Dear listeners, hello everyone. Welcome to today's program.",
                    "target_model": "qwen3-tts-vd-realtime-2026-01-15",
                    "voice": "yourVoice1",
                    "voice_prompt": "A calm middle-aged male announcer with a deep, rich, and magnetic voice, steady speaking speed, and clear articulation, suitable for news broadcasting or documentary narration., deep and magnetic, steady speaking speed"
                },
                {
                    "gmt_create": "2025-12-10 15:31:35",
                    "gmt_modified": "2025-12-10 15:31:35",
                    "language": "en",
                    "preview_text": "Dear listeners, hello everyone",
                    "target_model": "qwen3-tts-vd-realtime-2026-01-15",
                    "voice": "yourVoice2",
                    "voice_prompt": "A calm middle-aged male announcer with a deep, rich, and magnetic voice, steady speaking speed, and clear articulation, suitable for news broadcasting or documentary narration."
                }
            ]
        },
        "usage": {},
        "request_id": "yourRequestId"
    }

    Parameter utamanya adalah:

    Parameter

    Tipe

    Deskripsi

    voice

    string

    Nama suara. Anda dapat menggunakannya langsung sebagai parameter voice dalam API sintesis suara.

    target_model

    string

    Model sintesis suara yang menggerakkan suara. model yang didukung:

    • qwen3-tts-vd-realtime-2026-01-15

    • qwen3-tts-vd-realtime-2025-12-16

    Harus konsisten dengan model sintesis suara yang digunakan dalam panggilan API selanjutnya. Jika tidak, sintesis akan gagal.

    language

    string

    Kode bahasa.

    Nilai yang valid: zh (Bahasa Mandarin), en (Bahasa Inggris), de (Bahasa Jerman), it (Bahasa Italia), pt (Bahasa Portugis), es (Bahasa Spanyol), ja (Bahasa Jepang), ko (Bahasa Korea), fr (Bahasa Prancis), ru (Bahasa Rusia).

    voice_prompt

    string

    Deskripsi suara.

    preview_text

    string

    Teks pratinjau.

    gmt_create

    string

    Waktu suara dibuat.

    gmt_modified

    string

    Waktu suara dimodifikasi.

    page_index

    integer

    Indeks halaman.

    page_size

    integer

    Jumlah entri data per halaman.

    total_count

    integer

    Jumlah total entri data yang ditemukan.

    request_id

    string

    ID Permintaan.

  • Kode contoh

    Penting

    model: Model desain suara. Nilainya tetap qwen-voice-design. Jangan ubah nilai ini.

    cURL

    Jika Anda belum menyetel Kunci API sebagai variabel lingkungan, ganti $DASHSCOPE_API_KEY dalam contoh dengan Kunci API aktual Anda.

    # ======= Penting =======
    # URL di bawah ini untuk wilayah Singapura. Untuk wilayah Beijing, gunakan: 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 https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization \
    -H "Authorization: Bearer $DASHSCOPE_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
        "model": "qwen-voice-design",
        "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 menyetel variabel lingkungan, ganti baris di bawah ini dengan: api_key = "sk-xxx"
    api_key = os.getenv("DASHSCOPE_API_KEY")
    # URL untuk wilayah Singapura. Untuk wilayah Beijing, gunakan: 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-design", # 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 diambil:")
        for item in voice_list:
            print(f"- Suara: {item['voice']}  Dibuat: {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 menyetel variabel lingkungan, ganti baris di bawah ini dengan: String apiKey = "sk-xxx"
            String apiKey = System.getenv("DASHSCOPE_API_KEY");
            // URL untuk wilayah Singapura. Untuk wilayah Beijing, gunakan: 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-design\"," // 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("JSON yang Dikembalikan: " + 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 diambil:");
                    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  Dibuat: %s  Model: %s\n",
                                voice, gmtCreate, targetModel);
                    }
                }
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

Kueri suara tertentu

Mengambil informasi terperinci tentang suara tertentu berdasarkan namanya.

  • 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 otentikasi. Formatnya adalah Bearer <your_api_key>. Ganti "<your_api_key>" dengan Kunci API aktual Anda.

    Content-Type

    string

    Ya

    Jenis media data dalam badan permintaan. Nilainya tetap application/json.

  • Isi permintaan

    Badan permintaan berisi semua parameter permintaan. Anda dapat mengabaikan bidang opsional sesuai kebutuhan.

    Penting

    model: Model desain suara. Nilainya tetap qwen-voice-design. Jangan ubah nilai ini.

    {
        "model": "qwen-voice-design",
        "input": {
            "action": "query",
            "voice": "voiceName"
        }
    }
  • Parameter permintaan

    Parameter

    Tipe

    Bawaan

    Wajib

    Deskripsi

    model

    string

    -

    Didukung

    Model desain suara. Nilai tetap: qwen-voice-design.

    action

    string

    -

    Didukung

    Jenis operasi. Nilai tetap: query.

    voice

    string

    -

    Didukung

    Nama suara yang akan dikueri.

  • Parameter respons

    Klik untuk melihat contoh respons

    Data ditemukan

    {
        "output": {
            "gmt_create": "2025-12-10 14:54:09",
            "gmt_modified": "2025-12-10 17:47:48",
            "language": "en",
            "preview_text": "Dear listeners, hello everyone",
            "target_model": "qwen3-tts-vd-realtime-2026-01-15",
            "voice": "yourVoice",
            "voice_prompt": "A calm middle-aged male announcer with a deep, rich, and magnetic voice, steady speaking speed, and clear articulation, suitable for news broadcasting or documentary narration."
        },
        "usage": {},
        "request_id": "yourRequestId"
    }

    Data tidak ditemukan

    Saat suara yang dikueri tidak ada, API mengembalikan kode status HTTP 400, dan badan respons berisi kode kesalahan VoiceNotFound.

    {
        "request_id":"yourRequestId",
        "code":"VoiceNotFound",
        "message":"Voice not found: qwen-tts-vd-announcer-voice-xxxx"
    }

    Parameter utamanya adalah:

    Parameter

    Tipe

    Deskripsi

    voice

    string

    Nama suara. Anda dapat menggunakannya langsung sebagai parameter voice dalam API sintesis suara.

    target_model

    string

    Model sintesis suara yang menggerakkan suara. model yang didukung:

    • qwen3-tts-vd-realtime-2026-01-15

    • qwen3-tts-vd-realtime-2025-12-16

    Harus konsisten dengan model sintesis suara yang digunakan dalam panggilan API selanjutnya. Jika tidak, sintesis akan gagal.

    language

    string

    Kode bahasa.

    Nilai yang valid: zh (Bahasa Mandarin), en (Bahasa Inggris), de (Bahasa Jerman), it (Bahasa Italia), pt (Bahasa Portugis), es (Bahasa Spanyol), ja (Bahasa Jepang), ko (Bahasa Korea), fr (Bahasa Prancis), ru (Bahasa Rusia).

    voice_prompt

    string

    Deskripsi suara.

    preview_text

    string

    Teks pratinjau.

    gmt_create

    string

    Waktu suara dibuat.

    gmt_modified

    string

    Waktu suara dimodifikasi.

    request_id

    string

    ID Permintaan.

  • Kode contoh

    Penting

    model: Model desain suara. Nilainya tetap qwen-voice-design. Jangan ubah nilai ini.

    cURL

    Jika Anda belum menyetel Kunci API sebagai variabel lingkungan, ganti $DASHSCOPE_API_KEY dalam contoh dengan Kunci API aktual Anda.

    # ======= Penting =======
    # URL di bawah ini untuk wilayah Singapura. Untuk wilayah Beijing, gunakan: 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 https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization \
    -H "Authorization: Bearer $DASHSCOPE_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
        "model": "qwen-voice-design",
        "input": {
            "action": "query",
            "voice": "voiceName"
        }
    }'

    Python

    import requests
    import os
    
    def query_voice(voice_name):
        """
        Kueri informasi untuk suara tertentu
        :param voice_name: Nama suara
        :return: Kamus dengan informasi suara, atau None jika tidak ditemukan
        """
        # 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 menyetel variabel lingkungan, ganti baris di bawah ini dengan: api_key = "sk-xxx"
        api_key = os.getenv("DASHSCOPE_API_KEY")
        
        # Siapkan data permintaan
        headers = {
            "Authorization": f"Bearer {api_key}",
            "Content-Type": "application/json"
        }
        
        data = {
            "model": "qwen-voice-design",
            "input": {
                "action": "query",
                "voice": voice_name
            }
        }
        
        # URL untuk wilayah Singapura. Untuk wilayah Beijing, gunakan: https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization
        url = "https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization"
        # Kirim permintaan
        response = requests.post(
            url,
            headers=headers,
            json=data
        )
        
        if response.status_code == 200:
            result = response.json()
            
            # Periksa pesan kesalahan
            if "code" in result and result["code"] == "VoiceNotFound":
                print(f"Suara tidak ditemukan: {voice_name}")
                print(f"Pesan kesalahan: {result.get('message', 'Suara tidak ditemukan')}")
                return None
            
            # Dapatkan informasi suara
            voice_info = result["output"]
            print(f"Berhasil mengambil informasi suara:")
            print(f"  Nama Suara: {voice_info.get('voice')}")
            print(f"  Dibuat: {voice_info.get('gmt_create')}")
            print(f"  Dimodifikasi: {voice_info.get('gmt_modified')}")
            print(f"  Bahasa: {voice_info.get('language')}")
            print(f"  Teks Pratinjau: {voice_info.get('preview_text')}")
            print(f"  Model: {voice_info.get('target_model')}")
            print(f"  Prompt Suara: {voice_info.get('voice_prompt')}")
            
            return voice_info
        else:
            print(f"Permintaan gagal. Kode status: {response.status_code}")
            print(f"Tanggapan: {response.text}")
            return None
    
    def main():
        # Contoh: Kueri suara
        voice_name = "myvoice"  # Ganti dengan nama suara aktual yang ingin Anda kueri
        
        print(f"Mengkueri suara: {voice_name}")
        voice_info = query_voice(voice_name)
        
        if voice_info:
            print("\nKueri suara berhasil!")
        else:
            print("\nKueri suara gagal atau suara tidak ada.")
    
    if __name__ == "__main__":
        main()

    Java

    import com.google.gson.JsonObject;
    import com.google.gson.JsonParser;
    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) {
            Main example = new Main();
            // Contoh: Kueri suara
            String voiceName = "myvoice"; // Ganti dengan nama suara aktual yang ingin Anda kueri
            System.out.println("Mengkueri suara: " + voiceName);
            example.queryVoice(voiceName);
        }
    
        public void queryVoice(String voiceName) {
            // 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 menyetel variabel lingkungan, ganti baris di bawah ini dengan: String apiKey = "sk-xxx"
            String apiKey = System.getenv("DASHSCOPE_API_KEY");
    
            // Buat string badan permintaan JSON
            String jsonBody = "{\n" +
                    "    \"model\": \"qwen-voice-design\",\n" +
                    "    \"input\": {\n" +
                    "        \"action\": \"query\",\n" +
                    "        \"voice\": \"" + voiceName + "\"\n" +
                    "    }\n" +
                    "}";
    
            HttpURLConnection connection = null;
            try {
                // URL untuk wilayah Singapura. Untuk wilayah Beijing, gunakan: https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization
                URL url = new URL("https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization");
                connection = (HttpURLConnection) url.openConnection();
    
                // Setel metode dan header permintaan
                connection.setRequestMethod("POST");
                connection.setRequestProperty("Authorization", "Bearer " + apiKey);
                connection.setRequestProperty("Content-Type", "application/json");
                connection.setDoOutput(true);
                connection.setDoInput(true);
    
                // Kirim badan permintaan
                try (OutputStream os = connection.getOutputStream()) {
                    byte[] input = jsonBody.getBytes("UTF-8");
                    os.write(input, 0, input.length);
                    os.flush();
                }
    
                // Dapatkan tanggapan
                int responseCode = connection.getResponseCode();
                if (responseCode == HttpURLConnection.HTTP_OK) {
                    // Baca konten tanggapan
                    StringBuilder response = new StringBuilder();
                    try (BufferedReader br = new BufferedReader(
                            new InputStreamReader(connection.getInputStream(), "UTF-8"))) {
                        String responseLine;
                        while ((responseLine = br.readLine()) != null) {
                            response.append(responseLine.trim());
                        }
                    }
    
                    // Uraikan tanggapan JSON
                    JsonObject jsonResponse = JsonParser.parseString(response.toString()).getAsJsonObject();
    
                    // Periksa pesan kesalahan
                    if (jsonResponse.has("code") && "VoiceNotFound".equals(jsonResponse.get("code").getAsString())) {
                        String errorMessage = jsonResponse.has("message") ?
                                jsonResponse.get("message").getAsString() : "Suara tidak ditemukan";
                        System.out.println("Suara tidak ditemukan: " + voiceName);
                        System.out.println("Pesan kesalahan: " + errorMessage);
                        return;
                    }
    
                    // Dapatkan informasi suara
                    JsonObject outputObj = jsonResponse.getAsJsonObject("output");
    
                    System.out.println("Berhasil mengambil informasi suara:");
                    System.out.println("  Nama Suara: " + outputObj.get("voice").getAsString());
                    System.out.println("  Dibuat: " + outputObj.get("gmt_create").getAsString());
                    System.out.println("  Dimodifikasi: " + outputObj.get("gmt_modified").getAsString());
                    System.out.println("  Bahasa: " + outputObj.get("language").getAsString());
                    System.out.println("  Teks Pratinjau: " + outputObj.get("preview_text").getAsString());
                    System.out.println("  Model: " + outputObj.get("target_model").getAsString());
                    System.out.println("  Prompt Suara: " + outputObj.get("voice_prompt").getAsString());
    
                } else {
                    // Baca tanggapan kesalahan
                    StringBuilder errorResponse = new StringBuilder();
                    try (BufferedReader br = new BufferedReader(
                            new InputStreamReader(connection.getErrorStream(), "UTF-8"))) {
                        String responseLine;
                        while ((responseLine = br.readLine()) != null) {
                            errorResponse.append(responseLine.trim());
                        }
                    }
    
                    System.out.println("Permintaan gagal. Kode status: " + responseCode);
                    System.out.println("Tanggapan kesalahan: " + errorResponse.toString());
                }
    
            } catch (Exception e) {
                System.err.println("Kesalahan permintaan: " + e.getMessage());
                e.printStackTrace();
            } finally {
                if (connection != null) {
                    connection.disconnect();
                }
            }
        }
    }

Hapus suara

Menghapus suara tertentu dan melepaskan kuota yang sesuai.

  • 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 otentikasi. Formatnya adalah Bearer <your_api_key>. Ganti "<your_api_key>" dengan Kunci API aktual Anda.

    Content-Type

    string

    Ya

    Jenis media data dalam badan permintaan. Nilainya tetap application/json.

  • Isi permintaan

    Badan permintaan berisi semua parameter permintaan. Anda dapat mengabaikan bidang opsional sesuai kebutuhan:

    Penting

    model: Model desain suara. Nilainya tetap qwen-voice-design. Jangan ubah nilai ini.

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

    Parameter

    Tipe

    Bawaan

    Wajib

    Deskripsi

    model

    string

    -

    Didukung

    Model desain suara. Nilai tetap: qwen-voice-design.

    action

    string

    -

    Didukung

    Jenis operasi. Nilai tetap: delete.

    voice

    string

    -

    Didukung

    Suara yang akan dihapus.

  • Parameter respons

    Klik untuk melihat contoh respons

    {
        "output": {
            "voice": "yourVoice"
        },
        "usage": {},
        "request_id": "yourRequestId"
    }

    Parameter utamanya adalah:

    Parameter

    Tipe

    Deskripsi

    request_id

    string

    ID Permintaan.

    voice

    string

    Suara yang dihapus.

  • Kode contoh

    Penting

    model: Model desain suara. Nilainya tetap qwen-voice-design. Jangan ubah nilai ini.

    cURL

    Jika Anda belum menyetel Kunci API sebagai variabel lingkungan, ganti $DASHSCOPE_API_KEY dalam contoh dengan Kunci API aktual Anda.

    # ======= Penting =======
    # URL di bawah ini untuk wilayah Singapura. Untuk wilayah Beijing, gunakan: 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 https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization \
    -H "Authorization: Bearer $DASHSCOPE_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
        "model": "qwen-voice-design",
        "input": {
            "action": "delete",
            "voice": "yourVoice"
        }
    }'

    Python

    import requests
    import os
    
    def delete_voice(voice_name):
        """
        Menghapus suara tertentu
        :param voice_name: Nama suara
        :return: True jika penghapusan berhasil atau suara tidak ada tetapi permintaan berhasil, False jika operasi gagal
        """
        # 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 menyetel variabel lingkungan, ganti baris di bawah ini dengan: api_key = "sk-xxx"
        api_key = os.getenv("DASHSCOPE_API_KEY")
        
        # Siapkan data permintaan
        headers = {
            "Authorization": f"Bearer {api_key}",
            "Content-Type": "application/json"
        }
        
        data = {
            "model": "qwen-voice-design",
            "input": {
                "action": "delete",
                "voice": voice_name
            }
        }
        
        # URL untuk wilayah Singapura. Untuk wilayah Beijing, gunakan: https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization
        url = "https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization"
        # Kirim permintaan
        response = requests.post(
            url,
            headers=headers,
            json=data
        )
        
        if response.status_code == 200:
            result = response.json()
            
            # Periksa pesan kesalahan
            if "code" in result and "VoiceNotFound" in result["code"]:
                print(f"Suara tidak ada: {voice_name}")
                print(f"Pesan kesalahan: {result.get('message', 'Suara tidak ditemukan')}")
                return True  # Suara tidak ada juga dianggap operasi berhasil (target sudah hilang)
            
            # Periksa apakah penghapusan berhasil
            if "usage" in result:
                print(f"Suara berhasil dihapus: {voice_name}")
                print(f"ID Permintaan: {result.get('request_id', 'N/A')}")
                return True
            else:
                print(f"Operasi hapus mengembalikan format yang tidak terduga: {result}")
                return False
        else:
            print(f"Permintaan hapus suara gagal. Kode status: {response.status_code}")
            print(f"Tanggapan: {response.text}")
            return False
    
    def main():
        # Contoh: Hapus suara
        voice_name = "myvoice"  # Ganti dengan nama suara aktual yang ingin Anda hapus
        
        print(f"Menghapus suara: {voice_name}")
        success = delete_voice(voice_name)
        
        if success:
            print(f"\nOperasi penghapusan suara '{voice_name}' selesai!")
        else:
            print(f"\nOperasi penghapusan suara '{voice_name}' gagal!")
    
    if __name__ == "__main__":
        main()

    Java

    import com.google.gson.JsonObject;
    import com.google.gson.JsonParser;
    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) {
            Main example = new Main();
            // Contoh: Hapus suara
            String voiceName = "myvoice"; // Ganti dengan nama suara aktual yang ingin Anda hapus
            System.out.println("Menghapus suara: " + voiceName);
            example.deleteVoice(voiceName);
        }
    
        public void deleteVoice(String voiceName) {
            // 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 menyetel variabel lingkungan, ganti baris di bawah ini dengan: String apiKey = "sk-xxx"
            String apiKey = System.getenv("DASHSCOPE_API_KEY");
    
            // Buat string badan permintaan JSON
            String jsonBody = "{\n" +
                    "    \"model\": \"qwen-voice-design\",\n" +
                    "    \"input\": {\n" +
                    "        \"action\": \"delete\",\n" +
                    "        \"voice\": \"" + voiceName + "\"\n" +
                    "    }\n" +
                    "}";
    
            HttpURLConnection connection = null;
            try {
                // URL untuk wilayah Singapura. Untuk wilayah Beijing, gunakan: https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization
                URL url = new URL("https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization");
                connection = (HttpURLConnection) url.openConnection();
    
                // Setel metode dan header permintaan
                connection.setRequestMethod("POST");
                connection.setRequestProperty("Authorization", "Bearer " + apiKey);
                connection.setRequestProperty("Content-Type", "application/json");
                connection.setDoOutput(true);
                connection.setDoInput(true);
    
                // Kirim badan permintaan
                try (OutputStream os = connection.getOutputStream()) {
                    byte[] input = jsonBody.getBytes("UTF-8");
                    os.write(input, 0, input.length);
                    os.flush();
                }
    
                // Dapatkan tanggapan
                int responseCode = connection.getResponseCode();
                if (responseCode == HttpURLConnection.HTTP_OK) {
                    // Baca konten tanggapan
                    StringBuilder response = new StringBuilder();
                    try (BufferedReader br = new BufferedReader(
                            new InputStreamReader(connection.getInputStream(), "UTF-8"))) {
                        String responseLine;
                        while ((responseLine = br.readLine()) != null) {
                            response.append(responseLine.trim());
                        }
                    }
    
                    // Uraikan tanggapan JSON
                    JsonObject jsonResponse = JsonParser.parseString(response.toString()).getAsJsonObject();
    
                    // Periksa pesan kesalahan
                    if (jsonResponse.has("code") && jsonResponse.get("code").getAsString().contains("VoiceNotFound")) {
                        String errorMessage = jsonResponse.has("message") ?
                                jsonResponse.get("message").getAsString() : "Suara tidak ditemukan";
                        System.out.println("Suara tidak ada: " + voiceName);
                        System.out.println("Pesan kesalahan: " + errorMessage);
                        // Suara tidak ada juga dianggap operasi berhasil (target sudah hilang)
                    } else if (jsonResponse.has("usage")) {
                        // Periksa apakah penghapusan berhasil
                        System.out.println("Suara berhasil dihapus: " + voiceName);
                        String requestId = jsonResponse.has("request_id") ?
                                jsonResponse.get("request_id").getAsString() : "N/A";
                        System.out.println("ID Permintaan: " + requestId);
                    } else {
                        System.out.println("Operasi hapus mengembalikan format yang tidak terduga: " + response.toString());
                    }
    
                } else {
                    // Baca tanggapan kesalahan
                    StringBuilder errorResponse = new StringBuilder();
                    try (BufferedReader br = new BufferedReader(
                            new InputStreamReader(connection.getErrorStream(), "UTF-8"))) {
                        String responseLine;
                        while ((responseLine = br.readLine()) != null) {
                            errorResponse.append(responseLine.trim());
                        }
                    }
    
                    System.out.println("Permintaan hapus suara gagal. Kode status: " + responseCode);
                    System.out.println("Tanggapan kesalahan: " + errorResponse.toString());
                }
    
            } catch (Exception e) {
                System.err.println("Kesalahan permintaan: " + e.getMessage());
                e.printStackTrace();
            } finally {
                if (connection != null) {
                    connection.disconnect();
                }
            }
        }
    }

Sintesis suara

Untuk mempelajari cara menggunakan suara kustom dari desain suara untuk sintesis suara personalisasi, lihat Memulai: Dari desain suara hingga sintesis suara.

Model sintesis suara untuk desain suara, seperti qwen3-tts-vd-realtime-2026-01-15, bersifat khusus. Model ini hanya mendukung suara yang dihasilkan oleh desain suara dan tidak mendukung suara preset publik seperti Chelsie, Serena, Ethan, atau Cherry.

Kuota suara dan pembersihan otomatis

  • Batas total: 1.000 suara per akun

    Anda dapat memeriksa jumlah suara (total_count) dengan memanggil Daftar suara
  • Pembersihan otomatis: Jika suara tidak digunakan dalam permintaan sintesis suara apa pun dalam satu tahun terakhir, sistem akan menghapusnya secara otomatis.

Penagihan

Desain suara dan sintesis suara ditagih secara terpisah:

  • Desain suara: Membuat suara ditagih sebesar $0,2 per suara. Pembuatan yang gagal tidak ditagih.

    Catatan

    Rincian kuota gratis (hanya wilayah Singapura):

    • Dalam 90 hari setelah mengaktifkan Alibaba Cloud Model Studio, Anda mendapatkan 10 kesempatan gratis untuk 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,2 per suara.

  • Sintesis suara menggunakan suara kustom dari desain suara: Ditagih berdasarkan jumlah karakter teks. Untuk rincian, lihat Sintesis suara Real-time - Qwen.

Pesan kesalahan

Jika Anda mengalami kesalahan, lihat Pesan kesalahan untuk troubleshooting.