一直想做一个可以录音的可执行JAVA APP,实现自然语言对话。

第一步就是实现把录音转成语义,比如你对着话筒说"你好",你获取回答相应的回复。你对着话筒说“今天的天气”,能够回复你今天的天气,或者至少告诉你,你输入的语句含义是“查今天的天气”。

我决定先测试一下欧拉蜜语义开放平台的内置功能,选择智能对话模块。然后再考虑做自己的APP。

源码下载:欧拉蜜语音识别JAVA SDK包实例源码

该博客使用到的语法也可以在   语法分享和技巧 中找到

开发过程介绍:

1.  写语法
     调用自然语言API接口之前,首先要写自己的语法,也就是你要支持哪些句子,当然你也可以直接使用OLAMI平台提供的内置语法,如果它  的语法符合你的要求的话。我以快递查询模块为例,介绍一下怎么写语法。
1.1 注册

首先在官网上注册,然后进入开发系统中“我的应用”。

12 确定自己的模块

   在正式写语法之前,首先得弄明白怎么写语法,写什么样的语法。

   第一步得选择你的应用程序支持的模块,比如是查天气、播放音乐、还是智能家控制。 
这个模块,其实可以称之为领域,因为你不可能把人类所有的语言都涵盖,你的APP一般都是针对某个或者某几个领域。我选择的是快递APP。所以我要支持的都是快递的说法。

   确定好模块之后,你要思考一下你的应用程序希望从用户的说法中得到哪些有用信息,以及用户会有哪些操作。比如快递查询,我需要有“运单号”,“快递公司名称”这两个有效信息,另外,我的应用程序仅提供快递的查询业务。

   我大致知道如果用户说“帮我查一下圆通快递12344”的时候,包含的有效信息很全,我可以直接输出物流信息给他。但如果用户仅仅说“我想查快递”,这时他仅表达了想查的意愿,我的应用程序应该提示用户输入快递单号。

   在OALMI的语法中,使用”Slot”来抓取有效信息,它就像一个函数的参数,它的内容由用户决定。比如运单号和快递公司名称,每个用户的内容都是不同的。 
   因此进入OLAMI的NLI系统之后,我首先“新增”一个模块,名字为”expressage”,然后进入这个模块开始写语法。

1.3 确定有效信息Slot

   就如上面所述,我需要“运单号”和“快递公司名称”这两个关键信息,因此,我定义了”expnumber”和”expname”这两个Slot.

我选择的类型均为’ext’,因为用户有可能会直接输入运单号,而运单号的格式无法确定,所以我选择ext来抓取。 
    快递公司的名称也是有限的,其实选择internal格式的就可以了,但是我选择后面通过ext赋值的方式给slot赋值,这样有利于语法维护。(很拗口是吧?可以暂时不管)

1.4 确认APP的功能

你的APP准备提供什么功能呢?查询?显示?打开?关闭?OLAMI语法需要用Modifier来描述操作信息。其实也就是一个标志来告诉应用程序这句话的意图是什么。

比如“打开灯”,意图是打开,可以定义一个modifier “open”. 
“打开空调”的意图同样是打开,你只要用沿用已经定义的“open”即可。 
我的快递APP很简单,我就是提供查询功能,因此我定义一个global modifier ‘query’.

1.5. 了解Grammar,Rule,Template.

   其实刚开始只要知道Grammar和Rule就可以了。

   Rule即同义词汇的集合,词汇之间用’|’隔开,表示或的关系。

   Grammar即描述你要匹配的句子的语法。

   比如你希望匹配句子”查询快递”,可以将“查询”的同义词定义一个Rule, “快递”同义词汇定义一个Rule,我建议名称能使用中文就使用中文,这样看起来比较直观。下表中是可以匹配”查询快递”这句话的Grammar相关定义。


名称 类型 内容
查询_动词 Rule 查询|查一下|查查|查
快递_名词 Rule 快递|速递|物流|速运|快运
expname Ext Slot  
expnumber Ext Slot  
查快递1 Grammar <查询动词><快递名词><{@=query}>
查快递名称运单号1 Grammar <查询动词>< expname ><快递名词><{@=query_name_num}>

   你在写Grammar之前要确保Grammar中需要的Rule,Slot,Template已经定义好,并且想好自己的操作modifier. 
   每写好一个Grammar可以通过“例句测试”检查你要支持的句子是不是被当前的Grammar匹配,这个Grammar希望支持的句子都包含进去了,你再提交,然后发布。 
发布之后你才能通过API接口进行访问。

2. 访问自己的应用程序

2.1 你需要从语义理解API接口获取什么信息?


   https的返回,比如status就不再介绍了。

   说白了,开发平台解析你的语法之后,就是会告诉你这句话中的Slot和modifier,以及你的模块名称。 
   Slot根据你选择的类型不同,你获取的内容不同。比如ext类型的,你可以拿到slot的名称和slot的值。

   Datetime类型,即你的Slot是时间,你还可以拿到时间的毫秒数,起始时间等。

   Number类型,表示你只会抓取数字,会得到数字的计算值等。

   Modifier就是你自己定义的要支持的操作,只要按照他们规定的格式命名就好。

