基於Flask和百度AI實現與機器人對話

實現對話機器人主要有個步驟 :前端

  一.前端收集語音傳入後端web

  二.後端基於百度AI接口進行語音識別,轉換成文字ajax

  三.對文字進行自定義驗證或經過圖靈端口進行處理,生成回覆內容json

  四.將文字經過百度AI接口合成音頻傳入前端後端

 

一.前端收集語音傳入後端api

    先調用瀏覽器的多媒體對象(代碼中的 || 表示針對不一樣的瀏覽器),建立一個流媒體容器承載音頻內容,這裏注意在音頻轉換成文件後要調用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接口進行語音識別,轉換成文字app

    首先登陸ai.baidu.com建立本身的接口(網頁中有詳細的使用說明),注意將錄製的文件轉換成.pcm格式,網上有多種方法,我這裏使用ffmpeg,audio2text函數將轉換後的音頻轉成文字並返回.ide

""" 你的 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接口合成音頻傳入前端

    第一段的代碼中已經有接收後端信息的代碼.

 

注意! 最好在火狐瀏覽器中運行.

相關文章
相關標籤/搜索