All Products
Search
Document Center

Alibaba Cloud Model Studio:Real-time speech recognition: Fun-ASR/Paraformer

Last Updated:Mar 22, 2026

Layanan Real-time Speech Recognition mengonversi aliran audio menjadi teks ber-tanda baca, mentranskripsikan audio dari mikrofon, rekaman rapat, maupun file audio lokal. Kasus penggunaan umum meliputi transkripsi rapat real-time, keterangan langsung (live captions), obrolan suara, dan layanan pelanggan cerdas.

Fitur utama

  • Pengenalan ucapan real-time untuk beberapa bahasa, termasuk Tiongkok, Inggris, dan berbagai dialek.

  • Output timestamp untuk menghasilkan hasil pengenalan terstruktur.

  • Laju sampel fleksibel dan berbagai format audio guna menyesuaikan dengan lingkungan perekaman yang berbeda.

  • Deteksi Aktivitas Suara (Voice Activity Detection/VAD) opsional untuk secara otomatis menyaring segmen diam, sehingga meningkatkan efisiensi pemrosesan audio panjang.

  • Koneksi SDK dan WebSocket yang menyediakan layanan stabil dengan latensi rendah.

Ketersediaan

Model yang didukung:

Internasional

Dalam mode penyebaran internasional, Endpoint dan Penyimpanan Data berada di wilayah Singapura. Sistem menjadwalkan secara dinamis Sumber Daya Komputasi Inferensi Model di seluruh wilayah global, kecuali Tiongkok daratan.

Saat memanggil model berikut, gunakan API Key dari wilayah Singapura:

  • Fun-ASR: fun-asr-realtime (Stable, saat ini setara dengan fun-asr-realtime-2025-11-07), fun-asr-realtime-2025-11-07 (Snapshot)

Tiongkok daratan

Dalam mode penyebaran Tiongkok daratan, Endpoint dan Penyimpanan Data berada di wilayah Beijing. Sumber Daya Komputasi Inferensi Model hanya beroperasi di dalam Tiongkok daratan.

Saat memanggil model berikut, gunakan API Key dari wilayah Beijing:

  • Fun-ASR: fun-asr-realtime (Stable, saat ini setara dengan fun-asr-realtime-2025-11-07), fun-asr-realtime-2026-02-28 (Latest Snapshot), fun-asr-realtime-2025-11-07 (Snapshot), fun-asr-realtime-2025-09-15 (Snapshot)

    • fun-asr-flash-8k-realtime (Stable, saat ini setara dengan fun-asr-flash-8k-realtime-2026-01-28), fun-asr-flash-8k-realtime-2026-01-28

  • Paraformer: paraformer-realtime-v2, paraformer-realtime-v1, paraformer-realtime-8k-v2, paraformer-realtime-8k-v1

Untuk informasi lebih lanjut, lihat Daftar Model.

Pemilihan model

Skenario

Recommended

Alasan

Pengenalan Bahasa Mandarin (rapat/streaming langsung)

fun-asr-realtime, fun-asr-realtime-2026-02-28, paraformer-realtime-v2

Menawarkan latensi stabil dan mendukung berbagai format audio serta laju sampel tinggi.

Pengenalan multi-bahasa (Layanan Pelanggan lintas batas/konferensi internasional)

paraformer-realtime-v2

Mendukung skenario lintas batas dan peralihan bahasa yang mulus.

Pengenalan dialek Tiongkok (Layanan Pelanggan/layanan pemerintah)

fun-asr-realtime-2026-02-28, paraformer-realtime-v2

Mencakup berbagai dialek regional.

Pengenalan Campuran Bahasa Tiongkok, Inggris, dan Jepang (Kelas/Presentasi)

fun-asr-realtime, fun-asr-realtime-2025-11-07

Dioptimalkan untuk pengenalan bahasa Mandarin, Inggris, dan Jepang.

Transkripsi audio telepon dengan laju sampel rendah

fun-asr-flash-8k-realtime

Dioptimalkan untuk mentranskripsikan panggilan Layanan Pelanggan Tiongkok.

Untuk informasi lebih lanjut, lihat Bandingkan model.

Memulai

Berikut adalah contoh kode untuk memanggil API. Untuk contoh lain yang mencakup skenario umum, lihat GitHub.

