人机协同功能,在快速固定识别内容的前提下,提供人工干预识别内容的可能性。

开始准备

相比语音识别,人机协同输出的识别内容可分为固定部分、可变部分。每句话中可变部分占比对比一般语音识别将更少,一句话识别结束前,其固定部分已经不会再修改,可以对其进行人机协同下的人工干预等操作,让人工可以实时介入到识别过程中来。

初始化实例

可以通过客户端的 initRapidFixRecognition 方法初始化一个人机协同实例,实例可以用来调用此功能。

函数原型
  1. initRapidFixRecognition([options[, plugin]]): RapidFixRecognition

参数

options
可选

  • 描述:配置参数
  • 类型:object | 参数 | 类型 | 必须 | 默认值 | 描述 | | —- | —- | —- | —- | —- | | type | string | 否 | mic | 输入源类型,可选值 mic、audio | | input(type=mic) | string | 否 | 默认设备 | 启用的输入源。传入输入设备的 deviceId,可通过 enumerateDevices 获取 | | input(type=audio) | HTMLMediaElement | 是 | 无 | 启用的输入源。Audio/Video 实例的引用 | | vocabulary | Map | 否 | 无 | 设置热词。
    key:热词
    value:权重(1-5) | | resamplerWorker | string | 否 | 无 | 降采样 worker 地址,可指定降采样模块,不配置则使用内置的 JS 降采样算法 | | sampleRate | number | 否 | 16000 | 降采样目标采样率 | | enableInverseTextNormalization | boolean | 否 | true | 是否开启文本规整 | | disfluency | boolean | 否 | true | 是否尝试过滤识别结果中重复出现的语气词 |

plugin
可选

  • 描述:待加载的插件
  • 类型:插件实例,详见插件扩展

返回
  • 类型:人机协同实例

使用方式

以下会列出两种人机协同的基本用法。

开启录音识别

录音识别会使用浏览器的 RTC API,打开麦克风或指定的输入设备来实时捕获音频,并且获得识别结果。

完整例子🌰

  1. import NlsClient from 'ali-nls';
  2. // 创建客户端
  3. const client = new NlsClient({
  4. appkey: 'xxxxxx',
  5. accessToken: async () => await getToken(),
  6. });
  7. // 初始化人机协同
  8. const instance = client.initRapidFixRecognition();
  9. // 监听识别结果
  10. instance.on('resultChanged', ({
  11. sentence_end_result,
  12. constant_partial_result,
  13. variable_partial_result,
  14. }) => {
  15. console.log(
  16. `收到识别结果: \n
  17. ${sentence_end_result ? sentence_end_result.text : '<empty>'}|
  18. ${constant_partial_result ? constant_partial_result.text : '<empty>'}|
  19. ${variable_partial_result ? variable_partial_result.text : '<empty>'}`
  20. );
  21. });
  22. // 开始人机协同识别
  23. instance.start();

播放音频识别

播放音频识别,可以通过媒体标签来播放音视频文件,其中的音频作为实时语音输入,来获取识别结果。

完整例子🌰

import NlsClient from 'ali-nls';

// 创建客户端
const client = new NlsClient({
  appkey: 'xxxxxx',
  accessToken: async () => await getToken(),
});

// 创建 audio,也可以通过 document.getElementById 等 api 获取 html 中的 <audio />
const audio = new Audio();
audio.src = 'xxx'; // 可以是本地或者本域的音频地址,不允许跨域

// 初始化语音识别,使用媒体音频
const instance = client.initRapidFixRecognition({
  type: 'audio',
  input: audio,
});

// 监听识别结果
instance.on('resultChanged', ({
  sentence_end_result,
  constant_partial_result,
  variable_partial_result,
}) => {
  console.log(
    `收到识别结果: \n
    ${sentence_end_result ? sentence_end_result.text : '<empty>'}|
    ${constant_partial_result ? constant_partial_result.text : '<empty>'}|
    ${variable_partial_result ? variable_partial_result.text : '<empty>'}`
  );
});

// 开始识别(绑定并监听)
instance.start();

// 开始播放音频
audio.play();

API

人机协同实例提供的 API,包含了控制识别的主要功能。

start

开始人机协同识别。

  • 使用录音识别方式时,调用 start 后就会开始录音,并且开始识别音频中输入的语音;
  • 使用播放音频的方式时,调用 start 后 SDK 会绑定 input 设置的媒体元素,并监听其触发的播放事件,跟随 play、pause 等事件执行相应操作。

函数原型
start(): void

stop

停止人机协同识别。

  • 使用录音识别方式时,调用 stop 后就会停止识别与录音;
  • 使用播放音频的方式时,调用 stop 后会停止识别并解除绑定 input 设置的媒体元素。

函数原型
stop(): void

setGain

设置音量增益大小。

