Topik ini menjelaskan parameter dan antarmuka Java SDK untuk pengenalan ucapan real-time Qwen-Audio-ASR-Streaming.
Prasyarat
Layanan telah diaktifkan dan Dapatkan Kunci API. Untuk mencegah risiko keamanan akibat kebocoran kode, Konfigurasikan Kunci API sebagai Variabel lingkungan, bukan mengodekannya secara langsung dalam kode Anda.
Mulai cepat
Kelas Recognition menyediakan antarmuka untuk panggilan sinkron maupun panggilan streaming dua arah. Pilih pendekatan yang sesuai dengan kebutuhan Anda:
- Panggilan sinkron: mengenali file lokal dan mengembalikan hasil lengkap sekaligus. Paling cocok untuk memproses audio yang telah direkam sebelumnya.
- Panggilan streaming dua arah: mengenali aliran audio secara langsung dan mengembalikan hasil secara real time. Aliran audio dapat berasal dari perangkat eksternal seperti mikrofon atau dibaca dari file lokal. Paling cocok untuk skenario yang memerlukan umpan balik segera.
Panggilan sinkron
Kirim satu tugas pengenalan ucapan real-time dan dapatkan hasil pengenalan secara sinkron dengan memasukkan file lokal. Panggilan ini akan memblokir hingga hasil dikembalikan.
Buat instans Kelas Recognition, lalu panggil metode call untuk mengikat parameter permintaan dan file yang akan dikenali. Metode ini melakukan pengenalan dan mengembalikan hasil akhir.
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) {
// Berikut adalah konfigurasi untuk wilayah Singapura. Saat memanggil, ganti "{WorkspaceId}" dengan Workspace ID Anda yang sebenarnya. Konfigurasi berbeda tiap wilayah.
Constants.baseWebsocketApiUrl = "wss://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api-ws/v1/inference";
// Buat instans Recognition
Recognition recognizer = new Recognition();
// Buat RecognitionParam
RecognitionParam param =
RecognitionParam.builder()
.model("qwen-audio-3.0-asr-flash-streaming")
// Kunci API berbeda antara wilayah Singapura dan Beijing. Dapatkan Kunci API: https://www.alibabacloud.com/help/zh/model-studio/get-api-key
// Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan Kunci API Studio Model Anda: .apiKey("sk-xxx")
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
.format("wav")
.sampleRate(16000)
//.parameter("language_hints", new String[]{"zh"})
.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()
+ ", first package delay ms: "
+ recognizer.getFirstPackageDelay()
+ ", last package delay ms: "
+ recognizer.getLastPackageDelay());
System.exit(0);
}
}
Panggilan streaming dua arah: berbasis callback
Kirim satu tugas pengenalan ucapan real-time dan alirkan hasil pengenalan real-time dengan mengimplementasikan antarmuka callback.
-
Mulai pengenalan ucapan streaming
Buat instans Kelas Recognition, lalu panggil metode
calluntuk mengikat parameter permintaan dan antarmuka callback (ResultCallback) serta mulai pengenalan ucapan streaming. -
Alirkan audio
Panggil metode
sendAudioFramedari Kelas Recognition dalam loop untuk mengirim aliran audio biner ke server dalam segmen. Baca audio dari file lokal atau perangkat seperti mikrofon.Saat data audio dikirim, server mengembalikan hasil pengenalan ke klien secara real time melalui metode
onEventdari antarmuka callback (ResultCallback).Kirim sekitar 100 ms audio per frame, dengan ukuran muatan antara 1 KB hingga 16 KB.
-
Akhiri proses
Panggil metode
stopdari Kelas Recognition untuk mengakhiri pengenalan ucapan.Metode ini memblokir thread saat ini hingga callback
onCompleteatauonErrordari antarmuka callback (ResultCallback) dipicu, saat itu thread dilepas.
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 {
// Berikut adalah konfigurasi untuk wilayah Singapura. Saat memanggil, ganti "{WorkspaceId}" dengan Workspace ID Anda yang sebenarnya. Konfigurasi berbeda tiap wilayah.
Constants.baseWebsocketApiUrl = "wss://{WorkspaceId}.ap-southeast-1.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()
.model("qwen-audio-3.0-asr-flash-streaming")
// Kunci API berbeda antara wilayah Singapura dan Beijing. Dapatkan Kunci API: https://www.alibabacloud.com/help/zh/model-studio/get-api-key
// Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan Kunci API Studio Model Anda: .apiKey("sk-xxx")
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
.format("pcm")
.sampleRate(16000)
.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 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);
// Laju perekaman dibatasi; tidur sejenak untuk mencegah penggunaan CPU berlebihan
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()
+ ", first package delay ms: "
+ recognizer.getFirstPackageDelay()
+ ", last package delay ms: "
+ recognizer.getLastPackageDelay());
}
}
import com.alibaba.dashscope.api.GeneralApi;
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.base.HalfDuplexParamBase;
import com.alibaba.dashscope.common.GeneralListParam;
import com.alibaba.dashscope.common.ResultCallback;
import com.alibaba.dashscope.protocol.GeneralServiceOption;
import com.alibaba.dashscope.protocol.HttpMethod;
import com.alibaba.dashscope.protocol.Protocol;
import com.alibaba.dashscope.protocol.StreamingMode;
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.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 {
// Berikut adalah konfigurasi untuk wilayah Singapura. Saat memanggil, ganti "{WorkspaceId}" dengan Workspace ID Anda yang sebenarnya. Konfigurasi berbeda tiap wilayah.
Constants.baseWebsocketApiUrl = "wss://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api-ws/v1/inference";
// Dalam aplikasi nyata, metode ini hanya perlu dijalankan sekali di awal program; tidak perlu dijalankan berulang kali.
warmUp();
ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.submit(new RealtimeRecognitionTask(Paths.get(System.getProperty("user.dir"), "{YOUR_AUDIO_FILE}")));
executorService.shutdown();
// tunggu semua tugas selesai
executorService.awaitTermination(1, TimeUnit.MINUTES);
System.exit(0);
}
public static void warmUp() {
try {
// Permintaan GET ringan untuk membuat koneksi
GeneralServiceOption warmupOption = GeneralServiceOption.builder()
.protocol(Protocol.HTTP)
.httpMethod(HttpMethod.GET)
.streamingMode(StreamingMode.OUT)
.path("assistants")
.build();
warmupOption.setBaseHttpUrl(Constants.baseHttpApiUrl);
GeneralApi<HalfDuplexParamBase> api = new GeneralApi<>();
api.get(GeneralListParam.builder().limit(1L).build(), warmupOption);
} catch (Exception e) {
// Atur ulang flag untuk memungkinkan percobaan ulang jika pemanasan gagal
}
}
}
class RealtimeRecognitionTask implements Runnable {
private Path filepath;
public RealtimeRecognitionTask(Path filepath) {
this.filepath = filepath;
}
@Override
public void run() {
RecognitionParam param = RecognitionParam.builder()
.model("qwen-audio-3.0-asr-flash-streaming")
// Kunci API berbeda antara wilayah Singapura dan Beijing. Dapatkan Kunci API: https://www.alibabacloud.com/help/zh/model-studio/get-api-key
// Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan Kunci API Studio Model Anda: .apiKey("sk-xxx")
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
.format("wav")
.sampleRate(16000)
.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);
// 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 chunk
FileInputStream fis = new FileInputStream(this.filepath.toFile());
byte[] allData = new byte[fis.available()];
int ret = fis.read(allData);
fis.close();
int sendFrameLength = 3200;
for (int i = 0; i * sendFrameLength < allData.length; i ++) {
int start = i * sendFrameLength;
int end = Math.min(start + sendFrameLength, allData.length);
ByteBuffer byteBuffer = ByteBuffer.wrap(allData, start, end - start);
recognizer.sendAudioFrame(byteBuffer);
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()
+ ", first package delay ms: "
+ recognizer.getFirstPackageDelay()
+ ", last package delay ms: "
+ recognizer.getLastPackageDelay());
}
}
Panggilan streaming dua arah: berbasis Flowable
Kirim satu tugas pengenalan ucapan real-time dan alirkan hasil pengenalan real-time dengan mengimplementasikan alur kerja (Flowable).
Flowable adalah framework open-source untuk manajemen alur kerja dan proses bisnis, dirilis di bawah lisensi Apache 2.0. Untuk cara menggunakan Flowable, lihat Detail API Flowable.
Panggil metode streamCall dari Kelas Recognition secara langsung untuk memulai pengenalan.
Metode streamCall mengembalikan instans Flowable<RecognitionResult>. Gunakan metode instans Flowable, seperti blockingForEach atau subscribe, untuk memproses hasil pengenalan. Setiap hasil dibungkus dalam RecognitionResult.
Metode streamCall memiliki dua parameter:
- Instans
RecognitionParam(parameter permintaan): gunakan untuk mengatur model, laju sampel, format audio, dan parameter lain yang diperlukan untuk pengenalan ucapan. - Instans
Flowable<ByteBuffer>: buat instans bertipeFlowable<ByteBuffer>dan implementasikan logika penguraian 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 {
// Berikut adalah konfigurasi untuk wilayah Singapura. Saat memanggil, ganti "{WorkspaceId}" dengan Workspace ID Anda yang sebenarnya. Konfigurasi berbeda tiap wilayah.
Constants.baseWebsocketApiUrl = "wss://{WorkspaceId}.ap-southeast-1.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 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);
// Laju perekaman dibatasi; tidur sejenak untuk mencegah penggunaan CPU berlebihan
Thread.sleep(20);
}
}
// Beri tahu bahwa transkripsi telah berakhir
emitter.onComplete();
} catch (Exception e) {
emitter.onError(e);
}
})
.start();
},
BackpressureStrategy.BUFFER);
// Buat Recognizer
Recognition recognizer = new Recognition();
// Buat RecognitionParam dan masukkan Flowable<ByteBuffer> yang dibuat di atas ke parameter audioFrames
RecognitionParam param = RecognitionParam.builder()
.model("qwen-audio-3.0-asr-flash-streaming")
// Kunci API berbeda antara wilayah Singapura dan Beijing. Dapatkan Kunci API: https://www.alibabacloud.com/help/zh/model-studio/get-api-key
// Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan Kunci API Studio Model Anda: .apiKey("sk-xxx")
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
.format("pcm")
.sampleRate(16000)
.build();
// Antarmuka panggilan streaming
recognizer
.streamCall(param, audioSource)
.blockingForEach(
result -> {
// Langganan 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()
+ ", first package delay ms: "
+ recognizer.getFirstPackageDelay()
+ ", last package delay ms: "
+ recognizer.getLastPackageDelay());
System.exit(0);
}
}
Panggilan konkurensi tinggi
SDK Java DashScope menggunakan pooling koneksi OkHttp3 untuk mengurangi overhead pembentukan koneksi berulang. Untuk detailnya, lihat Praktik terbaik konkurensi tinggi.
Parameter permintaan
Gunakan metode berantai RecognitionParam untuk mengonfigurasi model, laju sampel, format audio, dan parameter lainnya. Masukkan objek parameter yang telah dikonfigurasi ke metode call/streamCall dari Kelas Recognition.
RecognitionParam param = RecognitionParam.builder()
.model("qwen-audio-3.0-asr-flash-streaming")
.format("pcm")
.sampleRate(16000)
//.parameter("language_hints", new String[]{"zh"})
.build();
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
model | String | Ya | Nama model. |
sampleRate | Integer | Ya | Laju sampel dalam Hz. Semua laju sampel didukung. |
format | String | Ya | Format audio. Nilai valid:
Pentingopus/speex: Harus menggunakan enkapsulasi Ogg. wav: Harus menggunakan encoding PCM. amr: Hanya tipe AMR-NB yang didukung. |
keep_dialect | boolean | Tidak | CatatanHanya berlaku untuk Default: |
vad_model | String | Tidak | CatatanHanya berlaku untuk Model VAD: |
vocabularyId | String | Tidak | ID daftar kata panas yang telah dikompilasi sebelumnya. Hasilkan ID ini terlebih dahulu dengan memanggil API pembuatan daftar kata panas. Masukkan ID ini selama pengenalan untuk menggunakan kata-kata panas dalam daftar tersebut. Cocok untuk skenario di mana kosakata diketahui dan relatif stabil, serta Anda perlu menggunakan kembali daftar kata yang sama di berbagai permintaan. Untuk detail penggunaan, lihat Kata panas yang telah dikompilasi. |
vocabulary | Map<String, Integer> | Tidak | Kata panas instan. Diberikan sebagai pasangan kunci-nilai, di mana kunci adalah teks kata panas ( Cocok untuk optimasi kata panas sementara pada tingkat sesi. Jika dikonfigurasi bersama kata panas yang telah dikompilasi, hanya kata panas instan yang berlaku. Untuk detail penggunaan, lihat Kata panas instan. Atur |
max_sentence_silence | Integer | Tidak | Ambang batas keheningan VAD untuk segmentasi, dalam ms. Ketika keheningan setelah segmen ucapan melebihi ambang batas ini, sistem menentukan bahwa kalimat telah berakhir. Nilai default: 800. Nilai valid: [200, 6000]. Atur |
multi_threshold_mode_enabled | boolean | Tidak | Apakah mode multi-ambang batas diaktifkan. Ketika diaktifkan, ini mencegah segmen VAD menjadi terlalu panjang. Nilai default: false. Atur |
punctuation_prediction_enabled | boolean | Tidak | Mengatur apakah tanda baca ditambahkan secara otomatis ke hasil pengenalan:
Atur |
heartbeat | boolean | Tidak | Apakah paket heartbeat diaktifkan. Nilai default: false.
Audio diam mengacu pada konten dalam file atau aliran data yang tidak mengandung sinyal suara. Anda dapat menghasilkan audio diam dengan beberapa cara, seperti menggunakan perangkat lunak pengeditan audio seperti Audacity atau Adobe Audition, atau menggunakan alat command-line seperti FFmpeg. CatatanUntuk menggunakan bidang ini, versi SDK harus 2.19.1 atau lebih baru. Atur |
language_hints | String[] | Tidak | Bahasa audio yang akan dikenali. Tidak ada nilai default; jika tidak diatur, model akan mendeteksi bahasa secara otomatis. Anda dapat menetapkan hingga 4 nilai. Jika lebih, hanya 4 nilai pertama yang berlaku. Klik untuk melihat kode bahasa yang didukung
Atur |
speech_noise_threshold | float | Tidak | Ambang batas untuk membedakan ucapan dari kebisingan, digunakan untuk menyesuaikan sensitivitas Voice Activity Detection (VAD). Nilai valid: [-1.0, 1.0]. Deskripsi nilai:
Ini adalah parameter konfigurasi lanjutan. Penyesuaian dapat memengaruhi hasil pengenalan secara signifikan. Rekomendasi:
Atur |
special_word_filter | String | Tidak | Menentukan kata sensitif yang akan diproses selama pengenalan ucapan, dan mendukung pengaturan metode pemrosesan berbeda untuk kata sensitif berbeda. Untuk detailnya, lihat Penyaringan kata sensitif. Atur |
input | Map<String, Object> | Tidak | Objek input yang memasukkan konteks percakapan. Konteks membantu pengenalan dan meningkatkan akurasi pengenalan istilah khusus. Untuk penggunaan, lihat Mulai cepat. Map harus berisi kunci
PentingBatasan: pesan konteks bertipe PentingKetika Anda memasukkan konteks, pesan dalam CatatanUntuk menggunakan bidang ini, versi SDK harus 2.22.23 atau lebih baru. Atur |
apiKey | String | Tidak | Kunci API Anda. |
Antarmuka utama
Kelas Recognition
Impor Recognition dengan import com.alibaba.dashscope.audio.asr.recognition.Recognition;. Antarmuka utamanya 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. | Pengenalan non-streaming file lokal. Metode ini memblokir thread saat ini hingga seluruh file audio dibaca. File harus dapat dibaca. |
|
|
| Pengenalan real-time streaming berbasis Flowable. |
|
| Tidak ada | Mengirim audio. Pertahankan ukuran setiap chunk audio yang dikirim dalam batas wajar. Ukuran chunk yang direkomendasikan berisi sekitar 100 ms audio dan berukuran 1 KB hingga 16 KB. Hasil pengenalan dikirim melalui metode onEvent dari Antarmuka callback (ResultCallback). |
| Tidak ada | Tidak ada | Menghentikan pengenalan real-time. Metode ini memblokir thread saat ini hingga callback |
| code: Kode penutupan WebSocket. reason: Alasan penutupan. Untuk panduan mengatur dua parameter ini, lihat Protokol WebSocket. | true | Setelah tugas berakhir, selalu tutup koneksi WebSocket, baik terjadi kesalahan maupun tidak, untuk menghindari kebocoran koneksi. Untuk menggunakan kembali koneksi demi efisiensi yang lebih baik, lihat Optimalkan pengenalan ucapan real-time Paraformer untuk konkurensi tinggi. |
| Tidak ada | requestId | Mendapatkan requestId tugas saat ini. Tersedia setelah tugas baru dimulai dengan CatatanMetode ini tersedia hanya di versi SDK 2.18.0 dan lebih baru. |
| Tidak ada | Latensi paket pertama. | Mendapatkan latensi paket pertama, yaitu penundaan dari pengiriman paket audio pertama hingga menerima hasil pengenalan pertama. Gunakan setelah tugas selesai. CatatanMetode ini tersedia hanya di versi SDK 2.18.0 dan lebih baru. |
| Tidak ada | Latensi paket terakhir. | Mendapatkan latensi paket terakhir, yaitu waktu dari pengiriman perintah CatatanMetode ini tersedia hanya di versi SDK 2.18.0 dan lebih baru. |
Antarmuka callback (ResultCallback)
Selama panggilan streaming dua arah, server mengembalikan informasi dan data proses penting ke klien melalui callback. Implementasikan metode callback untuk menangani informasi atau data yang dikembalikan oleh server.
Implementasikan metode callback dengan memperluas kelas abstrak ResultCallback. Saat memperluas kelas ini, Anda dapat mengatur tipe generik ke RecognitionResult. RecognitionResult membungkus struktur data yang dikembalikan oleh server.
Karena Java mendukung penggunaan kembali koneksi, tidak ada onClose atau onOpen.
ResultCallback<RecognitionResult> callback = new ResultCallback<RecognitionResult>() {
@Override
public void onEvent(RecognitionResult result) {
System.out.println("RequestId: " + result.getRequestId());
// Tambahkan logika Anda untuk memproses hasil pengenalan ucapan di sini.
}
@Override
public void onComplete() {
System.out.println("Tugas selesai");
}
@Override
public void onError(Exception e) {
System.out.println("Tugas gagal: " + e.getMessage());
}
};
| Antarmuka/Metode | Parameter | Nilai kembali | Deskripsi |
|---|---|---|---|
| Tidak ada | Dipanggil ketika server mengirim respons. | |
| Tidak ada | Tidak ada | Dipanggil setelah tugas selesai. |
|
| Tidak ada | Dipanggil ketika terjadi pengecualian. |
Respons
Hasil pengenalan real-time (RecognitionResult)
RecognitionResult merepresentasikan hasil dari satu pengenalan real-time.
| Antarmuka/Metode | Parameter | Nilai kembali | Deskripsi |
|---|---|---|---|
| Tidak ada | requestId | Mendapatkan requestId. |
| Tidak ada | Apakah kalimat lengkap telah terbentuk, yaitu apakah batas kalimat terdeteksi. | Menentukan apakah kalimat yang diberikan telah berakhir. |
| Tidak ada | Mendapatkan informasi kalimat, termasuk timestamp 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 yang dikenali. | Mengembalikan teks yang dikenali. |
| Tidak ada | Daftar objek Informasi timestamp tingkat kata (Word). | Mengembalikan informasi timestamp tingkat kata. |
Informasi timestamp tingkat 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 kesalahan
Jika Anda mengalami kesalahan, lihat Kode kesalahan untuk troubleshooting.
Jika masalah berlanjut, bergabunglah dengan komunitas developer untuk melaporkan masalah Anda dan berikan Request ID untuk investigasi lebih lanjut.
FAQ
Fitur
T: Bagaimana cara menjaga koneksi ke server tetap aktif selama periode diam yang panjang?
Atur parameter permintaan heartbeat ke true, dan terus kirim audio diam ke server.
Audio diam adalah audio yang tidak mengandung sinyal suara dalam file atau aliran data. Anda dapat menghasilkan audio diam dengan beberapa cara, misalnya dengan menggunakan perangkat lunak pengeditan audio seperti Audacity atau Adobe Audition, atau alat command-line seperti FFmpeg.
T: Bagaimana cara mengonversi audio ke format yang didukung?
Gunakan alat FFmpeg. Untuk penggunaan lebih lanjut, lihat situs resmi FFmpeg.
# Perintah konversi dasar (templat universal)
# -i, tujuan: path file input, contoh nilai: audio.wav
# -c:a, tujuan: penyandi audio, contoh nilai: aac, libmp3lame, pcm_s16le
# -b:a, tujuan: bitrate (kontrol kualitas audio), contoh nilai: 192k, 320k
# -ar, tujuan: laju sampel, contoh nilai: 44100 (CD), 48000, 16000
# -ac, tujuan: jumlah saluran, contoh nilai: 1 (mono), 2 (stereo)
# -y, tujuan: timpa file yang ada (tidak perlu nilai)
ffmpeg -i input_audio.ext -c:a encoder_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 (ekstrak/konversi audio Apple)
ffmpeg -i input.m4a -c:a copy output.aac # Ekstrak langsung tanpa re-encoding
ffmpeg -i input.m4a -c:a aac -b:a 256k output.aac # Re-encode 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: Bagaimana cara mengenali file lokal (rekaman)?
Ada dua cara untuk mengenali file lokal:
-
Masukkan path file lokal secara langsung: pendekatan ini hanya mengembalikan hasil pengenalan lengkap setelah pengenalan selesai, sehingga tidak cocok untuk skenario yang memerlukan umpan balik segera.
Lihat Panggilan sinkron, dan masukkan path file ke metode
calldari Kelas Recognition untuk mengenali rekaman secara langsung. -
Konversi file lokal ke aliran biner untuk pengenalan: pendekatan ini mengenali file dan mengalirkan hasil secara bersamaan, yang cocok untuk skenario yang memerlukan umpan balik segera.
- Lihat Panggilan streaming dua arah: berbasis callback, dan kirim aliran biner ke server untuk pengenalan melalui metode
sendAudioFramedari Kelas Recognition. - Lihat Panggilan streaming dua arah: berbasis Flowable, dan kirim aliran biner ke server untuk pengenalan melalui metode
streamCalldari Kelas Recognition.
- Lihat Panggilan streaming dua arah: berbasis callback, dan kirim aliran biner ke server untuk pengenalan melalui metode
Troubleshooting
T: Mengapa ucapan tidak dapat dikenali (tidak ada hasil pengenalan)?
-
Periksa bahwa format audio (
format) dan laju sampel (sampleRate/sample_rate) dalam parameter permintaan benar dan memenuhi batasan parameter. Kesalahan umum meliputi:- File audio memiliki ekstensi .wav tetapi sebenarnya dalam format MP3, sedangkan 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).
Gunakan alat ffprobe untuk mendapatkan informasi tentang kontainer, kodek, laju sampel, saluran, dan lainnya tentang audio:
- File audio memiliki ekstensi .wav tetapi sebenarnya dalam format MP3, sedangkan 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
-
Periksa bahwa bahasa yang diatur dalam
language_hintssesuai dengan bahasa aktual audio.Misalnya, audio sebenarnya dalam bahasa Mandarin, tetapi
language_hintsdiatur keen(Inggris). -
Jika tidak ada masalah yang ditemukan dari pemeriksaan di atas, konfigurasikan kata panas khusus untuk meningkatkan pengenalan istilah tertentu.