Sintesis suara dengan CosyVoice menggunakan DashScope Java SDK.
Titik akhir layanan
Secara default, SDK terhubung ke titik akhir Wilayah Beijing. Untuk menggunakan wilayah lain, atur Constants.baseWebsocketApiUrl sebelum menginisialisasi SDK.
- Singapura
- Tiongkok (Beijing)
wss://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api-ws/v1/inferenceGanti {WorkspaceId} dengan workspace ID Anda yang sebenarnya.SpeechSynthesizer
Package: com.alibaba.dashscope.audio.ttsv2.SpeechSynthesizer
Konstruktor
param: Parameter sintesis suara, dibuat denganSpeechSynthesisParam.builder()callback: Callback untuk panggilan streaming. Berikan null untuk panggilan non-streaming.
call() - Sintesis non-streaming/unidirectional streaming
Signature metode:
| Parameter | Type | Wajib | Deskripsi |
|---|---|---|---|
text | String | Ya | Teks yang akan disintesis. Panjang maksimum: 20.000 karakter. |
ByteBuffer atau null. Untuk panggilan non-streaming, mengembalikan seluruh data audio. Untuk panggilan unidirectional streaming, metode ini mengembalikan null; audio dikirimkan melalui callback.
streamingCall() - Sintesis bidirectional streaming
Signature metode:
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
text | String | Ya | Teks yang akan disintesis. Panjang maksimum: 20.000 karakter. Anda dapat memanggil metode ini beberapa kali untuk menambahkan teks. |
streamingComplete() - Mengakhiri bidirectional streaming
Signature metode:
streamingCancel() - Membatalkan bidirectional streaming
Signature metode:
SpeechSynthesizer.
callAsFlowable() - Sintesis unidirectional streaming (reaktif)
Signature metode:
| Parameter | Type | Wajib | Deskripsi |
|---|---|---|---|
text | String | Ya | Teks yang akan disintesis. |
streamingCallAsFlowable() - Sintesis bidirectional streaming (reaktif)
Signature metode:
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
textStream | Flowable<String> | Ya | Stream reaktif teks. |
SpeechSynthesisResult>.
getDuplexApi().close() - Menutup koneksi WebSocket
Signature metode:
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
code | int | Ya | Kode penutupan. |
reason | String | Ya | Alasan penutupan. |
boolean. Mengembalikan true jika koneksi berhasil ditutup, false jika tidak.
getLastRequestId() - Mendapatkan ID permintaan
Signature metode:
String, ID permintaan.
getFirstPackageDelay() - Mendapatkan latensi paket pertama
Signature metode:
long. Latensi paket pertama dalam milidetik, diukur dari pengiriman segmen teks pertama hingga menerima paket audio pertama.
SpeechSynthesisParam
Package: com.alibaba.dashscope.audio.ttsv2.SpeechSynthesisParam
Contoh:
Metode builder
| Metode | Tipe parameter | Wajib | Deskripsi |
|---|---|---|---|
model(String) | String | Ya | Nama model. |
voice(String) | String | Ya | Voice yang digunakan untuk sintesis suara.
|
format(SpeechSynthesisAudioFormat) | enum | Tidak | Format encoding audio dan laju sampel.Default: SpeechSynthesisAudioFormat.MP3_22050HZ_MONO_256KBPS.Package SpeechSynthesisAudioFormat: com.alibaba.dashscope.audio.ttsv2.SpeechSynthesisAudioFormat. |
volume(int) | int | Tidak | Tingkat volume.Nilai default: 50.Nilai valid: [0, 100]. |
speechRate(float) | float | Tidak | Laju bicara.Nilai default: 1.0.Nilai valid: [0.5, 2.0]. |
pitchRate(float) | float | Tidak | Pitch.Nilai default: 1.0.Nilai valid: [0.5, 2.0]. |
enableWordTimestamp(boolean) | boolean | Tidak | Menentukan apakah akan mengaktifkan timestamp tingkat kata.Nilai default: false.Hanya tersedia dalam mode keluaran streaming. Voice yang didukung: voice hasil kloning dari cosyvoice-v3.5-plus, cosyvoice-v3.5-flash, cosyvoice-v3-flash, cosyvoice-v3-plus, cosyvoice-v2, serta voice sistem yang ditandai sebagai didukung dalam Daftar Voice CosyVoice. Voice hasil kloning dari model lain tidak mendukung fitur ini. |
seed(int) | int | Tidak | Seed acak untuk mengontrol variasi dalam output sintesis. Ketika versi model, teks, voice, dan parameter lainnya tidak berubah, penggunaan seed yang sama menghasilkan output identik.Nilai default: 0.Nilai valid: [0, 65535].Untuk versi SDK sebelum 2.21.7, atur seed melalui parameter tambahan. |
languageHints(List<String>) | List<String> | Tidak | Menentukan bahasa target untuk sintesis suara guna meningkatkan kualitas output.Ketika pelafalan angka, ekspansi singkatan, pembacaan simbol, atau sintesis bahasa minoritas tidak sesuai harapan, gunakan parameter ini. Contohnya:
Nilai yang valid
|
instruction(String) | String | Tidak | Mengontrol karakteristik sintesis seperti dialek, emosi, atau gaya bicara.Untuk detail penggunaan, lihat Kontrol instruksi. |
hotFix(ParamHotFix) | ParamHotFix | Tidak | Mengonfigurasi koreksi pelafalan dan penggantian teks yang diterapkan sebelum sintesis. Fitur ini tidak didukung oleh cosyvoice-v2.
|
parameter(String key, Object value) | String, Object | Tidak | Mengatur Parameter tambahan. |
parameters(Map<String, Object>) | Map | Tidak | Mengatur Parameter tambahan. |
Parameter tambahan
Diatur melalui parameter() atau parameters().
Contoh:
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
bit_rate | integer | Tidak | Laju bit audio dalam kbps. Ketika format audio adalah mp3 atau opus, gunakan bit_rate untuk menyesuaikan laju bit.Nilai default: 32.Nilai valid: [6, 510]. |
enable_aigc_tag | boolean | Tidak | Menentukan apakah akan menyematkan watermark AIGC dalam audio yang dihasilkan. Ketika diatur ke true, watermark disematkan dalam file audio dengan format yang didukung (wav/mp3/opus).Nilai default: false. Hanya cosyvoice-v3-flash, cosyvoice-v3-plus, cosyvoice-v2 yang mendukung fitur ini. |
aigc_propagator | String | Tidak | Mengatur bidang ContentPropagator dalam watermark AIGC, mengidentifikasi propagator konten. Hanya berlaku ketika enable_aigc_tag bernilai true.Nilai default: UID Alibaba Cloud.Hanya cosyvoice-v3-flash, cosyvoice-v3-plus, cosyvoice-v2 yang mendukung fitur ini. |
aigc_propagate_id | String | Tidak | Mengatur bidang PropagateID dalam watermark AIGC, mengidentifikasi secara unik aksi propagasi tertentu. Hanya berlaku ketika enable_aigc_tag bernilai true.Nilai default: ID permintaan dari permintaan sintesis suara saat ini.Hanya cosyvoice-v3-flash, cosyvoice-v3-plus, cosyvoice-v2 yang mendukung fitur ini. |
enable_markdown_filter | boolean | Tidak | Hanya voice hasil kloning dari cosyvoice-v3-flash yang mendukung fitur ini.
|
ResultCallback
Package: com.alibaba.dashscope.common.ResultCallback
onEvent() - Menerima audio data
Signature metode:
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
result | SpeechSynthesisResult | Ya | Dipicu ketika event sintesis diterima. Berisi frame audio, informasi timestamp, dan informasi output (tipe event, teks asli, dll.). |
onComplete() - Sintesis selesai
Signature metode:
onError() - Penanganan error
Signature metode:
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
e | Exception | Ya | Dipicu ketika terjadi error. Berisi informasi exception. |
SpeechSynthesisResult
Package: com.alibaba.dashscope.audio.tts.SpeechSynthesisResult
getAudioFrame() - Mendapatkan frame data audio
Signature metode:
ByteBuffer, frame data audio.
getTimestamp() - Mendapatkan informasi timestamp
Signature metode:
getOutput() - Mendapatkan informasi output
Signature metode:
com.google.gson.JsonObject, informasi output dari event sintesis, berisi tipe event dan konten teks. Memerlukan versi SDK >= 2.22.0.
Informasi timestamp tingkat kalimat (Sentence)
Sentence membungkus informasi timestamp tingkat kalimat.
getBeginTime() - Mendapatkan waktu mulai kalimat
Signature metode:
getEndTime() - Mendapatkan waktu akhir kalimat
Signature metode:
getWords() - Mendapatkan timestamp tingkat kata
Signature metode:
List objek Word yang berisi informasi timestamp tingkat kata. Bisa jadi kosong.
Informasi timestamp tingkat kata (Word)
Word membungkus informasi timestamp tingkat kata.
getBeginTime() - Mendapatkan waktu mulai kata
Signature metode:
getEndTime() - Mendapatkan waktu akhir kata
Signature metode:
getText() - Mendapatkan teks
Signature metode:
String, konten teks.
getPhonemes() - Mendapatkan timestamp tingkat fonem
Signature metode:
List objek Phoneme yang berisi informasi timestamp tingkat fonem. Bisa jadi kosong.
Informasi timestamp tingkat fonem (Phoneme)
Phoneme membungkus informasi timestamp tingkat fonem.
getBeginTime() - Mendapatkan waktu mulai fonem
Signature metode:
getEndTime() - Mendapatkan waktu akhir fonem
Signature metode:
getText() - Mendapatkan teks
Signature metode:
String, konten teks.
getTone() - Mendapatkan nada
Signature metode:
- Dalam bahasa Inggris, 0, 1, dan 2 masing-masing merepresentasikan unstressed, primary stress, dan secondary stress.
- Dalam pinyin Mandarin, 1, 2, 3, 4, dan 5 masing-masing merepresentasikan nada pertama, kedua, ketiga, keempat, dan netral.
Informasi output (output)
getOutput() mengembalikan JsonObject yang membungkus informasi output event sintesis. Ambil informasi ini dalam callback onEvent atau stream Flowable. Informasi ini berisi bidang-bidang berikut:
| Bidang | Tipe | Deskripsi |
|---|---|---|
type | String | Tipe event. Nilai yang mungkin: sentence-begin (awal kalimat; mengembalikan teks yang akan disintesis), sentence-synthesis (sedang berlangsung sintesis audio; mengembalikan chunk data audio), sentence-end (akhir kalimat; mengembalikan konten teks dan timestamp tingkat kata). |
original_text | String | Teks asli kalimat saat ini. Dikembalikan dalam event sentence-begin dan sentence-end. |
sentence | JsonObject | Informasi kalimat, berisi indeks kalimat (index) dan timestamp tingkat kata (words). Event sentence-end mencakup informasi timestamp tingkat kata lengkap. |
Kode contoh
SDK mendukung mode sintesis berikut:
- Non-streaming: Panggilan blocking yang mengirimkan seluruh teks sekaligus dan langsung mengembalikan audio lengkap. Paling cocok untuk sintesis suara teks pendek.
- Unidirectional streaming: Panggilan non-blocking yang mengirimkan seluruh teks sekaligus dan mengirimkan data audio (mungkin dalam beberapa bagian) melalui fungsi callback. Paling cocok untuk skenario teks pendek yang memerlukan latensi rendah.
- Bidirectional streaming: Panggilan non-blocking yang mengirimkan teks dalam beberapa segmen dan mengirimkan audio yang disintesis secara inkremental melalui fungsi callback secara real time. Paling cocok untuk skenario teks panjang yang memerlukan latensi rendah.
- Panggilan non-streaming
- Panggilan unidirectional streaming
- Panggilan bidirectional streaming
Panjang teks per permintaan tidak boleh melebihi 20.000 karakter.
Panggilan berbasis Flowable
Flowable adalah tipe RxJava yang merepresentasikan stream reaktif yang mendukung backpressure. Untuk informasi lebih lanjut, lihat dokumentasi RxJava Flowable.
Sebelum menggunakan Flowable, pastikan library RxJava telah diintegrasikan dan Anda memahami dasar-dasar pemrograman reaktif.
Panjang teks per pemanggilan individu tidak boleh melebihi 20.000 karakter, dan panjang teks kumulatif dari semua pemanggilan tidak boleh melebihi 200.000 karakter.
- Panggilan unidirectional streaming
- Panggilan bidirectional streaming
Contoh berikut menunjukkan cara menggunakan antarmuka
blockingForEach objek Flowable untuk mengambil setiap objek SpeechSynthesisResult yang distream secara blocking.