Skip to main content
Paraformer

SDK Java Pengenalan Ujaran Real-time Paraformer

Topik ini menjelaskan parameter dan detail antarmuka SDK Java untuk pengenalan ujaran real-time Paraformer.

Alibaba 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.
Dokumen 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.
Ketika 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-v2paraformer-realtime-8k-v2
Kasus penggunaanStreaming langsung, rapat, dan skenario serupaPengenalan audio 8 kHz dalam skenario seperti layanan pelanggan telepon dan pesan suara
Laju sampelApa saja8kHz
BahasaBahasa Tiongkok (termasuk Mandarin dan berbagai dialek), Inggris, Jepang, Korea, Jerman, Prancis, RusiaDialek Tiongkok yang didukung: Shanghainese, Wu, Minnan, Timur Laut, Gansu, Guizhou, Henan, Hubei, Hunan, Jiangxi, Ningxia, Shanxi, Shaanxi, Shandong, Sichuan, Tianjin, Yunnan, KantonTiongkok
Prediksi tanda bacaDidukung secara default, tidak perlu konfigurasiDidukung secara default, tidak perlu konfigurasi
Inverse text normalization (ITN)Didukung secara default, tidak perlu konfigurasiDidukung secara default, tidak perlu konfigurasi
Kata kunci kustomLihat Kata kunci kustomLihat Kata kunci kustom
Tentukan bahasa pengenalanTentukan melalui parameter language_hints
Pengenalan sentimen
Pengenalan sentimen mengikuti batasan berikut:
  • Hanya tersedia untuk model paraformer-realtime-8k-v2.
  • Segmentasi semantik harus dinonaktifkan (dikontrol melalui Parameter permintaan semantic_punctuation_enabled). Segmentasi semantik dinonaktifkan secara default.
  • Hasil pengenalan sentimen hanya ditampilkan ketika metode isSentenceEnd dari Hasil pengenalan real-time (RecognitionResult) mengembalikan true.
Cara memperoleh hasil pengenalan sentimen: Panggil metode getEmoTag dan getEmoConfidence dari Informasi kalimat (Sentence) untuk memperoleh sentimen dan tingkat kepercayaan sentimen kalimat saat ini secara berturut-turut.

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.
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.
  1. Mulai pengenalan ujaran streaming Buat instans Kelas Recognition, panggil metode call dengan Parameter permintaan dan Antarmuka callback (ResultCallback) untuk memulai pengenalan ujaran streaming.
  2. Alirkan data audio Panggil metode sendAudioFrame dari 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 onEvent dari Antarmuka callback (ResultCallback). Disarankan agar setiap segmen audio berdurasi sekitar 100 milidetik, dengan ukuran data antara 1 KB hingga 16 KB.
  3. Selesaikan pemrosesan Panggil metode stop dari Kelas Recognition untuk mengakhiri pengenalan ujaran. Metode ini memblokir thread saat ini hingga callback onComplete atau onError dari Antarmuka callback (ResultCallback) dipicu.
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());
    }
}

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.
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 tipe Flowable<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.
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();
ParameterJenisDefaultWajibDeskripsi
modelString
YaModel untuk pengenalan ujaran real-time. Untuk informasi lebih lanjut, lihat Daftar model.
sampleRateInteger
YaAtur laju sampel (dalam Hz) audio yang akan dikenali.Bervariasi berdasarkan model:
  • paraformer-realtime-v2 mendukung laju sampel apa saja.
  • paraformer-realtime-8k-v2 hanya mendukung laju sampel 8000 Hz.
formatString
YaAtur format audio yang akan dikenali.Format audio yang didukung: pcm, wav, mp3, opus, speex, aac, amr.
opus/speex: Harus menggunakan enkapsulasi Ogg.wav: Harus dikodekan PCM.amr: Hanya tipe AMR-NB yang didukung.
vocabularyIdString
TidakAtur 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.
disfluencyRemovalEnabledbooleanfalseTidakAtur apakah akan memfilter kata pengisi:
  • true: Filter kata pengisi
  • false (default): Jangan filter kata pengisi
