實現對話機器人主要有個步驟 :前端
一.前端收集語音傳入後端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 }
二.後端基於百度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
三.對文字進行自定義驗證或經過圖靈端口進行處理,生成回覆內容函數
登陸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
在接入機器人以前能夠自定義回覆,若是信息與自定義的話類似度很高,就返回自定義的結果,反之才向機器人發送信息.
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接口合成音頻傳入前端
第一段的代碼中已經有接收後端信息的代碼.
注意! 最好在火狐瀏覽器中運行.