Paraformer实时语音识别Java API

本文介绍Paraformer实时语音识别Java API的使用。

前提条件

模型列表

模型名

模型简介

paraformer-realtime-v2

推荐使用。Paraformer最新多语种实时语音识别模型。

  • 适用场景:直播、会议等实时语音处理场景

  • 支持的采样率:任意

  • 支持的语种:中文(包含中文普通话和各种方言)、英文、日语、韩语

    支持的中文方言(单击查看详情)

    上海话、吴语、闽南语、东北话、甘肃话、贵州话、河南话、湖北话、湖南话、江西话、宁夏话、山西话、陕西话、山东话、四川话、天津话、云南话、粤语

  • 核心能力:

    • 支持标点符号预测

    • 支持逆文本正则化(ITN)

  • 特色功能:

    • 指定语种:通过language_hints参数能够指定待识别语种,提升识别效果

    • 支持定制热词

paraformer-realtime-8k-v2

推荐使用。Paraformer最新8k中文实时语音识别模型,模型结构升级,具有更快的推理速度和更好的识别效果。

  • 适用场景:电话客服、语音信箱等 8kHz 音频的实时识别,需快速推理与高准确率的场景(如实时字幕生成)等

  • 支持的采样率:8kHz

  • 支持的语种:中文

  • 核心能力:

    • 支持标点符号预测

    • 支持逆文本正则化(ITN)

  • 特色功能:

paraformer-realtime-v1

Paraformer中文实时语音识别模型。

  • 适用场景:视频直播、会议等实时场景

  • 支持的采样率:16kHz

  • 支持的语种:中文

  • 核心能力:

    • 支持标点符号预测

    • 支持逆文本正则化(ITN)

  • 特色功能:

paraformer-realtime-8k-v1

Paraformer中文实时语音识别模型。

  • 适用场景:8kHz电话客服等场景

  • 支持的采样率:8kHz

  • 支持的语种:中文

  • 核心能力:

    • 支持标点符号预测

    • 支持逆文本正则化(ITN)

  • 特色功能:

调用模式

核心类(Recognition)提供了同步调用和流式调用等接口。请根据实际需求选择合适的调用模式:

  • 同步调用:对本地文件进行识别,并一次性输出完整结果。

  • 流式调用:直接对音频流(无论是从外部设备如麦克风获取的音频流,还是从本地文件读取的音频流)进行识别,并流式输出结果。

同步调用

提交单个语音实时转写任务,通过传入本地文件的方式同步阻塞地拿到转写结果。

image
  1. 配置请求参数

    RecognitionParam param = RecognitionParam.builder()
        .model("paraformer-realtime-v2")
        .format("wav")
        .sampleRate(16000)
        // “language_hints”只支持paraformer-realtime-v2模型
        .parameter("language_hints", new String[]{"zh", "en"})
        .build();
  2. 实例化核心类(Recognition)

    Recognition recognizer = new Recognition();
  3. 同步调用。

    调用核心类(Recognition)call方法进行识别。

    // 调用call方法开始识别并获取识别结果
    String result = recognizer.call(param, new File("asr_example.wav"));

点击查看完整示例

示例中用到的音频为:asr_example.wav

import com.alibaba.dashscope.audio.asr.recognition.Recognition;
import com.alibaba.dashscope.audio.asr.recognition.RecognitionParam;
import java.io.File;

public class Main {
    public static void main(String[] args) {
        // 创建Recognition实例
        Recognition recognizer = new Recognition();
        // 创建RecognitionParam
        RecognitionParam param =
                RecognitionParam.builder()
                        // 若没有将API Key配置到环境变量中,需将下面这行代码注释放开,并将apiKey替换为自己的API Key
                        // .apiKey("yourApikey")
                        .model("paraformer-realtime-v2")
                        .format("wav")
                        .sampleRate(16000)
                        // “language_hints”只支持paraformer-realtime-v2模型
                        .parameter("language_hints", new String[]{"zh", "en"})
                        .build();

        try {
            System.out.println("识别结果:" + recognizer.call(param, new File("asr_example.wav")));
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(
                "[Metric] requestId: "
                        + recognizer.getLastRequestId()
                        + ", first package delay ms: "
                        + recognizer.getFirstPackageDelay()
                        + ", last package delay ms: "
                        + recognizer.getLastPackageDelay());
        System.exit(0);
    }
}

流式调用:基于回调

提交单个语音实时转写任务,通过实现回调接口的方式流式输出实时识别结果。

image
  1. 配置请求参数

