资讯 社区 文档
技术能力
语音技术
文字识别
人脸与人体
图像技术
语言与知识
视频技术

调用流程

Demo工程

强烈建议在使用iOS SDK之前,运行并试用Demo工程相关功能,参考Demo工程的调用和配置的方式。

  1. 双击使用XCode打开 BDSClientSample/BDSClientSample.xcodeproj
  2. 在控制台中新建应用,配置应用的BundleId为工程的BundleId,默认为com.baidu.speech.BDSClientSample
  3. 修改 BDSClientSample/Modules/ASR/ASRViewController.m中的 API_KEY, SECRET_KEY, APP_ID
  4. 确保网络通畅,运行工程

语音识别与唤醒

添加Framework

Framework 描述
libc++.tbd 提供对C/C++特性支持
libz.1.2.5.tbd 提供gzip支持
libsqlite3.0.tbd 提供对本地数据库的支持
AudioToolbox 提供录音和播放支持
AVFoundation 提供录音和播放支持
CFNetwork 提供对网络访问的支持
CoreLocation 提供对获取设备地理位置的支持,以提高识别准确度
CoreTelephony 提供对移动网络类型判断的支持
SystemConfiguration 提供对网络状态检测的支持
GLKit 内置识别控件所需

添加头文件

识别相关

如果只需要使用识别功能,只需要引入如下头文件:

#import "BDSEventManager.h"
#import "BDSASRDefines.h"
#import "BDSASRParameters.h"

唤醒相关

如果需要使用离线唤醒功能,需要引入如下头文件:

#import "BDSWakeupDefines.h"
#import "BDSWakeupParameters.h"

内置识别控件

如果需要使用内置识别控件,需要引入如下头文件:

#import "BDTheme.h"
#import "BDRecognizerViewParamsObject.h"
#import "BDRecognizerViewController.h"
#import "BDRecognizerViewDelegate.h"

添加静态库

SDK提供的是静态库,开发者只需要将库文件拖入工程目录即可。对静态库有以下几点说明:

1. 静态库采用lipo命令将armv7,arm64的静态库合并成的一个通用的库文件,避免开发者在编译不同target时频繁替换的问题;
2. 模拟器版本只支持在线识别,不支持离线识别及唤醒功能;

添加所需资源

提示音文件及识别控件所需主题文件

将开发包中BDSClientResource/ASR/BDSClientResources目录以“create folder references”方式添加到工程的资源Group中,注意使用"create groups"方式添加不能生效

离线识别及唤醒所需资源文件

将开发包中BDSClientResource/ASR/BDSClientEASRResources目录以"create groups"方式添加到工程目录下即可,资源文件说明如下:

文件名 说明
bds_easr_gramm.dat 离线识别引擎语法模式所需语法文件,在开放平台编辑自定义语法文件
bds_easr_basic_model.dat 基础资源文件,用于modelVAD、唤醒、离线语音识别语法模式
bds_easr_wakeup_words.dat 唤醒引擎所需唤醒词文件,在开放平台编辑自定义唤醒词
bds_easr_mfe_dnn.dat 基础资源文件,用于DNNMFE、唤醒、离线语音识别语法模式
bds_easr_mfe_cmvn.dat MFE CMVN文件,用于DNNMFE
bds_easr_dnn_wakeup_model.dat 用于DNNWakeup的模型文件




语音识别

语音识别包含数据上传接口和离在线识别接口,接口概述如下:

1. 创建相关接口对象 (createEventManagerWithName:)
2. 设置代理对象 (setDelegate:)
3. 配置参数 (setParameter:forKey:)
4. 发送预定义指令 (sendCommand:)
5. 参数列表及相关预定义值可参考附录,或相关parameters头文件、defines头文件
  1. 在线语音识别支持识别任意词,离线语音识别仅支持命令词识别(语法模式)。
  2. 单次短语音识别最长限制60秒。

在线识别