Dapatkan Kunci API dan ekspor Kunci API sebagai Variabel lingkungan. Jika menggunakan SDK untuk melakukan panggilan, instal DashScope SDK.

Fun-ASR

Dari mikrofon

Layanan Real-time Speech Recognition mentranskripsikan audio dari mikrofon dan memberikan output teks secara real-time saat Anda berbicara.

Java

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 {
        // URL berikut untuk wilayah Singapura. Jika Anda menggunakan model di wilayah Beijing, ganti URL dengan wss://dashscope.aliyuncs.com/api-ws/v1/inference.
        Constants.baseWebsocketApiUrl = "wss://dashscope-intl.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("fun-asr-realtime")
                // Kunci API untuk wilayah Singapura dan Beijing berbeda. Untuk mendapatkan Kunci API, lihat https://www.alibabacloud.com/help/en/model-studio/get-api-key.
                // Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan Kunci API 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("Final Result: " + result.getSentence().getText());
                } else {
                    System.out.println("Intermediate Result: " + result.getSentence().getText());
                }
            }

            @Override
            public void onComplete() {
                System.out.println("Recognition complete");
            }

            @Override
            public void onError(Exception e) {
                System.out.println("RecognitionCallback error: " + e.getMessage());
            }
        };
        try {
            recognizer.call(param, callback);
            // Buat AudioFormat.
            AudioFormat audioFormat = new AudioFormat(16000, 16, 1, true, false);
            // Dapatkan target data line yang sesuai dengan format yang ditentukan.
            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 ucapan 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);
                    // Tidur sejenak 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()
                        + ", first package delay ms: "
                        + recognizer.getFirstPackageDelay()
                        + ", last package delay ms: "
                        + recognizer.getLastPackageDelay());
    }
}

Python

Sebelum menjalankan contoh Python, instal paket PyAudio dengan perintah pip install pyaudio.

import os
import signal  # Untuk penanganan event keyboard (tekan "Ctrl+C" untuk menghentikan perekaman).
import sys

import dashscope
import pyaudio
from dashscope.audio.asr import *

mic = None
stream = None

# Atur parameter perekaman.
sample_rate = 16000  # Laju pengambilan sampel (Hz).
channels = 1  # Saluran mono.
dtype = 'int16'  # Tipe data.
format_pcm = 'pcm'  # Format data audio.
block_size = 3200  # Jumlah frame per buffer.


# Definisikan callback pengenalan ucapan real-time.
class Callback(RecognitionCallback):
    def on_open(self) -> None:
        global mic
        global stream
        print('RecognitionCallback open.')
        mic = pyaudio.PyAudio()
        stream = mic.open(format=pyaudio.paInt16,
                          channels=1,
                          rate=16000,
                          input=True)

    def on_close(self) -> None:
        global mic
        global stream
        print('RecognitionCallback close.')
        stream.stop_stream()
        stream.close()
        mic.terminate()
        stream = None
        mic = None

    def on_complete(self) -> None:
        print('RecognitionCallback completed.')  # Pengenalan selesai.

    def on_error(self, message) -> None:
        print('RecognitionCallback task_id: ', message.request_id)
        print('RecognitionCallback error: ', message.message)
        # Hentikan dan tutup aliran audio jika sedang berjalan.
        if 'stream' in globals() and stream.active:
            stream.stop()
            stream.close()
        # Keluar dari program secara paksa.
        sys.exit(1)

    def on_event(self, result: RecognitionResult) -> None:
        sentence = result.get_sentence()
        if 'text' in sentence:
            print('RecognitionCallback text: ', sentence['text'])
            if RecognitionResult.is_sentence_end(sentence):
                print(
                    'RecognitionCallback sentence end, request_id:%s, usage:%s'
                    % (result.get_request_id(), result.get_usage(sentence)))


def signal_handler(sig, frame):
    print('Ctrl+C ditekan, hentikan pengenalan ...')
    # Hentikan pengenalan.
    recognition.stop()
    print('Pengenalan dihentikan.')
    print(
        '[Metric] requestId: {}, first package delay ms: {}, last package delay ms: {}'
        .format(
            recognition.get_last_request_id(),
            recognition.get_first_package_delay(),
            recognition.get_last_package_delay(),
        ))
    # Keluar dari program secara paksa.
    sys.exit(0)