2.2 创建应用

   应用可以包含多个模块,具体包含哪些模块也是由你自己决定。OLAMI默认支持了“聊天”,“百科”,“查询日期”三个模块。如果你不需要可以去掉。内置模块的说明见

   点击下图中的配置模块添加自己写的模块和你希望添加的内置模块。比如对话系统模块中的nonsense就是聊天用的。你可以点配置模块右边的”测试”,输入要查询的句子就可以看到结果。

如果测试结果能正确返回,就表明API接口也可以获取同样的结果。

   比如我在输入框中“查快递”就可以看到JSON格式的输出,如下图显示:

2.3 查看应用的key

   这个key就是你访问API 接口的钥匙,在你的应用中点击”查看key”就可以看到了。

2.4 访问自然语言解析API接口

   API接口是https协议,相关说明,我就不再赘述了。

   我使用的是小程序访问,相关代码见下载包的index.js。

至此,OLAMI API 接口的基本调用工作已经完成,至于你要添加语言识别,语法完善,模块添加等就看自己的需求了。

   最后说一下语法文件.osl下载之后如何导入。你创建好模块之后,直接选择上传OSL文件即可。

3. 下载JAVA SDK 

https://cn.olami.ai/wiki/?mp=sdk&content=sdk/java/reference.html

直接下载maven工程java sdk的源代码,这样可以了解一下例子中是如何调用SDK的。

把解约后的olami-java-client-sdk-master文件夹放在你希望放置maven工程的地方,另外确认你的JDK和MAVEN函数已经安装好,我使用的是JDK1.8和MAVEN 3.5, eclipse使用luna版本,打开工程之后,import maven工程


然后错误出现了

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-javadoc-plugin:2.10.1:jar (attach-javadocs) on project langpack: MavenReportException: Error while creating archive:
[ERROR] Exit code: 1 - java.lang.StringIndexOutOfBoundsException: String index out of range: 50
[ERROR] at java.lang.String.substring(String.java:1907)
[ERROR] at sun.net.www.ParseUtil.unescape(ParseUtil.java:164)
[ERROR] at sun.net.www.ParseUtil.decode(ParseUtil.java:200)
[ERROR] at sun.misc.URLClassPath$FileLoader.<init>(URLClassPath.java:1016)
[ERROR] at sun.misc.URLClassPath$3.run(URLClassPath.java:357)
[ERROR] at sun.misc.URLClassPath$3.run(URLClassPath.java:352)
[ERROR] at java.security.AccessController.doPrivileged(Native Method)
[ERROR] at sun.misc.URLClassPath.getLoader(URLClassPath.java:351)

我尝试了以下方法:

------把JDK修改为1.7版本

------把MAVEN版本修改成3.0版本

------把eclipse的eclipse.ini -Xmx 改小

------把eclipse的java环境,window->preferences->java->install JREs 修改为JDK 文件包

------检查pom.xml的配置,务必添加:

<configuration>
<additionalparam>-Xdoclint:none</additionalparam>
</configuration>

反正能测试的方式统统试了,没有用。然后使用公司的电脑,同样的配置,没有任何问题。

后来想是不是我的路由器问题,导致包没有下好,因为我是maven菜鸟啊,开始不知道还有包地址可以查询,于是我按照报错的地址,在我的maven本地工程里找:

C:\Users\Anna\.m2\repository\org\apache\maven\plugins  ,果然没看到此包。幸好家里还有一个路由器,换了以下。然后把C:\Users\Anna\.m2\repository\里的内容全部清空,

重新打开工程编译,或者直接在\...\olami-java-client-sdk-master\olami-java-client-sdk-master 的路径下使用控制台运行mvn install -P all ,整个SDK包就可以运行正常。

所以很多网友说的jdk1.8不支持maven,这种说法是错的,

后面我又有eclipse 的neno版本进行测试,仍然可以正常使用。我想公司的电脑之所以好用,应该是网络可以下载正常。如果你的网不好用,可以在maven配置里设置代理。

4.  运行sdk 源代码里的例子


因为我要测试语音识别,所以选择例子 speech-input-example,直接把SpeechInputExample.java里的appKey和appSerect替换成欧拉蜜平台上自己创建应用的值即可,然后在文件中右键run as->java Application ,   就可以看到输出了。

这个输出的音频源是工程下面的sample.wav. 你可以点开听一听,内容是"你好"。

这个例子展示的是如何将一个完整的wav通过欧拉蜜java sdk转化为语义的过程。

5  windows平台使用java代码进行录音:


实现功能:在java应用程序中调用windows环境的麦克风进行录音,根据欧拉蜜语音识别录音要求 ,wav格式的音频要求WAV 格式的 PCM 录音数据,单声道(mono)、16K 采样率(16 KHz Sample Rate)、16 bits 位深(Bit Resolution)。

代码是示例代码中的

\\olami-java-client-sdk-master\olami-java-client-sdk-master\examples\speech-input-example\src\main\java\ai\olami\example\util\Microphone.java和DataBuffer.java。

6  为录音数据添加wav头