    RecognitionParam param = RecognitionParam.builder()
        .model("paraformer-realtime-v2")
        .format("wav")
        .sampleRate(16000)
        // “language_hints”只支持paraformer-realtime-v2模型
        .parameter("language_hints", new String[]{"zh", "en"})
        .build();
  2. 实例化回调接口(ResultCallback)

  3. 实例化核心类(Recognition)

    Recognition recognizer = new Recognition();
  4. 调用核心类(Recognition)call方法开启任务。

    // 调用call方法开始任务
    recognizer.call(param, callback);
  5. 分段发送二进制音频。

    您需要调用核心类(Recognition)sendAudioFrame方法,将从本地文件或设备(如麦克风)读取的二进制音频流分段发送给服务端。每次发送的音频时长建议为100ms左右,数据大小建议在1KB16KB之间。在发送音频数据的同时,服务端会回调ResultCallback实例的方法将识别结果返回给客户端。

    try (FileInputStream fis = new FileInputStream(this.filepath.toFile())) {
        // chunk size set to 1 seconds for 16KHz sample rate
        byte[] buffer = new byte[3200];
        int bytesRead;
        // Loop to read chunks of the file
        while ((bytesRead = fis.read(buffer)) != -1) {
            ByteBuffer byteBuffer;
            // Handle the last chunk which might be smaller than the buffer size
            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);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
  6. 结束任务:调用核心类(Recognition)stop方法

    请不要遗漏该步骤。stop会阻塞当前线程,直到ResultCallbackonComplete或者onError方法被回调才会解除对当前线程的阻塞。

    recognizer.stop();

点击查看完整示例

识别传入麦克风的语音

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 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 {
        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()
                // 若没有将API Key配置到环境变量中,需将apiKey替换为自己的API Key
                // .apiKey("yourApikey")
                .model("paraformer-realtime-v2")
                .format("wav")
                .sampleRate(16000)
                // “language_hints”只支持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("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());
            }
        };