# Definisikan fungsi utama.
if __name__ == '__main__':
    # Kunci API untuk wilayah Singapura dan Beijing berbeda. Untuk mendapatkan Kunci API, lihat https://www.alibabacloud.com/help/en/model-studio/get-api-key
    # Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan Kunci API Model Studio Anda: dashscope.api_key = "sk-xxx"
    dashscope.api_key = os.environ.get('DASHSCOPE_API_KEY')

    # Berikut adalah URL untuk wilayah Singapura. Jika Anda menggunakan model di wilayah Beijing, ganti URL dengan: wss://dashscope.aliyuncs.com/api-ws/v1/inference
    dashscope.base_websocket_api_url='wss://dashscope-intl.aliyuncs.com/api-ws/v1/inference'

    # Buat callback pengenalan.
    callback = Callback()

    # Panggil layanan pengenalan dalam mode asinkron. Anda dapat menyesuaikan parameter pengenalan, seperti model, format, dan sample_rate.
    recognition = Recognition(
        model='fun-asr-realtime',
        format=format_pcm,
        # Format yang didukung meliputi 'pcm', 'wav', 'opus', 'speex', 'aac', dan 'amr'. Untuk informasi lebih lanjut, lihat dokumentasi.
        sample_rate=sample_rate,
        # Mendukung 8000 dan 16000.
        semantic_punctuation_enabled=False,
        callback=callback)

    # Mulai pengenalan.
    recognition.start()

    signal.signal(signal.SIGINT, signal_handler)
    print("Tekan 'Ctrl+C' untuk menghentikan perekaman dan pengenalan...")
    # Atur penangan sinyal untuk menangkap sinyal interupsi (Ctrl+C).

    while True:
        if stream:
            data = stream.read(3200, exception_on_overflow=False)
            recognition.send_audio_frame(data)
        else:
            break

    recognition.stop()

Dari file lokal

API ini ideal untuk skenario audio pendek hampir real-time seperti obrolan suara, perintah suara, input suara, dan pencarian suara.

Java

File audio yang digunakan dalam contoh adalah asr_example.wav.

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 {
        // URL berikut untuk wilayah Singapura. Jika Anda menggunakan model di wilayah Beijing, ganti URL dengan wss://dashscope.aliyuncs.com/api-ws/v1/inference.
        Constants.baseWebsocketApiUrl = "wss://dashscope-intl.aliyuncs.com/api-ws/v1/inference";
        // Di lingkungan produksi, Anda hanya perlu memanggil metode ini sekali saat startup aplikasi.
        warmUp();

        ExecutorService executorService = Executors.newSingleThreadExecutor();
        executorService.submit(new RealtimeRecognitionTask(Paths.get(System.getProperty("user.dir"), "asr_example.wav")));
        executorService.shutdown();

        // tunggu hingga 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) {
            // Setel ulang flag untuk memungkinkan percobaan ulang jika pemanasan awal gagal
        }
    }
}

class RealtimeRecognitionTask implements Runnable {
    private Path filepath;

    public RealtimeRecognitionTask(Path filepath) {
        this.filepath = filepath;
    }

    @Override
    public void run() {
        RecognitionParam param = RecognitionParam.builder()
                .model("fun-asr-realtime")
                // Kunci API untuk wilayah Singapura dan Beijing berbeda. Untuk mendapatkan Kunci API, lihat https://www.alibabacloud.com/help/en/model-studio/get-api-key.
                // Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan Kunci API 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()+" "+
                            "[process " + threadName + "] Final Result:" + message.getSentence().getText());
                } else {
                    System.out.println(TimeUtils.getTimestamp()+" "+
                            "[process " + threadName + "] Intermediate Result: " + message.getSentence().getText());
                }
            }

            @Override
            public void onComplete() {
                System.out.println(TimeUtils.getTimestamp()+" "+"[" + threadName + "] Recognition complete");
            }

            @Override
            public void onError(Exception e) {
                System.out.println(TimeUtils.getTimestamp()+" "+
                        "[" + threadName + "] RecognitionCallback error: " + e.getMessage());
            }
        };

        try {
            recognizer.call(param, callback);
            // Harap ganti path dengan path file audio Anda
            System.out.println(TimeUtils.getTimestamp()+" "+"[" + threadName + "] Input file_path is: " + 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());
    }
}

