Parameter dan antarmuka utama SDK Java untuk sintesis suara CosyVoice.
Panduan pengguna: Untuk ikhtisar model dan saran pemilihan, lihat Sintesis suara Real-time - CosyVoice.
Prasyarat
-
Anda telah mengaktifkan Model Studio dan membuat kunci API. Ekspor sebagai variabel lingkungan (jangan hard-coded) untuk mencegah risiko keamanan.
CatatanUntuk akses sementara atau kontrol ketat atas operasi berisiko tinggi (mengakses/menghapus data sensitif), gunakan token otentikasi sementara sebagai gantinya.
Dibandingkan dengan kunci API jangka panjang, token sementara lebih aman (masa berlaku 60 detik) dan mengurangi risiko kebocoran kunci API.
Untuk menggunakan token sementara, ganti kunci API yang digunakan untuk otentikasi dalam kode Anda dengan token otentikasi sementara tersebut.
Model dan harga
Batasan teks dan format
Batas panjang teks
-
Pemanggilan non-streaming, pemanggilan streaming unidireksional, atau pemanggilan streaming unidireksional Flowable: Maksimum 20.000 karakter per permintaan.
-
Pemanggilan streaming bidireksional atau pemanggilan streaming bidireksional Flowable: Maksimum 20.000 karakter per permintaan, dengan batas total 200.000 karakter di seluruh permintaan.
Aturan penghitungan karakter
-
Karakter Tionghoa (Tionghoa sederhana/tradisional, Kanji Jepang, Hanja Korea) dihitung sebagai dua karakter. Semua karakter lainnya (tanda baca, huruf, angka, Kana, Hangul) dihitung sebagai satu karakter.
-
Tag SSML tidak termasuk dalam perhitungan panjang teks.
-
Contoh:
-
"你好"→ 2 (karakter Tionghoa) + 2 (karakter Tionghoa) = 4 karakter -
"中A文123"→ 2 (karakter Tionghoa) + 1 (A) + 2 (karakter Tionghoa) + 1 (1) + 1 (2) + 1 (3) = 8 karakter -
"中文。"→ 2 (karakter Tionghoa) + 2 (karakter Tionghoa) + 1 (.) = 5 karakter -
"中 文。"→ 2 (karakter Tionghoa) + 1 (spasi) + 2 (karakter Tionghoa) + 1 (.) = 6 karakter -
"<speak>你好</speak>"→ 2 (karakter Tionghoa) + 2 (karakter Tionghoa) = 4 karakter
-
Format encoding
Gunakan encoding UTF-8.
Dukungan ekspresi matematika
Penguraian ekspresi matematika (v3.5-flash, v3.5-plus, v3-flash, v3-plus, v2 saja): Mendukung matematika sekolah dasar dan menengah—operasi dasar, aljabar, geometri.
Fitur ini hanya mendukung bahasa Tionghoa.
Lihat Konversi formula LaTeX ke ucapan (hanya untuk bahasa Tionghoa).
SSML dukungan
SSML tersedia untuk voice kustom (desain voice atau kloning) dengan v3.5-flash, v3.5-plus, v3-flash, v3-plus, dan v2, serta untuk voice sistem yang ditandai sebagai didukung dalam daftar voice. Persyaratan:
-
SDK DashScope 2.20.3 atau yang lebih baru.
-
Hanya pemanggilan non-streaming dan pemanggilan streaming unidireksional (yaitu, metode
calldari kelas SpeechSynthesizer) yang didukung. Pemanggilan streaming bidireksional (yaitu, metodestreamingCalldari kelas SpeechSynthesizer) dan pemanggilan Flowable tidak didukung. -
Penggunaannya sama seperti sintesis suara biasa: berikan teks yang berisi SSML ke metode
calldari kelas SpeechSynthesizer.
Mulai
Kelas SpeechSynthesizer menyediakan antarmuka utama untuk sintesis suara dan mendukung metode pemanggilan berikut:
-
Non-streaming: Pemanggilan blocking yang mengirimkan seluruh teks sekaligus dan mengembalikan audio lengkap. Cocok untuk teks pendek.
-
Streaming unidireksional: Pemanggilan non-blocking yang mengirimkan seluruh teks sekaligus dan menerima audio melalui callback. Cocok untuk teks pendek dengan latensi rendah.
-
Streaming bidireksional: Pemanggilan non-blocking yang mengirimkan fragmen teks secara bertahap dan menerima audio melalui callback secara real-time. Cocok untuk teks panjang dengan latensi rendah.
Pemanggilan non-streaming
Mengirimkan tugas sintesis secara sinkron dan mengembalikan hasil lengkap.
Buat instance kelas SpeechSynthesizer, bind parameter permintaan, dan panggil metode call untuk mensintesis dan mendapatkan data audio biner.
Panjang teks yang dikirim tidak boleh melebihi 20.000 karakter. Untuk informasi lebih lanjut, lihat metode call dari kelas SpeechSynthesizer.
Sebelum setiap pemanggilan metode call, Anda harus menginisialisasi ulang instance SpeechSynthesizer.
Pemanggilan streaming unidireksional
Mengirimkan tugas sintesis secara asinkron dan menerima audio secara bertahap melalui ResultCallback.
Buat instance kelas SpeechSynthesizer, bind parameter permintaan dan antarmuka ResultCallback, lalu panggil metode call untuk mensintesis. Dapatkan hasil sintesis secara real-time melalui metode onEvent dari antarmuka ResultCallback.
Panjang teks yang dikirim tidak boleh melebihi 20.000 karakter. Untuk informasi lebih lanjut, lihat metode call dari kelas SpeechSynthesizer.
Sebelum setiap pemanggilan metode call, Anda harus menginisialisasi ulang instance SpeechSynthesizer.
Pemanggilan streaming bidireksional
Kirim teks dalam beberapa chunk dan terima data audio secara bertahap melalui callback ResultCallback yang terdaftar.
-
Untuk input streaming, panggil
streamingCallbeberapa kali untuk mengirimkan fragmen teks secara berurutan. Setelah server menerima fragmen teks, fragmen tersebut secara otomatis dibagi menjadi kalimat:-
Kalimat lengkap langsung disintesis.
-
Kalimat tidak lengkap dibuffer dan disintesis setelah menjadi lengkap.
Saat Anda memanggil
streamingComplete, server akan memaksa mensintesis semua fragmen teks yang diterima tetapi belum diproses, termasuk kalimat yang tidak lengkap. -
-
Interval antar pengiriman fragmen teks tidak boleh melebihi 23 detik, atau akan terjadi pengecualian timeout.
Panggil metode
streamingCompletesegera setelah tidak ada lagi teks yang perlu dikirim.Server menerapkan mekanisme timeout 23 detik. Konfigurasi ini tidak dapat dimodifikasi di sisi client.
-
Buat instance kelas SpeechSynthesizer
Buat instance kelas SpeechSynthesizer, lalu bind parameter permintaan dan antarmuka ResultCallback.
-
Streaming
Panggil metode
streamingCalldari kelas SpeechSynthesizer beberapa kali untuk mengirimkan teks sintesis dalam chunk. Ini mengirimkan teks ke server dalam segmen.Saat Anda mengirimkan teks, server mengembalikan hasil sintesis ke client secara real-time melalui metode
onEventdari antarmuka ResultCallback.Panjang fragmen teks yang dikirim dalam setiap pemanggilan metode
streamingCall(parametertext) tidak boleh melebihi 20.000 karakter. Panjang total semua teks yang dikirim tidak boleh melebihi 200.000 karakter. -
Akhiri pemrosesan
Panggil metode
streamingCompletedari kelas SpeechSynthesizer untuk mengakhiri sintesis suara.Metode ini memblokir thread saat ini hingga callback
onCompleteatauonErrordari antarmuka ResultCallback dipicu. Setelah itu, thread dibuka blokirnya.Pastikan Anda memanggil metode ini. Jika tidak, teks di akhir mungkin tidak dikonversi menjadi suara.
Pemanggilan menggunakan Flowable
Flowable adalah framework alur kerja open source (lisensi Apache 2.0). Lihat Detail API Flowable.
Sebelum menggunakan Flowable, pastikan Anda telah mengintegrasikan library RxJava dan memahami konsep dasar pemrograman reaktif.
Pemanggilan streaming unidireksional
Contoh berikut menunjukkan cara menggunakan antarmuka blockingForEach objek Flowable untuk memblokir dan mendapatkan data SpeechSynthesisResult yang dikembalikan dari setiap stream.
Hasil sintesis lengkap juga tersedia melalui metode getAudioData dari kelas SpeechSynthesizer setelah semua data streaming dari Flowable telah dikembalikan.
Pemanggilan streaming bidireksional
Contoh berikut menunjukkan cara menggunakan objek Flowable sebagai parameter input untuk memasukkan stream teks. Contoh ini juga menunjukkan cara menggunakan objek Flowable sebagai nilai kembali dan menggunakan antarmuka blockingForEach untuk memblokir dan mendapatkan data SpeechSynthesisResult yang dikembalikan dari setiap stream.
Hasil sintesis lengkap juga tersedia melalui metode getAudioData dari kelas SpeechSynthesizer setelah semua data streaming dari Flowable telah dikembalikan.
Pemanggilan konkurensi tinggi
SDK Java DashScope menggunakan teknologi kolam koneksi OkHttp3 untuk mengurangi overhead pembentukan koneksi berulang. Untuk informasi lebih lanjut, lihat Skenario konkurensi tinggi.
Parameter permintaan
Gunakan metode berantai SpeechSynthesisParam untuk mengonfigurasi parameter seperti model dan voice. Berikan objek parameter yang telah dikonfigurasi ke konstruktor kelas SpeechSynthesizer.
|
Parameter |
Tipe |
Wajib |
Deskripsi |
|
model |
String |
Ya |
model sintesis suara. Setiap versi model memerlukan voice yang kompatibel:
|
|
voice |
String |
Ya |
Voice yang digunakan untuk sintesis suara. Jenis voice yang didukung:
|
|
format |
enum |
Tidak |
Format encoding audio dan laju sampel. Default adalah format MP3 dengan laju sampel 22,05 kHz. Catatan
Laju sampel default merepresentasikan laju optimal untuk voice yang dipilih. Output menggunakan laju ini secara default, tetapi downsampling dan upsampling didukung. Format encoding audio dan laju sampel berikut didukung:
|
|
volume |
int |
Tidak |
Volume. Default: 50. Rentang valid: [0, 100]. Nilai berskala linear—0 berarti senyap, 50 adalah default, 100 adalah maksimum. |
|
speechRate |
float |
Tidak |
Laju bicara. Nilai default: 1,0. Nilai valid: [0,5, 2,0]. Nilai 1,0 adalah laju bicara standar. Nilai kurang dari 1,0 memperlambat bicara, dan nilai lebih dari 1,0 mempercepatnya. |
|
pitchRate |
float |
Tidak |
Pengali pitch. Hubungan dengan pitch yang dirasakan tidak linear maupun logaritmik—lakukan pengujian untuk menemukan nilai yang sesuai. Nilai default: 1,0. Nilai yang valid: [0,5–2,0]. Nilai 1,0 merupakan pitch alami suara. Nilai di atas 1,0 meningkatkan pitch, sedangkan nilai di bawah 1,0 menurunkannya. |
|
bit_rate |
int |
Tidak |
Bitrate audio dalam kbps. Jika format audionya Opus, sesuaikan bitrate dengan menggunakan parameter Nilai default: 32. Nilai valid: [6, 510]. Catatan
Atur parameter Atur menggunakan metode parameter
Atur menggunakan metode parameters
|
|
enableWordTimestamp |
boolean |
Tidak |
Menentukan apakah akan mengaktifkan timestamp tingkat kata. Nilai default: false.
Fitur ini hanya tersedia untuk voice kloning model cosyvoice-v3-flash, cosyvoice-v3-plus, dan cosyvoice-v2, serta untuk voice sistem yang ditandai sebagai didukung dalam daftar voice. Hasil timestamp hanya tersedia melalui antarmuka callback. |
|
seed |
int |
Tidak |
Seed acak yang digunakan selama generasi. Seed berbeda menghasilkan hasil sintesis berbeda. Jika model, teks, voice, dan parameter lainnya identik, menggunakan seed yang sama akan mereproduksi output yang sama. Nilai default: 0. Nilai valid: [0, 65535]. |
|
languageHints |
List |
Tidak |
Menentukan bahasa target untuk sintesis suara guna meningkatkan efek sintesis. Gunakan saat pelafalan atau kualitas sintesis buruk untuk angka, singkatan, simbol, atau bahasa yang kurang umum:
Nilai valid:
Catatan: Parameter ini berupa array, tetapi versi saat ini hanya memproses elemen pertama. Oleh karena itu, kami menyarankan hanya mengirimkan satu nilai. Penting
Parameter ini menentukan bahasa target untuk sintesis suara. Pengaturan ini independen dari bahasa audio sampel yang digunakan untuk kloning voice. Untuk mengatur bahasa sumber untuk tugas kloning, lihat API Kloning/Desain Voice CosyVoice. |
|
instruction |
String |
Tidak |
Menetapkan instruksi untuk mengontrol efek sintesis seperti dialek, emosi, atau gaya bicara. Fitur ini hanya tersedia untuk voice kloning model cosyvoice-v3.5-flash, cosyvoice-v3.5-plus, dan cosyvoice-v3-flash, serta untuk voice sistem yang ditandai mendukung Instruct dalam daftar voice. Batas panjang: 100 karakter. Karakter Tionghoa (termasuk Tionghoa sederhana dan tradisional, Kanji Jepang, dan Hanja Korea) dihitung sebagai dua karakter. Semua karakter lainnya, seperti tanda baca, huruf, angka, dan Kana/Hangul Jepang/Korea, dihitung sebagai satu karakter. Persyaratan penggunaan (berbeda-beda tergantung model):
|
|
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. Hanya cosyvoice-v3-flash, cosyvoice-v3-plus, dan cosyvoice-v2 yang mendukung fitur ini. Catatan
Atur parameter Atur menggunakan metode parameter
Atur menggunakan metode parameters
|
|
aigc_propagator |
String |
Tidak |
Menetapkan field Nilai default: UID Alibaba Cloud. Hanya cosyvoice-v3-flash, cosyvoice-v3-plus, dan cosyvoice-v2 yang mendukung fitur ini. Catatan
Atur parameter Atur menggunakan metode parameter
Atur menggunakan metode parameters
|
|
aigc_propagate_id |
String |
Tidak |
Menetapkan field Nilai default: ID permintaan dari permintaan sintesis suara saat ini. Hanya cosyvoice-v3-flash, cosyvoice-v3-plus, dan cosyvoice-v2 yang mendukung fitur ini. Catatan
Atur parameter Atur menggunakan metode parameter
Konfigurasi via parameters
|
|
hotFix |
ParamHotFix |
Tidak |
Konfigurasi hotpatching teks. Memungkinkan Anda menyesuaikan pelafalan kata tertentu atau mengganti teks sebelum sintesis. Fitur ini hanya tersedia untuk voice kloning cosyvoice-v3-flash. Deskripsi parameter:
Contoh:
|
|
enable_markdown_filter |
boolean |
false |
Menentukan apakah akan mengaktifkan penyaringan Markdown. Saat diaktifkan, sistem secara otomatis menghapus simbol Markdown dari teks input sebelum mensintesis suara, mencegahnya dibaca keras. Fitur ini hanya tersedia untuk voice kloning cosyvoice-v3-flash. Nilai default: false. Nilai valid:
Catatan
Atur parameter Atur menggunakan metode parameter
Atur menggunakan metode parameters
|
Antarmuka utama
SpeechSynthesizer kelas
Impor kelas SpeechSynthesizer menggunakan import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesizer;. Kelas ini menyediakan antarmuka utama untuk sintesis suara.
|
Antarmuka/Metode |
Parameter |
Nilai kembali |
Deskripsi |
|
|
Instance |
Konstruktor.
|
|
|
|
Mengonversi teks (teks biasa atau dengan SSML) menjadi suara. Saat membuat instance
Penting
Sebelum setiap pemanggilan metode |
|
|
Tidak ada |
Mengirimkan teks sebagai stream. SSML tidak didukung. Panggil antarmuka ini beberapa kali untuk mengirimkan teks ke server dalam beberapa bagian. Hasil sintesis dikembalikan melalui metode Untuk alur pemanggilan detail dan contoh referensi, lihat Pemanggilan streaming bidireksional. |
|
Tidak ada |
Tidak ada |
Mengakhiri sintesis suara streaming. Metode ini memblokir hingga salah satu kondisi berikut terjadi:
Untuk alur pemanggilan detail dan contoh referensi, lihat Pemanggilan streaming bidireksional. Penting
Saat melakukan pemanggilan streaming bidireksional, pastikan untuk memanggil metode ini agar tidak kehilangan bagian dari suara yang disintesis. |
|
|
Hasil sintesis, dikemas dalam |
Mengonversi input teks non-streaming (teks yang berisi SSML tidak didukung) menjadi output suara streaming secara real-time. Hasil sintesis dikembalikan dalam stream dalam objek Flowable. Untuk alur pemanggilan detail dan contoh referensi, lihat Pemanggilan menggunakan Flowable. |
|
code: Kode Penutupan WebSocket reason: Alasan penutupan Untuk informasi tentang cara mengonfigurasi parameter ini, lihat dokumen Protokol WebSocket. |
true |
Setelah tugas selesai, Anda harus menutup koneksi WebSocket terlepas dari apakah terjadi pengecualian atau tidak. Ini mencegah kebocoran koneksi. Untuk informasi tentang cara menggunakan kembali koneksi guna meningkatkan efisiensi, lihat Skenario konkurensi tinggi. |
|
|
Hasil sintesis, dikemas dalam |
Mengonversi input teks streaming (teks yang berisi SSML tidak didukung) menjadi output suara streaming secara real-time. Hasil sintesis dikembalikan dalam stream dalam objek Flowable. Untuk alur pemanggilan detail dan contoh referensi, lihat Pemanggilan menggunakan Flowable. |
|
Tidak ada |
ID permintaan dari tugas sebelumnya. |
Mendapatkan ID permintaan dari tugas sebelumnya. Gunakan ini setelah memulai tugas baru dengan memanggil |
|
Tidak ada |
Latensi paket pertama dari tugas saat ini. |
Mengembalikan latensi paket pertama dalam milidetik (waktu dari pengiriman teks hingga menerima audio pertama). Panggil setelah tugas selesai. Faktor yang memengaruhi latensi paket pertama:
Latensi tipikal:
Jika latensi secara konsisten melebihi 2.000 ms:
|
ResultCallback antarmuka
Untuk pemanggilan streaming (unidireksional atau bidireksional), dapatkan hasil melalui ResultCallback. Impor: import com.alibaba.dashscope.common.ResultCallback;.
|
Antarmuka/Metode |
Parameter |
Nilai kembali |
Deskripsi |
|
|
Tidak ada |
Dipanggil saat server mendorong data audio. Gunakan Panggil metode |
|
Tidak ada |
Tidak ada |
Dipanggil secara asinkron setelah semua data sintesis telah dikembalikan dan sintesis suara selesai. |
|
|
Tidak ada |
Dipanggil secara asinkron saat terjadi pengecualian. Kami menyarankan untuk mengimplementasikan logika pencatatan pengecualian lengkap dan pembersihan resource dalam metode |
Tanggapan
Server mengembalikan data audio biner:
-
Pemanggilan non-streaming: Proses data audio biner yang dikembalikan oleh metode
calldari kelas SpeechSynthesizer. -
Pemanggilan streaming unidireksional atau pemanggilan streaming bidireksional: Proses parameter (bertipe
SpeechSynthesisResult) dari metodeonEventdari antarmuka ResultCallback.Antarmuka utama
SpeechSynthesisResultadalah sebagai berikut:Antarmuka/Metode
Parameter
Nilai kembali
Deskripsi
public ByteBuffer getAudioFrame()Tidak ada
Data audio biner
Mengembalikan audio biner untuk segmen saat ini (mungkin kosong jika tidak ada data baru).
Gabungkan segmen menjadi file lengkap atau stream ke pemutar yang kompatibel.
Penting-
Dalam sintesis suara streaming, untuk format terkompresi seperti MP3 dan Opus, data audio tersegmentasi harus diputar menggunakan pemutar streaming. Jangan memutarnya frame per frame, karena ini menyebabkan decoding gagal.
Pemutar streaming termasuk FFmpeg, PyAudio (Python), AudioFormat (Java), dan MediaSource (JavaScript).
-
Saat menggabungkan data audio menjadi file audio lengkap, tulis ke file yang sama dalam mode append.
-
Untuk audio WAV dan MP3 dari sintesis suara streaming, hanya frame pertama yang berisi informasi header. Frame berikutnya hanya berisi data audio.
public String getRequestId()Tidak ada
ID permintaan dari tugas.
Mendapatkan ID permintaan dari tugas. Saat Anda mendapatkan data audio biner dengan memanggil
getAudioFrame, nilai kembali dari metodegetRequestIdadalahnull.public SpeechSynthesisUsage getUsage()Tidak ada
SpeechSynthesisUsage: Jumlah karakter yang dikenai biaya dalam permintaan saat ini sejauh ini.Mengembalikan
SpeechSynthesisUsageataunull.Metode
getCharactersdariSpeechSynthesisUsagemengembalikan jumlah karakter yang dikenai biaya dalam permintaan saat ini sejauh ini. GunakanSpeechSynthesisUsageyang diterima terakhir sebagai nilai akhir.public Sentence getTimestamp()Tidak ada
Sentence: Kalimat yang dikenai biaya dalam permintaan saat ini sejauh ini.Anda perlu mengaktifkan fitur timestamp tingkat kata
enableWordTimestamp.Mengembalikan
Sentenceataunull.Metode
Sentence:-
getIndex: Mendapatkan nomor kalimat, dimulai dari 0. -
getWords: Mendapatkan array karakterList<Word>yang membentuk kalimat. GunakanSentenceyang diterima terakhir sebagai nilai akhir.
Metode
Word:-
getText: Mendapatkan teks karakter. -
getBeginIndex: Mendapatkan indeks posisi awal karakter dalam kalimat, dimulai dari 0. -
getEndIndex: Mendapatkan indeks posisi akhir karakter dalam kalimat, dimulai dari 1. -
getBeginTime: Mendapatkan timestamp awal audio yang sesuai dengan karakter, dalam milidetik. -
getEndTime: Mendapatkan timestamp akhir audio yang sesuai dengan karakter, dalam milidetik.
-
Kode kesalahan
Jika terjadi kesalahan, lihat Pesan kesalahan untuk troubleshooting.
Contoh lainnya
Untuk contoh lainnya, lihat GitHub.
FAQ
Fitur, penagihan, dan pembatasan laju
T: Apa yang bisa saya lakukan jika pelafalan tidak akurat?
Gunakan SSML untuk memperbaiki pelafalan.
T: Sintesis suara ditagih berdasarkan jumlah karakter. Bagaimana cara memeriksa panjang teks untuk setiap permintaan sintesis?
-
Pemanggilan non-streaming: Anda perlu menghitungnya sendiri sesuai dengan aturan penghitungan karakter.
-
Metode pemanggilan lainnya: Gunakan metode
getUsagedari tanggapan SpeechSynthesisResult. Gunakan hasil tanggapan terakhir yang Anda terima sebagai nilai akhir.
Troubleshooting
Jika terjadi kesalahan kode, lihat Kode kesalahan untuk troubleshooting.
T: Bagaimana cara mendapatkan ID permintaan?
Dapatkan dengan salah satu cara berikut:
-
Dalam metode
onEventdari antarmuka ResultCallback, panggil metodegetRequestIddari SpeechSynthesisResult.Nilai kembali dari metode
getRequestIdmungkin null. Untuk informasi lebih lanjut, lihat deskripsi metodegetRequestIddalam SpeechSynthesisResult. -
Panggil metode
getLastRequestIddari SpeechSynthesizer.
T: Mengapa fitur SSML gagal?
Troubleshooting:
-
Verifikasi batasan dan kendala.
-
Pastikan Anda menggunakan antarmuka yang benar: hanya metode
calldari kelas SpeechSynthesizer yang mendukung SSML. -
Pastikan teks yang akan disintesis dalam format teks biasa dan memenuhi persyaratan format. Untuk informasi lebih lanjut, lihat Pengantar bahasa markup SSML.
T: Mengapa durasi audio sintesis TTS berbeda dengan durasi yang ditampilkan pada file WAV? Misalnya, file WAV menunjukkan 7 detik tetapi audio aktual kurang dari 5 detik?
TTS menggunakan mekanisme sintesis streaming, yang berarti mensintesis dan mengembalikan data secara progresif. Akibatnya, header file WAV berisi nilai perkiraan, yang mungkin memiliki margin kesalahan. Jika Anda memerlukan durasi yang tepat, Anda dapat mengatur format ke PCM dan secara manual menambahkan informasi header WAV setelah mendapatkan hasil sintesis lengkap. Ini akan memberikan durasi yang lebih akurat.
T: Mengapa audio tidak bisa diputar?
Periksa skenario berikut satu per satu:
-
Audio disimpan sebagai file lengkap (misalnya xx.mp3).
-
Konsistensi format: Verifikasi format permintaan sesuai dengan ekstensi file (misalnya, WAV dengan .wav, bukan .mp3).
-
Kompatibilitas pemutar: Verifikasi bahwa pemutar Anda mendukung format dan laju sampel file audio. Beberapa pemutar mungkin tidak mendukung laju sampel tinggi atau encoding audio tertentu.
-
-
Audio diputar dalam stream.
-
Simpan stream audio sebagai file lengkap dan coba putar dengan pemutar. Jika file tidak bisa diputar, lihat metode troubleshooting untuk skenario 1.
-
Jika file diputar normal, masalahnya mungkin pada implementasi pemutaran streaming Anda. Verifikasi bahwa 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-sendat?
Periksa skenario berikut satu per satu:
-
Periksa kecepatan pengiriman teks: Pastikan interval antar segmen teks masuk akal. Hindari situasi di mana segmen berikutnya tidak dikirim segera setelah segmen audio sebelumnya selesai diputar.
-
Periksa kinerja fungsi callback:
-
Hindari logika bisnis berat dalam fungsi callback—hal ini dapat menyebabkan pemblokiran.
-
Callback berjalan di thread WebSocket. Pemblokiran mencegah penerimaan paket tepat waktu dan menyebabkan pemutaran audio tersendat.
-
Kami menyarankan menulis data audio ke buffer terpisah dan memprosesnya di thread lain untuk menghindari pemblokiran thread WebSocket.
-
-
Periksa stabilitas jaringan: Pastikan koneksi jaringan Anda stabil untuk menghindari gangguan transmisi audio atau penundaan yang disebabkan oleh fluktuasi jaringan.
T: Mengapa sintesis suara memakan waktu lama?
Ikuti langkah-langkah berikut untuk troubleshooting:
-
Periksa interval input
Periksa interval input. Jika Anda menggunakan sintesis suara streaming, verifikasi apakah interval antar pengiriman segmen teks terlalu lama (misalnya, penundaan beberapa detik). Interval yang lama meningkatkan total waktu sintesis.
-
Analisis metrik kinerja.
-
Latensi paket pertama: Biasanya sekitar 500 ms.
-
RTF (RTF = Total waktu sintesis / Durasi audio): Biasanya kurang dari 1,0.
-
T: Bagaimana cara menangani pelafalan salah dalam suara yang disintesis?
Gunakan tag <phoneme> SSML untuk menentukan pelafalan yang benar.
T: Mengapa sebagian teks di akhir tidak dikonversi menjadi suara, atau mengapa tidak ada suara yang dikembalikan?
Periksa apakah Anda telah memanggil metode streamingComplete dari kelas SpeechSynthesizer. Selama sintesis suara, server mulai mensintesis hanya setelah mencache cukup teks. Jika Anda tidak memanggil streamingComplete, teks yang tersisa di buffer mungkin tidak disintesis.
Izin dan otentikasi
T: Bagaimana cara membatasi kunci API saya hanya untuk layanan sintesis suara CosyVoice saja (isolasi izin)?
Buat ruang kerja dan berikan otorisasi hanya ke model tertentu untuk membatasi cakupan kunci API. Untuk informasi lebih lanjut, lihat Mengelola ruang kerja.
Pertanyaan lainnya
Lihat QA di GitHub.