Untuk menggunakan model di wilayah China (Beijing), buka halaman Kunci API untuk wilayah China (Beijing).
Topik ini menjelaskan cara mengakses layanan sintesis suara CosyVoice melalui koneksi WebSocket.
SDK DashScope saat ini hanya mendukung Java dan Python. Jika Anda ingin mengembangkan aplikasi sintesis suara CosyVoice dalam bahasa pemrograman lain, Anda dapat berkomunikasi dengan layanan melalui koneksi WebSocket.
Panduan pengguna: Untuk informasi lebih lanjut tentang model dan panduan pemilihan model, lihat Sintesis suara Real-time - CosyVoice.
WebSocket adalah protokol jaringan yang mendukung komunikasi full-duplex. Klien dan server membangun koneksi persisten melalui satu kali handshake, memungkinkan kedua pihak saling mendorong data secara aktif. Hal ini memberikan keunggulan signifikan dalam performa real-time dan efisiensi.
Untuk bahasa pemrograman umum, tersedia banyak library WebSocket siap pakai beserta contohnya, seperti:
Go:
gorilla/websocketPHP:
RatchetNode.js:
ws
Pahami prinsip dasar dan detail teknis WebSocket sebelum memulai pengembangan.
Prasyarat
Anda telah mengaktifkan Model Studio dan membuat Kunci API. Untuk mencegah risiko keamanan, ekspor Kunci API sebagai Variabel lingkungan alih-alih menyematkannya langsung di kode Anda.
Untuk memberikan izin akses sementara kepada aplikasi atau pengguna pihak ketiga, atau jika Anda ingin mengontrol secara ketat operasi berisiko tinggi seperti mengakses atau menghapus data sensitif, kami menyarankan Anda menggunakan Token otentikasi sementara.
Dibandingkan dengan Kunci API jangka panjang, token otentikasi sementara lebih aman karena masa berlakunya singkat (60 detik). Token ini cocok untuk skenario panggilan sementara dan secara efektif mengurangi risiko kebocoran Kunci API.
Untuk menggunakan token sementara, gantilah Kunci API yang digunakan untuk otentikasi di kode Anda dengan token otentikasi sementara tersebut.
Model dan harga
Model | Harga | Kuota gratis (Catatan) |
cosyvoice-v3-plus | $0,286706 per 10.000 karakter | Tidak ada kuota gratis |
cosyvoice-v3-flash | $0,14335 per 10.000 karakter | |
cosyvoice-v2 | $0,286706 per 10.000 karakter |
Batasan teks dan format
Batas panjang teks
Teks yang dikirim dalam satu instruksi continue-task tidak boleh melebihi 20.000 karakter. Panjang total teks yang dikirim melalui beberapa instruksi continue-task tidak boleh melebihi 200.000 karakter.
Aturan penghitungan karakter
Satu karakter Tionghoa—termasuk Tionghoa sederhana atau tradisional, kanji Jepang, dan hanja Korea—dihitung sebagai 2 karakter. Semua karakter lain, seperti tanda baca, huruf, angka, serta kana atau hangul Jepang/Korea, dihitung sebagai 1 karakter.
Tag SSML tidak termasuk dalam perhitungan panjang teks.
Contoh:
"你好"→ 2(你) + 2(好) = 4 karakter"中A文123"→ 2(中) + 1(A) + 2(文) + 1(1) + 1(2) + 1(3) = 8 karakter"中文。"→ 2(中) + 2(文) + 1(。) = 5 karakter"中 文。"→ 2(中) + 1(spasi) + 2(文) + 1(。) = 6 karakter"<speak>你好</speak>"→ 2(你) + 2(好) = 4 karakter
Format encoding
Gunakan encoding UTF-8.
Dukungan ekspresi matematis
Fitur parsing ekspresi matematis saat ini hanya tersedia untuk model cosyvoice-v2, cosyvoice-v3-flash, dan cosyvoice-v3-plus. Fitur ini mendukung ekspresi matematis umum dari sekolah dasar dan menengah, seperti aritmetika dasar, aljabar, dan geometri.
Lihat Formula LaTeX ke Ucapan.
Dukungan SSML
Fitur Bahasa Markup Sintesis Ucapan (SSML) saat ini hanya tersedia untuk suara kloning model cosyvoice-v3-flash, cosyvoice-v3-plus, dan cosyvoice-v2, serta suara sistem yang ditandai sebagai didukung dalam daftar suara. Syarat-syarat berikut harus dipenuhi:
Untuk menggunakan fitur ini:
Saat mengirim instruksi run-task, atur parameter
enable_ssmlketrue.Gunakan instruksi continue-task untuk mengirim teks yang berisi SSML.
Saat dukungan SSML diaktifkan dengan mengatur parameter enable_ssml ke true, Anda harus mengirim seluruh teks sintesis dalam satu instruksi continue-task. Anda tidak dapat mengirim teks tersebut dalam beberapa bagian.
Alur interaksi
Klien mengirim pesan yang disebut instruksi ke server. Server mengembalikan dua jenis pesan ke klien: event dalam format JSON dan aliran audio biner.
Alur interaksi antara klien dan server adalah sebagai berikut:
Membangun koneksi: Klien membangun koneksi WebSocket dengan server.
Memulai tugas:
Klien mengirim instruksi run-task untuk memulai tugas.
Server mengembalikan event task-started, yang menunjukkan bahwa tugas telah berhasil dimulai dan Anda dapat melanjutkan ke langkah berikutnya.
Mengirim teks untuk sintesis:
Klien mengirim teks yang akan disintesis ke server dalam satu atau beberapa instruksi continue-task secara berurutan. Setelah server menerima satu pernyataan lengkap, server mengembalikan event result-generated dan aliran audio. Panjang teks dibatasi. Untuk informasi lebih lanjut, lihat deskripsi field
textdalam instruksi continue-task.CatatanAnda dapat mengirim instruksi continue-task beberapa kali untuk mengirim segmen teks secara berurutan. Server menerima segmen teks tersebut dan secara otomatis membaginya menjadi kalimat:
Server segera mensintesis kalimat lengkap dan mengirimkan audio yang sesuai ke klien.
Server menyimpan cache kalimat yang belum lengkap dan hanya mensintesisnya setelah kalimat tersebut lengkap. Tidak ada audio yang dikembalikan untuk kalimat yang belum lengkap.
Saat Anda mengirim instruksi finish-task, server secara paksa mensintesis semua konten yang tersimpan di cache.
Memberi tahu server untuk mengakhiri tugas:
Setelah semua teks dikirim, klien mengirim instruksi finish-task ke server dan terus menerima aliran audio. Catatan: Jangan lewatkan langkah ini. Jika tidak, Anda mungkin tidak menerima aliran audio lengkap.
Mengakhiri tugas:
Klien menerima event task-finished dari server, yang menandai berakhirnya tugas.
Menutup koneksi: Klien menutup koneksi WebSocket.
URL
URL WebSocket tetap:
wss://dashscope.aliyuncs.com/api-ws/v1/inferenceHeader
Tambahkan informasi berikut ke header permintaan:
{
"Authorization": "bearer <your_dashscope_api_key>", // Wajib. Ganti <your_dashscope_api_key> dengan Kunci API Anda sendiri.
"user-agent": "your_platform_info", // Opsional.
"X-DashScope-WorkSpace": workspace, // Opsional. ID ruang kerja Alibaba Cloud Model Studio.
"X-DashScope-DataInspection": "enable"
}Instruksi (klien → server)
Instruksi adalah pesan yang dikirim klien ke server. Instruksi ini dalam format JSON dan dikirim sebagai Text Frame untuk memulai dan mengakhiri tugas, serta mengidentifikasi batas tugas.
Anda harus mengikuti urutan ini saat mengirim instruksi. Jika tidak, tugas mungkin gagal:
Kirim instruksi jalankan tugas
Memulai tugas sintesis suara.
task_idyang dikembalikan diperlukan untuk instruksi continue-task dan finish-task berikutnya. Anda harus menggunakan task_id yang sama untuk semua instruksi dalam satu tugas.
Kirim instruksi continue-task
Mengirim teks untuk sintesis.
Anda hanya dapat mengirim instruksi ini setelah menerima event task-started dari server.
Kirim instruksi finish-task
Mengakhiri tugas sintesis suara.
Anda harus mengirim instruksi ini setelah mengirim semua instruksi continue-task.
1. Instruksi run-task: Memulai tugas
Memulai tugas sintesis suara. Atur parameter permintaan, seperti suara dan laju sampel, dalam instruksi ini.
Kapan mengirim: Setelah koneksi WebSocket dibangun.
Jangan kirim teks untuk sintesis: Untuk menyederhanakan troubleshooting, jangan sertakan teks dalam instruksi ini.
Contoh:
{
"header": {
"action": "run-task",
"task_id": "2bf83b9a-baeb-4fda-8d9a-xxxxxxxxxxxx", // UUID acak
"streaming": "duplex"
},
"payload": {
"task_group": "audio",
"task": "tts",
"function": "SpeechSynthesizer",
"model": "cosyvoice-v3-flash",
"parameters": {
"text_type": "PlainText",
"voice": "longanyang", // Suara
"format": "mp3", // Format audio
"sample_rate": 22050, // Laju sampel
"volume": 50, // Volume
"rate": 1, // Laju
"pitch": 1 // Pitch
},
"input": {// Field input tidak boleh dihilangkan. Jika tidak, terjadi error.
}
}
}Header parameter:
Parameter | Tipe | Wajib | Deskripsi |
header.action | string | Ya | Jenis instruksi. Untuk instruksi ini, nilainya tetap "run-task". |
header.task_id | string | Ya | ID tugas saat ini. UUID (Universally Unique Identifier) 32-bit yang terdiri dari 32 huruf dan angka yang dihasilkan secara acak. Bisa mencakup tanda hubung (seperti Saat Anda kemudian mengirim instruksi continue-task dan instruksi finish-task, Anda harus menggunakan task_id yang sama dengan yang digunakan untuk instruksi run-task. |
header.streaming | string | Ya | String tetap: "duplex" |
Parameter payload:
Parameter | Type | Wajib | Deskripsi |
payload.task_group | string | Ya | String tetap: "audio". |
payload.task | string | Ya | String tetap: "tts". |
payload.function | string | Ya | String tetap: "SpeechSynthesizer". |
payload.model | string | Ya | model sintesis suara. Model yang berbeda memerlukan suara yang sesuai:
|
payload.input | object | Ya |
|
payload.parameters | |||
text_type | string | Ya | String tetap: "PlainText". |
voice | string | Ya | Suara yang digunakan untuk sintesis suara. Didukung suara sistem dan suara kloning:
|
format | string | Tidak | Format encoding audio. Format yang didukung adalah pcm, wav, mp3 (default), dan opus. Saat format audio adalah opus, Anda dapat menyesuaikan bitrate menggunakan parameter |
sample_rate | integer | Tidak | Laju pengambilan sampel audio dalam Hz. Nilai default: 22050. Nilai yang valid: 8000, 16000, 22050, 24000, 44100, 48000. Catatan Laju sampel default adalah laju optimal untuk suara saat ini. Secara default, output menggunakan laju sampel ini. Downsampling dan upsampling juga didukung. |
volume | integer | Tidak | Volume. Nilai default: 50. Rentang nilai: [0, 100]. Nilai 50 adalah volume standar. Volume memiliki hubungan linear dengan nilai ini. 0 berarti senyap dan 100 adalah volume maksimum. |
rate | float | Tidak | Laju ucapan. Nilai default: 1,0. Rentang nilai: [0,5, 2,0]. Nilai 1,0 adalah laju standar. Nilai kurang dari 1,0 memperlambat ucapan, dan nilai lebih dari 1,0 mempercepatnya. |
pitch | float | Tidak | Pitch. Nilai ini adalah pengali untuk penyesuaian pitch. Hubungan antara nilai ini dan pitch yang dirasakan tidak sepenuhnya linear atau logaritmik. Uji nilai-nilai berbeda untuk menemukan yang terbaik. Nilai default: 1,0. Rentang nilai: [0,5, 2,0]. Nilai 1,0 adalah pitch alami suara. Nilai lebih dari 1,0 meningkatkan pitch, dan nilai kurang dari 1,0 menurunkannya. |
enable_ssml | boolean | Tidak | Menentukan apakah akan mengaktifkan fitur SSML. Jika parameter ini diatur ke |
bit_rate | int | Tidak | Bitrate audio dalam kbps. Jika format audio adalah Opus, Anda dapat menyesuaikan bitrate menggunakan parameter Nilai default: 32. Rentang nilai: [6, 510]. |
word_timestamp_enabled | boolean | Tidak | Menentukan apakah akan mengaktifkan timestamp tingkat karakter. Nilai default: false.
Fitur ini hanya tersedia untuk suara kloning model cosyvoice-v3-flash, cosyvoice-v3-plus, dan cosyvoice-v2, serta suara sistem yang ditandai sebagai didukung dalam daftar suara. |
seed | int | Tidak | Bilangan acak seed yang digunakan selama generasi, yang memvariasikan efek sintesis. Jika versi model, teks, suara, dan parameter lainnya sama, menggunakan seed yang sama akan mereproduksi hasil sintesis yang sama. Nilai default: 0. Rentang nilai: [0, 65535]. |
language_hints | array[string] | Tidak | Menentukan bahasa target untuk sintesis suara guna meningkatkan efek sintesis. Gunakan parameter ini saat pelafalan angka, singkatan, atau simbol, atau saat efek sintesis untuk bahasa non-Tionghoa tidak sesuai harapan. Nilai yang valid:
Catatan: Meskipun parameter ini berupa array, versi saat ini hanya memproses elemen pertama. Oleh karena itu, Anda harus hanya mengirim satu nilai. Penting Parameter ini menentukan bahasa target untuk sintesis suara. Pengaturan ini independen dari bahasa audio sampel yang digunakan untuk kloning suara. Untuk mengatur bahasa sumber untuk tugas kloning suara, lihat API kloning suara CosyVoice. |
instruction | string | Tidak | Atur instruksi: Fitur ini hanya tersedia untuk suara kloning model cosyvoice-v3-flash dan cosyvoice-v3-plus, serta suara sistem yang ditandai sebagai didukung dalam Daftar Suara. Tidak ada nilai default. Parameter ini tidak berpengaruh jika tidak diatur. Sintesis suara memiliki efek berikut:
|
enable_aigc_tag | boolean | Tidak | Menentukan apakah akan menambahkan identifier AIGC tak terlihat ke audio yang dihasilkan. Saat diatur ke true, identifier tak terlihat disematkan ke audio dalam format yang didukung (WAV, MP3, dan Opus). Nilai default: false. Fitur ini hanya tersedia untuk model cosyvoice-v3-flash, cosyvoice-v3-plus, dan cosyvoice-v2. |
aigc_propagator | string | Tidak | Mengatur field Nilai default: UID Alibaba Cloud. Fitur ini hanya tersedia untuk model cosyvoice-v3-flash, cosyvoice-v3-plus, dan cosyvoice-v2. |
aigc_propagate_id | string | Tidak | Mengatur field Nilai default: ID permintaan dari permintaan sintesis suara saat ini. Fitur ini hanya tersedia untuk model cosyvoice-v3-flash, cosyvoice-v3-plus, dan cosyvoice-v2. |
2. Instruksi continue-task
Instruksi ini mengirim teks untuk sintesis.
Kirim seluruh teks dalam satu instruksi continue-task, atau bagi teks tersebut dan kirim secara berurutan dalam beberapa instruksi continue-task.
Kapan mengirim: Kirim instruksi ini setelah Anda menerima event task-started.
Interval antara pengiriman segmen teks tidak boleh melebihi 23 detik. Jika tidak, pengecualian "request timeout after 23 seconds" akan dipicu.
Jika Anda tidak memiliki teks lagi untuk dikirim, kirim instruksi finish-task untuk mengakhiri tugas.
Server menerapkan mekanisme timeout 23 detik, yang tidak dapat dimodifikasi oleh klien.
Contoh:
{
"header": {
"action": "continue-task",
"task_id": "2bf83b9a-baeb-4fda-8d9a-xxxxxxxxxxxx", // UUID acak
"streaming": "duplex"
},
"payload": {
"input": {
"text": "Moonlight before my bed, could it be frost on the ground?"
}
}
}Parameter header:
Parameter | Type | Wajib | Deskripsi |
header.action | string | Ya | Jenis instruksi. Untuk instruksi ini, nilainya tetap "continue-task". |
header.task_id | string | Ya | ID tugas saat ini. Nilainya harus konsisten dengan task_id yang Anda gunakan untuk mengirim instruksi run-task. |
header.streaming | string | Ya | String tetap: "duplex" |
Parameter payload:
Parameter | Tipe | Wajib | Deskripsi |
input.text | string | Ya | Teks untuk disintesis. |
3. Instruksi finish-task: Mengakhiri Tugas
Mengakhiri tugas sintesis suara.
Anda harus mengirim instruksi ini. Jika tidak, ucapan yang disintesis mungkin tidak lengkap.
Setelah Anda mengirim instruksi ini, server mengonversi sisa teks menjadi ucapan. Saat sintesis selesai, server mengembalikan event task-finished ke klien.
Kapan mengirim: Kirim instruksi ini setelah Anda mengirim semua instruksi continue-task.
Contoh:
{
"header": {
"action": "finish-task",
"task_id": "2bf83b9a-baeb-4fda-8d9a-xxxxxxxxxxxx",
"streaming": "duplex"
},
"payload": {
"input": {}//Field input tidak boleh dihilangkan. Jika tidak, terjadi error.
}
}Parameter header:
Parameter | Tipe | Wajib | Deskripsi |
header.action | string | Ya | Jenis instruksi. Untuk instruksi ini, nilainya tetap "finish-task". |
header.task_id | string | Ya | ID tugas saat ini. Nilai ini harus sama dengan task_id yang digunakan saat mengirim instruksi run-task. |
header.streaming | string | Ya | String tetap: "duplex" |
Parameter payload:
Parameter | Tipe | Wajib | Deskripsi |
payload.input | object | Ya | Format tetap: {}. |
Event (server → klien)
Event adalah pesan yang dikirim dari server ke klien. Pesan-pesan ini dalam format JSON dan menunjukkan tahapan pemrosesan yang berbeda.
Aliran audio biner yang dikirim dari server ke klien tidak termasuk dalam event apa pun dan harus diterima secara terpisah.
1. Event task-started: Tugas dimulai
Event task-started menunjukkan bahwa tugas telah berhasil dimulai. Anda harus menerima event ini sebelum mengirim instruksi continue-task atau instruksi finish-task ke server. Jika tidak, tugas akan gagal.
payload dari event task-started kosong.
Contoh:
{
"header": {
"task_id": "2bf83b9a-baeb-4fda-8d9a-xxxxxxxxxxxx",
"event": "task-started",
"attributes": {}
},
"payload": {}
}Parameter header:
Parameter | Tipe | Deskripsi |
header.event | string | Jenis event. Untuk event ini, nilainya tetap "task-started". |
header.task_id | string | task_id yang dihasilkan oleh klien. |
2. event berbasis hasil
Setelah klien mengirim instruksi continue-task dan instruksi finish-task, server terus-menerus mengembalikan event result-generated.
Untuk membantu pengguna mengaitkan data audio dengan konten teks yang sesuai, server mengembalikan metadata kalimat dalam event result-generated saat mengembalikan data audio. Server secara otomatis membagi teks input pengguna. Proses sintesis untuk setiap kalimat mencakup tiga sub-event berikut:
sentence-begin: Menandai awal kalimat dan mengembalikan konten teks kalimat yang akan disintesis.sentence-synthesis: Menandai blok data audio. Segera setelah event ini, frame data audio dikirim melalui saluran biner WebSocket.Beberapa event
sentence-synthesisdihasilkan selama sintesis satu kalimat, masing-masing sesuai dengan blok data audio.Klien perlu menerima blok data audio ini secara berurutan dan menuliskannya ke file yang sama dalam mode tambahan (append).
Ada korespondensi satu-satu antara event
sentence-synthesisdan frame data audio berikutnya, memastikan tidak terjadi ketidaksesuaian.
sentence-end: Menandai akhir kalimat dan mengembalikan konten teks kalimat serta jumlah kumulatif karakter yang dikenai biaya.
Jenis sub-event ditunjukkan oleh field payload.output.type.
Contoh:
sentence-begin
{
"header": {
"task_id": "3f2d5c86-0550-45c0-801f-xxxxxxxxxx",
"event": "result-generated",
"attributes": {}
},
"payload": {
"output": {
"sentence": {
"index": 0,
"words": []
},
"type": "sentence-begin",
"original_text": "Moonlight before my bed,"
}
}
}sentence-synthesis
{
"header": {
"task_id": "3f2d5c86-0550-45c0-801f-xxxxxxxxxx",
"event": "result-generated",
"attributes": {}
},
"payload": {
"output": {
"sentence": {
"index": 0,
"words": []
},
"type": "sentence-synthesis"
}
}
}sentence-end
{
"header": {
"task_id": "3f2d5c86-0550-45c0-801f-xxxxxxxxxx",
"event": "result-generated",
"attributes": {}
},
"payload": {
"output": {
"sentence": {
"index": 0,
"words": []
},
"type": "sentence-end",
"original_text": "Moonlight before my bed,"
},
"usage": {
"characters": 11
}
}
}Parameter header:
Parameter | Type | Deskripsi |
header.event | string | Jenis event. Untuk event ini, nilainya tetap "result-generated". |
header.task_id | string | task_id yang dihasilkan oleh klien. |
header.attributes | object | Properti tambahan, biasanya berupa objek null. |
Parameter payload:
Parameter | Type | Deskripsi |
payload.output.type | string | Jenis sub-event. Nilai yang valid:
Alur event lengkap Untuk setiap kalimat yang akan disintesis, server mengembalikan event dalam urutan berikut:
|
payload.output.sentence.index | integer | Nomor kalimat, dimulai dari 0. |
payload.output.sentence.words | array | Array informasi tingkat kata, biasanya berupa array kosong. |
payload.output.original_text | string | Konten kalimat setelah membagi teks input pengguna. Kalimat terakhir mungkin tidak memiliki field ini. |
payload.usage.characters | integer | Jumlah kumulatif karakter yang dikenai biaya untuk permintaan saat ini.
Dalam satu tugas, field |
3. Event task-finished: Tugas selesai
Event task-finished dari server menunjukkan bahwa tugas telah selesai.
Setelah tugas selesai, Anda dapat menutup koneksi WebSocket untuk mengakhiri program atau menggunakan kembali koneksi tersebut dan mengirim ulang instruksi run-task untuk memulai tugas berikutnya. Untuk informasi lebih lanjut, lihat Overhead pembentukan koneksi dan penggunaan kembali koneksi.
Contoh:
{
"header": {
"task_id": "2bf83b9a-baeb-4fda-8d9a-xxxxxxxxxxxx",
"event": "task-finished",
"attributes": {
"request_uuid": "0a9dba9e-d3a6-45a4-be6d-xxxxxxxxxxxx"
}
},
"payload": {
"output": {
"sentence": {
"words": []
}
},
"usage": {
"characters": 13
}
}
}Parameter header:
Parameter | Tipe | Deskripsi |
header.event | string | Jenis event. Untuk event ini, nilainya tetap "task-finished". |
header.task_id | string | task_id yang dihasilkan oleh klien. |
header.attributes.request_uuid | string | ID Permintaan. Anda dapat memberikan ID ini kepada pengembang CosyVoice untuk membantu menemukan masalah. |
Parameter payload:
Parameter | Tipe | Deskripsi |
payload.usage.characters | integer | Jumlah karakter yang dikenai biaya dalam permintaan saat ini hingga saat ini.
Dalam satu tugas, field |
payload.output.sentence.index | integer | Nomor kalimat, dimulai dari 0. Field ini dan field berikutnya memerlukan pengaktifan timestamp tingkat kata dengan `word_timestamp_enabled`. |
payload.output.sentence.words[k] | ||
text | string | Teks karakter. |
begin_index | integer | Indeks awal karakter dalam kalimat, dimulai dari 0. |
end_index | integer | Indeks akhir karakter dalam kalimat, dimulai dari 1. |
begin_time | integer | Timestamp awal audio yang sesuai dengan karakter, dalam milidetik. |
end_time | integer | Timestamp akhir audio yang sesuai dengan karakter, dalam milidetik. |
Setelah Anda mengaktifkan timestamp tingkat kata menggunakan `word_timestamp_enabled`, respons akan mengembalikan informasi timestamp. Berikut adalah contohnya:
4. Event task-failed: Tugas gagal
Event task-failed menunjukkan bahwa tugas telah gagal. Dalam kasus ini, Anda harus menutup koneksi WebSocket dan menangani error tersebut. Anda dapat menganalisis pesan error untuk mengidentifikasi dan memperbaiki masalah pemrograman.
Pernyataan contoh:
{
"header": {
"task_id": "2bf83b9a-baeb-4fda-8d9a-xxxxxxxxxxxx",
"event": "task-failed",
"error_code": "InvalidParameter",
"error_message": "[tts:]Engine return error code: 418",
"attributes": {}
},
"payload": {}
}Header parameter:
Parameter | Tipe | Deskripsi |
header.event | string | Jenis event. Untuk event ini, nilainya tetap "task-failed". |
header.task_id | string | task_id yang dihasilkan oleh klien. |
header.error_code | string | Deskripsi jenis error. |
header.error_message | string | Alasan spesifik terjadinya error. |
Overhead koneksi dan penggunaan kembali
Layanan WebSocket mendukung penggunaan kembali koneksi untuk meningkatkan pemanfaatan resource dan menghindari overhead pembentukan koneksi.
Saat server menerima instruksi run-task dari klien, server memulai tugas baru. Klien kemudian mengirim instruksi finish-task, dan server mengembalikan event task-finished setelah tugas selesai. Setelah tugas selesai, koneksi WebSocket dapat digunakan kembali, memungkinkan klien memulai tugas berikutnya dengan mengirim instruksi run-task lagi.
Tugas yang berbeda dalam koneksi yang digunakan kembali harus menggunakan `task_id` yang berbeda.
Jika tugas gagal selama eksekusi, layanan mengembalikan event task-failed dan menutup koneksi. Koneksi tidak dapat digunakan kembali.
Jika tidak ada tugas baru selama 60 detik setelah tugas selesai, koneksi akan timeout dan terputus secara otomatis.
Kode contoh
Kode contoh menyediakan implementasi dasar untuk menjalankan layanan. Anda perlu mengembangkan kode tersebut untuk skenario bisnis spesifik Anda.
Saat menulis kode klien WebSocket, pemrograman asinkron biasanya digunakan untuk mengirim dan menerima pesan secara bersamaan. Anda dapat menulis program dengan mengikuti langkah-langkah berikut:
Kode error
Untuk informasi troubleshooting, lihat Pesan error.
FAQ
Fitur/Penagihan/Pembatasan laju
T: Apa yang bisa saya lakukan untuk memperbaiki pelafalan yang tidak akurat?
Anda dapat menggunakan SSML untuk menyesuaikan output sintesis suara.
T: Mengapa menggunakan protokol WebSocket alih-alih HTTP/HTTPS? Mengapa tidak menyediakan API RESTful?
Layanan Suara menggunakan WebSocket alih-alih HTTP, HTTPS, atau RESTful karena memerlukan komunikasi full-duplex. WebSocket memungkinkan server dan klien saling mengirim data secara aktif dalam dua arah, yang diperlukan untuk fitur seperti mendorong progres sintesis atau pengenalan ucapan secara real-time. Sebaliknya, API RESTful berbasis HTTP hanya mendukung model permintaan-respons satu arah yang diprakarsai klien dan tidak dapat memenuhi persyaratan interaksi real-time.
T: Sintesis suara ditagih berdasarkan jumlah karakter teks. Bagaimana cara melihat atau mendapatkan panjang teks untuk setiap sintesis?
Anda dapat mengambil jumlah karakter dari parameter payload.usage.characters dalam event result-generated yang dikembalikan oleh server. Pastikan Anda menggunakan jumlah dari event result-generated terakhir yang Anda terima.
Troubleshooting
Jika kode Anda melaporkan error, periksa apakah instruksi yang dikirim ke sisi server benar. Anda dapat mencetak konten instruksi untuk memeriksa kesalahan format atau parameter wajib yang hilang. Jika instruksi benar, gunakan kode error untuk troubleshooting.
T: Bagaimana cara mendapatkan Request ID?
Anda dapat mengambilnya dengan salah satu dari dua cara berikut:
Parse event result-generated yang dikembalikan oleh server.
Parse event task-finished yang dikembalikan oleh sisi server.
T: Mengapa fitur SSML gagal?
Lakukan troubleshooting dengan mengikuti langkah-langkah berikut:
Pastikan penggunaan berada dalam batasan dan kendala yang ditentukan.
Pastikan panggilan dilakukan dengan benar. Untuk informasi lebih lanjut, lihat Dukungan Bahasa Markup SSML.
Pastikan teks yang akan disintesis dalam format teks biasa dan memenuhi persyaratan format. Untuk informasi lebih lanjut, lihat Pengenalan Bahasa Markup SSML.
T: Mengapa audio tidak bisa diputar?
Lakukan troubleshooting berdasarkan skenario berikut:
Audio disimpan sebagai file lengkap, seperti file .mp3.
Konsistensi format audio: Pastikan format audio yang ditentukan dalam parameter permintaan sesuai dengan ekstensi file. Misalnya, pemutaran mungkin gagal jika format audio diatur ke WAV dalam parameter permintaan tetapi file memiliki ekstensi .mp3.
Kompatibilitas pemutar: Pastikan pemutar Anda mendukung format dan laju sampel file audio. Misalnya, beberapa pemutar mungkin tidak mendukung laju sampel tinggi atau encoding audio tertentu.
Audio diputar dalam mode streaming.
Simpan aliran audio sebagai file lengkap dan coba putar. Jika file gagal diputar, lihat langkah troubleshooting untuk skenario pertama.
Jika file diputar dengan benar, masalahnya mungkin pada implementasi pemutaran streaming. Pastikan pemutar Anda mendukung pemutaran streaming.
Alat dan library umum yang mendukung pemutaran streaming termasuk ffmpeg, pyaudio (Python), AudioFormat (Java), dan MediaSource (JavaScript).
T: Mengapa pemutaran audio tersendat?
Lakukan troubleshooting berdasarkan skenario berikut:
Periksa kecepatan pengiriman teks: Pastikan interval pengiriman teks masuk akal. Hindari penundaan dalam mengirim segmen teks berikutnya setelah audio untuk segmen sebelumnya selesai diputar.
Periksa performa fungsi callback:
Periksa apakah fungsi callback berisi logika bisnis berlebihan yang dapat menyebabkannya terblokir.
Fungsi callback berjalan di thread WebSocket. Jika thread ini terblokir, dapat mengganggu kemampuan WebSocket untuk menerima paket jaringan, mengakibatkan audio tersendat.
Untuk menghindari pemblokiran thread WebSocket, tulis data audio ke buffer audio terpisah dan gunakan thread lain untuk membaca dan memprosesnya.
Periksa stabilitas jaringan: Pastikan koneksi jaringan Anda stabil untuk mencegah gangguan atau penundaan transmisi audio akibat fluktuasi jaringan.
T: Mengapa sintesis suara lambat (waktu sintesis lama)?
Lakukan langkah troubleshooting berikut:
Periksa interval input
Jika Anda menggunakan sintesis suara streaming, periksa apakah interval pengiriman teks terlalu lama. Misalnya, penundaan beberapa detik sebelum mengirim segmen berikutnya akan meningkatkan total waktu sintesis.
Analisis metrik performa
Penundaan paket pertama: Biasanya sekitar 500 ms.
Faktor Real-Time (RTF): Dihitung sebagai Total Waktu Sintesis / Durasi Audio. RTF biasanya kurang dari 1,0.
T: Bagaimana cara menangani pelafalan yang salah dalam ucapan yang disintesis?
Gunakan tag <phoneme> SSML untuk menentukan pelafalan yang benar.
T: Mengapa tidak ada audio yang dikembalikan? Mengapa akhir teks tidak dikonversi menjadi ucapan? (Ucapan yang disintesis hilang)
Pastikan Anda telah mengirim instruksi finish-task. Selama sintesis suara, sisi server menyimpan cache sejumlah teks sebelum memulai sintesis. Jika Anda tidak mengirim instruksi finish-task, teks yang tersisa di cache mungkin tidak disintesis.
T: Mengapa urutan aliran audio yang dikembalikan salah, menyebabkan pemutaran kacau?
Lakukan troubleshooting dengan memeriksa poin-poin berikut:
Pastikan instruksi run-task, instruksi continue-task, dan instruksi finish-task untuk tugas sintesis yang sama menggunakan
task_idyang sama.Periksa apakah operasi asinkron menyebabkan data audio ditulis tidak berurutan.
Izin dan otentikasi
T: Saya ingin Kunci API saya hanya digunakan untuk layanan sintesis suara CosyVoice, bukan untuk model Model Studio lainnya (isolasi izin). Apa yang harus saya lakukan?
Anda dapat membuat ruang kerja dan hanya mengotorisasi model tertentu untuk membatasi cakupan Kunci API. Lihat Kelola ruang kerja.
Pertanyaan lainnya
Lihat Q&A di GitHub.