Python

File audio yang digunakan dalam contoh adalah: asr_example.wav.

import os
import time
import dashscope
from dashscope.audio.asr import *

# Kunci API untuk wilayah Singapura dan Beijing berbeda. Untuk mendapatkan Kunci API, lihat https://www.alibabacloud.com/help/en/model-studio/get-api-key
# Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan Kunci API Model Studio Anda: dashscope.api_key = "sk-xxx"
dashscope.api_key = os.environ.get('DASHSCOPE_API_KEY')

# Berikut adalah URL untuk wilayah Singapura. Jika Anda menggunakan model di wilayah Beijing, ganti URL dengan: wss://dashscope.aliyuncs.com/api-ws/v1/inference
dashscope.base_websocket_api_url='wss://dashscope-intl.aliyuncs.com/api-ws/v1/inference'

from datetime import datetime


def get_timestamp():
    now = datetime.now()
    formatted_timestamp = now.strftime("[%Y-%m-%d %H:%M:%S.%f]")
    return formatted_timestamp


class Callback(RecognitionCallback):
    def on_complete(self) -> None:
        print(get_timestamp() + ' Recognition completed')  # Pengenalan selesai.

    def on_error(self, result: RecognitionResult) -> None:
        print('Recognition task_id: ', result.request_id)
        print('Recognition error: ', result.message)
        exit(0)

    def on_event(self, result: RecognitionResult) -> None:
        sentence = result.get_sentence()
        if 'text' in sentence:
            print(get_timestamp() + ' RecognitionCallback text: ', sentence['text'])
        if RecognitionResult.is_sentence_end(sentence):
            print(get_timestamp() +
                  'RecognitionCallback sentence end, request_id:%s, usage:%s'
                  % (result.get_request_id(), result.get_usage(sentence)))


callback = Callback()

recognition = Recognition(model='fun-asr-realtime',
                          format='wav',
                          sample_rate=16000,
                          callback=callback)

try:
    audio_data: bytes = None
    f = open("asr_example.wav", 'rb')
    if os.path.getsize("asr_example.wav"):
        # Baca seluruh file ke dalam buffer sekaligus.
        file_buffer = f.read()
        f.close()
        print("Start Recognition")
        recognition.start()

        # Kirim data dalam potongan 3200 byte dari buffer.
        buffer_size = len(file_buffer)
        offset = 0
        chunk_size = 3200

        while offset < buffer_size:
            # Hitung ukuran potongan data saat ini yang akan dikirim.
            remaining_bytes = buffer_size - offset
            current_chunk_size = min(chunk_size, remaining_bytes)

            # Ekstrak potongan data saat ini dari buffer.
            audio_data = file_buffer[offset:offset + current_chunk_size]

            # Kirim frame data audio.
            recognition.send_audio_frame(audio_data)
            # Perbarui offset.
            offset += current_chunk_size

            # Tambahkan jeda untuk mensimulasikan transmisi real-time.
            time.sleep(0.1)

        recognition.stop()
    else:
        raise Exception(
            'File yang diberikan kosong (panjang nol byte)')
except Exception as e:
    raise e

print(
    '[Metric] requestId: {}, first package delay ms: {}, last package delay ms: {}'
    .format(
        recognition.get_last_request_id(),
        recognition.get_first_package_delay(),
        recognition.get_last_package_delay(),
    ))

Paraformer

Input mikrofon

Layanan Real-time Speech Recognition mentranskripsikan audio mikrofon menjadi teks secara real-time.

Java

import com.alibaba.dashscope.audio.asr.recognition.Recognition;
import com.alibaba.dashscope.audio.asr.recognition.RecognitionParam;
import com.alibaba.dashscope.exception.NoApiKeyException;
import io.reactivex.BackpressureStrategy;
import io.reactivex.Flowable;

import java.nio.ByteBuffer;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.TargetDataLine;

public class Main {

