基于百度理解与交互技术实现机器问答

一、前言

我们都知道现在聊天对话机器是一个很有意思的东西,比如说苹果siri,比如说微软的小冰。

聊天对话机器的应用场景也很广泛,比如说:银行的自助办卡机器人、展会讲解解说等等。

 

我们对机器人说句话,机器人从听取,到语义识别,认知转换,到最后调出我们所想要的东西,这个过程看似简单,其实内藏许多黑科技,让我们来一一解析一下。

 

1、我们对机器人说句话:我想看一下今天的天气?

技术实现:不论是语音、文字,机器首先要采集到我们的问题,语音还需要语音转换的一个过程,且内容转换结果必须准确,否则就有点像不同语言体系的人在对话,有种鸡同鸭讲的感觉,结果肯定也是一个大坑了。

 

2、语义识别

技术实现:通常这个阶段,已经将内容转换为一段文字,程序会对文字进行分词,结合关键字截取拼接语义(这里需要AI的训练)

3、认知转换

技术实现:上述的那就话中,今天是个关键词,天气是个关键词,  在训练库中需要提炼词槽,将可能语句尽可能提供给机器人

 

4、调用结果

当认知转换完成后,需要对关键词进行规则判断,比如说, 想看 + 今天+ 天气,组成时候,自动调用查询天气接口

 

上述的结果,更多需要我们对机器人进行训练,让它学习,要不然结果肯定不是那么友好的。 

 

二、技术需求

 

通过文字输入问题,动态理解转化,识别内容,进行机器解答和语音提示。

PS:上述的需求基本可以理解为你叫机器人做一件事,机器人领悟,按照你的要求执行。

进阶:可以采用语音输入,转换为文字,之后的序列一样。(需要阵列麦克风)

三、技术选型

1、采用C# winform 作为程序主题

2、采用win7 TTS 作为语音朗读功能

3、采用百度理解交互技术 UNIT 作为识别基础

 本篇的重点在于如何对机器UNIT 进行配置与训练(机器识别会理解错误,需要进行纠错),最后的winform 只是调用结果显示,不作为重点关注。

四、实现

1、新建winform 窗体

 

 

2、添加TTS,引用System.Speech

 

 

3、进行 语音朗读测试

 

SpeechSynthesizer voice = new SpeechSynthesizer(); //创建语音实例
           voice.Rate = 2; //设置语速,[-10,10]
           voice.Volume = 100; //设置音量,[0,100]
           voice.SpeakAsync(“您好!”);  //播放指定的字符串,这是异步朗读

 

PS:有些win7 系统TTS 有问题,需要自己百度查找,下载TTS 进行安装。目前上述支持中文,输入英文,只会念字母,因为需要朗读类别做转换,详细请百度speech 操作。

 

 

 4、结合百度理解与交互技术

 

百度提供的sdk 目前只支持android 和IOS,但有提供http API,所以笔者采用C#实现了。

先去官网注册成为百度开发者。

 

(1) 创建应用

 

 (2) 创建场景,场景编号是后面需要用到的

 

 

(3)新建单元,官方提供对话单元和问答单元,我们选择创建对话单元

 

 

 

(4)、对对话单元进行配置,新建词藻

 

 

 

 

新建词藻

 词藻词典有自定义的,也有系统的,本文中选择系统通用的。也可以下载自定义模板,写入自己的自定义词典

 

 

这个对话单元中,有文本回复和执行函数,我们这里选文本回复

触发的规则:会话规则中,上述的词藻已填充,那么文本内容才会出现

 

 

保存完成,后再次新建对话单元,主要说明介绍我们的公司

 

 

 

 

 

 跳转到数据中心,进行新建对话样本

 

 

 

 

 添加

 

 依法将公司介绍关键词添加

 

来的训练与验证板块

输入打开菜单,一开始输入,可能得到错误答案,你要 @UNIT 纠正意图与词槽,手动将关键词和意图、取词、词藻匹配上

 

 

 完成后的结果:

 

(1)、

配置基本参数

