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

调用流程

BDSSDKMessage

BDSSDKMessage 包可以认为是命令的参数,由一个标明意向的name,及其它参数组成,然后通过post函数传递命令。

name 说明
ASR_CMD_CONFIG 设置配置参数
ASR_CMD_START 设置启动参数
ASR_CMD_PUSH_AUDIO 传递音频数据
ASR_CMD_STOP 停止当前当前音频流输入
ASR_CMD_CANCEL 取消当前的整个识别过程

识别调用流程

获取实例

每次识别一个音频流,都需要从获取实例到释放实例完整地执行一遍。即get_instance每个音频流获取一次,不要复用。

get_instance最多可以保持10个实例,即最多同时识别10个音频。

std::string err_msg;
bds::BDSpeechSDK* sdk = bds::BDSpeechSDK::get_instance(bds::SDK_TYPE_ASR, err_msg);

设置回调监听器

设置结果的回调函数。注意回调产生在SDK内部的线程中。

void asr_output_callback(bds::BDSSDKMessage& message, void* user_arg);
sdk->set_event_listener(&asr_output_callback, (void*)& thread_seq);
// 此例中 thread_seq会作为user_arg参数,传入asr_output_callback回调。

设置SDK配置参数

bds::BDSSDKMessage cfg_params;
cfg_params.name = bds::ASR_CMD_CONFIG;
cfg_params.set_parameter(bds::COMMON_PARAM_KEY_DEBUG_LOG_LEVEL, sdk_log_level);
....
bool is_success =sdk->post(cfg_params, err_msg);
// is_success表示设置是否成功,具体错误见err_msg

cfg_params.set_parameter中可以设置的参数列表请见“参数列表:输入配置参数”一节

设置SDK 启动参数

这里只需要填写ASR_PARAM_KEY_APP参数,填写您自定义的应用名称即可,方便百度服务端联调及统计。

bds::BDSSDKMessage start_params;
start_params.name = bds::ASR_CMD_START;
start_params.set_parameter(bds::ASR_PARAM_KEY_APP, "AIPtest");
....
bool is_success =sdk->post(start_params, err_msg);
// is_success表示设置是否成功,具体错误见err_msg

cfg_params.set_parameter中可以的参数列表说明请见“参数列表:输入启动参数”一节

传递音频数据

音频流的音频格式为raw,或者是pcm文件输入流。单声道,16bits, 小端序。

bds::BDSSDKMessage push_params;
push_params.name = bds::ASR_CMD_PUSH_AUDIO;
push_params.set_parameter(bds::DATA_CHUNK, audio_buf, (int)read_cnt); // read_cnt=320
//如果实时音频,此处不需要sleep。如果是文件流,此处需要 sleep , sleep的时长为音频时长。
//即服务端处理一段音频需要等同于音频原始时长的耗时,不能上传过快,否则服务端行为不能预期。
....
bool is_success =sdk->post(push_params, err_msg);
// is_success表示设置是否成功,具体错误见err_msg

每次传递音频的大小可以根据需要来,建议320字节 。

两次音频数据调用请在10s内完成。否则有异常出现。


停止或者暂停流程

停止音频流输入

告诉SDK 音频流已经输入完毕,不再有后续音频。 需要调用以下2行代码:

  1. push_params.set_parameter(bds::DATA_CHUNK, audio_buf, 0)
  2. sdk->post(stop_params, err_msg));
 push_params.set_parameter(bds::DATA_CHUNK, audio_buf, 0);

bds::BDSSDKMessage stop_params;
stop_params.name = bds::ASR_CMD_STOP;
bool is_success = sdk->post(stop_params, err_msg));
// is_success表示设置是否成功,具体错误见err_msg

取消识别

告诉SDK 本次识别取消,即用户不再需要识别结果。

bds::BDSSDKMessage cancel_params;
cancel_params.name = bds::ASR_CMD_CANCEL;
bool is_success = sdk->post(cancel_params, err_msg));
// is_success表示设置是否成功,具体错误见err_msg

