语音识别功能,可以将实时语音转化为文本。

目前除了支持使用麦克风等输入设备作为实时语音输入,还支持使用 Audio/Video 标签或对象的实时播放作为语音输入。

初始化实例

要使用语音识别功能,你需要有一个语音识别的实例。通过客户端的 initRecognition 方法就可以初始化一个语音识别实例,这样就可以通过语音识别实例来调用识别功能。

函数原型
  1. initRecognition([options[, plugin]]): Recognition

参数

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) | | vocabularyId | string | 否 | 无 | 泛热词。 | | classVocabularyId | Map | 否 | 无 | 类热词。
    key:类名
    value:类热词词表ID | | customizationId | string | 否 | 无 | 定制模型 | | alsAmId | string | 否 | 无 | 声学模型 | | resamplerWorker | string | 否 | 无 | 降采样 worker 地址,可指定降采样模块,不配置则使用内置降采样算法 | | sampleRate | number | 否 | 16000 | 降采样目标采样率 | | enableIntermediateResult | boolean | 否 | false | 是否开启中间识别 | | enablePunctuationPrediction | boolean | 否 | false | 是否开启展示标点 | | enableInverseTextNormalization | boolean | 否 | false | 是否开启文本规整 | | enableSemanticSentenceDetection | boolean | 否 | false | 是否开启语义断句 | | segmterStr | string | 否 | 无 | 语义断句分段的分隔符 |

_plugin
可选

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

返回
  • 类型:语音识别实例

使用方式

以下会列出两种语音识别方式的基本用法。

开启录音识别

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

完整例子🌰

import NlsClient from 'ali-nls';

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

// 初始化语音识别
const instance = client.initRecognition();

// 监听识别结果
instance.on('sentenceEnd', (index, result) => {
  console.log(`第${index}句话收到识别结果`, result);
});

// 开始识别
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();
// 可以是本地或者本域的音频地址,不允许跨域
// PS:同样支持 audio 播放 mediaSource 来识别
audio.src = 'xxx';

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

// 监听识别结果
instance.on('sentenceEnd', (index, result) => {
  console.log(`第${index}句话收到识别结果`, result);
});

// 开始识别(绑定并监听)
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

sentenceBegin

检测到了一句话的开始。

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

参数

index

  • 描述:当前句子的索引
  • 类型:number

taskId

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

msg

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

sentenceChanged

收到中间识别结果。中间识别结果需要在初始化时开启 enableIntermediateResult

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

参数

index

  • 描述:当前句子的索引
  • 类型:number

result

  • 描述:识别内容
  • 类型:string

taskId

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

msg

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

sentenceEnd

检测到了一句话的结束。

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

参数

index

  • 描述:当前句子的索引
  • 类型:number

result

  • 描述:识别内容
  • 类型:string

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

高级用法

高级用法中包含了常见但不必须的使用场景,可以根据情况酌情使用。

使用 C++ 降采样模块

JS SDK 中默认包含了 JS 版本实现的降采样算法,可以满足基本需求。但是语音的音质(非人耳可分辨的差异)往往对识别结果的准确度有很大的影响。

如果条件允许,Chrome 74 版本以下强烈建议️️❗️❗❗使用 WebAssembly 扩展的 C++ 降采样模块来提升音质。只需要在初始化配置中增加降采样模块的 Worker 地址,即可开启 C++ 降采样扩展。

Chrome 74 版本及后续版本支持指定录音采样率,可以不使用降采样模块,SDK 也做了适配处理,C++ 降采样模块仅针对 Chrome 74 版本前适用

接下来将教你如何配置 C++ 降采样模块。

1. 获取降采样模块

通过 npm 安装依赖即可。

npm i pcm-resampler

2. 将 Worker 文件放到当前域的可访问链接

安装好的模块中,包含 Worker 的 js 文件和对应 WebAssembly 的 wasm 文件,可以在 node_modules 中获取到。

以 npm 的安装目录为例,获取文件的地址如下。

node_modules/pcm-resampler/dist/resampleWorker.min.js
node_modules/pcm-resampler/dist/resampleWorker.min.wasm

将以上两个文件放在静态资源目录的同一个目录路径下,得到对应的 http 访问地址。以常见的 public 目录为例。

/public/assets/resampleWorker.min.js
/public/assets/resampleWorker.min.wasm

❗️注意: 由于 Worker 不能跨域加载,需要保证同域的可访问性。跨域使用方式可以参考 cross-domain 生成 localWorkerUrl 来跨域。

3. 初始化语音识别时指定 Worker

const instance = client.initRecognition({
  resamplerWorker: '/public/assets/resampleWorker.min.js',
});

完成以上操作后,就开启 C++ 模块的降采样功能。

如果你打开了 debug 功能,在控制台中看到以下 log,代表已经可以正常使用。

[NLS Debug] 加载降采样 clang

获取音频结点

SDK 中提供了对外的 音频结点音频上下文。音频上下文有点类似 Canvas 的上下文,是 Web Audio API 的基础,而音频结点则是对音频做操作基础。有了音频结点,就可以做任何需要的定制需求,常见的如:绘制波形图、绘制频谱图、耳返同声等。

音频结点在 started 事件触发后就可以获取到。

instance.on('started', () => {
  instance.audioNode; // 音频结点,GainNode
  instance.audioContext; // 音频上下文,AudioContext
});

为了保证音频结点既可输入又可输出,这里提供的音频结点具体类型是 GainNode

更多关于 Web Audio API 相关的内容,可以参考 Web Audio API

使用插件

语音识别提供了插件功能,主要用来扩展一些以识别为基础的语音交互能力,如同声传译、对话助手等。具体使用方式可以参考后续的插件扩展文档。