直接录得音频数据必须加上WAV头才能送到sdk接口,加wav头的代码为

\\olami-java-client-sdk-master\olami-java-client-sdk-master\examples\speech-input-example\src\main\java\ai\olami\example\util\WaveFileWriter.java

7 将wav音频使用欧拉蜜语音识别平台识别

示例代码中的 \\olami-java-client-sdk-master\olami-java-client-sdk-master\examples\speech-input-example\src\main\java\ai\olami\example\SpeechInputExample.java。

技术交流

 

代码下载:

CSDN :欧拉蜜语音识别JAVA SDK包实例源码

实例解析: java实现Windows 录音控制智能家居(一)相关推荐

  1. 实例分享--告诉你如何使用语音和自然语言控制智能家居

       ZigBee作为一种短距离.低功耗的无线通信局域网协议,其优点是超低功耗.安全性高和自组网,并且可容纳多个设备,因此在智能家居控制中占有很大的优势.    但是,仅仅使用ZigBee技术来控制家 ...

  2. 实例分享--语音和自然语言控制智能家居

       ZigBee作为一种短距离.低功耗的无线通信局域网协议,其优点是超低功耗.安全性高和自组网,并且可容纳多个设备,因此在智能家居控制中占有很大的优势.    但是,仅仅使用ZigBee技术来控制家 ...

  3. GitChat · 人工智能 | 用语音和自然语言控制智能家居——实例分享

    GitChat 作者:晶晶郭 原文:用语音和自然语言控制智能家居--实例分享 关注公众号:GitChat 技术杂谈,一本正经的讲技术 前言 ZigBee作为一种短距离.低功耗的无线通信局域网协议,其优 ...

  4. java斗地主代码_实例解析java如何实现斗地主代码

    实例解析java如何实现斗地主代码 发布时间:2020-07-20 14:41:41 来源:亿速云 阅读:73 作者:小猪 小编这次要给大家分享的是实例解析java如何实现斗地主代码,文章内容丰富,感 ...

  5. 基于STM32的语言控制智能家居系统

    承接单片机定做 文章目录 前言 一.设计目标及内容: 二.框架思路 三.实现 喜欢请点赞哦! 前言 基于STM32的语言控制智能家居系统,主控使用STM32F103(正点原子战舰板子) 一.设计目标及 ...

  6. 语音对话控制智能家居系统

    语音对话控制智能家居系统 介绍 后端使用到了onenet.讯飞语音.图灵接口 实物图 演示链接(提取码:xszp) 项目源码 转载于:https://my.oschina.net/OneNb/blog ...

  7. 如何使用Logitech Harmony遥控器控制智能家居设备

    On some remotes, you may also have home control buttons that you can use with devices like Philips H ...

  8. 微信玩转开发板-微信控制智能家居简易模型

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 一.项目 ...

  9. STM32F103C8T6 LD3320语音识别模块非特定识别人声 离线控制 智能家居 开发板

    STM32F103C8T6 LD3320语音识别模块非特定识别人声 离线控制 智能家居 开发板 STM32F103C8T6 LD3320语音识别模块非特定识别人声 离线控制 智能家居 开发板 测试单片 ...

最新文章

  1. 33 ES6中的类和对象
  2. 科技/IT:2019 年 Q3 表现最佳和最差的企业
  3. 我的LDAP使用手记(Fedora-ds) 备忘用
  4. python中yield使用
  5. htmlparser解析网页内容代码
  6. Python3实现红黑树[下篇]
  7. c语言可以将负数强制转换成正数吗_C语言笔记(一、概述)
  8. 《Python快速入门》基础知识扫盲课
  9. 视觉开发需要什么程度的数学_软件开发需要学好数学吗?
  10. P3-weixin-2.0.1 版本发布,JAVA微信插件框架
  11. 2018-08-10 Netty:4.x
  12. LordPE关闭重定位 alsr
  13. Xshell v6 Build 0193 绿色特别版及全套产品
  14. 音频名词解释1(zhuanzai)
  15. 常用工具:自媒体视频素材网站,自媒体视频剪辑,自媒体排版工具
  16. Pythonnbsp;异常处理
  17. 遥感测深方法综述(一)遥感测深方兴未艾
  18. 空气动力研究与发展中心计算机所,中国空气动力研究与发展中心报告.pdf
  19. scrapy 项目实战(一)----爬取雅昌艺术网数据
  20. 山东大学单片机原理与应用实验 3.2 拓展并行I/O口实验

热门文章

  1. python抓取网站访客手机号_电商 生意参谋 抓取 访客数据 Python版
  2. 安全 安全 安全……
  3. 如来问:“你们带U盘了么”
  4. LeetCode编程练习题
  5. html 获取用户地理位置,HTML5 geolocation API获得用户当前地理位置
  6. 什么是强化学习?预测股票的效果如何?
  7. 到底什么是股票委托接口?
  8. SAS编程|SDTM-DM人口学域
  9. 北京理工大学计算机调剂非全,北京理工大学信息与电子学院研究生调剂(非全日制)...
  10. BD错误集锦2——VM下的centos启动后无法通过mtputty进行远程登陆