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_prompttidak 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:
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."
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.
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."
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.
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
1. Alur kerja
Desain suara dan sintesis suara adalah dua langkah yang saling terkait erat namun independen, mengikuti alur kerja "buat dulu, lalu gunakan":
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."
Panggil API Buat suara untuk menghasilkan suara kustom dan mendapatkan nama serta audio pratinjaunya.
Pada langkah ini, Anda harus menentukan
target_modeluntuk 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.
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_modelyang 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
Dapatkan Kunci API: Dapatkan dan Konfigurasikan Kunci API. Untuk keamanan, simpan Kunci API Anda dalam Variabel lingkungan.
Instal SDK: Instal SDK DashScope versi terbaru.
3. Contoh Kode
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(); } } }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
voicedengan 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/customizationInternasional (Singapura):
POST https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customizationHeader permintaan
Parameter
Tipe
Wajib
Deskripsi
Authorization
string
Token otentikasi. Format:
Bearer <your_api_key>. Ganti "<your_api_key>" dengan Kunci API aktual Anda.Content-Type
string
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.
PentingPerhatikan 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
-
Model desain suara. Nilai tetap:
qwen-voice-design.action
string
-
Jenis operasi. Nilai tetap:
create.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.
voice_prompt
string
-
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
-
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
-
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
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
Laju sampel (dalam Hz) audio pratinjau yang dihasilkan oleh desain suara.
Nilai yang valid:
8000
16000
24000
48000
response_format
string
wav
Format audio pratinjau yang dihasilkan oleh desain suara.
Nilai yang valid:
pcm
wav
mp3
opus
Parameter respons
Parameter utamanya adalah:
Parameter
Tipe
Deskripsi
voice
string
Nama suara. Anda dapat menggunakannya langsung sebagai parameter
voicedalam 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
PentingPerhatikan 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_KEYdalam 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/customizationInternasional:
POST https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customizationHeader permintaan
Parameter
Tipe
Wajib
Deskripsi
Authorization
string
Token otentikasi. Formatnya adalah
Bearer <your_api_key>. Ganti "<your_api_key>" dengan Kunci API aktual Anda.Content-Type
string
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.
Pentingmodel: Model desain suara. Nilainya tetapqwen-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
-
Model desain suara. Nilai tetap:
qwen-voice-design.action
string
-
Jenis operasi. Nilai tetap:
list.page_index
integer
0
Indeks halaman. Rentang nilai: [0, 200].
page_size
integer
10
Jumlah entri data per halaman. Nilai harus lebih besar dari 0.
Parameter respons
Parameter utamanya adalah:
Parameter
Tipe
Deskripsi
voice
string
Nama suara. Anda dapat menggunakannya langsung sebagai parameter
voicedalam 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
Pentingmodel: Model desain suara. Nilainya tetapqwen-voice-design. Jangan ubah nilai ini.cURL
Jika Anda belum menyetel Kunci API sebagai variabel lingkungan, ganti
$DASHSCOPE_API_KEYdalam 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/customizationInternasional:
POST https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customizationHeader permintaan
Parameter
Tipe
Wajib
Deskripsi
Authorization
string
Token otentikasi. Formatnya adalah
Bearer <your_api_key>. Ganti "<your_api_key>" dengan Kunci API aktual Anda.Content-Type
string
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.
Pentingmodel: Model desain suara. Nilainya tetapqwen-voice-design. Jangan ubah nilai ini.{ "model": "qwen-voice-design", "input": { "action": "query", "voice": "voiceName" } }Parameter permintaan
Parameter
Tipe
Bawaan
Wajib
Deskripsi
model
string
-
Model desain suara. Nilai tetap:
qwen-voice-design.action
string
-
Jenis operasi. Nilai tetap:
query.voice
string
-
Nama suara yang akan dikueri.
Parameter respons
Parameter utamanya adalah:
Parameter
Tipe
Deskripsi
voice
string
Nama suara. Anda dapat menggunakannya langsung sebagai parameter
voicedalam 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
Pentingmodel: Model desain suara. Nilainya tetapqwen-voice-design. Jangan ubah nilai ini.cURL
Jika Anda belum menyetel Kunci API sebagai variabel lingkungan, ganti
$DASHSCOPE_API_KEYdalam 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/customizationInternasional:
POST https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customizationHeader permintaan
Parameter
Tipe
Wajib
Deskripsi
Authorization
string
Token otentikasi. Formatnya adalah
Bearer <your_api_key>. Ganti "<your_api_key>" dengan Kunci API aktual Anda.Content-Type
string
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:
Pentingmodel: Model desain suara. Nilainya tetapqwen-voice-design. Jangan ubah nilai ini.{ "model": "qwen-voice-design", "input": { "action": "delete", "voice": "yourVoice" } }Parameter permintaan
Parameter
Tipe
Bawaan
Wajib
Deskripsi
model
string
-
Model desain suara. Nilai tetap:
qwen-voice-design.action
string
-
Jenis operasi. Nilai tetap:
delete.voice
string
-
Suara yang akan dihapus.
Parameter respons
Parameter utamanya adalah:
Parameter
Tipe
Deskripsi
request_id
string
ID Permintaan.
voice
string
Suara yang dihapus.
Kode contoh
Pentingmodel: Model desain suara. Nilainya tetapqwen-voice-design. Jangan ubah nilai ini.cURL
Jika Anda belum menyetel Kunci API sebagai variabel lingkungan, ganti
$DASHSCOPE_API_KEYdalam 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 suaraPembersihan 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.
CatatanRincian 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.