概述
注:详情可关注微信公众号Deverloper_Taoists
概述
Alexa语音服务允许开发者通过麦克风和扬声器为连接的产品提供语音功能.一旦集成,你的产品将有权访问Alexa内置功能(如音乐播放、定时器和闹钟、快递追踪、电影列表、日历管理等)以及使用Alexa技能工具包开发的第三方技能
AVSDevice SDK 提供基于C ++(11或更高版本)的库,利用 AVS API 为 Alexa 启用的产品创建设备软件。它是模块化和抽象的,提供用于处理离散功能(如语音捕获,音频处理和通信)的组件,每个组件都会显示可以使用和定制的API,用于集成。它还包括一个示例应用程序,演示与AVS的互动
这一节,主要分析从将设备唤醒到把用户输出的语句发送至Alexa Server 这一个过程
发送数据流解析图
简单以SampleApp 数据流向说明一下,首先ASP 有一个线程在不断的从misc中采集数据,并且往SDS这个大buffer里去灌数据,于此同时了,唤醒词处理引擎(WWE),在不断的从SDS里去读取前面灌入的数据,当检测到唤醒词后,逻辑转入到AIP模块。AIP模块会根据WWE模块传入的参数,找到句子的开始与结束,然后通过计算,从SDS中获取正确的语音数据,然后组包通过ACL模块将数据,发送到AlexaServer 中去。
主要流程分析
以SampleAPP 为例
Client->server 数据流程图1
Step 1. PortAudioMicrophoneWrapper::Alg_Process_thread()
Misc相关的设置工作在PortAudioMicrophoneWrapper.cpp中完成,注意channelCount,sampleFormat等参数设置,具体可参见函数boolPortAudioMicrophoneWrapper::initialize()。这里将数据采集放在一个专门的线程Alg_Process_thread里来处理。
主要是将采集到的数据经过ASP处理后写入SDS中。
Step 2. SphinxKeyWordDetector::detectionLoop()
(SphinxKeyWordDetector用的是Sphinx 开源框架,朋友可以参考Alexa自带的)
这里在WWE中开一个线程不断的调用readFromStream从SDS中读取数据,然后将数据放入Sphinx中去检测,如果匹配到modle中的关键词,则调用notifyKeyWordObservers通知AIP模块。我们跟一下notifyKeyWordObserves
这里的keyWordObserver是在SampleApplication::initialize()中传入的也即KeywordObserver对象,继续看
Step 3. SphinxKeyWordDetector:: onKeyWordDetected()
m_client 为DefaultClientl类型的对象,继续看
将speech的beginIndex 与endIndex 传入到AIP中的recognize()函数。进一步调用
AudioInputProcessor::executeRecognize
省去了一大堆,这里根据offset创建相应的reader,然后看
Step 4. ContextManager::updateStatesLoop()
ContextManager,是上下文管理者,m_contextManager->getContext()触发m_contextRequesterQueue入队列操作,执行sendContextToRequesters,
最终返回到AIP。
Step 4. AudioInputProcessor::onContextAvailable()
看一下MessageRequest(),主要是将AIP中的jsonContent 与AttachmentReader赋值给MessageRequest中的成员变量。很重要!!!!
继续看sendRequestNow(),主要逻辑为m_messageSender->sendMessage(),这里的m_messageSender由SampleApplication::initialize()中创建的AVSConnectionManager对象。
m_messageSender->sendMessage(m_recognizeRequest);
也即调用MessageRouter::sendMessage
Step 5. MessageRouter::sendMessage()
关注m_activeTransport->send(),绕了一大圈,最终进入到ACL的HTTP2Transport.cpp 中。
图太大,拆开看看
Client->server 数据流程图2
Step 6. HTTP2Transport::send()
enqueueRequest()将request入队列,如果m_isStopping 为true,则发送网络异常通知。
Step 7. HTTP2Transport:: networkLoop()
这个线程再SampleApplication的initialize()中的connect 函数执行后会调用到HTTP2Transport::connect(),进尔启动networkLoop 线程,首先调用establishConnection()建立连接,接着调用processNextOutgoingMessage()如下图
Step 8. HTTP2Transport:: processNextOutgoingMessage()
首先调用dequeueRequest出队列,然后使用m_authDelegate->getAuthToken(),获取对应的authtoken,
拼凑url, m_avsEndpoint默认取https://avs-alexa-na.amazon.com.createPostStream创建对应的HTTP2Stream。并将stream对应的curhandle放入到m_multi中,以及将stream插入到m_activesStreams中。
Step 9. HTTP2StreamPool::createPostStream()
没什么好说的看initPost实现
Step 10.HTTP2StreamPool::createPostStream ()
重点关注m_transfer.setReadCallback(),这里m_transfer,是CurlEasyHandleWrapper对象。
再看一下readCallback()
里面的attachmentReader是之前在AIP中构建的。调用它的read 的函数获取语音数据。
回到HTTP2Transport::processNextOutgoingMessage()中
看下getCurHandle(),跟下去,
返回的是对应stream的curl handle.因此有数据是readcallback 被调用,然后在networkLoop 中的
m_multi->perform发送给服务器。
最后
以上就是优美宝贝为你收集整理的Alexa Sdk学习笔记二的全部内容,希望文章能够帮你解决Alexa Sdk学习笔记二所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复