        recognizer.call(param, callback);
        try {
            // 创建音频格式
            AudioFormat audioFormat = new AudioFormat(16000, 16, 1, true, false);
            // 根据格式匹配默认录音设备
            TargetDataLine targetDataLine =
                    AudioSystem.getTargetDataLine(audioFormat);
            targetDataLine.open(audioFormat);
            // 开始录音
            targetDataLine.start();
            ByteBuffer buffer = ByteBuffer.allocate(1024);
            long start = System.currentTimeMillis();
            // 录音50s并进行实时转写
            while (System.currentTimeMillis() - start < 50000) {
                int read = targetDataLine.read(buffer.array(), 0, buffer.capacity());
                if (read > 0) {
                    buffer.limit(read);
                    // 将录音音频数据发送给流式识别服务
                    recognizer.sendAudioFrame(buffer);
                    buffer = ByteBuffer.allocate(1024);
                    // 录音速率有限,防止cpu占用过高,休眠一小会儿
                    Thread.sleep(20);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        recognizer.stop();
        System.out.println(
                "[Metric] requestId: "
                        + recognizer.getLastRequestId()
                        + ", first package delay ms: "
                        + recognizer.getFirstPackageDelay()
                        + ", last package delay ms: "
                        + recognizer.getLastPackageDelay());
    }
}

识别本地语音文件

示例中用到的音频为:asr_example.wav

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 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 {
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        executorService.submit(new RealtimeRecognitionTask(Paths.get(System.getProperty("user.dir"), "asr_example.wav")));
        executorService.shutdown();

        // wait for all tasks to complete
        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()
                // 若没有将API Key配置到环境变量中,需将apiKey替换为自己的API Key
                // .apiKey("yourApikey")
                .model("paraformer-realtime-v2")
                .format("wav")
                .sampleRate(16000)
                // “language_hints”只支持paraformer-realtime-v2模型
                .parameter("language_hints", new String[]{"zh", "en"})
                .build();
        Recognition recognizer = new Recognition();
        CountDownLatch latch = new CountDownLatch(1);

        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");
                latch.countDown();
            }

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

        recognizer.call(param, callback);
        // Please replace the path with your audio file path
        System.out.println(TimeUtils.getTimestamp()+" "+"[" + threadName + "] Input file_path is: " + this.filepath);
        // Read file and send audio by chunks
        try (FileInputStream fis = new FileInputStream(this.filepath.toFile())) {
            // chunk size set to 1 seconds for 16KHz sample rate
            byte[] buffer = new byte[3200];
            int bytesRead;
            // Loop to read chunks of the file
            while ((bytesRead = fis.read(buffer)) != -1) {
                ByteBuffer byteBuffer;
                // Handle the last chunk which might be smaller than the buffer size
                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());
        } catch (Exception e) {
            e.printStackTrace();
        }

        recognizer.stop();
        System.out.println(
                "["
                        + threadName
                        + "][Metric] requestId: "
                        + recognizer.getLastRequestId()
                        + ", first package delay ms: "
                        + recognizer.getFirstPackageDelay()
                        + ", last package delay ms: "
                        + recognizer.getLastPackageDelay());
        // wait for the translation to complete
        try {
            latch.await();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}

流式调用:基于Flowable

提交单个语音实时转写任务,通过实现工作流(Flowable)的方式流式输出实时识别结果。

Flowable 是一个用于工作流和业务流程管理的开源框架,它基于 Apache 2.0 许可证发布。关于Flowable的使用,请参见Flowable API详情

点击查看完整示例

直接调用核心类(Recognition)streamCall方法开始识别。

streamCall方法返回一个Flowable<RecognitionResult>实例,您可以调用Flowable实例的blockingForEachsubscribe等方法处理识别结果。识别结果封装在RecognitionResult中。

streamCall方法需要传入两个参数:

  • RecognitionParam实例:通过它可以设置语音识别所需的模型、采样率、音频格式等参数。

    如您未将API Key配置到环境变量,则在创建RecognitionParam实例时,需要调用它的apiKey方法设置API Key。

  • Flowable<ByteBuffer>实例:您需要创建一个Flowable<ByteBuffer>类型的实例,并在其中实现解析音频流的方法。

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 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 {
        // 创建一个Flowable<ByteBuffer>
        Flowable<ByteBuffer> audioSource =
                Flowable.create(
                        emitter -> {
                            new Thread(
                                    () -> {
                                        try {
                                            // 创建音频格式
                                            AudioFormat audioFormat = new AudioFormat(16000, 16, 1, true, false);
                                            // 根据格式匹配默认录音设备
                                            TargetDataLine targetDataLine =
                                                    AudioSystem.getTargetDataLine(audioFormat);
                                            targetDataLine.open(audioFormat);
                                            // 开始录音
                                            targetDataLine.start();
                                            ByteBuffer buffer = ByteBuffer.allocate(1024);
                                            long start = System.currentTimeMillis();
                                            // 录音50s并进行实时转写
                                            while (System.currentTimeMillis() - start < 50000) {
                                                int read = targetDataLine.read(buffer.array(), 0, buffer.capacity());
                                                if (read > 0) {
                                                    buffer.limit(read);
                                                    // 将录音音频数据发送给流式识别服务
                                                    emitter.onNext(buffer);
                                                    buffer = ByteBuffer.allocate(1024);
                                                    // 录音速率有限,防止cpu占用过高,休眠一小会儿
                                                    Thread.sleep(20);
                                                }
                                            }
                                            // 通知结束转写
                                            emitter.onComplete();
                                        } catch (Exception e) {
                                            emitter.onError(e);
                                        }
                                    })
                                    .start();
                        },
                        BackpressureStrategy.BUFFER);

        // 创建Recognizer
        Recognition recognizer = new Recognition();
        // 创建RecognitionParam,audioFrames参数中传入上面创建的Flowable<ByteBuffer>
        RecognitionParam param = RecognitionParam.builder()
                // 若没有将API Key配置到环境变量中,需将apiKey替换为自己的API Key
                // .apiKey("yourApikey")
                .model("paraformer-realtime-v2")
                .format("pcm")
                .sampleRate(16000)
                // “language_hints”只支持paraformer-realtime-v2模型
                .parameter("language_hints", new String[]{"zh", "en"})
                .build();

        // 流式调用接口
        recognizer
                .streamCall(param, audioSource)
                .blockingForEach(
                        result -> {
                            // Subscribe to the output result
                            if (result.isSentenceEnd()) {
                                System.out.println("Final Result: " + result.getSentence().getText());
                            } else {
                                System.out.println("Intermediate Result: " + result.getSentence().getText());
                            }
                        });
        System.out.println(
                "[Metric] requestId: "
                        + recognizer.getLastRequestId()
                        + ", first package delay ms: "
                        + recognizer.getFirstPackageDelay()
                        + ", last package delay ms: "
                        + recognizer.getLastPackageDelay());
        System.exit(0);
    }
}

高并发调用

DashScope Java SDK中,采用了OkHttp3的连接池技术,以减少重复建立连接的开销。详情请参见实时语音识别高并发场景

请求参数

请求参数通过RecognitionParam的链式方法进行配置。

点击查看示例

RecognitionParam param = RecognitionParam.builder()
  .model("paraformer-realtime-v2")
  .format("pcm")
  .sampleRate(16000)
  // “language_hints”只支持paraformer-realtime-v2模型
  .parameter("language_hints", new String[]{"zh", "en"})
  .build();

参数

类型

默认值

是否必须

说明

model

String

-

用于实时语音识别的模型。详情请参见模型列表

sampleRate

Integer

-

待识别音频采样率。

因模型而异:

  • paraformer-realtime-v2 支持任意采样率。

  • paraformer-realtime-v1 仅支持16kHz采样。

  • paraformer-realtime-8k-v2 仅支持8kHz采样率。

  • paraformer-realtime-8k-v1 仅支持8kHz采样率。

format

String

-

待识别音频格式。

支持的音频格式:'pcm'、'wav'、'mp3'、'opus'、'speex'、'aac'、'amr'。

vocabularyId

String

-

最新热词ID,支持最新v2系列模型并配置语种信息,此次语音识别中生效此热词ID对应的热词信息。默认不启用。使用方法请参考定制热词

phraseId

String

-

热词ID,此次语音识别中生效此热词ID对应的热词信息。默认不启用。

注:phraseIdv1版本模型热词方案,不支持v2及后续系列模型。支持该方式热词的模型列表请参考Paraformer语音识别热词定制与管理

disfluencyRemovalEnabled

boolean

false

过滤语气词,默认关闭。

language_hints

String[]

["zh", "en"]

指定识别语音中语言的代码列表。

该参数仅适用于paraformer-realtime-v2模型。

支持的语言代码:

  • zh: 中文

  • en: 英文

  • ja: 日语

  • yue: 粤语

  • ko: 韩语

仅对支持多语言的模型生效。如果不填写则模型会自动识别语种。

说明

language_hints需要通过RecognitionParam实例的parameter方法或者parameters方法进行设置:

通过parameter设置

RecognitionParam param = RecognitionParam.builder()
  // “language_hints”只支持paraformer-realtime-v2模型
  .parameter("language_hints", new String[]{"zh", "en"})
  .build();

通过parameters设置

RecognitionParam param = RecognitionParam.builder()
  // “language_hints”只支持paraformer-realtime-v2模型
  .parameters(Map.of(
          "language_hints", new String[]{"zh", "en"},
          "semantic_punctuation_enabled", false,
          "max_sentence_silence", 800,
          "inverse_text_normalization_enabled", false
  ))
  .build();

semantic_punctuation_enabled

boolean

true

是否开启语义断句,服务默认开启语义断句,如果关闭则使用VAD (Voice Activity Detection)断句。一般而言,VAD断句延迟低适用于交互场景,语义断句准确适用于会议转写场景。

此功能只有v2系列模型支持。

说明
  1. semantic_punctuation_enabled参数默认开启(true),但对延迟敏感的场景建议设置为false。