language_hintsString[]["zh", "en"]TidakAtur 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:
  • zh: Tiongkok
  • en: Inggris
  • ja: Jepang
  • yue: Kanton
  • ko: Korea
  • de: Jerman
  • fr: Prancis
  • ru: Rusia
Parameter ini hanya berlaku untuk model yang mendukung banyak bahasa (lihat Daftar model).
language_hints harus diatur melalui metode parameter atau metode parameters dari instans RecognitionParam:
RecognitionParam param = RecognitionParam.builder()
 .model("paraformer-realtime-v2")
 .format("pcm")
 .sampleRate(16000)
 .parameter("language_hints", new String[]{"zh", "en"})
 .build();
semantic_punctuation_enabledbooleanfalseTidakAtur apakah akan mengaktifkan segmentasi semantik. Dinonaktifkan secara default.
  • true: Aktifkan segmentasi semantik dan nonaktifkan segmentasi VAD (Voice Activity Detection).
  • false (default): Aktifkan segmentasi VAD (Voice Activity Detection) dan nonaktifkan segmentasi semantik.
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 semantic_punctuation_enabled, Anda dapat secara fleksibel mengganti metode segmentasi pengenalan ujaran agar sesuai dengan skenario berbeda.Parameter ini hanya berlaku ketika model adalah v2 atau yang lebih baru.
semantic_punctuation_enabled harus diatur melalui metode parameter atau metode parameters dari instans RecognitionParam:
RecognitionParam param = RecognitionParam.builder()
 .model("paraformer-realtime-v2")
 .format("pcm")
 .sampleRate(16000)
 .parameter("semantic_punctuation_enabled", true)
 .build();
max_sentence_silenceInteger800TidakAtur 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 semantic_punctuation_enabled bernilai false (segmentasi VAD) dan model adalah v2 atau yang lebih baru.
max_sentence_silence harus diatur melalui metode parameter atau metode parameters dari instans RecognitionParam:
RecognitionParam param = RecognitionParam.builder()
 .model("paraformer-realtime-v2")
 .format("pcm")
 .sampleRate(16000)
 .parameter("max_sentence_silence", 800)
 .build();
multi_threshold_mode_enabledbooleanfalseTidakKetika sakelar ini diaktifkan (true), mencegah segmentasi VAD memotong kalimat yang terlalu panjang. Dinonaktifkan secara default.Parameter ini hanya berlaku ketika parameter semantic_punctuation_enabled bernilai false (segmentasi VAD) dan model adalah v2 atau yang lebih baru.
multi_threshold_mode_enabled harus diatur melalui metode parameter atau metode parameters dari instans RecognitionParam:
RecognitionParam param = RecognitionParam.builder()
 .model("paraformer-realtime-v2")
 .format("pcm")
 .sampleRate(16000)
 .parameter("multi_threshold_mode_enabled", true)
 .build();
punctuation_prediction_enabledbooleantrueTidakAtur apakah akan menambahkan tanda baca secara otomatis dalam hasil pengenalan:
  • true (default): Ya
  • false: Tidak
Parameter ini hanya berlaku ketika model adalah v2 atau yang lebih baru.
punctuation_prediction_enabled harus diatur melalui metode parameter atau metode parameters dari instans RecognitionParam:
RecognitionParam param = RecognitionParam.builder()
 .model("paraformer-realtime-v2")
 .format("pcm")
 .sampleRate(16000)
 .parameter("punctuation_prediction_enabled", false)
 .build();
heartbeatbooleanfalseTidakKetika Anda perlu mempertahankan koneksi panjang dengan server, gunakan sakelar ini untuk mengontrol perilaku:
  • true: Koneksi dengan server dapat dipertahankan tanpa gangguan ketika terus-menerus mengirim audio diam.
  • false (default): Bahkan ketika audio diam terus-menerus dikirim, koneksi habis waktu dan ditutup setelah periode tertentu. 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.
Parameter ini hanya berlaku ketika model adalah v2 atau yang lebih baru.
Versi SDK harus 2.19.1 atau yang lebih baru untuk menggunakan bidang ini.heartbeat harus diatur melalui metode parameter atau metode parameters dari instans RecognitionParam:
RecognitionParam param = RecognitionParam.builder()
 .model("paraformer-realtime-v2")
 .format("pcm")
 .sampleRate(16000)
 .parameter("heartbeat", true)
 .build();
