Paraformer实时语音识别API详情

Paraformer语音识别

说明

支持的领域 / 任务:audio(音频) / asr(语音识别)

Paraformer语音识别提供的实时转写API,能够对长时间的语音数据流进行识别,并将结果流式返回给调用者,适用于会议演讲、视频直播等长时间不间断识别的场景。

新一代语音识别模型paraformer-realtime-v2,支持常见的视频直播、电话客服等场景下的音频输入,同时可以通过language_hints参数选择语种获得更准确的识别效果。

Paraformer实时语音识别返回较为丰富的结果供调用者选择使用,包括中间文字结果、句子级文字、词和时间戳等。模型默认进行标点符号预测和逆文本正则化。

模型名

模型简介

paraformer-realtime-v2

推荐使用 Paraformer最新实时语音识别模型,支持多个语种自由切换的视频直播、会议等实时场景的语音识别。可以通过language_hints参数选择语种获得更准确的识别效果。支持任意采样率的音频。

支持的语言包括:中文(包含中文普通话和各种方言)、英文、日语、韩语。支持热词功能,用法请参考定制热词

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

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

paraformer-realtime-8k-v2

推荐使用 Paraformer最新8k中文实时语音识别模型,模型结构升级,具有更快的推理速度和更好的识别效果。支持8kHz电话客服等场景下的实时语音识别。仅支持中文热词。用法请参考 定制热词

paraformer-realtime-v1

Paraformer中文实时语音识别模型,支持视频直播、会议等实时场景下的语音识别。仅支持16kHz采样率的音频。

paraformer-realtime-8k-v1

Paraformer中文实时语音识别模型,支持8kHz电话客服等场景下的实时语音识别。

API参考

前提条件

本文档主要以Python接口和参数为主进行讲解。

导入模块

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

dashscope.api_key = '<your-dashscope-api-key>'
import com.alibaba.dashscope.audio.asr.recognition.Recognition;
import com.alibaba.dashscope.audio.asr.recognition.RecognitionParam;
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;

请求参数

以下代码片段展示了如何创建一个使用paraformer-realtime-v2模型,使用16k采样率,PCM音频格式的实时识别请求参数:

recognition = Recognition(model='paraformer-realtime-v2',
                          format='pcm',
                          sample_rate=16000,
                          callback=callback)
    RecognitionParam param =
        RecognitionParam.builder()
            .model("paraformer-realtime-v2")
            .format("pcm")
            .sampleRate(16000)
            .apiKey("your-dashscope-api-key")
            .build();

参数说明

参数

类型

默认值

说明

model

str

-

指定用于实时语音识别的模型

sample_rate

int

-

识别音频采样率支持8000Hz以及16000Hz

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

  • paraformer-realtime-v1 仅支持16000Hz采样

  • paraformer-realtime-8k-v1 仅支持8000Hz采样率

format

str

-

支持'pcm'、'wav'、'opus'、'speex'、'aac'、'amr'等多种音频格式

vocabulary_id

str

-

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

phrase_id

str

-

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

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

disfluency_removal_enabled

bool

False

过滤语气词,默认关闭

language_hints

list[str]

['zh', 'en']

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

  • zh: 中文

  • en: 英文

  • ja: 日语

  • yue: 粤语

  • ko: 韩语

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

注:在java sdk中,此参数需要通过parameter额外参数配置,用法请参考快速开始中示例代码。

流式调用

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

通过回调方式的流式调用

以下代码片段展示了创建Recognition示例并使用上文创建的参数来调用基于回调方式的流式实时识别。

class Callback(RecognitionCallback):
    def on_complete(self) -> None:
        # 识别完成

    def on_error(self, result: RecognitionResult) -> None:
        # 错误处理

    def on_event(self, result: RecognitionResult) -> None:
        # 处理识别结果
 
callback = Callback()
recognition = Recognition(model='paraformer-realtime-v2',
                          format='pcm',
                          sample_rate=16000,
                          callback=callback)
recognition.start()
class RecognitionCallback extends ResultCallback<RecognitionResult> {

  @Override
  public void onEvent(RecognitionResult message) {
    // 处理识别结果
  }

  @Override
  public void onComplete() {
    // 识别完成
  }

  @Override
  public void onError(Exception e) {
    // 错误处理
  }
}

Recognition recognition = new Recognition();
recognition.call(param, new RecognitionCallback());

该方法签名如下:

成员方法

方法签名

说明

start