/// <summary>

    /// 理解与交互技术UNIT 

    /// </summary>

    public class ConfigUnit

    {

        /// <summary>

        /// Api key

        /// </summary>

        public static String clientId = "";

        // 百度云中开通对应服务应用的 Secret Key

        public static String clientSecret = "";

        //场景Id

        public static string clientSceneId = "";

    }

部分解析实体model

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;


namespace BaiduAIAPI.Model.UnitModel

{

    public class UnitModel

    {


        public long log_id { get; set; }

        public string error_code { get; set; }


        public string error_msg { get; set; }


        public UnitResult result { get; set; }


        public bool IsSuccess { get; set; }


        public string returnSay { get; set; }

    }


    public class UnitResult

    {


        public string session_id { get; set; }

        public List<UnitAction_list> action_list { get; set; }

        public object schema { get; set; }

        public object qu_res { get; set; }

    }

    public class UnitAction_list

    {


        public string action_id { get; set; }

        public object action_type { get; set; }

        public object arg_list { get; set; }

        public object code_actions { get; set; }


        public float confidence { get; set; }


        public object exe_status { get; set; }


        public string main_exe { get; set; }


        public string say { get; set; }


        public object hint_list { get; set; }

        

    }


    /// <summary>

    /// 其余的model 还没补充完整

    /// </summary>

    public class UnitSchema {



    }


}

错误信息定义

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;


namespace BaiduAIAPI.Type

{

   public class BaiduUnitType

    {

        public static string GetErrorCodeToDescription(string errorCode)

        {

            string errorDecrition = "";


            switch (errorCode)

            {


                case "1": errorDecrition = "服务器内部错误,请再次请求, 如果持续出现此类错误,请通过QQ群(224994340)联系技术支持团队。"; break;

                case "2": errorDecrition = "服务暂不可用,请再次请求, 如果持续出现此类错误,请通过QQ群(224994340)或工单联系技术支持团队。"; break;


                case "3": errorDecrition = "调用的API不存在,请检查后重新尝试。"; break;

                case "4": errorDecrition = "集群超限额。"; break;

                case "6": errorDecrition = "无权限访问该用户数据。"; break;

                case "14": errorDecrition = "IAM鉴权失败,建议用户参照文档自查生成sign的方式是否正确,或换用控制台中ak sk的方式调用。"; break;

                case "17": errorDecrition = "每天请求量超限额。"; break;

                case "18": errorDecrition = "QPS超限额。"; break;

                case "19": errorDecrition = "请求总量超限额。"; break;


                case "100": errorDecrition = "无效的access_token参数,请检查后重新尝试。"; break;

                case "110": errorDecrition = "access token无效。"; break;

                case "111": errorDecrition = "access token过期。"; break;

                case "282004": errorDecrition = "请求参数格式不正确。"; break;

                case "282900": errorDecrition = "必传字段为空。"; break;

                case "282901":

                    errorDecrition = "场景ID校验失败,请确认console中app和场景是否关联了:https://console.bce.baidu.com/ai/#/ai/unit/app/list。"; break;

                case "282902":

                    errorDecrition = "UNIT环境启动中,请稍后再试;如果持续出现此类错误,请通过QQ群(224994340)联系技术支持团队。"; break;


                case "282903":

                    errorDecrition = "UNIT系统异常;如果持续出现此类错误,请通过QQ群(224994340)联系技术支持团队。"; break;

                    

                        

                case "282000": errorDecrition = "服务器内部错误,如果您使用的是高精度接口,报这个错误码的原因可能是您上传的图片中文字过多,识别超时导致的,建议您对图片进行切割后再识别,其他情况请再次请求, 如果持续出现此类错误,请通过QQ群(631977213)或工单联系技术支持团队。"; break;

             

                default: errorDecrition = "未知的错误!"; break;

            }


            return errorDecrition;


        }

    }

}

封装的接口方法

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Web.UI.WebControls;

using AOP.Common;

using BaiduAIAPI.Model.UnitModel;

using BaiduAIAPI.Type;


namespace BaiduAIAPI.UNIT

{

    public class UnderstandingAndInteractiveTechnology

    {


        // unit对话接口

        public static UnitModel Unit_Utterance(string token, string sceneId, string query)

