带有Oracle Digital Assistant和Fn Project的会话式UI

在这里和那里,我们看到许多预测,很快聊天机器人将在用户与其系统之间的通信中扮演关键角色。 我没有水晶球,也不想等待这个“很快”,所以我决定现在就使这些预言成真,看看它的样子。

我正在工作的公司的标志产品是FlexDeploy ,它是一种完全自动化的DevOps解决方案。 FlexDeploy中最流行的活动之一是创建一个发行快照,该快照实际上会构建所有可部署的工件,并使用管道在环境之间部署它们。

因此,我决定在周末玩得开心,并为此操作实现了一个对话式UI,可以与FlexDeploy进行对话从字面上看 。 在工作结束时,我的家人看到我正在和笔记本电脑聊天,他们可以听到类似的声音:

“ Calypso!” 我说。

“嗨,我能为您提供什么帮助?” 就是答案。

“不确定”我测试了她。

“你在开玩笑吧!” 她明白了。

“您可以建立快照吗?” 我问。

“当然,您在想什么版本?”

“ 1001”

她报告说: “为版本1001创建了快照”

“谢谢”

“今天过得愉快。”她松了一口气。

因此,基本上,我将实现以下图表:

对话式使用者介面

作为UI的核心组件,我使用了全新的Oracle产品Oracle Digital Assistant 。 我建立了一种新的技能,可以进行基本的聊天,并实现了一个新的自定义 组件,因此我的机器人可以调用http请求,以使后端系统创建快照。 FlexDeployBot技能以及自定义组件的Node.js源代码的导出
在本文的GitHub 存储库中可以使用custombotcomponent

我将MacBook用作能够听和说的通信设备,并为机器人定义了一个Webhook 通道 ,以便可以向其发送消息并获得带有响应的回调。

在上面的图上看起来很简单。 唯一的问题是,我想将我的聊天机器人的大脑与通信设备的详细信息以及后端系统FlexDeploy的安装/版本的详细信息分离。 我需要一个中间的API层,一个缓冲区,在ODA和外部世界之间放置一些东西。 看起来无服务器功能非常适合这项工作。

对话式使用者介面

作为无服务器平台,我使用了Fn Project 。 它的优点在于,它是一个完全基于Docker容器的无容器平台的无服务器平台,它可以轻松地在我的笔记本电脑(我在本文中所做的工作)或在云中的某个地方(例如在Oracle Kubernetes Engine上) 本地运行

好的,让我们从图的左到右深入了解实现细节。

对话式使用者介面

因此, 侦听器组件,耳朵,可以识别我的语音并将其转换为文本的组件是使用Python实现的

该组件的关键代码片段如下所示(完整的源代码可在GitHub上找到 ):

r = sr.Recognizer()
mic = sr.Microphone()with mic as source:r.energy_threshold = 2000while True:  try:with mic as source: audio = r.listen(source, phrase_time_limit=5)           transcript = r.recognize_google(audio)print(transcript)if active:requests.post(url = URL, data = transcript)time.sleep(5)except sr.UnknownValueError:print("Sorry, I don't understand you")

为什么是Python ? 有很多可用的Python语音识别库,因此您可以使用它们,并选择一个更了解您的口音的库。 我喜欢Python。

因此,一旦听众识别出我的语音,它将调用Fn函数,将该短语作为请求主体传递。

函数sendToBotFn是通过Node.js实现的:

function buildSignatureHeader(buf, channelSecretKey) {return 'sha256=' + buildSignature(buf, channelSecretKey);
}function buildSignature(buf, channelSecretKey) {const hmac = crypto.createHmac('sha256', Buffer.from(channelSecretKey, 'utf8'));hmac.update(buf);return hmac.digest('hex');
}function performRequest(headers, data) {var dataString = JSON.stringify(data);var options = {body: dataString,
headers: headers};request('POST', host+endpoint, options);             
}function sendMessage(message) {let messagePayload = {type: 'text',text: message}let messageToBot = {userId: userId,messagePayload: messagePayload}let body = Buffer.from(JSON.stringify(messageToBot), 'utf8');let headers = {};headers['Content-Type'] = 'application/json; charset=utf-8';headers['X-Hub-Signature'] = buildSignatureHeader(body, channelKey);performRequest(headers, messageToBot);  
}fdk.handle(function(input){ sendMessage(input); return input; 
})