def start(self):

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

  • 回调函数

    Python SDK为例,其他SDK命名方式可能不同

    方法签名

    是否必须被override

    说明

    def on_open(self) -> None:

    websocket建立链接完成后立刻会被回调。

    def on_event(self, result: RecognitionResult) -> None:

    当服务有回复时会被回调,RecognitionResult 类型会在后文中介绍。

    def on_complete(self) -> None:

    当所有合成数据全部返回后进行回调。

    def on_error(self, result: RecognitionResult) -> None:

    当调用过程出现异常以及服务返回错误后以RecognitionResult类型进行回调。

    def on_close(self) -> None:

    当服务已经关闭连接后进行回调。

  • 返回结果说明

    RecognitionResult代表一次实时识别的结果,包含了时间戳和文本信息以及文本识别是否结束

    成员方法

    方法签名

    说明

    get_sentence

    def get_sentence(self) -> Union[Dict[str, Any], List[Any]]:

    获取当前识别的句子及时间戳信息。回调中返回的是单句信息,所以此方法返回类型为Dict[str, Any]

    get_request_id

    def get_request_id(self) -> str:

    获取请求的RequestId

    is_sentence_end

    @staticmethod

    def is_sentence_end(sentence: Dict[str, Any]) -> bool:

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

    Sentence类成员如下:

    参数

    类型

    说明

    beginTime

    Long

    句子开始时间

    endTime

    Long

    句子结束时间

    text

    String

    识别文本

    words

    List<Word>

    字时间戳信息

    Word类成员如下:

    参数

    类型

    说明

    beginTime

    long

    字开始时间

    endTime

    long

    字结束时间

    text

    String

    punctuation

    String

    标点

  • 发送音频数据

    以下代码片段展示在一段循环中通过Recognition对象的send_audio_frame来发送二进制音频数据:

    // buffer是一个Bytes类型对象,用户需要处理如何从音频源中流式生成Bytes对象
    recognition.send_audio_frame(buffer)
    // buffer是一个ByteBuffer类型对象,用户需要处理如何从音频源中流式生成ByteBuffer对象
    recognition.sendAudioFrame(buffer);

    该方法签名如下:

    成员方法

    方法签名

    说明

    send_audio_frame

    def send_audio_frame(self, buffer: bytes):

    推送音频,Bytes不应过短或过长,建议在1KB-16KB之间

  • 结束实时识别

    以下代码片段展示停止实时识别:

    recognition.stop();
    recognition.stop();

    该方法签名如下:

    成员方法

    方法签名

    说明

    stop

    def stop(self):

    停止实时识别,该方法会阻塞当前线程至回调的on_complete或者on_error返回

基于Java Flowable的流式调用

为了方便Java开发者尽可能的简化开发过程,实时语音识别支持Java Flowable调用。以下代码片段展示使用Flowable的流式实时识别调用。该代码片段中,param为上文创建的RecognitionParam对象,streamByteBuffer为一个Flowable<ByteBuffer>类型的对象,该streamCall调用返回一个Flowable<RecognitionResult>。关于Flowable的使用,可以参考http://reactivex.io/RxJava/2.x/javadoc/

recognition
    .streamCall(param, streamByteBuffer)
    .subscribe(
        result -> {
          // result为RecognitionResult对象
        },
        error -> {
          // 错误处理
        },
        () -> {
          // 识别结束处理
        });

该方法签名如下:

成员方法

方法签名

说明

streamCall

Flowable<RecognitionResult> streamCall(RecognitionParam param, Flowable<ByteBuffer>);

基于Flowable的流式实时识别

返回结果说明

该接口主要通过返回的Flowable<RecognitionResult>来获取流式结果,关于RecognitionResult的说明可以参考前文

同步调用

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

以下代码片段展示了使用本地音频文件“asr_example.wav"来调用同步接口:

result = recognition.call('asr_example.wav')
String result = recognizer.call(param, new File("asr_example.pcm"));

该方法签名如下:

成员方法

方法签名

说明

call

def call(self, file: str) -> Dict[str, Any]:

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

返回结果说明

返回一个Dict类型,该Dict字符串格式如下:

参数

类型

说明

sentences

List<Sentence>

完整句子时间戳列表

其中List<Sentence>中每一个Sentence都是一个Sentence样式的Dict对象,对于Sentence以及Sentence下的Word对象,可以参考上文本中关于Sentence类型和Word类型的说明。以下给出一个返回示例,该例子中sentences参数下仅有一个Sentence:

{
	'begin_time': 280,
	'end_time': 4000,
	'text': 'hello word, 这里是阿里巴巴语音实验室。',
	'words': [{
		'begin_time': 280,
		'end_time': 776,
		'text': 'hello ',
		'punctuation': ''
	}, {
		'begin_time': 776,
		'end_time': 1024,
		'text': 'word',
		'punctuation': ', '
	}, {
		'begin_time': 1024,
		'end_time': 1520,
		'text': '这里',
		'punctuation': ''
	}, {
		'begin_time': 1520,
		'end_time': 1768,
		'text': '是',
		'punctuation': ''
	}, {
		'begin_time': 1768,
		'end_time': 2760,
		'text': '阿里巴巴',
		'punctuation': ''
	}, {
		'begin_time': 2760,
		'end_time': 3256,
		'text': '语音',
		'punctuation': ''
	}, {
		'begin_time': 3256,
		'end_time': 4000,
		'text': '实验室',
		'punctuation': '。'
	}]
}

并发调用

Python

Python中,由于存在全局解释器锁,同一时刻只有一个线程可以执行Python代码(虽然某些性能导向的库可能会去除此限制)。如果您想更好地利用多核心计算机的计算资源,推荐你使用multiprocessingconcurrent.futures.ProcessPoolExecutor。 多线程在较高并发下会显著增加SDK调用延迟。

Java

Java SDK中,Dashscope SDK使用了okhttp3的连接池技术降低重复建联开销。默认配置为32个连接。如果您的最高并发数超过此数值,请通过下述环境变量增加连接数。

export DASHSCOPE_MAXIMUM_ASYNC_REQUESTS=2000
export DASHSCOPE_MAXIMUM_ASYNC_REQUESTS_PER_HOST=2000
export DASHSCOPE_CONNECTION_POOL_SIZE=2000

示例中设置为2000,请按照实际单机峰值并发量的1.5倍到2倍配置。

重要
  • 连接池配置为全局变量,请在调用SDK前完成,否则不会生效。

  • 连接池的连接数为所有任务(包含语音识别、语音合成、其他百炼平台非语音任务)的总和。