// 创建语音识别对象
self.asrEventManager = [BDSEventManager createEventManagerWithName:BDS_ASR_NAME];
// 设置语音识别代理
[self.asrEventManager setDelegate:self];
// 参数配置:在线身份验证
[self.asrEventManager setParameter:@[API_KEY, SECRET_KEY] forKey:BDS_ASR_API_SECRET_KEYS];
//设置 APPID
[self.asrEventManager setParameter:APP_ID forKey:BDS_ASR_OFFLINE_APP_CODE];
// 发送指令:启动识别
[self.asrEventManager sendCommand:BDS_ASR_CMD_START];

识别功能代理

@protocol BDSClientASRDelegate<NSObject>
- (void)VoiceRecognitionClientWorkStatus:(int)workStatus obj:(id)aObj;
@end

语音识别状态、录音数据等回调均在此代理中发生,具体事件请参考Demo工程中对不同workStatus的处理流程。

离在线并行识别

// 创建语音识别对象
self.asrEventManager = [BDSEventManager createEventManagerWithName:BDS_ASR_NAME];
// 设置语音识别代理
[self.asrEventManager setDelegate:self];
// 参数配置:在线身份验证
[self.asrEventManager setParameter:@[API_KEY, SECRET_KEY] forKey:BDS_ASR_API_SECRET_KEYS];
//设置 APPID
[self.asrEventManager setParameter:APP_ID forKey:BDS_ASR_OFFLINE_APP_CODE];
// 参数设置:识别策略为离在线并行
[self.asrEventManager setParameter:@(EVR_STRATEGY_BOTH) forKey:BDS_ASR_STRATEGY];
// 参数设置:离线识别引擎类型
[self.asrEventManager setParameter:@(EVR_OFFLINE_ENGINE_GRAMMER) forKey:BDS_ASR_OFFLINE_ENGINE_TYPE];
// 参数配置:命令词引擎语法文件路径。请从控制台的左侧功能栏进入“离线词&语义设置”模块,根据页面上的引导自行定义词条和语法,并生成bsg文件。下载语法文件后,替换BDS_ASR_OFFLINE_ENGINE_GRAMMER_FILE_PATH参数
[self.asrEventManager setParameter:@"命令词引擎语法文件路径" forKey:BDS_ASR_OFFLINE_ENGINE_GRAMMER_FILE_PATH];
// 参数配置:命令词引擎语言模型文件路径
[self.asrEventManager setParameter:@"命令词引擎语言模型文件路径" forKey:BDS_ASR_OFFLINE_ENGINE_DAT_FILE_PATH];
// 发送指令:加载离线引擎
[self.asrEventManager sendCommand:BDS_ASR_CMD_LOAD_ENGINE];
// 发送指令:启动识别
[self.asrEventManager sendCommand:BDS_ASR_CMD_START];

关于离线识别

注意

在线识别效果远优于离线识别,不推荐使用离线识别。

首次使用离线,SDK将会后台下载离线授权文件,成功后,授权文件有效期(三年)内无需联网。有效期即将结束后SDK将自动多次尝试联网更新证书)。

使用离线识别必须正确配置BDS_ASR_OFFLINE_APP_CODE,并设置BDS_ASR_STRATEGY为离线在线并行。

离线识别 可识别自定义语法规则下的词,如“打电话给王五”,“打开微信”等。

请在语音控制台的左侧功能栏中,进入“离线词&语义设置”模块,根据页面上的引导自行定义词条和语法,并生成bsg文件。下载语法文件后,设置BDS_ASR_OFFLINE_ENGINE_GRAMMER_FILE_PATH参数

具体示例如下:

NSString* gramm_filepath = [[NSBundle mainBundle] pathForResource:@"bds_easr_gramm" ofType:@"dat"];;
NSString* lm_filepath = [[NSBundle mainBundle] pathForResource:@"bds_easr_basic_model" ofType:@"dat"];;
NSString* wakeup_words_filepath = [[NSBundle mainBundle] pathForResource:@"bds_easr_wakeup_words" ofType:@"dat"];;
[self.asrEventManager setDelegate:self];
[self.asrEventManager setParameter:APP_ID forKey:BDS_ASR_OFFLINE_APP_CODE];
[self.asrEventManager setParameter:lm_filepath forKey:BDS_ASR_OFFLINE_ENGINE_DAT_FILE_PATH];
// 请在 (官网)[http://speech.baidu.com/asr] 参考模板定义语法,下载语法文件后,替换BDS_ASR_OFFLINE_ENGINE_GRAMMER_FILE_PATH参数
[self.asrEventManager setParameter:gramm_filepath forKey:BDS_ASR_OFFLINE_ENGINE_GRAMMER_FILE_PATH];
[self.asrEventManager setParameter:wakeup_words_filepath forKey:BDS_ASR_OFFLINE_ENGINE_WAKEUP_WORDS_FILE_PATH];

长语音识别

长语音识别对语音时长无限制,其本质是在本地进行VAD之后,由服务端逐句识别。

[self.asrEventManager setParameter:@(NO) forKey:BDS_ASR_NEED_CACHE_AUDIO];
[self.asrEventManager setParameter:@"" forKey:BDS_ASR_OFFLINE_ENGINE_TRIGGERED_WAKEUP_WORD];
[self.asrEventManager setParameter:@(YES) forKey:BDS_ASR_ENABLE_LONG_SPEECH];
// 长语音请务必开启本地VAD
[self.asrEventManager setParameter:@(YES) forKey:BDS_ASR_ENABLE_LOCAL_VAD];
  1. 使用长语音必须开启本地VAD: BDS_ASR_ENABLE_LOCAL_VAD
  2. 使用长语音必须关闭提示音(Known issue)

VAD

端点检测,即自动检测音频输入的起始点和结束点。SDK默认开启VAD,检测到静音后自动停止识别。 如果需要自行控制识别结束需关闭VAD,请同时关闭服务端VAD与端上VAD:

// 关闭服务端VAD
[self.asrEventManager setParameter:@(NO) forKey:BDS_ASR_ENABLE_EARLY_RETURN];
// 关闭本地VAD
[self.asrEventManager setParameter:@(NO) forKey:BDS_ASR_ENABLE_LOCAL_VAD];

目前SDK支持两种本地端点检测方式。说明如下:

识别策略 说明
ModelVAD 检测更加精准,抗噪能力强,响应速度较慢
DNNMFE 提供基础检测功能,性能高,响应速度快

使用ModelVAD、DNN需通过参数配置开启该功能,并配置相应资源文件(基础资源文件)

ModelVAD

//获取VAD模型的路径
NSString *modelVAD_filepath = [[NSBundle mainBundle] pathForResource:@"bds_easr_basic_model" ofType:@"dat"];
//设置modelVAD的文件路径
[self.asrEventManager setParameter:modelVAD_filepath forKey:BDS_ASR_MODEL_VAD_DAT_FILE];
//设置ModelVAD可用
[self.asrEventManager setParameter:@(YES) forKey:BDS_ASR_ENABLE_MODEL_VAD];

DNNMFE

NSString *mfe_dnn_filepath = [[NSBundle mainBundle] pathForResource:@"bds_easr_mfe_dnn" ofType:@"dat"];
//设置MFE模型文件
[self.asrEventManager setParameter:mfe_dnn_filepath forKey:BDS_ASR_MFE_DNN_DAT_FILE];
NSString *cmvn_dnn_filepath = [[NSBundle mainBundle] pathForResource:@"bds_easr_mfe_cmvn" ofType:@"dat"];
//设置MFE CMVN文件路径
[self.asrEventManager setParameter:cmvn_dnn_filepath forKey:BDS_ASR_MFE_CMVN_DAT_FILE];

DNNMFE 支持设置静音时长(需要同时开启服务端VAD与端上VAD,并且关闭VoiceRecogButtonTouchDown方法中的长语音标识)。设置以下两个参数,单位为帧数,每帧10ms。如需设置为 5s:

[self.asrEventManager setParameter:@(501.f) forKey:BDS_ASR_MFE_MAX_SPEECH_PAUSE];
[self.asrEventManager setParameter:@(500.f) forKey:BDS_ASR_MFE_MAX_WAIT_DURATION];

必须为浮点类型。

语义理解

语义解析可以识别用户的意图并提取用户表述中的关键内容,从而帮助开发者理解用户需求。如“北京天气”,“打电话给张三”等。语义理解包括本地语义和在线语义。

目前仅中文普通话支持语义理解。

使用在线语义,必须设置BDS_ASR_PRODUCT_ID为15373,完整的PRODUCT_ID列表请参考章节PRODUCT_ID

为基础模型的product_id即可。

// 开启离线语义(本地语义)
[self.asrEventManager setParameter:@(YES) forKey:BDS_ASR_ENABLE_NLU]; 
// 开启在线语义
[self.asrEventManager setParameter:@"15373" forKey:BDS_ASR_PRODUCT_ID];

注意:BDS_ASR_PRODUCT_ID参数会覆盖识别语言的设置 如果默认的语义无法满足要求,建议开发者使用UNIT 2.0,拥有完备的语义理解和交互功能。

语音唤醒

语音唤醒,需要配置所需语言模型文件(基础资源文件)及官网导出的自定义唤醒词文件,配置后加载引擎,即可进行开始唤醒。需要注意的是,唤醒引擎开启后会保持录音机为启动状态,用户说出正确的唤醒词后会触发唤醒,通过相关回调反馈给应用程序。

语音唤醒为离线功能,需配置离线授权信息(APP_ID),加载唤醒所需语言模型文件,接口与语音识别接口相同。

基于多种因素考虑,在App进入后台后,唤醒将会被打断。

代码示例

// 创建语音识别对象
self.wakeupEventManager = [BDSEventManager createEventManagerWithName:BDS_WAKEUP_NAME];
// 设置语音唤醒代理
[self.wakeupEventManager setDelegate:self];
// 参数配置:离线授权APPID
[self.wakeupEventManager setParameter:APP_ID forKey:BDS_WAKEUP_APP_CODE];
// 参数配置:唤醒语言模型文件路径, 默认文件名为 bds_easr_basic_model.dat
[self.wakeupEventManager setParameter:@"唤醒语言模型文件路径" forKey:BDS_WAKEUP_DAT_FILE_PATH];
// 发送指令:加载语音唤醒引擎
[self.wakeupEventManager sendCommand:BDS_WP_CMD_LOAD_ENGINE];
//设置唤醒词文件路径
// 默认的唤醒词文件为"bds_easr_wakeup_words.dat",包含的唤醒词为"百度一下"
// 如需自定义唤醒词,请在 http://ai.baidu.com/tech/speech/wake 中评估并下载唤醒词文件,替换此参数
 [self.wakeupEventManager setParameter:@"唤醒词文件路径”forKey:BDS_WAKEUP_WORDS_FILE_PATH]
// 发送指令:启动唤醒
[self.wakeupEventManager sendCommand:BDS_WP_CMD_START];

唤醒功能回调接口

@protocol BDSClientWakeupDelegate<NSObject>
- (void)WakeupClientWorkStatus:(int)workStatus obj:(id)aObj;
@end

唤醒辅助识别

使用唤醒的一种需求场景是唤醒后立刻识别,以唤醒词为百度一下举例,用户可能的输入为百度一下,北京天气怎么样?如果开发者需要对该种场景进行支持,请按如下操作:

  1. 正确配置唤醒引擎,语言模型文件及唤醒词文件,并加载引擎;
  2. 开启唤醒,接收用户语音输入;
  3. 在唤醒的唤醒词触发回调中,配置BDS_ASR_NEED_CACHE_AUDIO为YES到识别引擎,正常识别请将该值设为NO;
  4. 调用识别引擎开启识别过程;
// 如需要唤醒后立刻进行识别,为保证不丢音,启动语音识别前请添加如下配置,获取录音缓存:
[self.asrEventManager setParameter:@(YES) forKey:BDS_ASR_NEED_CACHE_AUDIO];