开放能力
开发平台
行业应用
生态合作
开发与教学
资讯 社区 控制台
技术能力
语音技术
图像技术
文字识别
人脸与人体识别
视频技术
AR与VR
自然语言处理
知识图谱
数据智能
场景方案
部署方案
行业应用
智能教育
智能医疗
智能零售
智能工业
企业服务
智能政务
智能农业
信息服务
智能园区
智能硬件
语音技术

    调用流程

    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识别慢,请先关注这几个时间,以排查问题在大概哪一侧。
    上一篇
    简介
    下一篇
    输入参数