利用百度AI快速开发出一款“问答机器人”并接入小程序
先看实现效果:
利用百度UNIT预置的智能问答技能和微信小程序,实现语音问答机器人。这里主要介绍小程序功能开发实现过程,分享主要功能实现的子程序模块,都是干货!
想了解UNIT预置技能调用,请参看我之前的帖子:《UNIT搭建机器人助理》
https://ai.baidu.com/forum/topic/show/953021
想了解微信小程序的开发过程,请参看我之前的帖子:《UNIT接入小程序》https://ai.baidu.com/forum/topic/show/953022
1 系统框架
用到的技术主要有:百度语音识别、语音合成、UNIT语义解析和微信小程序。小程序通过语音识别,将用户的问题提交给百度UNIT,进行语义解析。返回的回答结果通过语音合成,转化为语音,实现与用户的语音交互。全部功能都在小程序客户端完成,不需要服务器,适合个人开发者使用。
2 小程序项目
2.1 程序创建
在根目录的全局配置文件app.json中增加:"pages/contact/contact" ,会自动创建相关页面文件,结构如下:
contact.js:功能逻辑模块
contact.wxss:页面样式文件
contact.wxml:页面布局文件
contact.json:页面配置文件
2.2 小程序录音功能实现
采用微信提供的录音管理器 recorderManager实现录音,录音格式aac。需要注意的是,电脑上的微信开发工具和手机上录音结果文件是不一致的, format设置为 'aac',电脑端的录音是aac格式,手机端录音是m4a格式。由于百度语音识别极速版目前支持微信小程序录音m4a格式,所以上传语音文件时不用转格式,方便许多!
// 获取全局唯一的录音管理器 recorderManager
const recorderManager = wx.getRecorderManager();
// 录音时需要的参数, format设置为aac
const voiceOptions = {
duration: 60000,
sampleRate: 16000,
numberOfChannels: 1,
encodeBitRate: 48000,
format: 'aac',
frameSize: 50
}
// 按钮按下
touchdown: function () {
// 开始录音
recorderManager.start(voiceOptions);
this.setData({
isSpeaking: true,
})
that.speaking.call();
console.log("[Console log]:Touch down!Start recording!");
},
// 停止录音,会触发onStop事件
touchup: function () {
recorderManager.stop(voiceOptions)
console.log("[Console log]:Touch up!Stop recording!");
this.setData({
isSpeaking: false,
speakerUrl: '/res/image/speaker.png',
})
clearInterval(that.speakerInterval);//定时器停止
},
// 添加录音停止触发事件,这段代码可以放到onLoad()里,页面加载的时候就添加上
recorderManager.onStop((res) => {
const { tempFilePath, fileSize } = res
//录音完成调用语音识别API
this.sendAsrRequest(res.tempFilePath, res.fileSize);
});
2.3 小程序语音播放功能实现
需要注意的是:小程序自身录音,用wx.playVoice()函数播放不了,要用到innerAudioContext。
//微信语音播放,
play: function (e) {
const innerAudioContext = wx.createInnerAudioContext()
innerAudioContext.autoplay = true
innerAudioContext.src = filePath
innerAudioContext.onPlay(() => {
console.log('开始播放')
})
innerAudioContext.onError((res) => {
console.log(res.errMsg)
console.log(res.errCode)
})
},
3 调用语音识别极速版API
3.1 首先要在控制台创建应用,调用语音识别极速版API,“获取API Key/Secret Key”。
接口文档地址:https://ai.baidu.com/docs#/ASR-API-PRO/top
请求URL: https://vop.baidu.com/pro_api
3.2 语音识别功能实现
//发送语音识别请求,传入语音文件路径及长度,len为录音结束返回的字节长度:res.fileSize。
ASRRequest: function (tempFilePath,len,arg) { // corpus是要发送的对话;arg是回调方法
var that = this;
// appkey
var appkey = that.globalData.NLPAppkey;
// appsecret
var appSecret = that.globalData.NLPAppSecret;
var api = "nli";
var timestamp = new Date().getTime();
var voice0 = fs.readFileSync(tempFilePath, "base64");
console.log("[Console log]voice:" + voice0);
console.log("[Console log]len:" + len);
var rqJson = {
'dev_pid': 80001,
'format': 'm4a',
'rate': 16000,
'token': '填入获得的token ',
'cuid': '填入cuid ',
'channel': 1,
'len': len,
'speech': voice0
};
var rq = JSON.stringify(rqJson);
console.log(rq);
var ASRUrl = that.globalData.ASRUrl;
// cusid是用来实现上下文的,可以自己随意定义内容,要够长够随机
var cusid = that.globalData.NLPCusid;
console.log("[Console log]:ASRRequest(),URL:" + ASRUrl);
wx.request({
url: ASRUrl,
data: rq,
header: { 'content-type': 'application/json' },
method: 'POST',
success: function (res) {
var resData = res.data;
console.log("[Console log]:ASTRequest() success...");
console.log("[Console log]:Result:" + resData);
var nli = JSON.stringify(resData);
// 回调函数,解析数据
typeof arg.success == "function" && arg.success(nli);
},
fail: function (res) {
console.log("[Console log]:ASRRequest() failed...");
console.error("[Console log]:Error Message:" + res.errMsg);
typeof arg.fail == "function" && arg.fail();
},
complete: function () {
console.log("[Console log]:ASRRequest() complete...");
typeof arg.complete == "function" && arg.complete();
}
})
},
4 调用UNIT接口,获得回答
4.1 首先要在控制台创建应用,调用UNIT接口,“获取API Key/Secret Key”。
接口文档地址:https://ai.baidu.com/docs#/UNIT-v2-API/top
请求URL: https://aip.baidubce.com/rpc/2.0/unit/bot/chat
4.2 程序实现
NLIRequest: function (corpus, arg) { // corpus是要发送的对话;arg是回调方法
var that = this;
// appkey
var appkey = that.globalData.NLPAppkey;
// appsecret
var appSecret = that.globalData.NLPAppSecret;
var api = "nli";
var timestamp = new Date().getTime();
var rqJson = {
"bot_session": "",
"log_id": "7758521",
"request": {
"bernard_level": 0,
"client_session": "{\"client_results\":\"\", \"candidate_options\":[]}",
"query": corpus,
"query_info": {
"asr_candidates": [],
"source": "KEYBOARD",
"type": "TEXT"
},
"updates": "",
"user_id": "88888"
},
"bot_id": "64053",
"version": "2.0"
};
var rq = JSON.stringify(rqJson);
var nliUrl = that.globalData.NLPUrl;
// cusid是用来实现上下文的,可以自己随意定义内容,要够长够随机
var cusid = that.globalData.NLPCusid;
console.log("[Console log]:NLIRequest(),URL:" + nliUrl);
wx.request({
url: nliUrl,
data: rq,
header: { 'content-type': 'application/x-www-form-urlencoded' },
method: 'POST',
success: function (res) {
console.log("[Console log]:res:"+ res);
var resData = res.data;
console.log("[Console log]:NLIRequest() success...");
console.log("[Console log]:Result:");
console.log("[Console log]:resData:"+resData);
var nli = JSON.stringify(resData);
console.log("[Console log]:nli:" + nli);
// 回调函数,解析数据
typeof arg.success == "function" && arg.success(nli);
},
fail: function (res) {
console.log("[Console log]:NLIRequest() failed...");
console.error("[Console log]:Error Message:" + res.errMsg);
typeof arg.fail == "function" && arg.fail();
},
complete: function () {
console.log("[Console log]:NLIRequest() complete...");
typeof arg.complete == "function" && arg.complete();
}
})
},
5 调用语音合成API
5.1 首先要在控制台创建应用,调用语音合成API,“获取API Key/Secret Key”。
接口文档地址:https://ai.baidu.com/docs#/TTS-API/top
请求URL: https://tsn.baidu.com/text2audio
5.2 程序实现
// 语音合成
tts: function (e) {
console.log("[Console log]tts:" + e);
var tex = encodeURI(e);//转换编码url_encode UTF8编码
var tok = "填入获得的token";
var cuid = app.globalData.NLPCusid;
var ctp = 1;
var lan = "zh"; // zh表示中文
// 字符编码
var spd = 5; // 表示朗读的语速,9代表最快,1是最慢(撩妹请用2,绕口令请用9)
var url = "https://tsn.baidu.com/text2audio?tex=" + tex + "&lan=" + lan + "&cuid=" + cuid + "&ctp=" + ctp + "&tok=" + tok + "&spd=" + spd
wx.downloadFile({
url: url,
success: function (res) {
console.log(res)
filePath = res.tempFilePath;
// 只要服务器有响应数据,就会把响应内容写入文件并进入 success 回调
if (res.statusCode === 200) {
//小程序自身录音,用playVoice播放不了,要用innerAudioContext
/* wx.playVoice({
filePath: res.tempFilePath
})*/
var filepath = res.tempFilePath;
console.log(filepath);
const innerAudioContext = wx.createInnerAudioContext();
innerAudioContext.src = filepath;
innerAudioContext.onPlay(() => {
console.log('开始播放')
});
innerAudioContext.onError((res) => {
console.log(res.errMsg)
console.log(res.errCode)
});
innerAudioContext.play();
}
}
})
},
作者:wangwei8638
利用百度AI快速开发出一款“问答机器人”并接入小程序的更多相关文章
- 开发者如何利用工具快速开发出完美APP
文|移动互联网李建华 微信:ydhlwdyq 传统的个人开发者,要想开发出一个完美的APP要 经过以下几个过程:搭建开发环境,写代码,写统计系统,开发即将完成后,要购买服务器,然后把程序布置到服务器上 ...
- Web API应用架构在Winform混合框架中的应用(4)--利用代码生成工具快速开发整套应用
前面几篇介绍了Web API的基础信息,以及如何基于混合框架的方式在WInform界面里面整合了Web API的接入方式,虽然我们看似调用过程比较复杂,但是基于整个框架的支持和考虑,我们提供了代码生成 ...
- Microsoft Tech Summit 2018 课程简述:利用 Windows 新特性开发出更好的手绘视频应用
概述 Microsoft Tech Summit 2018 微软技术暨生态大会将于10月24日至27日在上海世博中心举行,这也会是国内举办的最后一届 Tech Summit,2019 年开始会以 Mi ...
- 百度大脑IOCR财会票据识别技术接入小程序,快速实现财会票据识别
本文主要介绍iOCR财会票据识别的小程序功能实现. 想了解微信小程序的开发过程,请参看我之前的帖子:<UNIT接入小程序>https://ai.baidu.com/forum/topic/ ...
- 微信小程序的功能开发工具跟公众号的差别,小程序是一种减负思维对简单APP是巨大打击
微信小程序的功能开发工具跟公众号的差别,小程序是一种减负思维对简单APP是巨大打击 摘要: 小程序和公众号最大的区别有如下四点:1.小程序没有粉丝,开发者在后台能看到的只能是累计用户访问数以及实时统计 ...
- 打造一款 刷Java 知识的小程序(二)
学习Java的神器已上线,面向广大Java爱好者! 之前写的一篇:打造一款 刷Java 知识的小程序(一) 一.第二版做了什么? 第一版小程序只具有初级展示功能,知识点都是hardcode在代码里面的 ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(二十一):在小程序中使用 WebSocket (.NET Core)
本文将介绍如何在 .NET Core 环境下,借助 SignalR 在小程序内使用 WebSocket.关于 WebSocket 和 SignalR 的基础理论知识不在这里展开,已经有足够的参考资料, ...
- 利用MVVM设计快速开发个人中心、设置等模块
我们在做iOS开发过程中,静态页面的开发比开发动态页面更让我们开发者抓狂.因为动态页面通常是一个页面一种cell样式,作为开发者只需要专注于定制好一种样式之后,就可以使用数据填充出较好的界面.而静态c ...
- PHP利用百度ai实现文本和图片审核
之前做平台内容发布审核都是自己构建一套违禁词库,在代码中利用词库判断用户发布的内容,现在可以使用百度ai api完成这个功能.接下来就简单说下怎么做吧: 首先打开百度ai 开发平台 注册一个账号: 注 ...
随机推荐
- yum运行报错:libcurl.so.4: cannot open shared object file: No such file or directory
/usr/lib64/目录下存在libcurl.so.4文件 CURL的动态库找不到,这里我们加入到ld.so.conf [root@localhost bin]# vim /etc/ld.so.c ...
- .net core 学习 读取配置文件
在空项目中是没有配置文件的,首先要新建一个,配置文件内容如下,下面来读取各个内容 { "ConnectionStrings": { "DefaultConnection& ...
- Linux集群介绍、keepalived介绍及配置高可用集群
7月3日任务 18.1 集群介绍18.2 keepalived介绍18.3/18.4/18.5 用keepalived配置高可用集群扩展heartbeat和keepalived比较http://blo ...
- Django2.2 Templates 页面渲染 数据列表跳转 以及简单的页面模块继承
声明:本博客用的为pycharm Django2.2,基于此内容,会简单讲解 数据库传参形式的增删查改(完整小项目) 路由的 位置参数.关键字参数.以及html中反向解析路由 request的表单传递 ...
- 使用jieba分析小说太古神王中,男主更爱谁?去文章中找答案吧!#华为云·寻找黑马程序员#
欢迎添加华为云小助手微信(微信号:HWCloud002 或 HWCloud003),输入关键字"加群",加入华为云线上技术讨论群:输入关键字"最新活动",获取华 ...
- Kafka 安装配置 及 简单实验记录
1. 下载二进制文件并解压,并修改 broker.id 的值 wget http://apache.fayea.com/kafka/0.10.0.0/kafka_2.10-0.10.0.0.tgz - ...
- Java修炼——容器HashMap用法
直接上代码,容器集合之间的关系在后面我会继续详细分析,这次先看HashMap用法 HashMap的方法都在代码中有解释.有需要的可以仔细看看 package com.bjsxt.map; import ...
- [TimLinux] django 全局变量在WSGI多进程多线程环境中的研究
场景1: 2个进程,每个进程1个线程,请求函数中设置了10秒sleep,9个请求同一URL: 结果: 1. 全局变量ID值,在每一个进程中相同,不同进程中不相同 2. 并行只能接受2个请求,同时发起多 ...
- LightOJ 1344 Aladdin and the Game of Bracelets
It's said that Aladdin had to solve seven mysteries before getting the Magical Lamp which summons a ...
- UVA-11107 Life Forms(求出现K次的子串,后缀数组+二分答案)
题解: 题意: 输入n个DNA序列,你的任务是求出一个长度最大的字符串,使得它在超过一半的DNA序列中出现.如果有多解,按照字典序从小到大输入所有解. 把n个DNA序列拼在一起,中间用没有出现过的字符 ...