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一般分为四步。
修改config.json文件里的设备信息。
构建DCSSdkApplication应用实例。
在main.cpp中初始化DCSSdkApplication。
编译运行DCSSdkApplication。DCSSdkApplication运行成功后,可以与智能设备进行语音交互。
Sample application举例
以Linux DCS SDK中Sample application为例讲解如何创建DCSApplication。Sample application存放在DCSApp目录中。
修改config.json文件里的设备信息。 打开工程文件resources/config.json,将文件中的clientId替换为在小度智能平台上申请的产品client id信息。其中client id信息可以在基础信息里面查询。
构造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();
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 micWrapper = PortAudioMicrophoneWrapper::create(m_dcsSdk);
启用DuerLink相关功能,如配网过程。
初始化DuerLink相关实例。
DuerLinkWrapper::getInstance()->initDuerLink();
启用配网相关功能。
DuerLinkWrapper::getInstance()->startNetworkRecovery();
启用设备发现和DLP(需要配合小度之家SDK进行使用)相关功能。
DuerLinkWrapper::getInstance()->startDiscoverAndBound(m_dcsSdk->getClientId());
在main.cpp中初始化DCSApplication。参考Sample Application程序的在入口文件main.cpp,实现工程的初始化。
创建一个DCSApplication实例。
auto dcsApplication = duerOSDcsApp::application::DCSApplication::create()
通过调用run函数让DCSApplication能持续运行直到退出。
dcsApplication->run()
编译及运行。
编译工程
在工程下执行$sh build.sh build/build.conf,生成相应的XXX_buildout目录。 XXX是平台的名称,如使用Ubuntu平台,生成的文件名称为Ubuntu_buildout。
运行程序
在XXX_buildout/output目录下,通过命令export $LD_LIBRARY_PATH=./lib设置环境,然后运行程序./duer_linux。
当程序运行成功时,可以通过语音与设备进行交互。通过唤醒词唤醒设备,并发出请求,请求示例如下。
小度小度,北京今天天气怎么样
小度小度,今天还有去金华的火车票吗
小度小度,我想订外卖
常见问题
如果不使用默认的PortAudio库采集音频,使用其他方式采集音频,该如何实现?
参照PortAudioMicrophoneWrapper的实现,在采集到音频数据时,通过调用DcsSdk的writeAudioData函数,向DuerOS传送音频数据。
如何使用点触式唤醒方式。
首先在调用create函数时,通过函数parametrs.setEnableSdkWakeup(false)禁用SDK语音唤醒功能,然后在触发与DuerOS的每一次交互前,调用notifyOfTapToTalk函数通知DuerOS开始语音识别。
账号登录失败,日志中出现Peer certificate cannot be authenticated with given CA certificates错误信息,该如何解决?
Linux DCS SDK通过HTTPS访问DuerOS服务,并需要对应的证书信息,默认证书信息在/etc/ssl/certs/目录下,用户也可以通过在resources/config.json中修改curloptCapath配置指定证书目录,另外设备也需要有同步最新时间的能力,否则证书验证也会失败。
闹钟功能失效?
请确认设备是否使用百度账号登录,在小度之家配置后才能使用。
Sample Application调用哪个接口进入配网模式?
请调用DuerLinkWrapper->startNetworkConfig()接口。