【人像特效】自己动手搭建闲聊机器人
wangwei8638 发布于2020-12 浏览:8391 回复:2
1
收藏
最后编辑于2022-04

      UNIT是百度推出的智能对话定制和服务平台,搭载业界领先的需求理解、对话控制及底层的自然语言处理、知识挖掘等核心技术,可以让您的产品快速拥有对话交互能力。

      UNIT及时推出了丰富的预置技能,开发者可一键获取技能,接入公众号、小程序、硬件产品、虚拟服务机器人等众多产品形态。下面通过简单几步,介绍如何通过百度小程序实现手动搭建闲聊机器人。

1 添加“闲聊”预置技能

1.1进入UNIT主页,点击“进入UNIT”,https://ai.baidu.com/unit/home

1.2 点击“我的技能”选项卡,在预置技能处点击“获取技能”。此处生成的技能ID在后续程序中调用。

1.3 选中“闲聊”,在右侧可以输入对话,初步测试。点击“获取该技能”,即可将该技能加入到我的技能。

2 百度小程序开发过程

2.1下载并安装百度开发者工具:

https://smartprogram.baidu.com/docs/develop/tutorial/install/

2.2小程序开发流程参考开发文档:https://smartprogram.baidu.com/docs/develop/tutorial/startdevelop/

2.3创建项目

在根目录的全局配置文件app.json中增加:"pages/contact/contact" ,会自动创建相关页面文件,结构如下:

contact.js:功能逻辑模块

contact.css:页面样式文件

contact.swan:页面布局文件

contact.json:页面配置文件

3.回复内容个性化干预

UNIT在今年3月份的升级中支持开发者对闲聊技能进行多维度干预。比如根据闲聊中用户问题或闲聊答复的文本、对话行为、情感情绪进行单条件或多条件组合设定干预规则,当用户在闲聊过程中触发了干预规则,则可以对用户输出固定答复、替换答复中的关键词、生产满足特定条件的答复,还可以在答复内容前加上特定的前后缀。可以针对开发者使用场景中的敏感闲聊内容进行灵活高效地干预,从而避免产生影响产品形象、商业目标的闲聊对话行为,从整体上保障、改善产品的人机对话体验。

以询问机器人年龄为例,可以自主设定机器人的年龄。

3.1配置个性化干预规则

3.2发布并生效新模型

3.3测试模型效果

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核心代码

const app = getApp();

var api = require('../../utils/get_token.js');

const recorderManager = swan.getRecorderManager();

const fs = swan.getFileSystemManager();

var inputVal = '';

var msgList = [];

var windowWidth = swan.getSystemInfoSync().windowWidth;

var windowHeight = swan.getSystemInfoSync().windowHeight;

var keyHeight = 0;

var that;

var chatListData = [];

var filePath;

/**

 * 获取token

 */

//header文件

var content_type = "application/json";

//client_id 为官网获取的AK, client_secret 为官网获取的SK

var client_id = '*****************';

var client_secret = '***************';

var tts_token = '';

 

/**

 * 初始化数据

 */

function initData(that) {

  inputVal = '';

  //获取TTS_token

  that.read_token(client_id, client_secret, content_type);

}

 

