paraformer实时文档

Paraformer语音识别

说明

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

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

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

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

模型概览

模型名

模型简介

paraformer-realtime-v2

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

支持的语言包括:中文(含粤语等各种方言)、英文、日语、韩语。

注:paraformer-realtime-v2暂不支持热词。

paraformer-realtime-v1

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

paraformer-realtime-8k-v1

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

API参考

前提条件

目前实时语音识别支持Python和Java两种SDK版本,本文档主要以Python接口和参数为主进行讲解。

请求参数

以下代码片段展示了如何创建一个使用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 仅支持16000Hz采样率

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

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

format

str

-

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

phrase_id

str

-

热词ID,此次语音识别中生效此热词ID对应的热词信息。默认不启用。设置热词请参考: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': '。'
	}]
}