Linux版本DCS SDK开发指南

Linux版本DCS SDK是基于DCS协议的智能设备语音交互开发包,开发者可以通过Linux DCS SDK实现智能设备与DuerOS之间的通信,降低了设备接入DuerOS的开发成本。Linux DCS SDK提供了语音输入、语音输出、扬声器控制、音频播放控制、闹钟设定等功能。此外,Linux DCS SDK具有网络配置、设备配对能力,结合小度之家SDK,可以轻松实现端设备的网络配置和访问授权。

常用功能

Linux DCS SDK常用功能模块包括应用层接口模块、媒体播放器模块、网络配置和设备配对授权模块、录音模块、唤醒模块等。

  • 应用层接口模块

    通过该模块提供的接口可以获取设备信息和对设备进行操控。包括初始化所有模块、控制提示音、控制设备按键、控制灯效、控制音效等。

  • 媒体播放器模块

    通过该模块提供的接口实现对用户注册的媒体播放器进行系统调用。包括音乐播放器、TTS播放器、蓝牙播放器、闹钟提示音播放器等。

  • 网络配置和设备配对授权模块

    提供无线网络配置、配对(设备发现与账户绑定)、DLP等基础功能,这些基础功能需要配合小度之家SDK完成。

  • 录音模块

    提供音频输入接口,音频数据格式为16bit小端,采样率16kHz。默认使用PortAudio库采集音频,也可以根据设备情况创建其他的采集音频方式。

  • 唤醒模块

    提供了内置唤醒引擎,唤醒词为“小度小度”。支持语音唤醒和点触式唤醒,默认使用语音唤醒,可以根据设备情况选择合适的唤醒方式。

  • 自定义指令

    支持设备注册的自定义指令集合。

开发运行环境

注册设备并申请Linux DCS SDK

请在DuerOS设备控制台上注册智能设备,具体流程请参见控制台接入流程

Linux DCS SDK工程

Linux DCS SDK工程目录如下。

  • appresources SampleApp存放资源目录文件。
  • build存放交叉编译工具。
    • build.sh编译脚本。
  • DCSApp目录存放SampleApp源代码。
  • resources目录存放DCS SDK。
  • common.res是唤醒资源文件。
  • config.json是DCS SDK配置文件。
  • xiaoduxiaodu_all_10022017.umdl是唤醒模型文件。
  • sdk是DCS SDK相关头文件和so库。
  • third存放DCS SDK依赖的第三方库文件。

图片

运行环境

硬件环境

Linux DCS SDK的硬件需要满足以下条件。

  • 单核CPU主频不小于1GHz
  • Flash空间不小于128M
  • 内存空间不小于64M
  • 支持浮点运算

软件环境

软件需要具备以下条件。

  • Ubuntu 16.04及以上的64位版本
  • 支持C++11的编译器(推荐使用GNU GCC 4.9.4及以上版本)
  • Cmake 3.6.3及以上版本

第三方开源库

Linux DCS SDK依赖以下第三方开源文件。

  • OpenSSL 1.0.2g
  • zlib 1.2.8
  • Nghttp2 v1.24.0
  • libcurl 7.54.1
  • SQLite3 3200100
  • iconv 1.14

Sample application依赖如下第三方库文件。

  • PortAudio v190600
  • ffmpeg 3.2.7

注:Linux DCS SDK发布套件里面包含了第三方的开源库,不需要开发者准备。

DCS SDK应用示例

创建应用步骤

使用Linux DCS SDK创建DCSSdkApplication一般分为四步。

  1. 修改config.json文件里的设备信息。
  2. 构建DCSSdkApplication应用实例。
  3. 在main.cpp中初始化DCSSdkApplication。
  4. 编译运行DCSSdkApplication。DCSSdkApplication运行成功后,可以与智能设备进行语音交互。

Sample application举例

