文档

实时语音识别API详情

更新时间:

Paraformer语音识别

说明

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

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

常见的视频直播场景一般采用16kHz及以上的采样率进行声音采集,用户可选择paraformer-realtime-v1模型进行中英文语音识别。在电话客服场景一般采用8kHz进行声音采集,用户应选择paraformer-realtime-8k-v1模型进行语音识别以获得更佳的效果。

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

模型概览

模型名

模型简介

paraformer-realtime-v1

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

paraformer-realtime-8k-v1

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

API参考

前提条件

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

请求参数

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

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

  • 参数说明

参数

类型

默认值

说明

model

str

-

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

sample_rate

int

-

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

format

str

-

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

phrase_id

str

-

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

disfluency_removal_enabled

bool

False

过滤语气词,默认关闭

流式调用

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

通过回调方式的流式调用

以下代码片段展示了创建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-v1',
                          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': '。'
	}]
}
  • 本页导读 (0)