Topik ini menjelaskan parameter dan detail antarmuka SDK Java untuk pengenalan ujaran real-time Paraformer.
PentingAlibaba Cloud Model Studio telah merilis domain khusus ruang kerja untuk wilayah China (Beijing). Domain baru ini memberikan performa unggul dan stabilitas lebih tinggi untuk permintaan inferensi. Kami merekomendasikan migrasi dari dashscope.aliyuncs.com ke {WorkspaceId}.cn-beijing.maas.aliyuncs.com.
Ganti {WorkspaceId} dengan Workspace ID Anda yang sebenarnya. Domain yang ada tetap berfungsi penuh.
PentingDokumen ini hanya berlaku untuk wilayah China (Beijing). Untuk menggunakan model, Anda harus menggunakan API key dari wilayah China (Beijing).
Panduan pengguna: Untuk pengenalan model dan rekomendasi pemilihan, lihat Pengenalan ujaran real-time - Fun-ASR/Paraformer.
Prasyarat
Anda telah mengaktifkan layanan dan Mendapatkan API key. Harap Konfigurasikan API key sebagai Variabel lingkungan alih-alih hardcoding di kode Anda untuk mencegah risiko keamanan akibat kebocoran kode.
CatatanKetika Anda perlu memberikan akses sementara ke aplikasi atau pengguna pihak ketiga, atau ketika ingin mengontrol secara ketat operasi berisiko tinggi seperti mengakses atau menghapus data sensitif, kami merekomendasikan penggunaan Token otentikasi sementara.
Dibandingkan dengan API Key jangka panjang, token otentikasi sementara memiliki periode validitas singkat (60 detik) dan keamanan lebih tinggi, sehingga cocok untuk skenario panggilan sementara dan secara efektif mengurangi risiko kebocoran API Key.
Penggunaan: Dalam kode Anda, ganti API Key yang awalnya digunakan untuk otentikasi dengan token otentikasi sementara yang diperoleh.
Daftar model
| paraformer-realtime-v2 | paraformer-realtime-8k-v2 | |
|---|---|---|
| Kasus penggunaan | Streaming langsung, rapat, dan skenario serupa | Pengenalan audio 8 kHz dalam skenario seperti layanan pelanggan telepon dan pesan suara |
| Laju sampel | Apa saja | 8kHz |
| Bahasa | Bahasa Tiongkok (termasuk Mandarin dan berbagai dialek), Inggris, Jepang, Korea, Jerman, Prancis, Rusia Dialek Tiongkok yang didukung: Shanghainese, Wu, Minnan, Timur Laut, Gansu, Guizhou, Henan, Hubei, Hunan, Jiangxi, Ningxia, Shanxi, Shaanxi, Shandong, Sichuan, Tianjin, Yunnan, Kanton | Tiongkok |
| Prediksi tanda baca | Didukung secara default, tidak perlu konfigurasi | Didukung secara default, tidak perlu konfigurasi |
| Inverse text normalization (ITN) | Didukung secara default, tidak perlu konfigurasi | Didukung secara default, tidak perlu konfigurasi |
| Kata kunci kustom | Lihat Kata kunci kustom | Lihat Kata kunci kustom |
| Tentukan bahasa pengenalan | Tentukan melalui parameter | |
| Pengenalan sentimen | (Klik untuk melihat penggunaan) Pengenalan sentimen mengikuti batasan berikut:
Cara memperoleh hasil pengenalan sentimen: Panggil metode |
Mulai cepat
Kelas Recognition menyediakan antarmuka panggilan non-streaming dan streaming dua arah. Pilih metode panggilan yang sesuai berdasarkan kebutuhan Anda:
- Panggilan non-streaming: Mengenali file lokal dan mengembalikan hasil lengkap sekaligus. Cocok untuk memproses audio yang telah direkam sebelumnya.
- Panggilan streaming dua arah: Mengenali aliran audio secara langsung dan menghasilkan hasil secara real time. Aliran audio dapat berasal dari perangkat eksternal (seperti mikrofon) atau dibaca dari file lokal. Cocok untuk skenario yang memerlukan umpan balik segera.
Panggilan non-streaming
Kirim satu tugas pengenalan ujaran-ke-teks real-time dan peroleh hasil transkripsi secara sinkron dengan memasukkan file lokal.
Buat instans Kelas Recognition, panggil metode call dengan Parameter permintaan dan file yang akan dikenali, lakukan pengenalan, dan peroleh hasil pengenalan.
Klik untuk melihat contoh lengkap
import com.alibaba.dashscope.audio.asr.recognition.Recognition;
import com.alibaba.dashscope.audio.asr.recognition.RecognitionParam;
import com.alibaba.dashscope.utils.Constants;
import java.io.File;
public class Main {
public static void main(String[] args) {
// Konfigurasi berikut untuk wilayah China (Beijing). Ganti "{WorkspaceId}" dengan Workspace ID Anda yang sebenarnya. Konfigurasi bervariasi berdasarkan wilayah.
Constants.baseWebsocketApiUrl = "wss://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api-ws/v1/inference";
// Buat instans Recognition
Recognition recognizer = new Recognition();
// Buat RecognitionParam
RecognitionParam param =
RecognitionParam.builder()
// Jika Anda belum mengonfigurasi API Key sebagai variabel lingkungan, hapus komentar baris berikut dan ganti apiKey dengan API Key Anda sendiri
// .apiKey("yourApikey")
.model("paraformer-realtime-v2")
.format("wav")
.sampleRate(16000)
// "language_hints" hanya didukung oleh model paraformer-realtime-v2
.parameter("language_hints", new String[]{"zh", "en"})
.build();
try {
System.out.println("Hasil pengenalan: " + recognizer.call(param, new File("{YOUR_AUDIO_FILE}")));
} catch (Exception e) {
e.printStackTrace();
} finally {
// Tutup koneksi WebSocket setelah tugas selesai
recognizer.getDuplexApi().close(1000, "bye");
}
System.out.println(
"[Metric] requestId: "
+ recognizer.getLastRequestId()
+ ", delay paket pertama ms: "
+ recognizer.getFirstPackageDelay()
+ ", delay paket terakhir ms: "
+ recognizer.getLastPackageDelay());
System.exit(0);
}
}
Streaming dua arah: berbasis callback
Kirim satu tugas pengenalan ujaran-ke-teks real-time dan alirkan hasil pengenalan real time melalui antarmuka callback.
-
Mulai pengenalan ujaran streaming
Buat instans Kelas Recognition, panggil metode
calldengan Parameter permintaan dan Antarmuka callback (ResultCallback) untuk memulai pengenalan ujaran streaming. -
Alirkan data audio
Panggil metode
sendAudioFramedari Kelas Recognition dalam loop untuk mengirim segmen aliran audio biner yang dibaca dari file lokal atau perangkat (seperti mikrofon) ke server.Selama transmisi data audio, server mengembalikan hasil pengenalan ke klien secara real time melalui metode
onEventdari Antarmuka callback (ResultCallback).Disarankan agar setiap segmen audio berdurasi sekitar 100 milidetik, dengan ukuran data antara 1 KB hingga 16 KB.
-
Selesaikan pemrosesan
Panggil metode
stopdari Kelas Recognition untuk mengakhiri pengenalan ujaran.Metode ini memblokir thread saat ini hingga callback
onCompleteatauonErrordari Antarmuka callback (ResultCallback) dipicu.
Klik untuk melihat contoh lengkap
import com.alibaba.dashscope.audio.asr.recognition.Recognition;
import com.alibaba.dashscope.audio.asr.recognition.RecognitionParam;
import com.alibaba.dashscope.audio.asr.recognition.RecognitionResult;
import com.alibaba.dashscope.common.ResultCallback;
import com.alibaba.dashscope.utils.Constants;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.TargetDataLine;
import java.nio.ByteBuffer;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class Main {
public static void main(String[] args) throws InterruptedException {
// Konfigurasi berikut untuk wilayah China (Beijing). Ganti "{WorkspaceId}" dengan Workspace ID Anda yang sebenarnya. Konfigurasi bervariasi berdasarkan wilayah.
Constants.baseWebsocketApiUrl = "wss://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api-ws/v1/inference";
ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.submit(new RealtimeRecognitionTask());
executorService.shutdown();
executorService.awaitTermination(1, TimeUnit.MINUTES);
System.exit(0);
}
}
class RealtimeRecognitionTask implements Runnable {
@Override
public void run() {
RecognitionParam param = RecognitionParam.builder()
// Jika Anda belum mengonfigurasi API Key sebagai variabel lingkungan, ganti apiKey dengan API Key Anda sendiri
// .apiKey("yourApikey")
.model("paraformer-realtime-v2")
.format("wav")
.sampleRate(16000)
// "language_hints" hanya didukung oleh model paraformer-realtime-v2
.parameter("language_hints", new String[]{"zh", "en"})
.build();
Recognition recognizer = new Recognition();
ResultCallback<RecognitionResult> callback = new ResultCallback<RecognitionResult>() {
@Override
public void onEvent(RecognitionResult result) {
if (result.isSentenceEnd()) {
System.out.println("Hasil Akhir: " + result.getSentence().getText());
} else {
System.out.println("Hasil Sementara: " + result.getSentence().getText());
}
}
@Override
public void onComplete() {
System.out.println("Pengenalan selesai");
}
@Override
public void onError(Exception e) {
System.out.println("Kesalahan RecognitionCallback: " + e.getMessage());
}
};
try {
recognizer.call(param, callback);
// Buat format audio
AudioFormat audioFormat = new AudioFormat(16000, 16, 1, true, false);
// Sesuaikan dengan perangkat perekaman default berdasarkan format
TargetDataLine targetDataLine =
AudioSystem.getTargetDataLine(audioFormat);
targetDataLine.open(audioFormat);
// Mulai merekam
targetDataLine.start();
ByteBuffer buffer = ByteBuffer.allocate(1024);
long start = System.currentTimeMillis();
// Rekam selama 50 detik dan lakukan transkripsi real time
while (System.currentTimeMillis() - start < 50000) {
int read = targetDataLine.read(buffer.array(), 0, buffer.capacity());
if (read > 0) {
buffer.limit(read);
// Kirim data audio yang direkam ke layanan pengenalan streaming
recognizer.sendAudioFrame(buffer);
buffer = ByteBuffer.allocate(1024);
// Batasi laju perekaman, tidur sebentar untuk mencegah penggunaan CPU tinggi
Thread.sleep(20);
}
}
recognizer.stop();
} catch (Exception e) {
e.printStackTrace();
} finally {
// Tutup koneksi WebSocket setelah tugas selesai
recognizer.getDuplexApi().close(1000, "bye");
}
System.out.println(
"[Metric] requestId: "
+ recognizer.getLastRequestId()
+ ", delay paket pertama ms: "
+ recognizer.getFirstPackageDelay()
+ ", delay paket terakhir ms: "
+ recognizer.getLastPackageDelay());
}
}
import com.alibaba.dashscope.audio.asr.recognition.Recognition;
import com.alibaba.dashscope.audio.asr.recognition.RecognitionParam;
import com.alibaba.dashscope.audio.asr.recognition.RecognitionResult;
import com.alibaba.dashscope.common.ResultCallback;
import com.alibaba.dashscope.utils.Constants;
import java.io.FileInputStream;
import java.nio.ByteBuffer;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
class TimeUtils {
private static final DateTimeFormatter formatter =
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
public static String getTimestamp() {
return LocalDateTime.now().format(formatter);
}
}
public class Main {
public static void main(String[] args) throws InterruptedException {
// Konfigurasi berikut untuk wilayah China (Beijing). Ganti "{WorkspaceId}" dengan Workspace ID Anda yang sebenarnya. Konfigurasi bervariasi berdasarkan wilayah.
Constants.baseWebsocketApiUrl = "wss://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api-ws/v1/inference";
ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.submit(new RealtimeRecognitionTask(Paths.get(System.getProperty("user.dir"), "{YOUR_AUDIO_FILE}")));
executorService.shutdown();
// tunggu hingga semua tugas selesai
executorService.awaitTermination(1, TimeUnit.MINUTES);
System.exit(0);
}
}
class RealtimeRecognitionTask implements Runnable {
private Path filepath;
public RealtimeRecognitionTask(Path filepath) {
this.filepath = filepath;
}
@Override
public void run() {
RecognitionParam param = RecognitionParam.builder()
// Jika Anda belum mengonfigurasi API Key sebagai variabel lingkungan, ganti apiKey dengan API Key Anda sendiri
// .apiKey("yourApikey")
.model("paraformer-realtime-v2")
.format("wav")
.sampleRate(16000)
// "language_hints" hanya didukung oleh model paraformer-realtime-v2
.parameter("language_hints", new String[]{"zh", "en"})
.build();
Recognition recognizer = new Recognition();
String threadName = Thread.currentThread().getName();
ResultCallback<RecognitionResult> callback = new ResultCallback<RecognitionResult>() {
@Override
public void onEvent(RecognitionResult message) {
if (message.isSentenceEnd()) {
System.out.println(TimeUtils.getTimestamp()+" "+
"[proses " + threadName + "] Hasil Akhir:" + message.getSentence().getText());
} else {
System.out.println(TimeUtils.getTimestamp()+" "+
"[proses " + threadName + "] Hasil Sementara: " + message.getSentence().getText());
}
}
@Override
public void onComplete() {
System.out.println(TimeUtils.getTimestamp()+" "+"[" + threadName + "] Pengenalan selesai");
}
@Override
public void onError(Exception e) {
System.out.println(TimeUtils.getTimestamp()+" "+
"[" + threadName + "] Kesalahan RecognitionCallback: " + e.getMessage());
}
};
try {
recognizer.call(param, callback);
// Harap ganti path dengan path file audio Anda
System.out.println(TimeUtils.getTimestamp()+" "+"[" + threadName + "] Input file_path adalah: " + this.filepath);
// Baca file dan kirim audio per bagian
FileInputStream fis = new FileInputStream(this.filepath.toFile());
// ukuran chunk diatur menjadi 1 detik untuk laju sampel 16KHz
byte[] buffer = new byte[3200];
int bytesRead;
// Loop untuk membaca bagian file
while ((bytesRead = fis.read(buffer)) != -1) {
ByteBuffer byteBuffer;
// Tangani chunk terakhir yang mungkin lebih kecil dari ukuran buffer
System.out.println(TimeUtils.getTimestamp()+" "+"[" + threadName + "] bytesRead: " + bytesRead);
if (bytesRead < buffer.length) {
byteBuffer = ByteBuffer.wrap(buffer, 0, bytesRead);
} else {
byteBuffer = ByteBuffer.wrap(buffer);
}
recognizer.sendAudioFrame(byteBuffer);
buffer = new byte[3200];
Thread.sleep(100);
}
System.out.println(TimeUtils.getTimestamp()+" "+LocalDateTime.now());
recognizer.stop();
} catch (Exception e) {
e.printStackTrace();
} finally {
// Tutup koneksi WebSocket setelah tugas selesai
recognizer.getDuplexApi().close(1000, "bye");
}
System.out.println(
"["
+ threadName
+ "][Metric] requestId: "
+ recognizer.getLastRequestId()
+ ", delay paket pertama ms: "
+ recognizer.getFirstPackageDelay()
+ ", delay paket terakhir ms: "
+ recognizer.getLastPackageDelay());
}
}
Streaming dua arah: berbasis Flowable
Kirim satu tugas pengenalan ujaran-ke-teks real-time dan alirkan hasil pengenalan real time melalui alur kerja Flowable.
Flowable adalah framework open-source untuk manajemen alur kerja dan proses bisnis, dirilis di bawah lisensi Apache 2.0. Untuk informasi lebih lanjut tentang Flowable, lihat Dokumentasi API Flowable.
Klik untuk melihat contoh lengkap
Langsung panggil metode streamCall dari Kelas Recognition untuk memulai pengenalan.
Metode streamCall mengembalikan instans Flowable<RecognitionResult>. Anda dapat memanggil metode seperti blockingForEach dan subscribe dari instans Flowable untuk memproses hasil pengenalan. Hasil pengenalan dikemas dalam RecognitionResult.
Metode streamCall memerlukan dua parameter:
- Instans
RecognitionParam(Parameter permintaan): Gunakan untuk mengatur parameter seperti model, laju sampel, dan format audio untuk pengenalan ujaran. - Instans
Flowable<ByteBuffer>: Anda perlu membuat instans tipeFlowable<ByteBuffer>dan mengimplementasikan metode parsing aliran audio di dalamnya.
import com.alibaba.dashscope.audio.asr.recognition.Recognition;
import com.alibaba.dashscope.audio.asr.recognition.RecognitionParam;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.utils.Constants;
import io.reactivex.BackpressureStrategy;
import io.reactivex.Flowable;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.TargetDataLine;
import java.nio.ByteBuffer;
public class Main {
public static void main(String[] args) throws NoApiKeyException {
// Konfigurasi berikut untuk wilayah China (Beijing). Ganti "{WorkspaceId}" dengan Workspace ID Anda yang sebenarnya. Konfigurasi bervariasi berdasarkan wilayah.
Constants.baseWebsocketApiUrl = "wss://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api-ws/v1/inference";
// Buat Flowable<ByteBuffer>
Flowable<ByteBuffer> audioSource =
Flowable.create(
emitter -> {
new Thread(
() -> {
try {
// Buat format audio
AudioFormat audioFormat = new AudioFormat(16000, 16, 1, true, false);
// Sesuaikan dengan perangkat perekaman default berdasarkan format
TargetDataLine targetDataLine =
AudioSystem.getTargetDataLine(audioFormat);
targetDataLine.open(audioFormat);
// Mulai merekam
targetDataLine.start();
ByteBuffer buffer = ByteBuffer.allocate(1024);
long start = System.currentTimeMillis();
// Rekam selama 50 detik dan lakukan transkripsi real time
while (System.currentTimeMillis() - start < 50000) {
int read = targetDataLine.read(buffer.array(), 0, buffer.capacity());
if (read > 0) {
buffer.limit(read);
// Kirim data audio yang direkam ke layanan pengenalan streaming
emitter.onNext(buffer);
buffer = ByteBuffer.allocate(1024);
// Batasi laju perekaman, tidur sebentar untuk mencegah penggunaan CPU tinggi
Thread.sleep(20);
}
}
// Beri tahu akhir transkripsi
emitter.onComplete();
} catch (Exception e) {
emitter.onError(e);
}
})
.start();
},
BackpressureStrategy.BUFFER);
// Buat Recognizer
Recognition recognizer = new Recognition();
// Buat RecognitionParam, masukkan Flowable<ByteBuffer> yang dibuat di atas ke parameter audioFrames
RecognitionParam param = RecognitionParam.builder()
// Jika Anda belum mengonfigurasi API Key sebagai variabel lingkungan, ganti apiKey dengan API Key Anda sendiri
// .apiKey("yourApikey")
.model("paraformer-realtime-v2")
.format("pcm")
.sampleRate(16000)
// "language_hints" hanya didukung oleh model paraformer-realtime-v2
.parameter("language_hints", new String[]{"zh", "en"})
.build();
// Antarmuka panggilan streaming
recognizer
.streamCall(param, audioSource)
.blockingForEach(
result -> {
// Berlangganan hasil output
if (result.isSentenceEnd()) {
System.out.println("Hasil Akhir: " + result.getSentence().getText());
} else {
System.out.println("Hasil Sementara: " + result.getSentence().getText());
}
});
// Tutup koneksi WebSocket setelah tugas selesai
recognizer.getDuplexApi().close(1000, "bye");
System.out.println(
"[Metric] requestId: "
+ recognizer.getLastRequestId()
+ ", delay paket pertama ms: "
+ recognizer.getFirstPackageDelay()
+ ", delay paket terakhir ms: "
+ recognizer.getLastPackageDelay());
System.exit(0);
}
}
Panggilan konkurensi tinggi
SDK Java DashScope menggunakan pooling koneksi OkHttp3 untuk mengurangi overhead pembentukan koneksi berulang. Untuk informasi lebih lanjut, lihat Optimalkan pengenalan ujaran real-time Paraformer untuk konkurensi tinggi.
Parameter permintaan
Konfigurasikan parameter seperti model, laju sampel, dan format audio melalui metode berantai RecognitionParam. Masukkan objek parameter yang telah dikonfigurasi ke metode call/streamCall dari Kelas Recognition.
Klik untuk melihat contoh
RecognitionParam param = RecognitionParam.builder()
.model("paraformer-realtime-v2")
.format("pcm")
.sampleRate(16000)
// "language_hints" hanya didukung oleh model paraformer-realtime-v2
.parameter("language_hints", new String[]{"zh", "en"})
.build();
| Parameter | Jenis | Default | Wajib | Deskripsi |
|---|---|---|---|---|
model | String | Ya | Model untuk pengenalan ujaran real-time. Untuk informasi lebih lanjut, lihat Daftar model. | |
sampleRate | Integer | Ya | Atur laju sampel (dalam Hz) audio yang akan dikenali. Bervariasi berdasarkan model:
| |
format | String | Ya | Atur format audio yang akan dikenali. Format audio yang didukung: pcm, wav, mp3, opus, speex, aac, amr. Pentingopus/speex: Harus menggunakan enkapsulasi Ogg. wav: Harus dikodekan PCM. amr: Hanya tipe AMR-NB yang didukung. | |
vocabularyId | String | Tidak | Atur ID kata kunci. Jika tidak diatur, kata kunci tidak akan berlaku. Gunakan bidang ini untuk mengatur ID kata kunci untuk model v2 dan yang lebih baru. Dalam sesi pengenalan ujaran saat ini, informasi kata kunci yang sesuai dengan ID kata kunci ini akan diterapkan. Untuk penggunaan detail, lihat Kata kunci kustom. | |
disfluencyRemovalEnabled | boolean | false | Tidak | Atur apakah akan memfilter kata pengisi:
|
language_hints | String[] | ["zh", "en"] | Tidak | Atur kode bahasa untuk pengenalan. Jika Anda tidak dapat menentukan bahasa sebelumnya, Anda dapat membiarkannya tidak diatur dan model akan secara otomatis mendeteksi bahasa. Kode bahasa yang saat ini didukung:
Parameter ini hanya berlaku untuk model yang mendukung banyak bahasa (lihat Daftar model). Catatan |
semantic_punctuation_enabled | boolean | false | Tidak | Atur apakah akan mengaktifkan segmentasi semantik. Dinonaktifkan secara default.
Segmentasi semantik memberikan akurasi lebih tinggi dan cocok untuk skenario transkripsi rapat. Segmentasi VAD (Voice Activity Detection) memiliki latensi lebih rendah dan cocok untuk skenario interaktif. Dengan menyesuaikan parameter Parameter ini hanya berlaku ketika model adalah v2 atau yang lebih baru. Catatan |
max_sentence_silence | Integer | 800 | Tidak | Atur ambang batas durasi diam (dalam ms) untuk segmentasi VAD (Voice Activity Detection). Ketika durasi diam setelah segmen ujaran melebihi ambang batas ini, sistem menentukan bahwa kalimat telah berakhir. Rentang parameter adalah 200 ms hingga 6000 ms, dengan nilai default 800 ms. Parameter ini hanya berlaku ketika parameter Catatan |
multi_threshold_mode_enabled | boolean | false | Tidak | Ketika sakelar ini diaktifkan (true), mencegah segmentasi VAD memotong kalimat yang terlalu panjang. Dinonaktifkan secara default. Parameter ini hanya berlaku ketika parameter Catatan |
punctuation_prediction_enabled | boolean | true | Tidak | Atur apakah akan menambahkan tanda baca secara otomatis dalam hasil pengenalan:
Parameter ini hanya berlaku ketika model adalah v2 atau yang lebih baru. Catatan |
heartbeat | boolean | false | Tidak | Ketika Anda perlu mempertahankan koneksi panjang dengan server, gunakan sakelar ini untuk mengontrol perilaku:
Parameter ini hanya berlaku ketika model adalah v2 atau yang lebih baru. CatatanVersi SDK harus 2.19.1 atau yang lebih baru untuk menggunakan bidang ini.
|
inverse_text_normalization_enabled | boolean | true | Tidak | Atur apakah akan mengaktifkan ITN (Inverse Text Normalization). Diaktifkan secara default (true). Ketika diaktifkan, angka Tiongkok dikonversi ke angka Arab. Parameter ini hanya berlaku ketika model adalah v2 atau yang lebih baru. Catatan |
apiKey | String | Tidak | Kunci API pengguna. |
Antarmuka utama
Kelas Recognition
Recognition diimpor melalui "import com.alibaba.dashscope.audio.asr.recognition.Recognition;". Antarmuka utamanya adalah sebagai berikut:
| Antarmuka/Metode | Parameter | Nilai kembali | Deskripsi |
|---|---|---|---|
|
| Tidak ada | Pengenalan real-time streaming berbasis callback. Metode ini tidak memblokir thread saat ini. |
|
| Hasil pengenalan | Panggilan non-streaming berbasis file lokal. Metode ini memblokir thread saat ini hingga semua audio telah dibaca. File yang akan dikenali harus memiliki izin baca. |
|
|
| Pengenalan real-time streaming berbasis Flowable. |
|
| Tidak ada | Kirim data audio. Setiap paket audio sebaiknya tidak terlalu besar atau terlalu kecil. Disarankan agar setiap paket berdurasi sekitar 100 ms, dengan ukuran antara 1 KB hingga 16 KB. Hasil pengenalan diperoleh melalui metode onEvent dari Antarmuka callback (ResultCallback). |
| Tidak ada | Tidak ada | Hentikan pengenalan real-time. Metode ini memblokir thread saat ini hingga metode |
| code: Kode penutupan WebSocket reason: Alasan penutupan Kedua parameter ini dapat dikonfigurasi sesuai dokumentasi Protokol WebSocket. | true | Setelah tugas selesai, koneksi WebSocket harus ditutup terlepas dari apakah terjadi pengecualian atau tidak, untuk menghindari kebocoran koneksi. Untuk informasi tentang cara menggunakan kembali koneksi guna meningkatkan efisiensi, lihat Optimalkan pengenalan ujaran real-time Paraformer untuk konkurensi tinggi. |
| Tidak ada | requestId | Dapatkan requestId tugas saat ini. Tersedia setelah memulai tugas baru dengan CatatanMetode ini tersedia mulai dari versi SDK 2.18.0. |
| Tidak ada | Delay paket pertama | Dapatkan delay paket pertama, yaitu latensi dari pengiriman paket audio pertama hingga menerima hasil pengenalan pertama. Gunakan setelah tugas selesai. CatatanMetode ini tersedia mulai dari versi SDK 2.18.0. |
| Tidak ada | Delay paket terakhir | Dapatkan delay paket terakhir, yaitu latensi dari pengiriman perintah CatatanMetode ini tersedia mulai dari versi SDK 2.18.0. |
Antarmuka callback (ResultCallback)
Selama panggilan streaming dua arah, server mengembalikan informasi dan data proses utama ke klien melalui callback. Anda perlu mengimplementasikan metode callback untuk menangani informasi atau data yang dikembalikan oleh server.
Metode callback diimplementasikan dengan memperluas kelas abstrak ResultCallback. Saat memperluas kelas abstrak ini, Anda dapat menentukan tipe generik sebagai RecognitionResult. RecognitionResult mengemas struktur data yang dikembalikan oleh server.
Karena Java mendukung penggunaan kembali koneksi, tidak ada callback onClose atau onOpen.
| Antarmuka/Metode | Parameter | Nilai kembali | Deskripsi |
|---|---|---|---|
| Tidak ada | Dipanggil ketika server memiliki respons. | |
| Tidak ada | Tidak ada | Dipanggil ketika tugas selesai. |
|
| Tidak ada | Dipanggil ketika terjadi pengecualian. |
Tanggapan
Hasil pengenalan real-time (RecognitionResult)
RecognitionResult merepresentasikan hasil sesi pengenalan real-time.
| Antarmuka/Metode | Parameter | Nilai kembali | Deskripsi |
|---|---|---|---|
| Tidak ada | requestId | Dapatkan requestId. |
| Tidak ada | Apakah merupakan kalimat lengkap, yaitu batas kalimat telah tercapai | Menentukan apakah kalimat yang diberikan telah berakhir. |
| Tidak ada | Dapatkan informasi kalimat, termasuk stempel waktu dan teks. |
Informasi kalimat (Sentence)
| Antarmuka/Metode | Parameter | Nilai kembali | Deskripsi |
|---|---|---|---|
| Tidak ada | Waktu mulai kalimat dalam ms | Mengembalikan waktu mulai kalimat. |
| Tidak ada | Waktu akhir kalimat dalam ms | Mengembalikan waktu akhir kalimat. |
| Tidak ada | Teks pengenalan | Mengembalikan teks yang dikenali. |
| Tidak ada | Mengembalikan informasi stempel waktu tingkat kata. | |
| Tidak ada | Sentimen kalimat saat ini | Mengembalikan sentimen kalimat saat ini:
Pengenalan sentimen mengikuti batasan berikut:
|
| Tidak ada | Tingkat kepercayaan sentimen kalimat saat ini | Mengembalikan tingkat kepercayaan sentimen kalimat saat ini. Rentang nilai: [0.0, 1.0]. Nilai lebih tinggi menunjukkan kepercayaan lebih tinggi. Pengenalan sentimen mengikuti batasan berikut:
|
Informasi stempel waktu kata (Word)
| Antarmuka/Metode | Parameter | Nilai kembali | Deskripsi |
|---|---|---|---|
| Tidak ada | Waktu mulai kata dalam ms | Mengembalikan waktu mulai kata. |
| Tidak ada | Waktu akhir kata dalam ms | Mengembalikan waktu akhir kata. |
| Tidak ada | Kata | Mengembalikan kata yang dikenali. |
| Tidak ada | Tanda baca | Mengembalikan tanda baca. |
Kode error
Jika Anda mengalami error, lihat Kode error untuk troubleshooting.
Jika masalah berlanjut, bergabunglah dengan komunitas developer untuk melaporkan masalah Anda dan berikan Request ID untuk investigasi lebih lanjut.
Contoh lainnya
Untuk contoh lainnya, lihat GitHub.
FAQ
Pertanyaan fitur
T: Bagaimana cara mempertahankan koneksi panjang dengan server selama diam berkepanjangan?
Atur parameter permintaan heartbeat menjadi true dan terus-menerus kirim audio diam ke server.
Audio diam mengacu pada file audio atau aliran data yang tidak mengandung sinyal suara. Audio diam dapat dihasilkan melalui berbagai metode, seperti menggunakan perangkat lunak pengeditan audio seperti Audacity atau Adobe Audition, atau melalui alat command-line seperti FFmpeg.
T: Bagaimana cara mengonversi audio ke format yang didukung?
Anda dapat menggunakan tool FFmpeg. Untuk penggunaan lebih lanjut, rujuk situs resmi FFmpeg.
# Perintah konversi dasar (templat universal)
# -i: Path file input. Contoh: audio.wav
# -c:a: Kodek audio. Contoh: aac, libmp3lame, pcm_s16le
# -b:a: Bitrate (kontrol kualitas). Contoh: 192k, 320k
# -ar: Laju sampel. Contoh: 44100 (CD), 48000, 16000
# -ac: Jumlah channel. Contoh: 1 (mono), 2 (stereo)
# -y: Timpa file yang ada (tidak perlu nilai)
ffmpeg -i input_audio.ext -c:a codec_name -b:a bitrate -ar sample_rate -ac channels output.ext
# Contoh: WAV -> MP3 (pertahankan kualitas asli)
ffmpeg -i input.wav -c:a libmp3lame -q:a 0 output.mp3
# Contoh: MP3 -> WAV (format standar PCM 16-bit)
ffmpeg -i input.mp3 -c:a pcm_s16le -ar 44100 -ac 2 output.wav
# Contoh: M4A -> AAC (ekstraksi/konversi audio Apple)
ffmpeg -i input.m4a -c:a copy output.aac # Ekstraksi langsung tanpa pengkodean ulang
ffmpeg -i input.m4a -c:a aac -b:a 256k output.aac # Pengkodean ulang untuk kualitas lebih tinggi
# Contoh: FLAC lossless -> Opus (kompresi tinggi)
ffmpeg -i input.flac -c:a libopus -b:a 128k -vbr on output.opus
T: Apakah mendukung melihat rentang waktu untuk setiap kalimat?
Ya. Hasil pengenalan ujaran mencakup stempel waktu mulai dan akhir untuk setiap kalimat, yang dapat digunakan untuk menentukan rentang waktu setiap kalimat.
T: Bagaimana cara mengenali file lokal (audio yang direkam)?
Ada dua cara untuk mengenali file lokal:
-
Masukkan path file lokal secara langsung: Metode ini hanya memperoleh hasil pengenalan lengkap setelah seluruh pengenalan selesai, dan tidak cocok untuk skenario yang memerlukan umpan balik segera.
Lihat Panggilan non-streaming. Masukkan path file ke metode
calldari Kelas Recognition untuk langsung mengenali file yang direkam. -
Konversi file lokal ke aliran biner untuk pengenalan: Metode ini mengenali file sambil mengalirkan hasil pengenalan, cocok untuk skenario yang memerlukan umpan balik segera.
- Lihat Streaming dua arah: berbasis callback. Gunakan metode
sendAudioFramedari Kelas Recognition untuk mengirim aliran biner ke server untuk pengenalan. - Lihat Streaming dua arah: berbasis Flowable. Gunakan metode
streamCalldari Kelas Recognition untuk mengirim aliran biner ke server untuk pengenalan.
- Lihat Streaming dua arah: berbasis callback. Gunakan metode
Troubleshooting
T: Apa penyebab kegagalan mengenali ujaran (tidak ada hasil pengenalan)?
-
Periksa apakah format audio (
format) dan laju sampel (sampleRate/sample_rate) dalam parameter permintaan diatur dengan benar dan mematuhi batasan parameter. Berikut adalah contoh kesalahan umum:- Ekstensi file audio adalah .wav, tetapi format sebenarnya adalah MP3, dan parameter permintaan
formatdiatur ke mp3 (pengaturan parameter salah). - Laju sampel audio adalah 3600 Hz, tetapi parameter permintaan
sampleRate/sample_ratediatur ke 48000 (pengaturan parameter salah).
Anda dapat menggunakan tool ffprobe untuk memperoleh informasi kontainer, kodek, laju sampel, channel, dan lainnya tentang audio:
- Ekstensi file audio adalah .wav, tetapi format sebenarnya adalah MP3, dan parameter permintaan
ffprobe -v error -show_entries format=format_name -show_entries stream=codec_name,sample_rate,channels -of default=noprint_wrappers=1 input.xxx
-
Ketika menggunakan model
paraformer-realtime-v2, periksa apakah bahasa yang diatur dalamlanguage_hintssesuai dengan bahasa sebenarnya dari audio.Contoh: Audio sebenarnya dalam bahasa Tiongkok, tetapi
language_hintsdiatur keen(Inggris). -
Jika semua pemeriksaan di atas lolos, Anda dapat menggunakan kata kunci kustom untuk meningkatkan akurasi pengenalan untuk kata-kata tertentu.