        {

            UnitModel result = new UnitModel();

            #region 基础校验

            string error = "";

            if (string.IsNullOrWhiteSpace(token))

            {

                error += "token不能为空!";

            }

            if (string.IsNullOrWhiteSpace(sceneId))

            {

                error += "场景编号不能为空!";

            }


            if (string.IsNullOrWhiteSpace(query))

            {

                error += "询问问题不能为空!";

            }


            if (!string.IsNullOrWhiteSpace(error))

            {

                result.error_msg = error;

                return result;

            }

            #endregion


            string host = "https://aip.baidubce.com/rpc/2.0/solution/v1/unit_utterance?access_token=" + token;

            string str = "{\"scene_id\":" + sceneId + ",\"query\":\"" + query + "\", \"session_id\":\"\"}"; // json格式 

            var tempResult = HttpRequestHelper.Post(host, str);



             result=Json.ToObject<UnitModel>(tempResult);


            if (!string.IsNullOrWhiteSpace(result.error_code))

            {

                result.error_msg = BaiduUnitType.GetErrorCodeToDescription(result.error_code);

                result.IsSuccess = false;

            }

            else

            {

                result.IsSuccess = true;

                result.returnSay = result.result.action_list[0].say;

            }


            return result;

        }

    }

}

首先用单元测试结果:

using System;

using BaiduAIAPI;

using BaiduAIAPI.UNIT;

using Microsoft.VisualStudio.TestTools.UnitTesting;


namespace AIAPIUnitTestProject.BaiduAIAPI

{

    [TestClass]

    public class BaiduUnitTest

    {

        [TestMethod]

        public void TestChat()

        {

            var accessTokenModel = Access_Token.GetAccessToken(ConfigUnit.clientId, ConfigUnit.clientSecret);

            if (accessTokenModel.IsSuccess)

            {

                string queryString = "今天天气怎么样?";

                var tempUnitResult = UnderstandingAndInteractiveTechnology.Unit_Utterance(accessTokenModel.SuccessModel.access_token, ConfigUnit.clientSceneId, queryString);


              


            }


        }

    }

}

确定接口没有问题,结合到我们的Demo程序中,界面代码如下:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

using System.Speech.Synthesis;

using BaiduAIAPI;

using BaiduAIAPI.UNIT;

using BaiduAIAPI.Model.UnitModel;


namespace SpeechDemo

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();



        }


        private void button1_Click(object sender, EventArgs e)

        {

            if (tb_YourSay.Text.Trim() == "")

            {


                MessageBox.Show("请你输入你要说的话!");

                return;

            }

            UnitModel result = new UnitModel();

            var accessTokenModel = Access_Token.GetAccessToken(ConfigUnit.clientId, ConfigUnit.clientSecret);

            if (accessTokenModel.IsSuccess)

            {

                string queryString = tb_YourSay.Text.Trim();

                result = UnderstandingAndInteractiveTechnology.Unit_Utterance(accessTokenModel.SuccessModel.access_token, ConfigUnit.clientSceneId, queryString);

            }

            else

            {

                result.returnSay = result.error_msg;

            }

            tb_RobotSay.Text = result.returnSay;

            SpeechSynthesizer voice = new SpeechSynthesizer();   //创建语音实例

            voice.Rate = 2; //设置语速,[-10,10]

            voice.Volume = 100; //设置音量,[0,100]

           

            voice.SpeakAsync(result.returnSay);  //播放指定的字符串,这是异步朗读

          


        }

    }

}

结果展示

 

 

评价

理解和交互需要做大量的对话样本和语言交互纠错,才可以实现相对比较精准的回答。

相关文章:

  • 基于Accord.Audio和百度语言识别

  • 认识微软Visual Studio Tools for AI

  • 基于Emgu CV+百度人脸识别,实现视频动态 人脸抓取与识别

  • 百度OCR文字识别-身份证识别

  • 微软人工智能和对话平台--知识商城体验

原文地址:http://www.cnblogs.com/linbin524/p/8136799.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

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

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

相关文章

Spark入门(十七)之单表关联