    public static void main(String[] args) throws NoApiKeyException {
        // Buat Flowable<ByteBuffer>
        Flowable<ByteBuffer> audioSource = Flowable.create(emitter -> {
            new Thread(() -> {
                try {
                    // Buat format audio
                    AudioFormat audioFormat = new AudioFormat(16000, 16, 1, true, false);
                    // Dapatkan perangkat perekaman default untuk format audio yang ditentukan
                    TargetDataLine targetDataLine =
                            AudioSystem.getTargetDataLine(audioFormat);
                    targetDataLine.open(audioFormat);
                    // Mulai merekam
                    targetDataLine.start();
                    ByteBuffer buffer = ByteBuffer.allocate(1024);
                    long start = System.currentTimeMillis();
                    // Rekam selama 300 detik dan lakukan transkripsi real-time
                    while (System.currentTimeMillis() - start < 300000) {
                        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);
                            // Tidur untuk mengendalikan laju perekaman dan mencegah penggunaan CPU tinggi.
                            Thread.sleep(20);
                        }
                    }
                    // Beri tahu penyelesaian transkripsi
                    emitter.onComplete();
                } catch (Exception e) {
                    emitter.onError(e);
                }
            }).start();
        },
        BackpressureStrategy.BUFFER);

        // Buat instance Recognizer
        Recognition recognizer = new Recognition();
        // Bangun parameter pengenalan.
        RecognitionParam param = RecognitionParam.builder()
            .model("paraformer-realtime-v2")
            .format("pcm")
            .sampleRate(16000)
            // Jika Anda belum mengonfigurasi Kunci API sebagai Variabel Lingkungan, hapus komentar baris berikut dan ganti "apikey" dengan Kunci API Anda sendiri.
            // .apiKey("apikey")
            .build();

        // Panggil API dalam mode streaming
        recognizer.streamCall(param, audioSource)
            // Gunakan blockingForEach untuk menerima hasil
            .blockingForEach(
                result -> {
                    // Cetak hasil akhir
                    if (result.isSentenceEnd()) {
                        System.out.println("Fix:" + result.getSentence().getText());
                    } else {
                        System.out.println("Result:" + result.getSentence().getText());
                    }
                });
        System.exit(0);
    }
}

Python

Sebelum menjalankan contoh Python, instal suite pemutaran dan penangkapan audio PyAudio dengan perintah pip install pyaudio.

import pyaudio
from dashscope.audio.asr import (Recognition, RecognitionCallback,
                                 RecognitionResult)

# Jika Anda belum mengonfigurasi Kunci API sebagai Variabel Lingkungan, hapus komentar baris berikut dan ganti "apiKey" dengan Kunci API Anda sendiri.
# import dashscope
# dashscope.api_key = "apiKey"

mic = None
stream = None


class Callback(RecognitionCallback):
    def on_open(self) -> None:
        global mic
        global stream
        print('RecognitionCallback open.')
        mic = pyaudio.PyAudio()
        stream = mic.open(format=pyaudio.paInt16,
                          channels=1,
                          rate=16000,
                          input=True)

    def on_close(self) -> None:
        global mic
        global stream
        print('RecognitionCallback close.')
        stream.stop_stream()
        stream.close()
        mic.terminate()
        stream = None
        mic = None

    def on_event(self, result: RecognitionResult) -> None:
        print('RecognitionCallback sentence: ', result.get_sentence())


callback = Callback()
recognition = Recognition(model='paraformer-realtime-v2',
                          format='pcm',
                          sample_rate=16000,
                          callback=callback)
recognition.start()

while True:
    if stream:
        data = stream.read(3200, exception_on_overflow=False)
        recognition.send_audio_frame(data)
    else:
        break

recognition.stop()

File audio lokal

Layanan Real-time Speech Recognition dapat mengenali dan mentranskripsikan file audio lokal. API ini ideal untuk skenario hampir real-time dengan audio pendek, seperti obrolan suara, perintah kontrol, input suara, dan pencarian suara.

Java

import com.alibaba.dashscope.audio.asr.recognition.Recognition;
import com.alibaba.dashscope.audio.asr.recognition.RecognitionParam;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;