inverse_text_normalization_enabledbooleantrueTidakAtur 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.
inverse_text_normalization_enabled harus diatur melalui metode parameter atau metode parameters dari instans RecognitionParam:
RecognitionParam param = RecognitionParam.builder()
 .model("paraformer-realtime-v2")
 .format("pcm")
 .sampleRate(16000)
 .parameter("inverse_text_normalization_enabled", false)
 .build();
apiKeyString
TidakKunci API pengguna.

Antarmuka utama

Kelas Recognition

Recognition diimpor melalui "import com.alibaba.dashscope.audio.asr.recognition.Recognition;". Antarmuka utamanya adalah sebagai berikut:
Antarmuka/MetodeParameterNilai kembaliDeskripsi
public void call(RecognitionParam param, final ResultCallback<RecognitionResult> callback)
Tidak adaPengenalan real-time streaming berbasis callback. Metode ini tidak memblokir thread saat ini.
public String call(RecognitionParam param, File file)
Hasil pengenalanPanggilan non-streaming berbasis file lokal. Metode ini memblokir thread saat ini hingga semua audio telah dibaca. File yang akan dikenali harus memiliki izin baca.
public Flowable<RecognitionResult> streamCall(RecognitionParam param, Flowable<ByteBuffer> audioFrame)
Flowable<RecognitionResult>Pengenalan real-time streaming berbasis Flowable.
public void sendAudioFrame(ByteBuffer audioFrame)
  • audioFrame: Aliran audio biner tipe ByteBuffer
Tidak adaKirim 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).
public void stop()
Tidak adaTidak adaHentikan pengenalan real-time.Metode ini memblokir thread saat ini hingga metode onComplete atau onError dari instans ResultCallback dipanggil.
recognizer.getDuplexApi().close(int code, String reason)
code: Kode penutupan WebSocketreason: Alasan penutupanKedua parameter ini dapat dikonfigurasi sesuai dokumentasi Protokol WebSocket.trueSetelah 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.
public String getLastRequestId()
Tidak adarequestIdDapatkan requestId tugas saat ini. Tersedia setelah memulai tugas baru dengan call atau streamingCall.
Metode ini tersedia mulai dari versi SDK 2.18.0.
public long getFirstPackageDelay()
Tidak adaDelay paket pertamaDapatkan delay paket pertama, yaitu latensi dari pengiriman paket audio pertama hingga menerima hasil pengenalan pertama. Gunakan setelah tugas selesai.
Metode ini tersedia mulai dari versi SDK 2.18.0.
public long getLastPackageDelay()
Tidak adaDelay paket terakhirDapatkan delay paket terakhir, yaitu latensi dari pengiriman perintah stop hingga menerima hasil pengenalan terakhir. Gunakan setelah tugas selesai.
Metode 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.

Contoh

