概述
注:详情可关注微信公众号Deverloper_Taoists
概述
Alexa语音服务允许开发者通过麦克风和扬声器为连接的产品提供语音功能.一旦集成,你的产品将有权访问Alexa内置功能(如音乐播放、定时器和闹钟、快递追踪、电影列表、日历管理等)以及使用Alexa技能工具包开发的第三方技能。AVSDevice SDK 提供基于C ++(11或更高版本)的库,利用 AVS API 为 Alexa 启用的产品创建设备软件。它是模块化和抽象的,提供用于处理离散功能(如语音捕获,音频处理和通信)的组件,每个组件都会显示可以使用和定制的API,用于集成。它还包括一个示例应用程序,演示与AVS的互动
上图说明了构成用于 C++ 的 AVS Device SDK 的组件之间的数据流
Audio Signal Processor:算法处理模块。所应用的算法被设计用于产生干净的音频数据,包括回声消除,波束形成,语音活动检测等。如果存在多麦克风阵列,则 ASP 构建并输出阵列的单个音频流。
SharedData Stream:共享数据流主要有两个作用,1.在发送到 AVS 之前,在ASP、唤醒语引擎ACL之间传递音频数据。2,通过 Alexa 通信库将由 AVS 发送的数据内容,传递给特定能力的代理。
Audio Input Process:用于处理通过 ACL 发送到 AVS 的音频输入。
Alexa Communications Library:提供消息发送和接收功能并建立和维护与AVS的长期持续连接。
Alexa Directive Sequencer Library:AVS指令集,接收从AVS Server接收到的指令,并送给指定的能力集代理处理。
Mediaplayer:语音播放。
主要流程分析
初始化工作(以测试用例SampleApp 为例)
SampleApplication::create函数处理流程(这里列举主要部分)
avs_sdk 函数的入口为main.cpp 的main 函数,主要做了两件事,先是调用函数SampleApplication::create()(这里做个非常非常多的事情),接着调用sampleApplication->run()函数进入循环等待(处理来自控制台的命令输入)。这里我们主要分析create函数做了些什么。
Step1. alexaClientSDK::sampleApp::SampleApplication::create()
参数pathToConfig 指定配置文件路径,指向AlexaClientSDKConfig.json,pathToInputFolder 和唤醒引擎有关,我们这里指向sphinx 唤醒引擎用到的字典,声学模型,语言模型,logLevel指定程序log等级。
Step2. SampleApplication::initialize()函数太长,就不完全贴出来了,只看关键调用。
这里是log设置。
解析AlexaClientSDKConfig.json文件,用于后面connect avs-server.
SpeakMediaPlayer,AudioMediaPlayer,AlertsMediaPlayer关于gstreamer的一堆初始化。前面读取文件AlexaClientSDKConfig.json信息,并将相关信息存储在本地数据库中,下面获取clientId,clientSecret,refreshTotoken,构建AuthDelegate
Creatingthe DefaultClient,这里面做很多事情,暂时只关注创建了那些对象,后续展开。
先认证后面会看到是调用refreshAndNotifyThreadFunction()接着连接亚马逊服务器。其实在AuthDelegate.cpp 以及ACL 模块的HTTP2Transport.cpp中会看到程序会间隔一段时间向亚马逊服务器进行refreshToken 的认证,以及去检测网络连接状态。
创建SDS 以及设置唤醒引擎识别的AudioFormat.
创建wakeWordAudioProvider,SphinxKeyWordDetector检测到唤醒词后,通知keywordObserver接着进入到AudioInputProcess进一步处理先不展开讲述。
Step 3.sampleApplication->run()
这里主要作用就是在程序运行过程中,让用户可以控制程序的部分运行轨迹。
Step 4. DefaultClient::initialize()函数
下面我们继续分析DefaultClient.cpp中相关的初始化工作,从上面的分析可以知道在SampleApplication::initialize()中会构建DefaultClient对象具体如下
同样DefaultClient::initialize()函数也相当的长,下面主要列举关键部分,具体可在github 上看完整代码
这里比较重要,构建DialogUXStateAggregator对象,会话状态观察者,诸如listening,thinking,speaking,idle等。
首先创建附件管理器(创建数据生产者以及数据消费者),m_messageRouter,提供了连接到AVS的认证,协助ACL接收以及发送avsattachments。m_connectionManager创建连接管理器。m_certifiedSender,管理发给AVS的json格式event消息(客户端产生event,服务器产生directive)
创建ExceptionEnconterSender 对象负责处理execption消息(无法处理的指令),创建DirectiveSequencer即指令处理线程。DirectiveSequencer接收到指令后,会将其灌入对应的指令队列,然后根据不同的指令找到不同的能力集CapabilityAgent,然后做响应的处理逻辑。
负责解析Alexa服务器发送过来的数据,并将其转化成对应的指令
会话上下文管理,负责管理每个组件的状态管理,这对每个能力集都是必须的。
首先创建Audio Input Processor.这个用于处理通过 ACL 发送到 AVS 的音频输入。接着添加一个状态观察者。
下面主要就是创建相关的能力集,方便处理服务器发送过来的不同指令,有些能力集若是不需要,也可以干掉,比如对于不带显示器的设备TemplateRuntime就可以裁剪掉。
创建断点连接句柄。亚马逊提供了三个endpoint,分别是https://avs-alexa-na.amazon.com,https://avs-alexa-eu.amazon.com,https://avs-alexa-fe.amazon.com。
细节很多,总感觉描述不玩,先写到这里吧
最后
以上就是淡然咖啡豆为你收集整理的Alexa Sdk学习笔记一的全部内容,希望文章能够帮你解决Alexa Sdk学习笔记一所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复