先看实现效果:

利用百度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快速开发出一款“问答机器人”并接入小程序的更多相关文章

  1. 开发者如何利用工具快速开发出完美APP

    文|移动互联网李建华 微信:ydhlwdyq 传统的个人开发者,要想开发出一个完美的APP要 经过以下几个过程:搭建开发环境,写代码,写统计系统,开发即将完成后,要购买服务器,然后把程序布置到服务器上 ...

  2. Web API应用架构在Winform混合框架中的应用(4)--利用代码生成工具快速开发整套应用

    前面几篇介绍了Web API的基础信息,以及如何基于混合框架的方式在WInform界面里面整合了Web API的接入方式,虽然我们看似调用过程比较复杂,但是基于整个框架的支持和考虑,我们提供了代码生成 ...

  3. Microsoft Tech Summit 2018 课程简述:利用 Windows 新特性开发出更好的手绘视频应用

    概述 Microsoft Tech Summit 2018 微软技术暨生态大会将于10月24日至27日在上海世博中心举行,这也会是国内举办的最后一届 Tech Summit,2019 年开始会以 Mi ...

  4. 百度大脑IOCR财会票据识别技术接入小程序,快速实现财会票据识别

    本文主要介绍iOCR财会票据识别的小程序功能实现. 想了解微信小程序的开发过程,请参看我之前的帖子:<UNIT接入小程序>https://ai.baidu.com/forum/topic/ ...

  5. 微信小程序的功能开发工具跟公众号的差别,小程序是一种减负思维对简单APP是巨大打击

    微信小程序的功能开发工具跟公众号的差别,小程序是一种减负思维对简单APP是巨大打击 摘要: 小程序和公众号最大的区别有如下四点:1.小程序没有粉丝,开发者在后台能看到的只能是累计用户访问数以及实时统计 ...

  6. 打造一款 刷Java 知识的小程序(二)

    学习Java的神器已上线,面向广大Java爱好者! 之前写的一篇:打造一款 刷Java 知识的小程序(一) 一.第二版做了什么? 第一版小程序只具有初级展示功能,知识点都是hardcode在代码里面的 ...

  7. Senparc.Weixin.MP SDK 微信公众平台开发教程(二十一):在小程序中使用 WebSocket (.NET Core)

    本文将介绍如何在 .NET Core 环境下,借助 SignalR 在小程序内使用 WebSocket.关于 WebSocket 和 SignalR 的基础理论知识不在这里展开,已经有足够的参考资料, ...

  8. 利用MVVM设计快速开发个人中心、设置等模块

    我们在做iOS开发过程中,静态页面的开发比开发动态页面更让我们开发者抓狂.因为动态页面通常是一个页面一种cell样式,作为开发者只需要专注于定制好一种样式之后,就可以使用数据填充出较好的界面.而静态c ...

  9. PHP利用百度ai实现文本和图片审核

    之前做平台内容发布审核都是自己构建一套违禁词库,在代码中利用词库判断用户发布的内容,现在可以使用百度ai api完成这个功能.接下来就简单说下怎么做吧: 首先打开百度ai 开发平台 注册一个账号: 注 ...

随机推荐

  1. 并发编程--greenlet与gevent

    什么是greenlet? 虽然CPython(标准Python)能够通过生成器来实现协程,但使用起来还并不是很方便. 与此同时,Python的一个衍生版 Stackless Python实现了原生的协 ...

  2. Java基础常见笔试题总结

    1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行的字节码文件 2.“sta ...

  3. 你真的了解Object源码吗

    欢迎点赞阅读,一同学习交流,有疑问请留言 . GitHub上也有开源 JavaHouse 欢迎star 引入 Object 应该是比较简单的源码了.现在我们来分析一下他.Object 是类层次结构的根 ...

  4. java path

    static{ String path = new Object(){ public String getPath() { return this.getClass().getResource(&qu ...

  5. 原生线程池这么强大,Tomcat 为何还需扩展线程池?

    前言 Tomcat/Jetty 是目前比较流行的 Web 容器,两者接受请求之后都会转交给线程池处理,这样可以有效提高处理的能力与并发度.JDK 提高完整线程池实现,但是 Tomcat/Jetty 都 ...

  6. zabbix自动发现 url 以及对http返回状态码监控实现 告警

    2019-06-04 18:39:12 目的:批量监控业务URL的返回状态码,通过zabbix监控判断业务好坏. 1.zabbix安装 请查看此永久链接:https://www.cnblogs.com ...

  7. 极化码之tal-vardy算法(1)

    继前两节我们分别探讨了极化码的编码,以及深入到高斯信道探讨高斯近似法之后,我们来关注一个非常重要的极化码构造算法.这个算法并没有一个明确的名词,因此我们以两位发明者的名字将其命名为“Tal-Vardy ...

  8. js鼠标划过事件

    js鼠标划过事件一般有两对 onmouseover/onmouseout onmouseenter/onmouseleave 区别: 1.onmouseover/onmouseout 鼠标经过自身会触 ...

  9. redis - redis数据结构与API

    通用命令 keys:遍历所有的key[keys一般不再生产环境使用],时间复杂度O(n) keys * keys he* keys he[h-l]* keys ph? dbsize:计算key的总数, ...

  10. PHP的array_walk和array_map函数实现数组值UTF-8转GBK编码

    在PHP中,array_walk() 和 array_map()两个函数都可以实现对数组中每个值的修改,比如本例就是将数组中所有的值,由UTF-8编码转成GBK编码. 当然,除了这两个函数,也可以用 ...