一、单表关联 给出child-parent&#xff08;孩子——父母&#xff09;表&#xff0c;要求输出grandchild-grandparent&#xff08;孙子——祖父母&#xff09;表 二、maven设置 <?xml version"1.0" encoding"UTF-8"?><project xmlns"htt…

P3514-[POI2011]LIZ-Lollipop【思路题】

正题 题目链接:https://www.luogu.org/problemnew/show/P3514 题目大意 一个12序列&#xff0c;若干个询问求有没有一个子串之和为kkk 解题思路 首先感谢ZYCdalaoZYCdalaoZYCdalao的温馨提示。 然后进入正题 首先我们考虑一个串的和为kkk 那么最边的数的情况(1,1),(1,2),(2…

(十)Spring 与 MVC 框架整合

Spring 整合 MVC 目录 MVC 框架整合思想为什么要整合 MVC 框架搭建 Web 运行环境Spring 整合 MVC 框架的核心思路1. 准备工厂2. 代码整合Spring 整合 Struts2MVC 框架整合思想 为什么要整合 MVC 框架 MVC 框架提供了控制器&#xff08;Controller&#xff09;调用 Servlet …

Spark入门(十八)之多表关联

一、多表关联 输入是两个文件&#xff0c;一个代表工厂表&#xff0c;包含工厂名列和地址编号列&#xff1b;另一个代表地址表&#xff0c;包含地址名列和地址编号列。要求从输入数据中找出工厂名和地址名的对应关系&#xff0c;输出"工厂名——地址名"表 二、maven…

利用VSTS跟Kubernetes整合进行CI/CD

为什么VSTS要搭配Kubernetes&#xff1f;通常我们在开发管理软件项目的时候都会碰到一个很头痛的问题&#xff0c;就是开发、测试、生产环境不一致&#xff0c;导致开发人员和测试人员甚至和运维吵架。因为常见的物理环境甚至云环境中&#xff0c;这些部署环境都是由运维人员提…

P3112-[USACO14DEC]后卫马克Guard Mark【贪心】

正题 题目链接:https://www.luogu.org/problemnew/show/P3112 题目大意 有nnn只牛&#xff0c;每只牛有hi,wi,sih_i,w_i,s_ihi​,wi​,si​分别表示有多高&#xff0c;有多重&#xff0c;上面最多承载总共多重的牛。 选择一些牛依次摆放要求高度超过TTT且上面还能增加最重的物…

(十一)Spring 基础注解(对象创建相关注解、注入相关注解)

注解编程 目录 注解基础概念注解的作用Spring 注解的发展历程Spring 基础注解&#xff08;Spring 2.x&#xff09;对象创建相关注解ComponentRepository、Service、ContollerScopeLazy生命周期注解 PostConstruct、PreDestroy注入相关注解用户自定义类型 AutowiredJDK 类型注…

Spark Streaming之统计socket单词数

一、统计socket单词数 侦听TCP套接字的数据服务器接收到的文本数据中的单词数。 二、maven配置 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/…

使用 ASP.NET Core, Entity Framework Core 和 ABP 创建N层Web应用 第二篇

介绍这是“使用 ASP.NET Core &#xff0c;Entity Framework Core 和 ASP.NET Boilerplate 创建N层 Web 应用”系列文章的第二篇。以下可以看其他篇目&#xff1a;使用 ASP.NET Core &#xff0c;Entity Framework Core 和 ASP.NET Boilerplate 创建N层 Web 应用 第一篇 &…

jzoj4786-[NOIP2016提高A组模拟9.17]小a的强迫症【数论】

正题 题目大意 nnn个颜色第iii个个数为numinum_inumi​个&#xff0c;然后要求第iii种颜色的最后一个一定在第i1i1i1种的最后一个前面。求方案总数。 解题思路 首先先定义一个1∼n1\sim n1∼n的序列&#xff0c;然后依次将剩下的数插入。 第iii个颜色有z(∑j1i−1numj)1z(\su…

0-MyBatis简介

