基于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 }
二.后端基于百度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
三.对文字进行自定义验证或通过图灵端口进行处理,生成回复内容
登录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接口合成音频传入前端
第一段的代码中已经有接收后端信息的代码.
注意! 最好在火狐浏览器中运行.