Page({

 

  /**

   * 页面的初始数据

   */

  data: {

    // 自定义欢迎语的语料

    defaultCorpus: '',

    // 用户输入

    askWord: '',

    // 发送按钮disable

    sendButtDisable: true,

    // 用户信息

    userInfo: {},

    // 对话信息

    chatList: [],

    // 对话滚动标志

    scrolltop: '',

    toView: '',

    // 用户Logo,如果用户不授权,则使用默认图像

    userLogoUrl: '/res/image/user_default.png',

    keyboard: '',

    scrollHeight: '92vh',

    inputBottom: 0,

       value: '',

        focus: true,

        hasResult: false,

        showEmptyResult: false,

        blur: true

  },

 

  /**

   * 生命周期函数--监听页面加载

   */

  onLoad: function (options) {

    initData(this);

    });

 

    that = this;

    // 取得用户信息,把用户头像放入用户Logo中

    app.getUserInfo(function (userInfo) {

      var aUrl = userInfo.avatarUrl;

      if (aUrl != null) {

        that.setData({

          userLogoUrl: aUrl

        });

      }

    });

    // 自定义欢迎语

    // this.sendRequest(this.data.defaultCorpus);

    that.addChat('万众一心,抗击疫情。您可以这样问我:最新确诊病例?', 'l');

  },

 

  /**

   * 生命周期函数--监听页面显示

   */

  onShow: function () {

   swan.setPageInfo({

            title: '智子问答',

            keywords: ' ',

            description: ' ',      

            success: res => {

                console.log('setPageInfo success', res);

            },

            fail: err => {

                console.log('setPageInfo fail', err);

            }

        })

  },

 

  /**

   * 页面相关事件处理函数--监听用户下拉动作

   */

  onPullDownRefresh: function () {},

 

  /**

   * 页面上拉触底事件的处理函数

   */

  onReachBottom: function () {},

 

  /**

   * 获取聚焦

   */

  focus: function (e) {

    keyHeight = e.detail.height;

    this.setData({

      scrollHeight: windowHeight - keyHeight + 'px'

    });

    this.setData({

      toView: 'msg-' + (msgList.length - 1),

      inputBottom: keyHeight + 'px'

    });

    //计算msg高度

    // calScrollHeight(this, keyHeight);

  },

 

  //失去聚焦(软键盘消失)

  blur: function (e) {

    this.setData({

      scrollHeight: '90vh',

      inputBottom: 0

    });

    this.setData({

      toView: 'msg-' + (msgList.length - 1)

    });

  },

 

  // 监听用户输入

  Typing: function (e) {

    var inputVal = e.detail.value;

    var buttDis = true;

    if (inputVal.length != 0) {

      var buttDis = false;

    }

    that.setData({

      sendButtDisable: buttDis

    });

  },

 

   searchFocus(e) {

        this.setData({

            focus: true

        });

    },

    searchInput(e) {

        const value = e.detail.value;

        this.setData({

            value,

            component: [],

            api: [],

            hasResult: false,

            showEmptyResult: false

        });

        if (!value) {

            this.resetResult();

            return false;

        }

 

        if (value.length === 1 && /[a-zA-Z]/.test(value)) {

            this.resetResult();

            return false;

        }

    },

    searchConfirm(e) {

        const value = this.getData('value').replace(/\s/gi, '');

         that.addChat(value, 'r');

          // 请求函数

        that.sendRequest(value);

        if (value) {

            this.setData({

                showEmptyResult: true,

                hasHistory: true

            });

        }

    },

    searchBlur(e) {

        this.setData({

            focus: false

        });

    },

    searchClear() {

        this.setData({

            value: '',

            hasResult: false,

            showEmptyResult: false

        });

    },

 

  // 调用语义接口

  sendChat: function (e) {

    let word = e.detail.value.ask_word ? e.detail.value.ask_word : e.detail.value;

    that.addChat(word, 'r');

    that.setData({

      askWord: '',

      sendButtDisable: true

    });

    // 请求函数

    that.sendRequest(word);

    //  that.voiceAnalysis(word);

  },

  // 发送UNIT网络请求

  sendRequest(corpus) {

    that.read_token(client_id, client_secret, content_type);

    console.log("ok!! tts_token:", tts_token);

    app.NLIRequest(corpus, {

      'success': function (res) {

        if (res.status == "error") {

          swan.showToast({

            title: '返回数据有误!'

          });

          return;

        }

        that.NLIProcess(res);

      },

      'fail': function (res) {

        swan.showToast({

          title: '请求失败!'

        });

        return;

      }

    });

  },

  // 处理语义(拿到回答)

  NLIProcess: function (res) {

 

    var nlires = JSON.parse(res);

    var nliArray = nlires.result.response.action_list[0].say;

    //  var nliArray = nlires.result;

    // console.log(nliArray);

    that.addChat(nliArray, 'l');

    that.tts(nliArray);

    return;

  },

 

  // 显示回答,并滚动到最新位置

  addChat: function (word, orientation) {

    that.addChatWithFlag(word, orientation, true);

  },

  // 显示回答并选择是否滚动到最新位置(true为是,false为否)

  addChatWithFlag: function (word, orientation, scrolltopFlag) {

    let ch = { 'text': word, 'time': new Date().getTime(), 'orientation': orientation };

    chatListData.push(ch);

    var charlenght = chatListData.length;

    if (scrolltopFlag) {

      that.setData({

        chatList: chatListData,

        scrolltop: "roll" + charlenght

      });

    } else {

      that.setData({

        chatList: chatListData

      });

    }

  },

 

  switchInputType: function () {

    this.setData({

      keyboard: !this.data.keyboard

    });

  },

 

 

  // 获取token

  read_token: function (client_id, client_secret, content_type) {

    api.get_token(client_id, client_secret, content_type, {

      'success': function (res) {

        var resData = JSON.parse(res);

        tts_token = resData.access_token;

        //  console.log("[Console log]access_token:" + tts_token);

        return;

      },

      'fail': function (res) {

        swan.showToast({

          title: '请求token失败!'

        });

        return;

      }

    });

  },

});

5.测试效果

收藏
点赞
1
个赞
共2条回复 最后由用户已被禁言回复于2022-04
#3wangwei8638回复于2020-12
#2 用户已被禁言回复
你是百度小程序。 我是微信小程序。 还差QQ、抖音、支付宝小程序示例就齐活了。哈哈哈哈
展开

向大佬学习,O(∩_∩)O哈哈~

0
#2用户已被禁言回复于2020-12

你是百度小程序。

我是微信小程序。

还差QQ、抖音、支付宝小程序示例就齐活了。哈哈哈哈

1
TOP
切换版块