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();
- 读取SampleApp配置文件。
-
准备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; }
- SDK配置文件的目录设置。
- 初始化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());
- 初始化DuerLink相关实例。
- 配置并创建设备相应的播放器实例。主要包含语音播报播放器、音乐播放播放器、闹钟闹铃播放器、提示音播放器等。
-
在main.cpp中初始化DCSApplication。参考Sample Application程序的在入口文件main.cpp,实现工程的初始化。
- 创建一个DCSApplication实例。
auto dcsApplication = duerOSDcsApp::application::DCSApplication::create()
- 通过调用run函数让DCSApplication能持续运行直到退出。
dcsApplication->run()
- 创建一个DCSApplication实例。
- 编译及运行。
- 编译工程
在工程下执行$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()接口。