的技能开发一般来说,开发一个对话系统或者机器人问答系统,会涉及到很多领域的技术,除了硬件系统,还包括语言识别、自然语言处理/识别、知识图谱构建、NaturalLanguageGeneration和TTS广播等,对于企业和个人开发者来说,几乎是一项艰巨的任务。幸运的是,DuerOS等对话式AI操作系统的诞生,让我们可以直接面对业务逻辑,相对轻松地完成语音业务的开发和实现。在以往的研发中,多采用面向接口的设计方法。那么,如何实现会话操作系统的开发呢?接口在OO时,通常会提到SOLID原则:单一职责开闭原则LiskovReplacementInterfaceIsolationDependencyInversion其中,接口隔离是一个重要的原则。接口的概念扩展更为广泛,wiki上的解释如下:接口是计算机系统中两个或多个独立组件交换信息的共享边界。交换可以发生在软件、计算机硬件、外围设备、人以及这些的组合之间。界面从载体上大致可以分为硬件界面和软件界面,从交互上可以分为人机界面和机器-机器(M2M)界面。软件中的接口为组件提供常量、数据类型、过程类型、异常规范和方法签名。有时公共变量也被定义为接口的一部分。接口是一个非常高的抽象层次,经常会涉及到接口,所以要注意上下文和具体的应用场景。在面向对象的编程语言中,尤其是那些不支持多重继承的语言中,它们往往具有特殊的特定含义,接口这个词就成了关键词,比如Java。Java接口中使用的方法一般都是抽象方法和常量,但在Java8及以后的版本中,支持静态成员和默认函数实现,例如:publicinterfaceMyTestInterface{intMAX_STORAGE_SIZE=1024;defaultvoiddoTest(){System.out.println("Hello,Test!");}}尽管如此,作为一个开始使用Java1.2的老程序员来说,Java的发展还是有些慢。关于接口描述语言(IDL),最早出现在CORBA规范中。当我在1999年第一次使用IDL时,它的魔力给我留下了深刻的印象。那时候简直就是跨平台开发的基础。事实上,OMGIDL并不是作为一种编程语言体现在CORBA体系结构中,而是用来描述客户端对象和产生对象调用请求的服务对象之间的接口。IDL文件描述数据类型和方法框架,而服务对象为指定的对象实现提供上述数据和方法。IDL文件一般描述了服务器提供的服务功能,客户端可以根据接口文件中描述的方法向服务器提出服务请求。大多数CORBA产品中都提供了从IDL到相关编程语言的编译器。在Android应用开发中,AIDL其实只是IDL的一个领域应用。那么接口和协议有什么联系和区别呢?protocol协议一般是指通信协议,比如大家熟知的互联网协议——TCP/IP。在编程语言中,协议表示调用者和目标对象之间的交互链。一般的描述是:一个对象可以理解的消息。这些消息可能伴随的参数。这些消息返回的结果类型。尽管修改了对象的状态仍保持不变。对象需要由客户端处理的异常情况。对于通信,还包括方法调用序列和决策点,例如UML交互图中的表示:通信图、序列图、交互概览图/活动图等。在面向对象的编程语言中,也有编程语言使用协议作为关键字的,例如Objective-C。在Objective-C中同样不支持多重继承,即一个类不允许有多个父类,所以Objective-C提供了类似的实现方式,即协议。协议有点类似于Java中的接口,不同的是在协议中,可以提供可选的方法,不需要全部继承。例如:@protocolmyprotocolName-(void)requiredMethod;@optional-(void)anOptionalMethod1;-(void)anOptionalMethodn;-(void)otherOptionalMethod;@required-(void)anotherRequiredMethod;@endObjective-C协议包括正式协议和非正式协议,这里不再赘述。协议和接口在很多情况下是重叠的,但它们有不同的观点。接口面向实体对象,而协议侧重于交互。本质上,任何协议都是由字典和文法构成的通信共识。对于程序员来说,他们往往更关注传输协议和应用协议。传输协议主要完成数据的组装、复用、错误检测和流量控制。应用协议是具体业务的数据和状态描述及内容交互。那么,对话系统如何面向接口和协议进行应用开发呢?DuerOS,对话系统的应用技能开发,是一个对话人工智能交互系统,简称对话AI系统。应用DuerOS的典型产品之一是智能音箱。说到智能音箱上的应用开发,往往会让人联想到使用音箱提供的SDK,比如AndroidSDK或者LinuxSDK,然后将应用下载到音箱上。这种认识在多年前还停留在APP开发阶段,对人工智能操作系统存在很大的误解。可以参考感知人工智能操作系统。在智能音箱等基于DuerOS的设备上,应用的开发与Web服务的开发并无二致。简单来说,智能音箱可以理解为一个浏览器,只不过将原来的鼠标点击和键盘输入换成了语音交互。通过DuerOSBotPlatform(简称DBP)实现智能设备上应用程序的开发。交互协议称为DuerOSConversationService(简称DCS),包括智能终端与DuerOS之间的协议,以及DuerOS与应用服务(Bot)之间的通信。之间的约定。作为开发者,我们主要实现DuerOS与应用服务(Bot)之间的协议。为了方便起见,它也被称为DBP协议。DBP协议分析DBP协议使用HTTP/HTTPS作为传输协议。http的相关内容可以参考温故知新、HTTP/2。DBP协议中应用协议的数据是通过JSON来表达的。RequestandResponse智能音箱上的应用其实就是响应DBP协议中请求的web服务。典型的请求结构示例如下:{"version":"2.0","session":{},"context":{"System":{"user":{},"application":{},"设备“:{“deviceId”:“{{STRING}}”,“supportedInterfaces”:{“VoiceInput”:{},“VoiceOutput”:{},“AudioPlayer”:{},“VideoPlayer”:{},“Display":{}}}},"AudioPlayer":{},"VideoPlayer":{}},"request":{}}session表示用户会话信息,一个会话过程从开始到结束,当userinvokeskills,表示用户与技能之间的一次会话。Context描述了设备的状态数据、能力配置参数和用户相关信息,包括System,即系统参数和播放器状态。request是具体的payload,是AI通过DuerOS处理的用户请求。响应是开发者实现的主要内容。结构示例如下:{"version":"2.0","context":{"intent":{"name":"{{STRING}}","slots":{"{{STRING}}":{}}},"expectResponse":[{}],},"session":{"attributes":{"{{STRING}}":"{{STRING}}"},},"response":{"outputSpeech":{"type":"{{STRING}}","text":"{{STRING}}","ssml":"{{STRING}}",},"reprompt":{"outputSpeech":{"type":"{{STRING}}","text":"{{STRING}}","ssml":"{{STRING}}",}},"card":{}"directives":[],"expectSpeech":{{BOOLEAN}},"shouldEndSession":{{BOOLEAN}}}}Context用于将intent的结果反馈给DuerOS;Intent是技能app认为对本次session进行更合理意图分析的第二次查询,expectResponse用于推断用户可能的回复,DuerOS会在后续查询中优化意图分析模型。有关意图和槽,请参阅感知自然语言理解(NLU)。session存储了DuerOSsession的属性数据。如果这次session没有结束,那么在下一次发送给skill的请求中,session.attributes字段会携带这些属性给skill应用,相当于数据在终端被绕过了。圈。Response是技能应用回复DuerOS的payload,包括语音播报的内容和风格、显示输出和技能命令等。一对Request/Response构成了DBP协议的主体。事件和指令事件和指令是DBP协议中重要的消息形式。智能终端和DuerOS向我们开发的技能应用发送的消息称为事件,技能应用向智能终端和DuerOS发送的消息称为指令。用户语音输入后,DuerOS会对语音请求进行识别和理解,并将理解结果发送给技能应用。定义一个应用技能生命周期的事件有3个:LaunchRequest:表示开启技能应用IntentRequest:相当于进入技能应用的消息处理周期SessionEndedRequest:相当于被动结束技能应用,当然技能应用可以主动退出。智能终端上的处理状态事件通过DuerOS透传给技能应用,主要包括音频播放器audioplayer的音频播放事件集和视频播放器videoplayer的视频播放事件集。对于有屏幕的终端,还包括表单事件,即用户屏幕上的点击事件等。具体来说,音频事件包括:AudioPlayer.PlaybackStarted事件AudioPlayer.PlaybackStopped事件AudioPlayer.PlaybackFinished事件AudioPlayer.PlaybackNearlyFinished事件AudioPlayer.ProgressReportIntervalElapsed事件视频播放事件包括:VideoPlayer.PlaybackStarted事件VideoPlayer.PlaybackStopped事件VideoPlayer.PlaybackVideearFinished事件VideoPlayer.Playback事件ProgressReportIntervalElapsed事件VideoPlayer.ProgressReportDelayElapsed事件VideoPlayer.PlaybackStutterStarted事件VideoPlayer.PlaybackStutterFinished事件VideoPlayer.PlaybackPaused事件VideoPlayer.PlaybackResumed事件VideoPlayer.PlaybackQueueCleared事件PlaybackScheduledStopReached事件Form事件包括Bton.ClickedForton和Formed.Buton等显示控件点击事件。为了方便开发和增强显示形式的表现力,DBP协议还提供了显示卡和显示模板,相关事件包括Display.ElementSelected事件和Display.ButtonClicked事件。对于这些事件的处理,技能应用相当于获取了用户的输入、智能设备的状态和DuerOS的数据,然后以指令的形式完成交互。在对话过程中,技能应用可以发出Dialog.ElicitSlot、Dialog.ConfirmSlot、Dialog.ConfirmIntent、Dialog.Delegate等命令,用于填充和确认slot,确认intent,通知DuerOS处理NLU。在音视频播放中,技能应用可以发出的命令有AudioPlayer.Play和AudioPlayer.Stop通知音频播放器开始和停止播放,VideoPlayer.Play和VideoPlayer.Stop通知视频播放器开始和停止playingVideoPlayer.ClearQueue用于清空播放资源队列。在有屏智能设备上,Form事件处理可以理解为一般的HTML表单处理,显示模板的命令只有一个Hint,用于显示技能应用的引导词。技能引导词是技能展示的提示信息,引导用户与技能应用进行交互。可以为每个技能设计引导词,让用户更快速地使用技能。可以看出DBP协议的主体部分比较简单明了。总结即使您了解协议的格式和内容,自己实现整个DBP协议也需要一定的工作量。幸运的是,DBP平台提供了多种编程语言的SDK,封装了DBP协议的实现。基于这些SDK(Java/JavaScript/Go/PHP/Python),我们的开发变得相对简单,让我们可以专注于应用的业务逻辑。DBP平台还提供了大量的技能开发模板,相当于一个简化的开发框架,让对话式AI系统的技能应用开发变得更加简单。另外,DBP平台提供的小技能开发,可以实现一些简单的技能应用的开发,无需编程。参考资料https://dueros.baidu.com/dbpPughKen,《面向接口的设计》,PragmaticBookshelf,2006WilliamStallings,《数据与计算机通信(第十版)》,电子工业出版社,2015【本文来自专栏作家《旧篇》的原创文章《曹》,作者微信公众号:哦家ArchiSelf,id:wrieless-com】点此阅读更多该作者好文