MyBatis简介 目录 简介MyBatis 历史MyBatis特点为什么要使用 MyBatis&#xff1f;JDBC 缺点Hibernate 缺点MyBatis简介 MyBatis 历史 MyBatis 原是 apache 的一个开源项目 iBatis&#xff1b;2010年6月这个项目由 apache software foundation 迁移到了 google code&#xf…

揭秘微软6万工程师DevOps成功转型的技术「武器」

在微软&#xff0c;通过其自身数年的 DevOps 转型&#xff0c; 6 万名工程师实现了更好的软件平台创新和快速迭代。微软有庞大的技术产品矩阵&#xff0c;同时也具有每天发布的能力&#xff0c;其中&#xff0c;微软研发云是支撑整个开发过程与运维最重要的基础平台。微软研发云…

jzoj4787-[NOIP2016提高A组模拟9.17]数格子【矩阵乘法】

正题 题目大意 求121\times 212的方块铺满4n4\times n4n的方格方案总数。 解题思路 首先 当计算fnf_nfn​时&#xff0c; 显然最后一排可以(−−−−)(∣∣∣∣)(−−∣∣)(∣−−∣)(∣∣−−)(--\ --)(|\ \ |\ \ |\ \ |)(--\ \ |\ \ |)(|\ \ --\ \ |)(|\ \ |--)(−− −−)…

Flowable学习笔记(一、入门)

转载自 Flowable学习笔记&#xff08;一、入门&#xff09; 一、Flowable简介 1、Flowable是什么 Flowable是一个使用Java编写的轻量级业务流程引擎。Flowable流程引擎可用于部署BPMN 2.0流程定义&#xff08;用于定义流程的行业XML标准&#xff09;&#xff0c; 创建这些流…

01-MyBatis入门程序

MyBatis入门程序 目录 1. 下载 Mybatis 核心包2. 创建工程&#xff0c;引入 MyBatis 核心包及依赖包3. 创建 customer 表&#xff0c;建立与表对应的 domain使用 lombok&#xff0c;开启注解创建 Customer 类4. 创建 MyBatis 核心配置文件 SqlMappingConfig.xml5. 创建表对象…

角落的开发工具集之Vs(Visual Studio)2017插件推荐

“ 工具善其事&#xff0c;必先利其器&#xff01;装好这些插件让vs更上一层楼”因为最近录制视频的缘故&#xff0c;很多朋友都在QQ群留言&#xff0c;或者微信公众号私信我&#xff0c;问我一些工具和一些插件啊&#xff0c;怎么使用的啊&#xff1f;那么今天我忙里偷闲整理一…

jzoj4788-[NOIP2016提高A组模拟9.17]序列【差分,贪心】

正题 题目大意 一个序列AAA可以每次选择一段区间(Ai1)%4(i∈[l..r])(A_{i}1)\%4(i\in [l..r])(Ai​1)%4(i∈[l..r])。求最少次数使其变成BBB序列。 解题思路 先计算出每个数字最少加多少可以变成目标数字记录入aaa数组。 然后若不考虑一个数要取模多次的话答案就是 ∑i1nmax…

02-MyBatis配置SQL打印

MyBatis 配置SQL打印 在 SqlMappingConfig.xml 中配置以下代码&#xff1a; <!--配置sql打印--> <settings><setting name"logImpl" value"STDOUT_LOGGING"/> </settings>运行效果&#xff1a;会显示 SQL 语句&#xff0c;查询结…

Flowable学习笔记(二、BPMN 2.0-基础 )

转载自 Flowable学习笔记&#xff08;二、BPMN 2.0-基础 &#xff09; 1、BPMN简介 业务流程模型和标记法&#xff08;BPMN, Business Process Model and Notation&#xff09;是一套图形化表示法&#xff0c;用于以业务流程模型详细说明各种业务流程。 它最初由业务流程管理…

ASP.NET Core文件上传与下载(多种上传方式)

前言前段时间项目上线,实在太忙,最近终于开始可以研究研究ASP.NET Core了.打算写个系列,但是还没想好目录,今天先来一篇,后面在整理吧.ASP.NET Core 2.0 发展到现在,已经很成熟了.下个项目争取使用吧.正文1.使用模型绑定上传文件(官方例子)官方机器翻译的地址:https://docs.mic…