  2. semantic_punctuation_enabled需要通过RecognitionParam实例的parameter方法或者parameters方法进行设置:

    通过parameter设置

    RecognitionParam param = RecognitionParam.builder()
      // “language_hints”只支持paraformer-realtime-v2模型
      .parameter("semantic_punctuation_enabled", false)
      .build();

    通过parameters设置

    RecognitionParam param = RecognitionParam.builder()
      // “language_hints”只支持paraformer-realtime-v2模型
      .parameters(Map.of(
              "language_hints", new String[]{"zh", "en"},
              "semantic_punctuation_enabled", false,
              "max_sentence_silence", 800,
              "inverse_text_normalization_enabled", false
      ))
      .build();

max_sentence_silence

Integer

800

语音断句检测阈值,如果一段语音后的静音时长超过该阈值,会被认为一个句子已经结束,参数范围200ms~6000ms,默认值800ms。

此功能只有v2系列模型支持。

说明
  1. 关闭语义断句(semantic_punctuation_enabled=false)后才生效。

  2. max_sentence_silence需要通过RecognitionParam实例的parameter方法或者parameters方法进行设置:

    通过parameter设置

    RecognitionParam param = RecognitionParam.builder()
      // “language_hints”只支持paraformer-realtime-v2模型
      .parameter("max_sentence_silence", 800)
      .build();

    通过parameters设置

