zoukankan      html  css  js  c++  java
  • 基于Flask和百度AI实现与机器人对话

    实现对话机器人主要有个步骤 :

      一.前端收集语音传入后端

      二.后端基于百度AI接口进行语音识别,转换成文字

      三.对文字进行自定义验证或通过图灵端口进行处理,生成回复内容

      四.将文字通过百度AI接口合成音频传入前端

    一.前端收集语音传入后端

        先调用浏览器的多媒体对象(代码中的 || 表示针对不同的浏览器),创建一个流媒体容器承载音频内容,这里注意在音频转换成文件后要调用clear方法清空容器,否则会不断叠加,直到溢出内存.

     1     var serv = "http://192.168.11.129:9527";
     2 
     3     var reco = null;
     4     var audio_context = new AudioContext();//创建音频内容对象
     5     navigator.getUserMedia = (navigator.getUserMedia ||
     6         navigator.webkitGetUserMedia ||
     7         navigator.mozGetUserMedia ||
     8         navigator.msGetUserMedia);    //调用浏览器的媒体对象
     9 
    10     navigator.getUserMedia({audio: true}, create_stream, function (err) {   //开启扬声器和麦克风
    11         console.log(err)
    12     });
    13 
    14     function create_stream(user_media) {
    15         var stream_input = audio_context.createMediaStreamSource(user_media); //创建一个流媒体容器
    16         reco = new Recorder(stream_input);
    17     }
    18 
    19     function start_reco() {
    20         reco.record();   //开始录音
    21     }
    22     function stop_reco() {
    23         reco.stop();   //停止录音
    24 
    25         reco.exportWAV(function (wav_file) {
    26             console.log(wav_file);
    27             var formdata = new FormData(); // form 表单 {key:value}
    28             formdata.append("reco", wav_file); // form input type="file"
    29             formdata.append("key", "value");
    30             $.ajax({
    31                 url: serv + "/upload",
    32                 type: 'post',
    33                 processData: false,
    34                 contentType: false,
    35                 data: formdata,
    36                 dataType: 'json',
    37                 success: function (data) {
    38                     console.log(data);
    39                     if (data.code == 0) {
    40                         document.getElementById("player").src = "http://192.168.11.129:9527/get_file/" + data.filename;
    41                         document.getElementById("content").innerText = data.content;
    42 
    43                     }
    44                 }
    45             })
    46         });
    47         reco.clear();  //音频转换成文件以后清空容器
    48     }
    View Code

    二.后端基于百度AI接口进行语音识别,转换成文字

        首先登录ai.baidu.com创建自己的接口(网页中有详细的使用说明),注意将录制的文件转换成.pcm格式,网上有多种方法,我这里使用ffmpeg,audio2text函数将转换后的音频转成文字并返回.

    """ 你的 APPID AK SK """
    APP_ID = '158***'       #调用百度AI语音识别接口
    API_KEY = '*********************'
    SECRET_KEY = '********0ITAFKv****************'
    
    client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
    nlp_client = AipNlp(APP_ID, API_KEY, SECRET_KEY)
    
    
    def get_file_content(filePath):
        os.system(f"ffmpeg -y  -i {filePath}  -acodec pcm_s16le -f s16le -ac 1 -ar 16000 {filePath}.pcm")  #将音频转换成.pcm格式
        with open(f"{filePath}.pcm", 'rb') as fp:
            return fp.read()
    
    
    def audio2text(filePath):
        res = client.asr(get_file_content(filePath), 'pcm', 16000, {
            'dev_pid': 1536,
        })
        
        text = res.get("result")[0]
        
        return text
    View Code

    三.对文字进行自定义验证或通过图灵端口进行处理,生成回复内容

        登录tuling123.com创建自己的机器人并对机器人根据自己的喜好进行设置,将上一步中转换的内容替换到data中,data是机器人可识别的数据格式,最后将取出的内容进行提取,返回有用信息.

    import requests
    def to_tuling(text):  #机器人可识别的数据格式(必须按规定写)
        data = {
            "perception": {
                "inputText": {
                    "text": "北京"
                }
            },
            "userInfo": {
                "apiKey": "0f9368bdbf***********bb1dd79",
                "userId": "123"
            }
        }
        data["perception"]["inputText"]["text"] = text   #将上一步中转换的文字传入机器人可识别的数据格式中
        res = requests.post("http://openapi.tuling123.com/openapi/api/v2", json=data) #接入图灵机器人,并把数据data传入
        res_json = res.json()    #把机器人返回的内容进行json处理
        text = res_json.get("results")[0].get("values").get("text")     #取出需要的内容
    
        return text
    View Code

        在接入机器人之前可以自定义回复,如果信息与自定义的话相似度很高,就返回自定义的结果,反之才向机器人发送信息.

    1 def my_nlp(text):
    2     if nlp_client.simnet(text, '今天天气真好呀').get('score') > 0.85:
    3         A = '你今天也很精神'
    4         return A
    5     A = to_tuling(text)
    6     return A

    四.将文字通过百度AI接口合成音频传入前端

        第一段的代码中已经有接收后端信息的代码.

    注意! 最好在火狐浏览器中运行.

      

  • 相关阅读:
    带参数的装饰器
    python清空文件夹
    sqlalchemy的filter使用
    git pull命令的用法
    通过jenkins打包ipa包报错:Command CodeSign failed with a nonzero exit code(errSecInternalComponent)
    postman上传图片,及接口上传图片
    liunx中crontab没有生效
    liunx正则危险符号“*”星号
    rqalpha的改造工作
    Qt浅谈之一:内存泄露(总结)
  • 原文地址:https://www.cnblogs.com/wangtaobiu/p/10603924.html
Copyright © 2011-2022 走看看