为什么选择Node.js? 不是因为我喜欢。 不。这是因为有关实现自定义Web挂钩通道的 Oracle文档是指Node.js。 他们喜欢。

当聊天机器人响应时,它正在调用Webhook,该Webhook指的是在笔记本电脑上运行的Fn函数receiveFromBotFn
我使用ngrok隧道将侦听localhost:8080的Fn应用程序公开到Internet。 receiveFromBotFn函数也通过Node.js实现:

const fdk=require('@fnproject/fdk');
const request = require('sync-request');
const url = 'http://localhost:4390';
fdk.handle(function(input){  var sayItCall = request('POST', url,{body: input.messagePayload.text,});return input;
})

该功能将http请求发送到在本地运行并监听4390端口的简单Web服务器。

我必须承认,使用Node.js实现类似的事情非常容易。 Web服务器使用Mac OS X本机实用程序说出请求正文中出现的所有内容:

var http = require('http');
const exec = require("child_process").exec
const request = require('sync-request');http.createServer(function (req, res) {let body = '';req.on('data', chunk => {body += chunk.toString();});req.on('end', () => {       exec('say '+body, (error, stdout, stderr) => {});       res.end('ok');});res.end();}).listen(4390);

为了实际调用后端来创建一个快照与FlexDeploy与custombotcomponentFn功能createSnapshotFn的聊天机器人所调用:

fdk.handle(function(input){var res=request('POST',fd_url+'/flexdeploy/rest/v1/releases/'+input+'/snapshot',  {json: {action : 'createSnapshot'},});return JSON.parse(res.getBody('utf8'));
})

该函数很简单,它只是调用FlexDeploy REST API来开始为给定版本构建快照。 它也可以用Node.js实现,但是我将用Java重写它。 我爱Java。 此外,我将实现一个Fn Flow ,而不是一个简单的函数,该流程首先检查给定的发行版是否存在以及该发行版是否有效,然后才为该发行版调用createSnapshotFn函数。 在下一篇文章中。

而已!

翻译自: https://www.javacodegeeks.com/2018/12/conversational-assistant-fn-project.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/344731.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯单片机基础学习00_2

三、功能模块 4、中断系统 中断系统 1)中断的概念:这是大家需要在脑子里有的一个印象,我们大致可以将中断描述成CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生);CPU暂时中…

通信原理速识1:绪论

模块1 通信系统的端到端框架 (一)模拟通信系统 存在的两种变换 1.发送端:把连续信息变换成原始电信号(基带信号)(信源) 接收端:把电信号变换成连续消息(受信)…

atomiclong_想要更快地使用AtomicLong? 等待它。

atomiclong我经常听到Java原子类型(java.util.concurrent.atomic)超级快,可以很好地与高度并发的代码一起使用。 大多数时候,原子以健壮和高效的方式完成其工作。 但是,在某些情况下,原子类型上非托管争用的…

数字信号处理基础知识00

数字信号处理 Digital Signal Processing 离散时间信号与系统分析 Z变换 离散傅立叶变换(DFT) 快速傅立叶变换(FFT) 离散时间系统的结构 IIR滤波器的设计 FIR滤波器的设计 绪论——数字信号处理概述 基本概念:信号定…

Apache Camel 3的工作终于开始了

我们正在开始Apache Camel 3的工作。 我们正在多方面努力改善骆驼并引入新功能。 实际上,Guillaume Nodet的第一项工作实际上是在10月初开始的 ,在那里他通过清理代码库,删除不推荐使用的代码和组件,改进路由引擎和核心中的其他内…

工程电磁场与电磁波第1章——矢量分析

1矢量分析 1.1 矢量代数 1.1.1 矢量加减法 1.1.2 矢量乘积 矢量的标量积:点积 矢量的矢量积:叉积 标量三重积、矢量三重积 1.2 正交坐标系 正交坐标系 正交坐标系的点积、叉积、标量三重积 度量系数 1.2.1 直角坐标系 1.2.2 圆柱坐标系 1.2.3 球坐标…

蓝桥杯扫盲之int, char, unsigned int, unsigned char的使用

