基于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接口合成音频传入前端

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

 

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

  

 

posted @ 2019-03-26 21:32  屁桃  阅读(1195)  评论(0编辑  收藏  举报