public class Main {
    public static void main(String[] args) {
        // Anda dapat mengabaikan pengunduhan file dari URL dan menggunakan file lokal untuk memanggil API.
        String exampleWavUrl =
                "https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_female2.wav";
        try {
            InputStream in = new URL(exampleWavUrl).openStream();
            Files.copy(in, Paths.get("asr_example.wav"), StandardCopyOption.REPLACE_EXISTING);
        } catch (IOException e) {
            System.out.println("error: " + e);
            System.exit(1);
        }

        // Buat instance Recognition
        Recognition recognizer = new Recognition();
        // Buat RecognitionParam
        RecognitionParam param =
                RecognitionParam.builder()
                        // Jika Anda belum mengonfigurasi Kunci API sebagai Variabel Lingkungan, hapus komentar baris berikut dan ganti "apikey" dengan Kunci API Anda sendiri.
                        // .apiKey("apikey")
                        .model("paraformer-realtime-v2")
                        .format("wav")
                        .sampleRate(16000)
                        // Parameter "language_hints" hanya didukung oleh model paraformer-v2 dan paraformer-realtime-v2.
                        .parameter("language_hints", new String[]{"zh", "en"})
                        .build();

        try {
            System.out.println("Recognition Result: " + recognizer.call(param, new File("asr_example.wav")));
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.exit(0);
    }
}

Python

import requests
from http import HTTPStatus
from dashscope.audio.asr import Recognition

# Jika Anda belum mengonfigurasi Kunci API sebagai Variabel Lingkungan, hapus komentar baris berikut dan ganti "apiKey" dengan Kunci API Anda sendiri.
# import dashscope
# dashscope.api_key = "apiKey"

# Anda dapat mengabaikan pengunduhan file dari URL dan menggunakan file lokal untuk pengenalan.
r = requests.get(
    'https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_female2.wav'
)
with open('asr_example.wav', 'wb') as f:
    f.write(r.content)

recognition = Recognition(model='paraformer-realtime-v2',
                          format='wav',
                          sample_rate=16000,
                          # Parameter "language_hints" hanya didukung oleh model paraformer-v2 dan paraformer-realtime-v2.
                          language_hints=['zh', 'en'],
                          callback=None)
result = recognition.call('asr_example.wav')
if result.status_code == HTTPStatus.OK:
    print('Recognition Result:')
    print(result.get_sentence())
else:
    print('Error: ', result.message)

Mulai produksi

Meningkatkan akurasi pengenalan

  • Pilih Model dengan Laju Sampel yang Tepat: Untuk audio telepon yang direkam pada 8 kHz, gunakan model 8 kHz. Hindari upsampling ke 16 kHz untuk pengenalan karena dapat menyebabkan distorsi dan menurunkan akurasi.

  • Optimalkan Kualitas Input Audio: Gunakan mikrofon berkualitas tinggi dan pastikan lingkungan perekaman memiliki rasio sinyal terhadap noise (SNR) tinggi serta bebas gema. Pada level aplikasi, integrasikan algoritma pengurangan noise (seperti RNNoise) dan Pembatalan Gema Akustik (AEC) untuk memproses audio sebelumnya agar input lebih bersih.

  • Tentukan Bahasa Pengenalan: Untuk model multibahasa seperti Paraformer-v2, tentukan bahasa audio terlebih dahulu (misalnya, gunakan parameter Language_hints untuk menentukan ['zh','en']). Hal ini membantu model konvergen, menghindari kebingungan antar bahasa yang terdengar mirip, dan meningkatkan akurasi.

  • Aktifkan Penghapusan Ketidakteraturan Ucapan: Untuk model Paraformer, aktifkan fitur penghapusan ketidakteraturan ucapan dengan mengatur parameter disfluency_removal_enabled. Hal ini menghasilkan output teks yang lebih formal dan mudah dibaca.

Menetapkan kebijakan toleransi kesalahan

  • Rekoneksi di Sisi Klien: Klien Anda harus menerapkan mekanisme rekoneksi otomatis untuk menangani jitter jaringan. Rekomendasi berikut berlaku untuk Software Development Kit (SDK) Python:

    1. Tangkap Pengecualian: Implementasikan metode on_error dalam kelas Callback. SDK dashscope memanggil metode ini saat mengalami error jaringan atau masalah lainnya.

    2. Beri Sinyal untuk Rekoneksi: Dalam metode on_error, atur sinyal rekoneksi. Di Python, Anda dapat menggunakan threading.Event, yaitu mekanisme pensinyalan aman untuk thread.

    3. Implementasikan Loop Rekoneksi: Bungkus logika utama Anda dalam loop for untuk mengelola percobaan ulang, misalnya hingga tiga kali. Saat sinyal rekoneksi terdeteksi, hentikan tugas pengenalan saat ini, bebaskan semua sumber daya, tunggu beberapa detik, lalu mulai ulang loop untuk membuat koneksi baru.

