Topik ini menjelaskan parameter dan detail antarmuka SDK Java CosyVoice untuk sintesis ucapan.
Untuk menggunakan model di wilayah China (Beijing), buka halaman Kunci API untuk wilayah China (Beijing).
Panduan pengguna: Untuk informasi lebih lanjut tentang model dan panduan pemilihan model, lihat Sintesis ucapan Real-time - CosyVoice.
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.
CatatanUntuk 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 dapat secara efektif mengurangi risiko kebocoran Kunci API.
Untuk menggunakan token sementara, gantilah Kunci API yang digunakan untuk otentikasi dalam 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
Panggilan non-streaming, panggilan streaming unidireksional, atau panggilan streaming unidireksional Flowable: Teks untuk satu permintaan tidak boleh melebihi 20.000 karakter.
Panggilan streaming bidireksional atau panggilan streaming bidireksional Flowable: Teks dalam satu permintaan tidak boleh melebihi 20.000 karakter, dan panjang total teks tidak boleh melebihi 200.000 karakter.
Aturan penghitungan karakter
Satu karakter Han (termasuk Han Cina sederhana atau tradisional, kanji Jepang, dan hanja Korea) dihitung sebagai 2 karakter. Semua karakter lainnya, 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 pengkodean
Gunakan pengkodean UTF-8.
Dukungan ekspresi matematika
Fitur penguraian ekspresi matematika saat ini hanya tersedia untuk model cosyvoice-v2, cosyvoice-v3-flash, dan cosyvoice-v3-plus. Fitur ini mendukung ekspresi matematika umum dari sekolah dasar dan menengah, seperti aritmetika dasar, aljabar, dan geometri.
Lihat Formula LaTeX ke Ucapan.
SSML dukungan
Fitur Bahasa Markup Sintesis Ucapan (SSML) saat ini hanya tersedia untuk voice kloning model cosyvoice-v3-flash, cosyvoice-v3-plus, dan cosyvoice-v2, serta voice sistem yang ditandai sebagai didukung dalam daftar voice. Syarat-syarat berikut harus dipenuhi:
Gunakan SDK DashScope versi 2.20.3 atau lebih baru.
Hanya panggilan non-streaming dan panggilan streaming satu arah (yang menggunakan metode
calldari kelas SpeechSynthesizer) yang didukung. Panggilan streaming dua arah (yang menggunakan metodestreamingCalldari kelas SpeechSynthesizer) atau panggilan Flowable tidak didukung.Penggunaannya sama seperti sintesis ucapan standar. Kirimkan teks yang berisi SSML ke metode
calldari kelas SpeechSynthesizer.
Memulai
Kelas SpeechSynthesizer menyediakan antarmuka untuk sintesis ucapan dan mendukung metode panggilan berikut:
Panggilan non-streaming: Panggilan blocking yang mengirimkan seluruh teks sekaligus dan langsung mengembalikan audio lengkap. Metode ini cocok untuk skenario sintesis teks pendek.
Panggilan streaming unidireksional: Panggilan non-blocking yang mengirimkan seluruh teks sekaligus dan menggunakan fungsi callback untuk menerima data audio, yang mungkin dikirimkan dalam beberapa bagian. Metode ini cocok untuk skenario sintesis teks pendek yang memerlukan latensi rendah.
Panggilan streaming bidireksional: Panggilan non-blocking yang mengirimkan teks secara bertahap dan menggunakan fungsi callback untuk menerima aliran audio hasil sintesis secara bertahap secara real-time. Metode ini cocok untuk skenario sintesis teks panjang yang memerlukan latensi rendah.
Panggilan non-streaming
Kirimkan tugas sintesis ucapan secara sinkron untuk langsung mendapatkan hasil lengkap.
Buat instans kelas SpeechSynthesizer, atur parameter permintaan, lalu panggil metode call untuk melakukan sintesis dan mendapatkan data audio biner.
Panjang teks tidak boleh melebihi 2.000 karakter. Lihat metode call dari kelas SpeechSynthesizer.
Sebelum setiap pemanggilan metode call, Anda harus membuat instans SpeechSynthesizer yang baru.
Panggilan streaming unidireksional
Kirimkan tugas sintesis ucapan secara asinkron dan terima segmen ucapan secara real-time frame demi frame dengan mendaftarkan callback ResultCallback.
Buat instans kelas SpeechSynthesizer, atur parameter permintaan dan antarmuka ResultCallback, lalu panggil metode call untuk melakukan sintesis audio. Metode onEvent dari antarmuka ResultCallback menyediakan hasil sintesis secara real-time.
Panjang teks tidak boleh melebihi 2.000 karakter. Lihat metode call dari kelas SpeechSynthesizer.
Sebelum setiap pemanggilan metode call, Anda harus membuat instans SpeechSynthesizer yang baru.
Panggilan streaming bidireksional
Kirimkan teks dalam beberapa bagian dan terima data segmen ucapan secara real-time frame demi frame dengan mendaftarkan callback ResultCallback.
Untuk input streaming, Anda dapat memanggil
streamingCallbeberapa kali untuk mengirimkan fragmen teks secara berurutan. Setelah server menerima fragmen teks tersebut, server akan secara otomatis membagi teks menjadi kalimat:Kalimat lengkap akan langsung disintesis.
Kalimat yang belum lengkap akan disimpan dalam cache hingga lengkap, lalu disintesis.
Saat Anda memanggil
streamingComplete, server akan mensintesis semua fragmen teks yang telah diterima tetapi belum diproses, termasuk kalimat yang belum lengkap.Interval antar pengiriman fragmen teks tidak boleh melebihi 23 detik. Jika tidak, akan terjadi pengecualian "request timeout after 23 seconds".
Jika tidak ada lagi teks yang akan dikirim, panggil
streamingCompleteuntuk segera mengakhiri tugas.Server menerapkan timeout 23 detik, yang tidak dapat dimodifikasi oleh klien.
Buat instans kelas SpeechSynthesizer.
Buat instans kelas SpeechSynthesizer dan atur parameter permintaan dan antarmuka ResultCallback.
Kirimkan data secara streaming
Panggil metode
streamingCalldari kelas SpeechSynthesizer beberapa kali untuk mengirimkan teks yang akan disintesis ke server secara bertahap.Saat Anda mengirimkan teks, server akan mengembalikan hasil sintesis ke klien secara real-time melalui metode
onEventdari antarmuka ResultCallback.Untuk setiap pemanggilan metode
streamingCall, panjang segmen teks (yaitutext) tidak boleh melebihi 2.000 karakter. Panjang total semua teks yang dikirim tidak boleh melebihi 200.000 karakter.Akhiri pemrosesan
Panggil metode
streamingCompletedari kelas SpeechSynthesizer untuk mengakhiri tugas sintesis ucapan.Metode ini akan memblokir thread saat ini hingga callback
onCompleteatauonErrordari antarmuka ResultCallback dipicu, setelah itu thread akan dibebaskan.Anda harus memanggil metode ini. Jika tidak, fragmen teks terakhir mungkin tidak berhasil dikonversi menjadi ucapan.
Panggilan melalui Flowable
Flowable adalah framework open-source untuk manajemen alur kerja dan proses bisnis yang dirilis di bawah lisensi Apache 2.0. Untuk informasi lebih lanjut tentang cara menggunakan Flowable, lihat Detail API Flowable.
Sebelum menggunakan Flowable, pastikan Anda telah mengintegrasikan library RxJava dan memahami konsep dasar pemrograman reaktif.
Panggilan streaming unidireksional
Contoh berikut menunjukkan cara menggunakan antarmuka blockingForEach objek Flowable untuk memblokir thread saat ini dan mengambil data SpeechSynthesisResult yang dikembalikan dalam setiap aliran.
Anda juga dapat memperoleh hasil sintesis lengkap menggunakan metode getAudioData dari kelas SpeechSynthesizer setelah aliran Flowable selesai.
Panggilan streaming bidireksional
Contoh berikut menunjukkan cara menggunakan objek Flowable sebagai parameter input untuk aliran teks. Contoh ini juga menunjukkan cara menggunakan objek Flowable sebagai nilai kembalian dan menggunakan antarmuka blockingForEach untuk memblokir thread saat ini dan mengambil data SpeechSynthesisResult yang dikembalikan dalam setiap aliran.
Anda juga dapat memperoleh hasil sintesis lengkap menggunakan metode getAudioData dari kelas SpeechSynthesizer setelah aliran Flowable selesai.
Panggilan konkurensi tinggi
SDK Java DashScope menggunakan teknologi kolam koneksi OkHttp3 untuk mengurangi overhead dari pembuatan koneksi berulang. Lihat Skenario konkurensi tinggi.
Parameter permintaan
Gunakan metode berantai SpeechSynthesisParam untuk mengonfigurasi parameter, seperti model dan voice, lalu kirimkan objek parameter yang telah dikonfigurasi ke konstruktor kelas SpeechSynthesizer.
Parameter | Tipe | Wajib | Deskripsi |
model | String | Ya | model sintesis ucapan. Model yang berbeda memerlukan voice yang sesuai:
|
voice | String | Ya | Voice yang digunakan untuk sintesis ucapan. Voice sistem dan voice kloning didukung:
|
format | enum | Tidak | Format pengkodean audio dan laju sampel. Jika Anda tidak menentukan Catatan Laju sampel default adalah laju optimal untuk voice saat ini. Secara default, output menggunakan laju sampel ini. Downsampling dan upsampling juga didukung. Format pengkodean audio dan laju sampel berikut tersedia:
|
volume | int | 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. |
speechRate | 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. |
pitchRate | 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 voice. Nilai lebih dari 1.0 meningkatkan pitch, dan nilai kurang dari 1.0 menurunkannya. |
bit_rate | int | Tidak | Bitrate audio dalam kbps. Jika format audionya Opus, Anda dapat menyesuaikan bitrate menggunakan parameter Nilai default: 32. Rentang nilai: [6, 510]. Catatan Atur parameter Atur menggunakan parameterAtur menggunakan parameters |
enableWordTimestamp | boolean | Tidak | Menentukan apakah akan mengaktifkan timestamp tingkat karakter. Nilai default: false.
Fitur ini hanya tersedia untuk voice kloning model cosyvoice-v3-flash, cosyvoice-v3-plus, dan cosyvoice-v2, serta voice sistem yang ditandai sebagai didukung dalam daftar voice. Hasil timestamp hanya dapat diperoleh melalui antarmuka callback. |
seed | int | Tidak | Seed bilangan acak yang digunakan selama generasi, yang memvariasikan efek sintesis. Jika versi model, teks, voice, dan parameter lainnya sama, menggunakan seed yang sama akan menghasilkan hasil sintesis yang identik. Nilai default: 0. Rentang nilai: [0, 65535]. |
languageHints | List | Tidak | Menentukan bahasa target untuk sintesis ucapan guna meningkatkan efek sintesis. Gunakan parameter ini ketika pelafalan angka, singkatan, atau simbol, atau ketika efek sintesis untuk bahasa non-Cina tidak sesuai harapan. Nilai yang valid:
Catatan: Meskipun parameter ini berupa array, versi saat ini hanya memproses elemen pertama. Oleh karena itu, Anda hanya boleh mengirimkan satu nilai. Penting Parameter ini menentukan bahasa target untuk sintesis ucapan. 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 instruction untuk mengontrol efek seperti dialek, emosi, atau karakter. Hanya tersedia untuk voice kloning model cosyvoice-v3-flash dan cosyvoice-v3-plus, serta voice sistem yang ditandai sebagai mendukung instruct dalam Daftar Voice. Batasan:
Fitur:
|
enable_aigc_tag | boolean | Tidak | Menentukan apakah akan menambahkan pengenal AIGC tak terlihat ke audio yang dihasilkan. Saat diatur ke true, pengenal tak terlihat akan 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. Catatan Atur parameter Atur menggunakan metode parameterAtur menggunakan metode parameters |
aigc_propagator | String | Tidak | Mengatur bidang Nilai default: UID Alibaba Cloud. Fitur ini hanya tersedia untuk model cosyvoice-v3-flash, cosyvoice-v3-plus, dan cosyvoice-v2. Catatan Atur Atur menggunakan metode parameterAtur menggunakan metode parameters |
aigc_propagate_id | String | Tidak | Mengatur bidang Nilai default: Request ID dari permintaan sintesis ucapan saat ini. Fitur ini hanya tersedia untuk model cosyvoice-v3-flash, cosyvoice-v3-plus, dan cosyvoice-v2. Catatan Atur Atur menggunakan metode parameterAtur menggunakan metode parameters |
Antarmuka utama
Kelas SpeechSynthesizer
Kelas SpeechSynthesizer menyediakan antarmuka utama untuk sintesis ucapan dan diimpor menggunakan import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesizer;.
Antarmuka/Metode | Parameter | Nilai kembali | Deskripsi |
|
| Instans | Konstruktor.
|
|
|
| Mengonversi segmen teks menjadi ucapan. Teks dapat berupa teks biasa atau teks yang berisi SSML. Saat Anda membuat instans
Penting Sebelum setiap pemanggilan metode |
|
| Tidak ada | Mengirimkan teks untuk sintesis secara streaming. Teks yang berisi SSML tidak didukung. Anda dapat memanggil antarmuka ini beberapa kali untuk mengirimkan teks untuk sintesis ke server secara bertahap. Metode Untuk alur panggilan detail dan contoh referensi, lihat Panggilan streaming bidireksional. |
| Tidak ada | Tidak ada | Mengakhiri sintesis ucapan streaming. Metode ini memblokir thread pemanggil hingga salah satu kondisi berikut terjadi:
Untuk proses panggilan detail dan contoh referensi, lihat Panggilan streaming bidireksional. Penting Saat melakukan panggilan streaming bidireksional, panggil metode ini untuk menghindari bagian ucapan hasil sintesis yang hilang. |
|
| Hasil sintesis, dikemas dalam | Mengonversi input teks non-streaming menjadi output ucapan streaming secara real-time. Teks yang berisi SSML tidak didukung. Hasil sintesis dikembalikan dalam aliran di dalam objek Flowable. Untuk proses panggilan detail dan contoh referensi, lihat Panggilan melalui Flowable. |
| code: Kode Penutupan WebSocket reason: Alasan penutupan Untuk informasi tentang cara mengonfigurasi parameter ini, lihat Protokol WebSocket. | true | Setelah tugas selesai, tutup koneksi WebSocket, baik terjadi pengecualian maupun tidak, untuk menghindari kebocoran koneksi. Untuk informasi tentang cara menggunakan kembali koneksi guna meningkatkan efisiensi, lihat Skenario konkurensi tinggi. |
|
| Hasil sintesis dikemas dalam | Mengonversi input teks streaming menjadi output ucapan streaming secara real-time. Teks yang berisi SSML tidak didukung. Hasil sintesis dikembalikan sebagai aliran dalam objek Flowable. Untuk proses panggilan detail dan contoh referensi, lihat Panggilan melalui Flowable. |
| Tidak ada | Request ID dari tugas sebelumnya. | Mendapatkan Request ID dari tugas sebelumnya. Anda dapat menggunakan metode ini setelah memulai tugas baru dengan memanggil |
| Tidak ada | Latensi paket pertama untuk tugas saat ini. | Mendapatkan latensi paket pertama tugas saat ini, yang biasanya sekitar 500 ms. Gunakan metode ini setelah tugas selesai. Latensi paket pertama adalah waktu antara saat teks mulai dikirim dan saat paket audio pertama diterima, diukur dalam milidetik. Koneksi WebSocket harus dibuat saat teks dikirim pertama kali. Oleh karena itu, latensi paket pertama mencakup waktu pembuatan koneksi. Jika koneksi digunakan kembali dalam skenario konkurensi tinggi, waktu koneksi tidak termasuk. |
Antarmuka callback (ResultCallback)
Saat Anda melakukan panggilan streaming unidireksional atau panggilan streaming bidireksional, Anda dapat mengambil hasil sintesis dari antarmuka ResultCallback. Antarmuka ini diimpor menggunakan import com.alibaba.dashscope.common.ResultCallback;.
Antarmuka/Metode | Parameter | Nilai kembali | Deskripsi |
|
| Tidak ada | Dipanggil secara asinkron saat server mendorong data sintesis ucapan. Anda dapat memanggil metode Panggil metode |
| Tidak ada | Tidak ada | Callback dipanggil secara asinkron setelah semua data sintetis dikembalikan (sintesis ucapan selesai). |
|
| Tidak ada | Antarmuka ini dipanggil secara asinkron saat terjadi pengecualian. Implementasikan logika pencatatan pengecualian lengkap dan pembersihan resource di metode |
Respons
Server mengembalikan data audio biner:
Panggilan non-streaming: Proses data audio biner yang dikembalikan oleh metode
calldari kelas SpeechSynthesizer.Panggilan streaming unidireksional atau panggilan streaming bidireksional: Proses parameter
SpeechSynthesisResultdari metodeonEventdari antarmuka ResultCallback.Antarmuka utama
SpeechSynthesisResultadalah sebagai berikut:Antarmuka/Metode
Parameter
Nilai kembali
Deskripsi
public ByteBuffer getAudioFrame()Tidak ada
Data audio biner
Mengembalikan data audio biner dari segmen sintesis streaming saat ini. Ini mungkin kosong jika tidak ada data baru yang tiba.
Gabungkan data audio biner menjadi file audio lengkap untuk pemutaran, atau putar secara real-time dengan pemutar yang mendukung pemutaran streaming.
PentingDalam sintesis ucapan streaming, untuk format terkompresi seperti MP3 dan Opus, gunakan pemutar streaming untuk memutar segmen audio. Jangan memutarnya frame demi frame untuk menghindari kegagalan decoding.
Pemutar yang mendukung pemutaran streaming termasuk ffmpeg, pyaudio (Python), AudioFormat (Java), dan MediaSource (JavaScript).
Saat menggabungkan data audio menjadi file audio lengkap, tambahkan data tersebut ke file yang sama.
Untuk format audio WAV dan MP3 dalam sintesis ucapan streaming, hanya frame pertama yang berisi informasi header. Frame berikutnya hanya berisi data audio.
public String getRequestId()Tidak ada
Request ID dari tugas.
Mendapatkan Request ID tugas. Saat Anda memanggil
getAudioFrameuntuk mendapatkan data audio biner, nilai kembalian 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 yang telah digunakan sejauh ini dalam permintaan saat ini. GunakanSpeechSynthesisUsageyang diterima terakhir sebagai hitungan akhir.public Sentence getTimestamp()Tidak ada
Sentence: Kalimat yang dikenai biaya dalam permintaan saat ini sejauh ini.Anda harus mengaktifkan fitur timestamp tingkat kata
enableWordTimestamp.Mengembalikan
Sentenceataunull.Metode
Sentence:getIndex: Mendapatkan nomor kalimat, dimulai dari 0.getWords: Mendapatkan array kata yang membentuk kalimat,List<Word>. GunakanSentenceyang diterima terakhir sebagai hasil akhir.
Metode
Word:getText: Mendapatkan teks karakter.getBeginIndex: Mendapatkan indeks 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
Untuk informasi troubleshooting, lihat Pesan kesalahan.
Contoh lainnya
Untuk contoh lainnya, lihat GitHub.
FAQ
Fitur, penagihan, dan pembatasan laju
T: Apa yang bisa saya lakukan untuk memperbaiki pelafalan yang tidak akurat?
Anda dapat menggunakan SSML untuk menyesuaikan output sintesis ucapan.
T: Sintesis ucapan ditagih berdasarkan jumlah karakter teks. Bagaimana cara melihat atau mendapatkan panjang teks untuk setiap sintesis?
Panggilan non-streaming: Anda harus menghitungnya secara manual berdasarkan aturan penghitungan karakter.
Untuk jenis panggilan lainnya: Anda dapat mengambil jumlah karakter menggunakan metode
getUsagedari respons SpeechSynthesisResult. Nilai dalam respons terakhir adalah total akhir.
Troubleshooting
Jika terjadi kesalahan kode, lihat Kode kesalahan untuk informasi troubleshooting.
T: Bagaimana cara mendapatkan Request ID?
Anda dapat mengambilnya dengan salah satu dari dua cara berikut:
Dalam metode
onEventResultCallback, Anda dapat memanggil metodegetRequestIdSpeechSynthesisResult.Nilai kembalian metode
getRequestIdmungkin null. Lihat deskripsi metodegetRequestIddi SpeechSynthesisResult.Panggil metode
getLastRequestIddari SpeechSynthesizer.
T: Mengapa fitur SSML gagal?
Lakukan langkah-langkah berikut untuk troubleshooting masalah ini:
Verifikasi bahwa Batasan dan kendala sudah benar.
Pastikan Anda menggunakan antarmuka yang benar. SSML hanya didukung oleh metode
calldari kelas SpeechSynthesizer.Pastikan teks untuk sintesis dalam bentuk teks biasa dan memenuhi persyaratan format. Lihat 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 pengkodean 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 dapat diputar dengan benar, masalahnya mungkin terletak 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 wajar. Hindari penundaan dalam mengirimkan segmen teks berikutnya setelah audio untuk segmen sebelumnya selesai diputar.
Periksa kinerja fungsi callback:
Periksa apakah fungsi callback berisi logika bisnis berlebihan yang dapat menyebabkannya terblokir.
Fungsi callback berjalan di thread WebSocket. Jika thread ini terblokir, hal ini dapat mengganggu kemampuan WebSocket untuk menerima paket jaringan, sehingga menyebabkan audio tersendat.
Untuk menghindari pemblokiran thread WebSocket, tulis data audio ke buffer audio terpisah lalu 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 ucapan lambat (waktu sintesis lama)?
Lakukan langkah troubleshooting berikut:
Periksa interval input
Jika Anda menggunakan sintesis ucapan streaming, periksa apakah interval pengiriman teks terlalu lama. Misalnya, penundaan beberapa detik sebelum mengirimkan segmen berikutnya akan meningkatkan total waktu sintesis.
Analisis metrik kinerja
Latensi paket pertama: Biasanya sekitar 500 ms.
Faktor Waktu Nyata (RTF): Dihitung sebagai Total Waktu Sintesis / Durasi Audio. RTF biasanya kurang dari 1,0.
T: Bagaimana cara menangani pelafalan yang salah dalam ucapan hasil sintesis?
Gunakan tag <phoneme> SSML untuk menentukan pelafalan yang benar.
T: Mengapa tidak ada ucapan yang dikembalikan? Mengapa teks di akhir tidak berhasil dikonversi menjadi ucapan? (Ucapan hasil sintesis hilang)
Periksa apakah Anda telah memanggil metode streamingComplete dari kelas SpeechSynthesizer. Selama sintesis ucapan, server menyimpan teks dalam cache dan baru mulai sintesis setelah jumlah teks yang cukup tersimpan dalam cache. Jika Anda tidak memanggil metode streamingComplete, teks yang tersisa dalam cache mungkin tidak disintesis menjadi ucapan.
Izin dan otentikasi
T: Saya ingin Kunci API saya hanya digunakan untuk layanan sintesis ucapan 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.