NUI 移动端 SDK 支持对持续输入的语音流进行实时识别,适用于会议演讲、视频直播等场景。本文介绍初始化参数、识别参数和回调事件。
功能简介
NUI SDK 提供语音能力和状态管理,可用于集成完整语音处理流程,也可按需调用独立能力,并使用统一的接口。
使用限制与配置
输入音频须为 PCM 编码、16 位采样位数、单声道,支持 8000 Hz 和 16000 Hz 采样率。音频不符合要求时,可能识别失败或返回空结果。
SDK 接收 PCM 音频后,可按
sr_format设置以 PCM 或 OPUS 格式传输;选择 OPUS 时,由 SDK 编码压缩。8000 Hz 仅支持 PCM 传输。中间识别结果、标点预测和中文数字转阿拉伯数字均为可选功能,根据需要开启。
语种和方言模型不能通过代码指定,需要在控制台为项目配置,并与音频采样率和场景匹配。配置方法请参见管理项目。
服务地址
SDK 默认使用上海公网地址。公网地址可从所有服务器访问;内网地址仅供同地域 VPC 内的 ECS 实例访问,经典网络不支持。使用内网地址不产生 ECS 实例的公网流量费用。
|
地域 |
公网地址 |
内网地址 |
|
上海 |
|
|
|
北京 |
|
|
|
深圳 |
|
|
交互流程
初始化 SDK 并设置识别参数后,启动识别,通过音频回调持续提供数据。SDK 通过事件回调返回句子开始、中间结果和句子结束等信息。音频发送完毕后,结束识别并等待任务完成。
识别事件以 JSON 表示。header.task_id 标识同一次识别任务,header.message_id 标识一条消息;排查问题时应记录任务 ID。
鉴权和初始化
客户端建立 WebSocket 连接时,使用 NLS Token 鉴权。获取方式请参见获取Token。以下参数用于 SDK 初始化。
|
参数 |
类型 |
必填 |
说明 |
|
|
String |
是 |
工作目录路径,SDK 从该路径读取配置文件。 |
|
|
String |
是 |
项目 Appkey,获取方法请参见管理项目。 |
|
|
String |
是 |
有效的 NLS Token。可在初始化时设置,也可在参数设置时更新。 |
|
|
String |
是 |
唯一标识设备的字符串,例如 MAC 地址、序列号或 UniquePsuedoID。 |
|
|
String |
否 |
调试目录。初始化接口的 |
|
|
String |
否 |
是否保存调试音频,取值为字符串 |
识别参数
初始化后、开始识别前,通过参数设置接口传入 JSON 字符串。Android 使用 setParams,iOS 使用 nui_set_params。通常设置一次即可;需要更新 Token 时可重新设置。
顶层参数
|
参数 |
类型 |
必填 |
说明 |
|
|
String |
否 |
项目 Appkey,一般在初始化时设置。 |
|
|
String |
否 |
需要更新 NLS Token 时设置。 |
|
|
Int |
是 |
语音服务类型。实时语音识别取值为 |
|
|
String |
否 |
客户端自行进行 DNS 解析后,用于访问服务的 IP 地址。 |
|
|
JsonObject |
否 |
识别服务参数,具体字段见下表。 |
nls_config
|
参数 |
类型 |
必填 |
说明 |
|
|
String |
否 |
音频传输编码,取值为 |
|
|
Integer |
否 |
音频采样率,默认为 16000 Hz。项目模型须支持所用采样率和场景。 |
|
|
Boolean |
否 |
是否返回中间识别结果,默认为 |
|
|
Boolean |
否 |
是否在后处理中添加标点,默认为 |
|
|
Boolean |
否 |
是否开启逆文本正则化(ITN),将中文数字转换为阿拉伯数字,默认为 |
|
|
String |
否 |
自学习模型 ID。 |
|
|
String |
否 |
定制泛热词 ID。 |
|
|
Integer |
否 |
静音断句阈值,单位为毫秒。静音时长超过该值时判断为句子结束。取值范围为 200~2000,默认为 800。 |
|
|
Boolean |
否 |
是否返回词信息,默认为 |
|
|
Boolean |
否 |
是否过滤语气词,默认为 |
|
|
String |
否 |
服务端 VAD 模型 ID,默认无需设置。 |
|
|
float |
否 |
噪音判定阈值,取值范围为 -1~+1。越接近 -1,越多音频被判为语音,可能误识别噪声;越接近 +1,越多音频被判为噪音,可能漏识别语音。该参数属于高级参数,应谨慎调整并重点测试。 |
|
|
JsonObject |
否 |
配置交互协议支持、但本表未列出的扩展参数。具体设置方法请参见对应 SDK 的参数设置示例。 |
参数设置示例请参见Android SDK或iOS SDK。
发送音频与处理事件
开始识别后,在 onNuiNeedAudioData 回调中持续提供 PCM 音频。SDK 通过 onNuiEventCallback 返回识别事件。SDK 事件枚举与消息中的 header.name 对应关系如下。
|
SDK 事件 |
header.name |
含义 |
|
|
|
检测到一句话开始。 |
|
|
|
句子中间结果,需要开启 |
|
|
|
句子结束,返回该句的完整结果。 |
公共 header 字段
|
字段 |
类型 |
说明 |
|
|
String |
消息命名空间,本接口为 |
|
|
String |
消息名称。 |
|
|
Integer |
业务状态码, |
|
|
String |
本条消息的 ID。 |
|
|
String |
识别任务的全局唯一 ID。 |
|
|
String |
状态描述。 |
事件详情
SentenceBegin
以下 JSON 示例说明消息结构。
{
"header": {
"namespace": "SpeechTranscriber",
"name": "SentenceBegin",
"status": 20000000,
"message_id": "a426f3d4618447519c9d85d1a0d1****",
"task_id": "5ec521b5aa104e3abccf3d361822****",
"status_text": "Gateway:SUCCESS:Success."
},
"payload": {
"index": 1,
"time": 0
}
}
payload 字段
|
字段 |
类型 |
说明 |
|
|
Integer |
句子编号,从 1 开始递增。 |
|
|
Integer |
当前已处理的音频时长,单位为毫秒。 |
TranscriptionResultChanged
以下 JSON 示例说明消息结构。
{
"header": {
"namespace": "SpeechTranscriber",
"name": "TranscriptionResultChanged",
"status": 20000000,
"message_id": "dc21193fada84380a3b6137875ab****",
"task_id": "5ec521b5aa104e3abccf3d361822****",
"status_text": "Gateway:SUCCESS:Success."
},
"payload": {
"index": 1,
"time": 1835,
"result": "北京的天",
"confidence": 1.0,
"words": [
{
"text": "北京",
"startTime": 630,
"endTime": 930
},
{
"text": "的",
"startTime": 930,
"endTime": 1110
},
{
"text": "天",
"startTime": 1110,
"endTime": 1140
}
]
}
}
payload 字段
|
字段 |
类型 |
说明 |
|
|
Integer |
句子编号,从 1 开始递增。 |
|
|
Integer |
当前已处理的音频时长,单位为毫秒。 |
|
|
String |
当前句子的中间识别结果。 |
|
|
|
词信息列表,需要开启 |
|
|
Double |
句子识别结果的置信度,取值范围为 0.0~1.0,值越大表示置信度越高。 |
SentenceEnd
以下 JSON 示例说明消息结构。
{
"header": {
"namespace": "SpeechTranscriber",
"name": "SentenceEnd",
"status": 20000000,
"message_id": "c3a9ae4b231649d5ae05d4af36fd****",
"task_id": "5ec521b5aa104e3abccf3d361822****",
"status_text": "Gateway:SUCCESS:Success."
},
"payload": {
"index": 1,
"time": 2000,
"begin_time": 0,
"result": "北京的天气。",
"confidence": 1.0,
"words": [
{
"text": "北京",
"startTime": 630,
"endTime": 930
},
{
"text": "的",
"startTime": 930,
"endTime": 1110
},
{
"text": "天气",
"startTime": 1110,
"endTime": 1380
}
]
}
}
payload 字段
|
字段 |
类型 |
说明 |
|
|
Integer |
句子编号,从 1 开始递增。 |
|
|
Integer |
当前已处理的音频时长,单位为毫秒。 |
|
|
Integer |
该句对应的 |
|
|
String |
当前句子的完整识别结果。 |
|
|
|
词信息列表,需要开启 |
|
|
Double |
句子识别结果的置信度,取值范围为 0.0~1.0,值越大表示置信度越高。 |
Word 字段
|
字段 |
类型 |
说明 |
|
|
String |
词文本。 |
|
|
Integer |
词在音频中的开始时间,单位为毫秒。 |
|
|
Integer |
词在音频中的结束时间,单位为毫秒。 |
结束识别
音频发送完毕后,调用 SDK 的结束识别接口。Android 调用 stopDialog;iOS 调用 nui_dialog_cancel,需要保留最终结果时将 force 设为 false。通过 EVENT_TRANSCRIBER_COMPLETE 确认识别任务已结束。
句子结果与任务完成是不同事件。没有有效语音时,任务可以完成而不返回句子结果。
错误码
调用失败时,根据错误码和任务 ID 排查问题。通用错误码、实时语音识别错误码和 SDK 错误码及处理方法,请参见错误码查询。
相关文档
SDK 集成步骤、接口签名及完整代码示例,请参见Android SDK和iOS SDK。