一、C51常用数据类型 C语言中默认规则:short int 即为int,long int 即为 long,前面若无unsigned符号默认signed型。 0和1每一个所占空间是一位(b),也是单片机存储器中最小的单位。 1B(字节&…

第十一届 蓝桥杯 单片机设计与开发项目 省赛 程序设计试题及源码

一、试题 1、 基本要求 1.1 使用大赛组委会提供的国信长天单片机竞赛实训平台,完成本试题的程序设计 与调试。 1.2 选手在程序设计与调试过程中,可参考组委会提供的“资源数据包”。 1.3 请注意: 程序编写、调试完成后选手应通过考试系统提交完整、可编译的 Keil 工程文件…

AWS:避免那些“神圣的法案”时刻的一些技巧

云非常棒:几乎100%的可用性,几乎零维护,按需付费,最重要的是,它具有无限的可扩展性。 但是最后两个很容易把你咬回去,把那令人敬畏的事情变成一场噩梦。 有时您会看到类似的故事: …

樊昌信版通信原理期末复习第一章绪论

第1章 绪论 一、知识点梳理 1、通信的目的:传递消息中所包含的信息。 2、消息:是物质或精神状态的一种反映。 3、信息:是消息中包含的有效内容。 4、通信系统的一般模型 信源输入变换器:将非电物理量变成电信号。 发送设备&…

DC/DC开关电源设计

DC/DC开关电源设计视频讲解链接:https://www.bilibili.com/video/BV1Dv411y7jM?t156 一、电源概述 主要内容:线性稳压电源和开关稳压电源的概念理解 1、稳压电源(stabilized voltage supply)是能为负载提供稳定的交流电或直流…

jboss junit_使用junit-drools进行JBoss Drools单元测试

jboss junit最近,我一直在大量使用JBoss Drools进行项目。 我不是Drools专家-我也不太相信这个框架,或者可能不是只相信该项目中的特定用例-我发现很难为基于Drools的业务规则编写简单,可维护的单元测试 。 这就是junit-drools诞生的方式–简…

【从3D点云生成平面图:一种空间划分方法】

文章目录 概要概述实验总结 概要 本文提出了一种从原始传感器数据自动重建室内环境平面图的新方法。现有的方法是通过检测角点并将它们连接起来,以平面图形的形式生成平面图,与此相反,本文采用了一种策略,将空间分解为多边形分区…

数字信号处理基础知识之DFT、DTFT、DFS、FFT基本概念扫盲

一、名词汇总 DFT:离散傅里叶变换(Discrete Fourier Transform); DTFT:离散时间傅里叶变换(Discrete-time Fourier Transform); DFS:离散傅里叶级数,又称离散…

数字基带传输学习笔记00引言

S0 引言 一、是什么 1、什么是数字基带信号? 未经调制的数字信号,所占据频谱从零频或很低频率开始 若信道中传输的是数字信号,则称为数字通信系统。这些信号包含丰富的低频分量,甚至直流分量,称为数字基带信号。 如…

如何在ADF中将参数传递给ActionListener

在某些情况下,需要将值传递给ADF Button的ActionListener。 可以由actionListeners调用的方法只有一个ActionEvent类型的参数。 因此,我将解释如何将参数传递给该bean方法,但是它在方法签名中仅包含一个参数ActionEvent。 我在页面上添加了…

计算机二级公共基础部分学习笔记

1、Rear指向队列最后一个元素的位置 Front指向队列第一个元素的前一个位置 RearFront,要么满,要么空;循环队列元素个数求法; 2、总节点数不同度节点数相加 总节点数度数*对应节点数和1 3、二叉树 前序:根-左-右 中序&…

FPGA初学者入门相关概念知识点

一、基础入门 1、整体理解 简单来说,FPGA 就是“可反复编程的逻辑器件”。 ASIC 和 FPGA 就如同印刷品和白纸 ARM 虽然有很多外设,DSP 虽然具备强大的信号运算能力,但是,ARM 能做的,DSP 能做的,FPGA 一定…

01数字基带信号及其频谱特性

S1 数字基带信号及其频谱特性 一、分类 1、单极性不归零波形 优点:电脉冲之间无间隔,极性单一,易于用TTL,CMOS电路产生; 缺点: a) 有直流成份;判决电平不能稳定在最佳的电平,抗噪声…

人工智能英语学习笔记

基础篇单词 mythology n. ancient myths in general; ideas that many people think are true but that do not exist or are false 神话 Examples: A satyr is half man and half goat in Greek and Roman mythology. 在希腊和罗马神话中,森林之神是半人半羊的样子…