All Products
Search
Document Center

Alibaba Cloud Model Studio:SDK Java Pengenalan Ujaran Real-time Paraformer

Last Updated:Sep 09, 2026

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-v2paraformer-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 language_hints

Pengenalan sentimen

(Klik untuk melihat penggunaan)

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.

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.

  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.

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 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.

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();
ParameterJenisDefaultWajibDeskripsi

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:

  • paraformer-realtime-v2 mendukung laju sampel apa saja.
  • paraformer-realtime-8k-v2 hanya mendukung laju sampel 8000 Hz.

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:

  • true: Filter kata pengisi
  • false (default): Jangan filter 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:

  • 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).

Catatanlanguage_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();
RecognitionParam param = RecognitionParam.builder()
 .model("paraformer-realtime-v2")
 .format("pcm")
 .sampleRate(16000)
 .parameters(Collections.singletonMap("language_hints", new String[]{"zh", "en"}))
 .build();

semantic_punctuation_enabled

boolean

false

Tidak

Atur 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.

Catatansemantic_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();
RecognitionParam param = RecognitionParam.builder()
 .model("paraformer-realtime-v2")
 .format("pcm")
 .sampleRate(16000)
 .parameters(Collections.singletonMap("semantic_punctuation_enabled", true))
 .build();

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 semantic_punctuation_enabled bernilai false (segmentasi VAD) dan model adalah v2 atau yang lebih baru.

Catatanmax_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();
RecognitionParam param = RecognitionParam.builder()
 .model("paraformer-realtime-v2")
 .format("pcm")
 .sampleRate(16000)
 .parameters(Collections.singletonMap("max_sentence_silence", 800))
 .build();

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 semantic_punctuation_enabled bernilai false (segmentasi VAD) dan model adalah v2 atau yang lebih baru.

Catatanmulti_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();
RecognitionParam param = RecognitionParam.builder()
 .model("paraformer-realtime-v2")
 .format("pcm")
 .sampleRate(16000)
 .parameters(Collections.singletonMap("multi_threshold_mode_enabled", true))
 .build();

punctuation_prediction_enabled

boolean

true

Tidak

Atur 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.

Catatanpunctuation_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();
RecognitionParam param = RecognitionParam.builder()
 .model("paraformer-realtime-v2")
 .format("pcm")
 .sampleRate(16000)
 .parameters(Collections.singletonMap("punctuation_prediction_enabled", false))
 .build();

heartbeat

boolean

false

Tidak

Ketika 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.

CatatanVersi 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();
RecognitionParam param = RecognitionParam.builder()
 .model("paraformer-realtime-v2")
 .format("pcm")
 .sampleRate(16000)
 .parameters(Collections.singletonMap("heartbeat", true))
 .build();

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.

Catataninverse_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();
RecognitionParam param = RecognitionParam.builder()
 .model("paraformer-realtime-v2")
 .format("pcm")
 .sampleRate(16000)
 .parameters(Collections.singletonMap("inverse_text_normalization_enabled", false))
 .build();

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/MetodeParameterNilai kembaliDeskripsi
public void call(RecognitionParam param, final ResultCallback<RecognitionResult> callback)

Tidak ada

Pengenalan real-time streaming berbasis callback. Metode ini tidak memblokir thread saat ini.

public String call(RecognitionParam param, File file)

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.

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 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).

public void stop()

Tidak ada

Tidak ada

Hentikan 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 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.

public String getLastRequestId()

Tidak ada

requestId

Dapatkan requestId tugas saat ini. Tersedia setelah memulai tugas baru dengan call atau streamingCall.

CatatanMetode ini tersedia mulai dari versi SDK 2.18.0.

public long getFirstPackageDelay()

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.

public long getLastPackageDelay()

Tidak ada

Delay paket terakhir

Dapatkan delay paket terakhir, yaitu latensi dari pengiriman perintah stop hingga menerima hasil pengenalan terakhir. Gunakan setelah tugas selesai.

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.

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 ada

Dipanggil ketika server memiliki respons.

public void onComplete()

Tidak ada

Tidak ada

Dipanggil ketika tugas selesai.

public void onError(Exception e)

e: Informasi pengecualian

Tidak ada

Dipanggil ketika terjadi pengecualian.

Tanggapan

Hasil pengenalan real-time (RecognitionResult)

RecognitionResult merepresentasikan hasil sesi pengenalan real-time.

Antarmuka/MetodeParameterNilai kembaliDeskripsi
public String getRequestId()

Tidak ada

requestId

Dapatkan requestId.

public boolean isSentenceEnd()

Tidak ada

Apakah merupakan kalimat lengkap, yaitu batas kalimat telah tercapai

Menentukan apakah kalimat yang diberikan telah berakhir.

public Sentence getSentence()

Tidak ada

Informasi kalimat (Sentence)

Dapatkan informasi kalimat, termasuk stempel waktu dan teks.

Informasi kalimat (Sentence)

Antarmuka/MetodeParameterNilai kembaliDeskripsi
public Long getBeginTime()

Tidak ada

Waktu mulai kalimat dalam ms

Mengembalikan waktu mulai kalimat.

public Long getEndTime()

Tidak ada

Waktu akhir kalimat dalam ms

Mengembalikan waktu akhir kalimat.

public String getText()

Tidak ada

Teks pengenalan

Mengembalikan teks yang dikenali.

public List<Word> getWords()

Tidak ada

Daftar Informasi stempel waktu kata (Word)

Mengembalikan informasi stempel waktu tingkat kata.

public String getEmoTag()

Tidak ada

Sentimen kalimat saat ini

Mengembalikan 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 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:

  • 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 ada

Waktu mulai kata dalam ms

Mengembalikan waktu mulai kata.

public long getEndTime()

Tidak ada

Waktu akhir kata dalam ms

Mengembalikan waktu akhir kata.

public String getText()

Tidak ada

Kata

Mengembalikan kata yang dikenali.

public String getPunctuation()

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 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.