  • Atur Heartbeat untuk Mencegah Kehilangan Koneksi: Untuk mempertahankan koneksi jangka panjang dengan layanan, atur parameter heartbeat ke true. Hal ini mencegah koneksi terputus meskipun terjadi periode diam yang panjang dalam audio.

  • Pengendalian aliran: Saat memanggil API model, ikuti aturan Pengendalian aliran model.

API

Perbandingan fitur model

Fitur

Fun-ASR

Paraformer

Bahasa yang didukung

Bervariasi berdasarkan model:

  • fun-asr-realtime, fun-asr-realtime-2026-02-28, dan fun-asr-realtime-2025-11-07: Tiongkok (Mandarin dan dialek seperti Kanton, Wu, dan Min Selatan), Inggris, dan Jepang. Termasuk juga dukungan luas untuk aksen Mandarin regional.

  • fun-asr-realtime-2025-09-15: Tiongkok (Mandarin) dan Inggris.

  • fun-asr-flash-8k-realtime dan fun-asr-flash-8k-realtime-2026-01-28: Tiongkok.

Bervariasi berdasarkan model:

  • paraformer-realtime-v2: Tiongkok (Mandarin dan dialek seperti Kanton, Wu, dan Shanghainese), Inggris, Jepang, Korea, Jerman, Prancis, dan Rusia.

  • paraformer-realtime-v1, paraformer-realtime-8k-v2, dan paraformer-realtime-8k-v1: Tiongkok (Mandarin).

Format audio yang didukung

PCM, WAV, MP3, OPUS, Speex, AAC, dan AMR.

Laju sampel

Bervariasi berdasarkan model:

  • fun-asr-realtime, fun-asr-realtime-2026-02-28, fun-asr-realtime-2025-11-07, dan fun-asr-realtime-2025-09-15: 16 kHz.

  • fun-asr-flash-8k-realtime dan fun-asr-flash-8k-realtime-2026-01-28: 8 kHz.

Bervariasi berdasarkan model:

  • paraformer-realtime-v2: Semua laju sampel.

  • paraformer-realtime-v1: 16 kHz.

  • paraformer-realtime-8k-v2 dan paraformer-realtime-8k-v1: 8 kHz.

Saluran audio

Mono.

Format input

Aliran biner audio.

Durasi audio

Tanpa Batas.

Tanpa Batas.

Pengenalan emosi

Tidak didukung.

Bervariasi berdasarkan model:

  • paraformer-realtime-v2, paraformer-realtime-v1, dan paraformer-realtime-8k-v1: Tidak didukung.

  • paraformer-realtime-8k-v2: Diaktifkan secara default (dapat dinonaktifkan).

Penyaringan kata sensitif

Tidak didukung.

Diarisasi Pembicara

Tidak didukung.

Penyaringan kata pengisi

Tidak didukung.

Dinonaktifkan secara default (dapat diaktifkan).

Timestamp

Selalu diaktifkan.

Prediksi tanda baca

Selalu diaktifkan.

Bervariasi berdasarkan model:

  • paraformer-realtime-v2 dan paraformer-realtime-8k-v2: Diaktifkan secara default (dapat dinonaktifkan).

  • paraformer-realtime-v1 dan paraformer-realtime-8k-v1: Selalu diaktifkan.

Hotword

Tidak didukung.

Inverse text normalization (ITN)

Selalu diaktifkan.

Deteksi aktivitas suara (VAD)

Selalu diaktifkan.

Batas laju (RPS)

20

20

Metode integrasi

SDK Java, Python, Android, dan iOS; API WebSocket.

Harga

Bervariasi berdasarkan model:

  • fun-asr-realtime, fun-asr-realtime-2026-02-28, dan fun-asr-realtime-2025-11-07:

    • Internasional: $0,00009/detik

    • Tiongkok daratan: $0,000047/detik

  • fun-asr-realtime-2025-09-15:

    • Tiongkok daratan: $0,000047/detik

  • fun-asr-flash-8k-realtime dan fun-asr-flash-8k-realtime-2026-01-28:

    • Tiongkok daratan: $0,000032/detik

Tiongkok daratan: $0,000034/detik