ResultCallback<RecognitionResult> callback = new ResultCallback<RecognitionResult>() {
    @Override
    public void onEvent(RecognitionResult result) {
        System.out.println("RequestId: " + result.getRequestId());
        // Implementasikan logika Anda untuk memproses hasil pengenalan ujaran 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/MetodeParameterNilai kembaliDeskripsi
public void onEvent(RecognitionResult result)
result: Hasil pengenalan real-time (RecognitionResult)Tidak adaDipanggil ketika server memiliki respons.
public void onComplete()
Tidak adaTidak adaDipanggil ketika tugas selesai.
public void onError(Exception e)
e: Informasi pengecualianTidak adaDipanggil ketika terjadi pengecualian.

Tanggapan

Hasil pengenalan real-time (RecognitionResult)

RecognitionResult merepresentasikan hasil sesi pengenalan real-time.
Antarmuka/MetodeParameterNilai kembaliDeskripsi
public String getRequestId()
Tidak adarequestIdDapatkan requestId.
public boolean isSentenceEnd()
Tidak adaApakah merupakan kalimat lengkap, yaitu batas kalimat telah tercapaiMenentukan apakah kalimat yang diberikan telah berakhir.
public Sentence getSentence()
Tidak adaInformasi kalimat (Sentence)Dapatkan informasi kalimat, termasuk stempel waktu dan teks.

Informasi kalimat (Sentence)

Antarmuka/MetodeParameterNilai kembaliDeskripsi
public Long getBeginTime()
Tidak adaWaktu mulai kalimat dalam msMengembalikan waktu mulai kalimat.
public Long getEndTime()
Tidak adaWaktu akhir kalimat dalam msMengembalikan waktu akhir kalimat.
public String getText()
Tidak adaTeks pengenalanMengembalikan teks yang dikenali.
public List<Word> getWords()
Tidak adaDaftar Informasi stempel waktu kata (Word)Mengembalikan informasi stempel waktu tingkat kata.
public String getEmoTag()
Tidak adaSentimen kalimat saat iniMengembalikan sentimen kalimat saat ini:
  • positive: Sentimen positif, seperti senang atau puas
  • negative: Sentimen negatif, seperti marah atau suram
  • neutral: Tidak ada sentimen yang jelas
Pengenalan sentimen mengikuti batasan berikut:
  • Hanya tersedia untuk model paraformer-realtime-8k-v2.
  • Segmentasi semantik harus dinonaktifkan (dikontrol melalui Parameter permintaan semantic_punctuation_enabled). Segmentasi semantik dinonaktifkan secara default.
  • Hasil pengenalan sentimen hanya ditampilkan ketika metode isSentenceEnd dari Hasil pengenalan real-time (RecognitionResult) mengembalikan true.
public Double getEmoConfidence()
Tidak adaTingkat kepercayaan sentimen kalimat saat iniMengembalikan tingkat kepercayaan sentimen kalimat saat ini. Rentang nilai: [0.0, 1.0]. Nilai lebih tinggi menunjukkan kepercayaan lebih tinggi.Pengenalan sentimen mengikuti batasan berikut:
  • Hanya tersedia untuk model paraformer-realtime-8k-v2.
  • Segmentasi semantik harus dinonaktifkan (dikontrol melalui Parameter permintaan semantic_punctuation_enabled). Segmentasi semantik dinonaktifkan secara default.
  • Hasil pengenalan sentimen hanya ditampilkan ketika metode isSentenceEnd dari Hasil pengenalan real-time (RecognitionResult) mengembalikan true.

Informasi stempel waktu kata (Word)

Antarmuka/MetodeParameterNilai kembaliDeskripsi
public long getBeginTime()
Tidak adaWaktu mulai kata dalam msMengembalikan waktu mulai kata.
public long getEndTime()
Tidak adaWaktu akhir kata dalam msMengembalikan waktu akhir kata.
public String getText()
Tidak adaKataMengembalikan kata yang dikenali.
public String getPunctuation()
Tidak adaTanda bacaMengembalikan 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 call dari 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.

Troubleshooting

T: Apa penyebab kegagalan mengenali ujaran (tidak ada hasil pengenalan)?

  1. 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 format diatur ke mp3 (pengaturan parameter salah).
    • Laju sampel audio adalah 3600 Hz, tetapi parameter permintaan sampleRate/sample_rate diatur ke 48000 (pengaturan parameter salah).
    Anda dapat menggunakan tool ffprobe untuk memperoleh informasi kontainer, kodek, laju sampel, channel, dan lainnya tentang audio:
ffprobe -v error -show_entries format=format_name -show_entries stream=codec_name,sample_rate,channels -of default=noprint_wrappers=1 input.xxx
  1. Ketika menggunakan model paraformer-realtime-v2, periksa apakah bahasa yang diatur dalam language_hints sesuai dengan bahasa sebenarnya dari audio. Contoh: Audio sebenarnya dalam bahasa Tiongkok, tetapi language_hints diatur ke en (Inggris).
  2. Jika semua pemeriksaan di atas lolos, Anda dapat menggunakan kata kunci kustom untuk meningkatkan akurasi pengenalan untuk kata-kata tertentu.
Pembuatan Gambar
  • FAQ
Video Generation
Model Dunia
Audio
  • Pembuatan audio
Realtime API
Penyematan Teks
TokenPlan
Model production
SDK Java Pengenalan Ujaran Real-time Paraformer - Alibaba Cloud Model Studio