    RecognitionParam param = RecognitionParam.builder()
      // “language_hints”只支持paraformer-realtime-v2模型
      .parameters(Map.of(
              "language_hints", new String[]{"zh", "en"},
              "semantic_punctuation_enabled", false,
              "max_sentence_silence", 800,
              "inverse_text_normalization_enabled", false
      ))
      .build();

inverse_text_normalization_enabled

Boolean

true

是否开启ITN(逆文本,Inverse Text Normalization),开启后(设置为true)中文数字会转换为阿拉伯数字。

此功能只有v2系列模型支持。

说明

inverse_text_normalization_enabled需要通过RecognitionParam实例的parameter方法或者parameters方法进行设置:

通过parameter设置

RecognitionParam param = RecognitionParam.builder()
  // “language_hints”只支持paraformer-realtime-v2模型
  .parameter("inverse_text_normalization_enabled", false)
  .build();

通过parameters设置

RecognitionParam param = RecognitionParam.builder()
  // “language_hints”只支持paraformer-realtime-v2模型
  .parameters(Map.of(
          "language_hints", new String[]{"zh", "en"},
          "semantic_punctuation_enabled", false,
          "max_sentence_silence", 800,
          "inverse_text_normalization_enabled", false
  ))
  .build();

apiKey

String

-

用户API Key。如已将API Key配置到环境变量,则无须在代码中设置。

响应结果

实时识别结果(RecognitionResult

RecognitionResult代表一次实时识别的结果。

接口/方法

参数

返回值

描述

public String getRequestId()

requestId

获取requestId。

public boolean isSentenceEnd()

是否是完整句子,即产生断句

判断给定句子是否已经结束。

public Sentence getSentence()

Sentence实例

获取单句信息,包括时间戳和文本信息等。详情请参见单句信息(Sentence)

单句信息(Sentence

接口/方法

参数

返回值

描述

public Long getBeginTime()

句子开始时间,单位为ms

返回句子开始时间。

public Long getEndTime()

句子结束时间,单位为ms

返回句子结束时间。

public String getText()

识别文本

返回识别文本。

public List<Word> getWords()

字时间戳信息:Word集合

返回字时间戳信息。详情请参见字时间戳信息(Word)

public String getEmoTag()

当前句子的情感

返回当前句子的情感:

  • positive:正面情感,如开心、满意

  • negative:负面情感,如愤怒、沉闷

  • neutral:无明显情感

仅在关闭语义断句(semantic_punctuation_enabled=false),并且is_sentence_end=true时生效。

paraformer-realtime-8k-v2模型支持情感识别。

public Double getEmoConfidence()

当前句子识别情感的置信度

返回当前句子识别情感的置信度,取值范围:[0.0,1.0]。值越大表示置信度越高。

paraformer-realtime-8k-v2模型支持情感识别。

字时间戳信息(Word

接口/方法

参数

返回值

描述

public long getBeginTime()

字开始时间,单位为ms

返回字开始时间。

public long getEndTime()

字结束时间,单位为ms

返回字结束时间。

public String getText()

返回识别的字。

public String getPunctuation()

标点

返回标点。

关键接口

核心类(Recognition

Recognition可以通过“import com.alibaba.dashscope.audio.asr.recognition.Recognition;”方式引入。它的关键接口如下:

接口/方法

参数

返回值

描述

public void call(RecognitionParam param, final ResultCallback<RecognitionResult> callback)
  • param:语音识别相关参数

  • callback:回调

基于回调形式的流式实时识别,该方法不会阻塞当前线程。

public String call(RecognitionParam param, File file)
  • param:参数

  • file:文件

识别结果

基于本地文件的同步调用,该方法会阻塞当前线程直到全部音频读完,该方法要求所识别文件具有可读权限。

public Flowable<RecognitionResult> streamCall(RecognitionParam param, Flowable<ByteBuffer> audioFrame)
  • paramRecognitionParam实例,参数类

  • audioFrameFlowable<ByteBuffer>实例

Flowable<RecognitionResult>

基于Flowable的流式实时识别。

public void sendAudioFrame(ByteBuffer audioFrame)
  • audioFrame:二进制音频流,为ByteBuffer类型

推送音频,每次推送的音频流不宜过大或过小,建议每包音频时长为100ms左右,大小在1KB~16KB之间。

识别结果通过回调接口(ResultCallback)onEvent方法获取。

public void stop()

停止实时识别。

该方法会阻塞当前线程,直到回调实例ResultCallbackonComplete或者onError被调用之后才会解除对当前线程的阻塞。

public String getLastRequestId()

requestId

获取当前任务的requestId,在调用callstreamingCall开始新任务之后可以使用。

说明

该方法自2.18.0版本及以后的SDK中才开始提供。

public long getFirstPackageDelay()

首包延迟

获取首包延迟,从发送第一包音频到收到首包识别结果延迟,在任务完成后使用。

说明

该方法自2.18.0版本及以后的SDK中才开始提供。

public long getLastPackageDelay()

尾包延迟

获得尾包延迟,发送stop指令到最后一包识别结果下发耗时,在任务完成后使用。

说明

该方法自2.18.0版本及以后的SDK中才开始提供。

回调接口(ResultCallback

流式调用时,服务端会通过回调的方式,将关键流程信息和数据返回给客户端。您需要实现回调方法,处理服务端返回的信息或者数据。

回调方法的实现,通过继承抽象类ResultCallback完成,继承该抽象类时,您可以指定泛型为RecognitionResultRecognitionResult封装了服务器返回的数据结构。

由于Java支持连接复用,因此没有onCloseonOpen

示例

ResultCallback<RecognitionResult> callback = new ResultCallback<RecognitionResult>() {
    @Override
    public void onEvent(RecognitionResult result) {
        System.out.println("RequestId为:" + result.getRequestId());
        // 在此实现处理语音识别结果的逻辑
    }

    @Override
    public void onComplete() {
        System.out.println("任务完成");
    }

    @Override
    public void onError(Exception e) {
        System.out.println("任务失败:" + e.getMessage());
    }
};

接口/方法

参数

返回值

描述

public void onEvent(RecognitionResult result)

result实时识别结果(RecognitionResult)

当服务有回复时会被回调。

public void onComplete()

任务完成后该接口被回调。

public void onError(Exception e)

e:异常信息

发生异常时该接口被回调。

错误码

在使用API过程中,如果调用失败并返回错误信息,请参见错误信息进行解决。

更多示例

更多示例,请参见GitHub

常见问题

请参见GitHub QA