在设置的event_listener输出回调中,SDK返回EvoiceRecognitionClientWorkStatusCancel事件

释放资源

  bds::BDSpeechSDK::release_instance(sdk);

与get_instance 对应 SDK不是处于空闲状态(见下面的空闲状态定义),调用 bds::BDSpeechSDK::release_instance可能引起程序出core。

清理所有线程池

所有识别结束,不需要发起新的识别。

SDK空闲时才能执行

bds::BDSpeechSDK::do_cleanup();

其它

SDK空闲状态定义

SDK空闲是指 没有开始识别或者实例产生了以下3个回调后:

  • EVoiceRecognitionClientWorkStatusLongSpeechEnd // 长语音识别过程正常结束
  • EVoiceRecognitionClientWorkStatusError // 发生错误
  • EVoiceRecognitionClientWorkStatusCancel // 用户手动取消当前识别

本次识别的最后一点数据发完之后,并且post了长度为0的数据,并且post了stop命令后,最长(通常都不会超过)12s,sdk就会产生上述3个回调。

不建议用户发送ASR_CMD_CANCEL命令来强制结束识别,如果有需要,也可以这样做;但在没收到上述三个回调状态时,即不是空闲状态调用 bds::BDSpeechSDK::release_instance可能引起程序出core

设置日志

默认日志根据您设置的日志级别输出到stderr中,可以自行指定日志文件。 注意需要在引擎空闲的时候,如一开始执行。 日志需要设置 COMMON_PARAM_KEY_DEBUG_LOG_LEVEL = EVRDebugLogLevelTrace 开启

BDSpeechSDK::open_log_file(const char *logFileName, int fileSize = 0);
  • logFileName 日志的路径
  • fileSize 日志文件的最大size, 实际size为 fileSize *512k

    如果日志文件大于size, SDK会自动将当前日志文件重名名为xxx.bak文件(并删除历史xxx.bak),并新建一个日志文件xxx。所以这样只能最多同时保留两个日志文件。

    您可以根据fileSize参数定期运行一个cron任务,备份xxx.bak文件

BDSpeechSDK::close_log_file();

close_log_file函数与open_log_file配对使用。在引擎空闲的时候,如全部结束后执行。

统计日志格式

开启日志并且日志级别在EVRDebugLogLevelInformation以上。 Sdk日志里带有统计信息,以Statistics开头(s大写),如下示例:

[INFO]-[2017-12-08 15:08:28.598][bds_EventManagerAsr.cpp:307]Statistics info, sn[e89f9705-2ca9-43bb-9790-0328a69ab1f4], sn_cost[11245]ms, response_cost[1085]ms, hard_delay[16]ms, recv_interval:[11229]ms, now:[1512716908598612], recv_first_pack_time:[1512716897352635], recv_last_pack_time:[1512716908582388], audio_len[10.620000]s

其中, 一个sn代表一句话的识别标志logId

  • audio_len: 该句话的音频长度
  • sn_cost :产生这个sn到这个sn对应的语音识别结束耗时, 可近似当作sdk识别该句话的总耗时;
  • recv_interval :为sdk从用户侧接收这句话总的间隔时间, 即recv_first_pack_time和recv_last_pack_time之差
  • response_cost:响应时间,为sdk收到用户post来的该句话的第一个包到第一次给出用户识别结果(可能是部分结果)的耗时;
  • hard_delay :硬延时,类似response_cost,但是是计算最后一个包的。sdk收到用户post来的该句话的最后一个包到给出用户最终识别结果(可能报错信息)的耗时;
  • recv_first_pack_time和recv_last_pack_time:sdk用户post来的该句话的第一包和最后一包的时间点,实际用户每次传递多少数据可能有所不同,且传来时还未分句,但不影响,sdk会回做标记,并计算出每句话的首尾包是哪次传来的,以及传过来的时间点。 通常sn_cost 应该略大于recv_interval,而recv_interval应该近似等于audio_len(时间上),即一句的识别时间和该句话的音频长度相当(略长出几十到几百ms),如果觉得sdk识别慢,请先关注这几个时间,以排查问题在大概哪一侧。