函数原型
setGain(value): void

参数

value

  • 描述:需要设置的增益值,默认 1。最小值约 -3.4,最大约 3.40 代表静音
  • 类型:number

on

监听事件。可以用来监听 SDK 提供的相关事件。

函数原型
on(event, handler): void

参数

event

  • 描述:事件名
  • 类型:string

handler

  • 描述:事件处理函数,不同事件的处理函数有不同参数,详见事件
  • 类型:function

off

取消事件监听。使用完毕或重新初始化后,一定要取消之前的监听事件,防止造成内存泄漏。

函数原型
off(event[, handler]): void

参数

event

  • 描述:事件名
  • 类型:string

handler
可选

  • 描述:需要解绑的事件处理函数,如果不传该参数,将会解绑该事件对应的所有处理函数
  • 类型:function

事件

人机协同识别提供的事件,在使用过程中,会有对应的事件触发,可以通过 onoff 来监听或取消监听事件。

started

开始人机协同识别事件。识别成功开始时,会触发该事件。

处理函数
handler(taskId, msg): void

参数

taskId

  • 描述:本次任务的任务 ID
  • 类型:string

msg

  • 描述:原始事件完整对象
  • 类型:object

resultChanged

收到人机协同识别结果。

处理函数
handler(result, taskId, msg): void

参数

result

  • 描述:识别内容。包含 sentence_end_result、constant_partial_result、variable_partial_result
  • 类型:object

taskId

  • 描述:本次任务的任务 ID
  • 类型:string

msg

  • 描述:原始事件完整对象
  • 类型:object

completed

人机协同识别结束事件。成功结束识别任务时,会触发该事件。

处理函数
handler(taskId, msg): void

参数

taskId

  • 描述:本次任务的任务 ID
  • 类型:string

msg

  • 描述:原始事件完整对象
  • 类型:object

dating

传输识别数据。向服务端传输识别数据时会触发该事件,可以通过处理函数的参数拿到原始音频片段。

处理函数
handler(chunk): void

参数

chunk

  • 描述:语音片段
  • 类型:ArrayBuffer

error

错误信息事件。发生错误时会触发该事件,通过监听该事件,可以排查运行中的问题。

处理函数
handler(err, message, code): void

参数

err

  • 描述:错误事件对象
  • 类型:Event

message

  • 描述:错误信息描述
  • 类型:string

code

  • 描述:错误码
  • 类型:number

closed

关闭事件。当与服务端链接断开时,会触发该事件

处理函数
handler(ev): void

参数

ev

  • 描述:关闭事件对象
  • 类型:CloseEvent

reconnect

重连事件。正在与服务端尝试重连,网络异常时触发重连时会触发该事件

处理函数
handler(code, message, left): void

参数

code

  • 描述:错误码
  • 类型:number

message

  • 描述:错误信息描述
  • 类型:string

left

  • 描述:重连剩余次数
  • 类型:number

unknow

未知事件。当接受到服务端传递给 SDK 无法处理的事件时,会通过该事件抛出。

处理函数
handler(msg): void

参数

msg

  • 描述:原始事件完整对象
  • 类型:object

识别结果

人机协同识别结果分为三部分:sentence_end_result、constant_partial_result、variable_partial_result。

字段解释

sentence_end_result

当前句最后一个增量固定识别结果。存在这个字段时,其他字段则为下一句内容。

// 详细文本内容获取方式
sentence_end_result.text

constant_partial_result

增量固定识别结果。

// 详细文本内容获取方式
constant_partial_result.text

variable_partial_result

可变识别结果。

// 详细文本内容获取方式
variable_partial_result.text

参考解析方式

// 已完整识别的句子内容
const sentences = [];
// 正在识别的句子固定内容
let constantPartial = '';
// 正在识别的句子可变内容
let variablePartial = '';

// 监听识别结果
instance.on('resultChanged', ({
  sentence_end_result,
  constant_partial_result,
  variable_partial_result,
}) => {
  // 解析当前句最后一个增量固定识别结果
  if (sentence_end_result) {
    // 创建完整句子
    sentences.push(`${constantPartial}${sentence_end_result.text}`);
    // 清空正在识别内容
    constantPartial = '';
  }

  // 解析增量固定识别结果
  if (constant_partial_result) {
    // 追加正在识别内容
    constantPartial += constant_partial_result.text;
  }

  // 解析可变识别结果
  variablePartial = variable_partial_result ? variable_partial_result.text : '';
});

// 显示内容
// sentences 已完整识别的句子内容
// constantPartial 正在识别的句子固定内容
// variablePartial 正在识别的句子可变内容
// sentences、constantPartial 部分可做修改或其他干预操作
console.log(`当前识别结果: ${sentences.join('')}${constantPartial}${variablePartial}`);

高级用法

请参考语音识别 高级用法