以Linux DCS SDK中Sample application为例讲解如何创建DCSApplication。Sample application存放在DCSApp目录中。

  1. 修改config.json文件里的设备信息。 打开工程文件resources/config.json,将文件中的clientId替换为在小度智能平台上申请的产品client id信息。其中client id信息可以在基础信息里面查询。
    图片
  2. 构造DCSSdkApplication实例对象。该实例对象的信息存储对象DcsSdkParameters中,对象DcsSdkParameters的定义请参见DcsSdkParameters.h头文件。下面是Sample Application中参数准备及构建DCSSdkApplication实例过程。

    • 配置并创建设备相应的播放器实例。主要包含语音播报播放器、音乐播放播放器、闹钟闹铃播放器、提示音播放器等。
      • 读取SampleApp配置文件。
        Configuration::getInstance()->readConfig()
      • 创建语音播报播放器实例,传入参数为音频设备节点。
        auto speakMediaPlayer = mediaPlayer::TtsPlayerProxy::create(configuration->getTtsPlaybackDevice());
      • 创建音乐播放播放器实例,传入参数为音频设备节点。
        auto audioMediaPlayer = mediaPlayer::MediaPlayerProxy::create(configuration->getMusicPlaybackDevice());
      • 创建闹钟闹铃播放器实例,传入参数为音频设备节点。
        auto alertsMediaPlayer = mediaPlayer::AlertsPlayerProxy::create(configuration->getAlertPlaybackDevice());
      • 创建提示音播放器实例,传入参数为音频设备节点。
        auto localMediaPlayer = mediaPlayer::LocalPlayerProxy::create(configuration->getInfoPlaybackDevice());
      • 创建本地语音合成播放器节点,用于将文字离线转换为语音播报,传入参数为音频设备节点。
        auto localTtsPlayer = mediaPlayer::LocalTtsProxy::create(configuration->getNattsPlaybackDevice());
      • 创建蓝牙播放器,如果硬件设备支持并需要蓝牙播放功能可以创建此实例。
        auto blueToothPlayer = mediaPlayer::BlueToothPlayerProxy::create();
    • 准备SDK初始化的参数。

      duerOSDcsSDK::sdkInterfaces::DcsSdkParameters parameters;
      • SDK配置文件的目录设置。
        parameters.setPathToConfig(PATH_TO_CONFIG);
      • SDK运行时动态写入的配置文件路径设置,启动程序时文件可以不存在,但路径必须有效可写。
        parameters.setPathToRuntimeConfig(PATH_TO_RUNTIME_CONFIG);
      • 设置设备的唯一编号。
        parameters.setDeviceId();
      • 设置TTS的播放器实例。
        parameters.setSpeakMediaPlayer(speakMediaPlayer);
      • 设置音频播放器实例。
        parameters.setAudioMediaPlayer(audioMediaPlayer);
      • 设置闹钟播放器实例。
        parameters.setAlertsMediaPlayer(alertsMediaPlayer);
      • 设置本地提示音播放器实例。
        parameters.setLocalAlarmMediaPlayer(localMediaPlayer);
      • 设置会话状态观察类实例。
        parameters.setDialogStateObservers({applicationManager});
      • 设置连接状态观察类实例。
        parameters.setConnectionObservers(applicationManager);
      • 设置设备相关操作的接口实现类实例。
        parameters.setApplicationImplementation(applicationManager);
      • 设置蓝牙资源播放器实例。
        parameters.setLocalMediaPlayer(blueToothPlayer);
      • 设置SDK内置的唤醒库。
        parameters.setEnableSdkWakeup(true);
        auto voiceAndTouchWakeUpObserver = std::make_shared<VoiceAndTouchWakeUpObserver>();
        parameters.setKeyWordObserverInterface(voiceAndTouchWakeUpObserver);   
        parameters.setLocalTtsMediaPlayer(localTtsPlayer);
        m_dcsSdk = duerOSDcsSDK::sdkInterfaces::DcsSdk::create(parameters);
        if (!m_dcsSdk) {
        bduer::Logger::log_error("Failed to create default SDK handler!");
        return false;
        }
    • 初始化PortAudio录音工具,创建PortAudio录音包装器实例。
      std::shared_ptr<PortAudioMicrophoneWrapper> micWrapper = PortAudioMicrophoneWrapper::create(m_dcsSdk);
    • 启用DuerLink相关功能,如配网过程。
      • 初始化DuerLink相关实例。
        DuerLinkWrapper::getInstance()->initDuerLink();
      • 启用配网相关功能。
        DuerLinkWrapper::getInstance()->startNetworkRecovery();
      • 启用设备发现和DLP(需要配合小度之家SDK进行使用)相关功能。
        DuerLinkWrapper::getInstance()->startDiscoverAndBound(m_dcsSdk->getClientId());
  3. 在main.cpp中初始化DCSApplication。参考Sample Application程序的在入口文件main.cpp,实现工程的初始化。

    • 创建一个DCSApplication实例。
      auto dcsApplication = duerOSDcsApp::application::DCSApplication::create()
    • 通过调用run函数让DCSApplication能持续运行直到退出。
      dcsApplication->run()
  4. 编译及运行。
    • 编译工程
      在工程下执行$sh build.sh build/build.conf,生成相应的XXX_buildout目录。 XXX是平台的名称,如使用Ubuntu平台,生成的文件名称为Ubuntu_buildout。
    • 运行程序
      在XXX_buildout/output目录下,通过命令export $LD_LIBRARY_PATH=./lib设置环境,然后运行程序./duer_linux
      当程序运行成功时,可以通过语音与设备进行交互。通过唤醒词唤醒设备,并发出请求,请求示例如下。

      小度小度,北京今天天气怎么样
      小度小度,今天还有去金华的火车票吗
      小度小度,我想订外卖

常见问题

  1. 如果不使用默认的PortAudio库采集音频,使用其他方式采集音频,该如何实现?
    参照PortAudioMicrophoneWrapper的实现,在采集到音频数据时,通过调用DcsSdk的writeAudioData函数,向DuerOS传送音频数据。

  2. 如何使用点触式唤醒方式。
    首先在调用create函数时,通过函数parametrs.setEnableSdkWakeup(false)禁用SDK语音唤醒功能,然后在触发与DuerOS的每一次交互前,调用notifyOfTapToTalk函数通知DuerOS开始语音识别。

  3. 账号登录失败,日志中出现Peer certificate cannot be authenticated with given CA certificates错误信息,该如何解决?
    Linux DCS SDK通过HTTPS访问DuerOS服务,并需要对应的证书信息,默认证书信息在/etc/ssl/certs/目录下,用户也可以通过在resources/config.json中修改curloptCapath配置指定证书目录,另外设备也需要有同步最新时间的能力,否则证书验证也会失败。

  4. 闹钟功能失效?
    请确认设备是否使用百度账号登录,在小度之家配置后才能使用。

  5. Sample Application调用哪个接口进入配网模式?
    请调用DuerLinkWrapper->startNetworkConfig()接口。