第七篇:wed版语音机器人
wed版语音机器人:
GitHub项目地址:https://github.com/Yang915/WebToy
特别说明:该项目在本机测试,通过浏览器调用系统麦克风(https请求),实际环境在Firefox进行127.0.0.1本机回环测试,其他浏览器不确保正常运行!!!
项目目录说明:

项目主程序:main.py
import os
from flask import Flask, render_template, request from BP_get_answer import app_get_answer # 返回应答语音的蓝图模块 app = Flask(__name__)
app.debug = True app.register_blueprint(app_get_answer) # 注册蓝图 @app.route('/ai_uploader', methods=['GET', 'POST'])
def answer():
# 接收前端发来的语音消息,并指定路径保存
reco_file = request.files.get('reco')
# 调用uuid三方模块生成唯一文件名
from uuid import uuid4
filename = f'{uuid4()}.wav' filepath = os.path.join(os.path.dirname(__file__), 'audio', 'questions', filename)
reco_file.save(filepath)
# print('语音问题保存路径:',filepath) # 调用语音识别模块,对语音信息进行格式转换保存在指定目录,然后进行识别,得到文字信息
from ASR import asr
text_question = asr(filepath)
# print('语音问题文本',text_question) # 调用自然语言处理模块,对文字信息进行处理,得到回复文字信息
from NLP import nlp
text_answer = nlp(text_question)
# print('语音回答文本',text_answer) # 调用语音合成模块,对回复的文字信息进行合成并保存在指定目录下
from TTS import tts
answer_filepath = tts(text_answer)
print('语音回答文件路径:', answer_filepath) # 获取语音应答消息文件名并返回
answer_filename = os.path.basename(answer_filepath)
return {'filename': answer_filename} # 返回展示页面
@app.route('/record')
def get_record():
return render_template('WebToy.html') if __name__ == '__main__':
app.run()
main.py
模板页面展示:WebToy.html(静态文件从github可以获取)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title id="title"></title> </head>
<body>
<audio id="player" autoplay controls></audio>
<p>
<button onclick="start_reco()">开始录音</button>
</p>
<p>
<button onclick="ai_reco()" style="background-color: cornflowerblue">发送语音指令</button>
</p>
</body>
<script type="application/javascript" src="/static/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="/static/Recorder.js"></script>
<script type="application/javascript">
var serv = "http://127.0.0.1:5000";
var audio_context = new AudioContext();//音频内容对象
navigator.getUserMedia = (navigator.getUserMedia ||
navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia ||
navigator.msGetUserMedia); navigator.getUserMedia({audio: true}, create_stream, function (err) {
console.log(err)
}); function create_stream(user_media) {
var stream_input = audio_context.createMediaStreamSource(user_media);
reco = new Recorder(stream_input);
} function start_reco() {
reco.record();
} function ai_reco() {
reco.stop(); reco.exportWAV(function (wav_file) {
console.log(wav_file);
var formdata = new FormData(); // form 表单 {key:value}
formdata.append("reco", wav_file); // form input type="file"
$.ajax({
url: serv + "/ai_uploader",
type: 'post',
processData: false,
contentType: false,
data: formdata,
dataType: 'json',
success: function (data) {
//console.log(data.filename);
var filename = data.filename;
document.getElementById('player').src = serv + '/get_answer/' + filename;
}
})
}); reco.clear();
} </script>
</html>
WebToy.html
分支--语音识别:ASR.py
import os
from aip import AipSpeech APP_ID = ''
API_KEY = 'jM4b8GIG9gzrzySTRq3szK2E'
SECRET_KEY = 'iE626cEpjT1iAVwh24XV5h1QFuR8FPD2' client = AipSpeech(APP_ID, API_KEY, SECRET_KEY) # 读取文件
def get_file_content(filepath):
# 文件格式转换成pcm(前提是需要安装ffmpeg软件并配置环境变量)
filename = os.path.basename(filepath)
pcm_filename = filename.split('.')[0] + '.pcm'
pcm_filepath = os.path.join(os.path.dirname(__file__), 'audio', 'pcm', pcm_filename)
cmd_str = f'ffmpeg -y -i {filepath} -acodec pcm_s16le -f s16le -ac 1 -ar 16000 {pcm_filepath}' # ffmpeg软件安装及环境变量配置
os.system(cmd_str) # 调用os.system()在CMD执行命令
filepath = pcm_filepath with open(filepath, 'rb') as fp:
return fp.read() # 识别本地文件
def asr(filePath):
pcm_file = get_file_content(filePath)
result = client.asr(pcm_file, 'pcm', 16000, {
'dev_pid': 1536,
})
print(result)
try:
text = result.get('result')[0]
except:
text = '!@#$%^&^%$#$%^&*'
# print(text)
return text
ASR.py
分支--图灵机器人配置模块:TuringRobotAPI.py
'''
图灵机器人API V2.0接入文档:https://www.kancloud.cn/turing/www-tuling123-com/718227
'''
import json
import requests
def turingRobotAnswer(text_question):
request_json={
"perception": { #必须参数:输入信息(注意:输入参数必须包含inputText或inputImage或inputMedia)
"inputText": { #非必须参数:文本信息
"text": text_question #必须参数:1-128字符 ,直接输入文本
},
},
"userInfo": { #必须参数:用户参数
"apiKey": "11cb5ce350c54016974151892635388b", #必须参数:32位,机器人标识
"userId": "" #必须参数:长度小于等于32位,用户唯一标识
}
}
result=requests.post('http://openapi.tuling123.com/openapi/api/v2',json=request_json)#POST请求,参数文档有说明
# print(result)
text_answer=json.loads(result.content).get('results')[0].get('values').get('text')
return text_answer
TuringRobotAPI.py
分支--自然语言处理模块:NLP.py
from aip import AipNlp
from TuringRobotAPI import turingRobotAnswer APP_ID = ''
API_KEY = 'jM4b8GIG9gzrzySTRq3szK2E'
SECRET_KEY = 'iE626cEpjT1iAVwh24XV5h1QFuR8FPD2' NLP_client = AipNlp(APP_ID, API_KEY, SECRET_KEY) def nlp(text_question):
text_answer = '我是无所不知的智能小机器人飞飞!'
score = NLP_client.simnet(text_question, '你叫什么名字').get('score')
if score < 0.58:
text_answer = turingRobotAnswer(text_question)
return text_answer
NLP.py
分支--语音合成模块:TTS.py
import os from aip import AipSpeech APP_ID = ''
API_KEY = 'jM4b8GIG9gzrzySTRq3szK2E'
SECRET_KEY = 'iE626cEpjT1iAVwh24XV5h1QFuR8FPD2' SPEECH_client = AipSpeech(APP_ID, API_KEY, SECRET_KEY) # TTS合成语音文件(语音合成)
VOICE = {'spd': 5, 'pit': 7, 'vol': 6, 'per': 4, } def tts(text_answer):
audio = SPEECH_client.synthesis(text_answer, 'zh', 1, VOICE)
from uuid import uuid4
answer_filepanme = f'{uuid4()}.mp3'
answer_filepath = os.path.join(os.path.dirname(__file__), 'audio', 'answers', answer_filepanme) if not isinstance(audio, dict):
with open(answer_filepath, 'wb') as f:
f.write(audio) return answer_filepath
TTS.py
分支--语音应答蓝图模块:BP_get_answer.py
import os
from flask import Blueprint, send_file, request dir_static = os.path.join('audio', 'answers')
app_get_answer = Blueprint('get_answer', __name__, static_folder=dir_static, static_url_path='/get_answer') @app_get_answer.route('/<filename>')
def get_answer(filename):
return send_file(filename)
BP_get_answer.py
第七篇:wed版语音机器人的更多相关文章
- 第七篇 :微信公众平台开发实战Java版之如何获取微信用户基本信息
在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的.对于不同公众号,同一用户的openid不同). 公众号可通过本接口来根据O ...
- SLAM+语音机器人DIY系列:(一)Linux基础——2.安装Linux发行版ubuntu系统
摘要 由于机器人SLAM.自动导航.语音交互这一系列算法都在机器人操作系统ROS中有很好的支持,所以后续的章节中都会使用ROS来组织构建代码:而ROS又是安装在Linux发行版ubuntu系统之上的, ...
- SLAM+语音机器人DIY系列:(七)语音交互与自然语言处理——1.语音交互相关技术
摘要 这一章将进入机器人语音交互的学习,让机器人能跟人进行语音对话交流.这是一件很酷的事情,本章将涉及到语音识别.语音合成.自然语言处理方面的知识.本章内容: 1.语音交互相关技术 2.机器人语音交互 ...
- SLAM+语音机器人DIY系列:(六)SLAM建图与自主避障导航——2.google-cartographer机器人SLAM建图
摘要 通过前面的基础学习,本章进入最为激动的机器人自主导航的学习.在前面的学习铺垫后,终于迎来了最大乐趣的时刻,就是赋予我们的miiboo机器人能自由行走的生命.本章将围绕机器人SLAM建图.导航避障 ...
- SLAM+语音机器人DIY系列:(五)树莓派3开发环境搭建——1.安装系统ubuntu_mate_16.04
摘要 通过前面一系列的铺垫,相信大家对整个miiboo机器人的DIY有了一个清晰整体的认识.接下来就正式进入机器人大脑(嵌入式主板:树莓派3)的开发.本章将从树莓派3的开发环境搭建入手,为后续ros开 ...
- SLAM+语音机器人DIY系列:(一)Linux基础——1.Linux简介
摘要 由于机器人SLAM.自动导航.语音交互这一系列算法都在机器人操作系统ROS中有很好的支持,所以后续的章节中都会使用ROS来组织构建代码:而ROS又是安装在Linux发行版ubuntu系统之上的, ...
- SLAM+语音机器人DIY系列:(一)Linux基础——3.Linux命令行基础操作
摘要 由于机器人SLAM.自动导航.语音交互这一系列算法都在机器人操作系统ROS中有很好的支持,所以后续的章节中都会使用ROS来组织构建代码:而ROS又是安装在Linux发行版ubuntu系统之上的, ...
- SLAM+语音机器人DIY系列:(二)ROS入门——1.ROS是什么
摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...
- SLAM+语音机器人DIY系列:(二)ROS入门——2.ROS系统整体架构
摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...
随机推荐
- Inno Setup打包之先卸载再安装
使用Inno Setup打包程序之后,如果想要在安装前先卸载,那么需要加下面代码,需要注意的是红色标注的改为你们自己的.网上看到有些说_is1前面用AppName,但是我这边验证不行. [Setup] ...
- union 的概念及在嵌入式编程中的应用
union 概念 union 在中文的叫法中又被称为共用体,联合或者联合体,它定义的方式与 struct 是相同的,但是意义却与 struct 完全不同,下面是 union 的定义格式: union ...
- 异常:由 spring-session pom 引发
错误异常 Correct the classpath of your application so that it contains a single, compatible version of o ...
- hdu_1052 Tian Ji -- The Horse Racing 贪心
Tian Ji -- The Horse Racing Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- 面向对象(OO)第二阶段学习总结
0.前言 此阶段总共进行三次大作业,其中第一次作业中的第一题,水文数据校验及处理中,遇到较大的难题,第一次接触正则表达式,编码过程中显得难度特别大.第二次作业同样也是对于一元多项式求导中对单项的正则校 ...
- IBM:向所有云平台开放Watson人工智能系统
据美国科技媒体TechCrunch报道,IBM今天宣布不再把沃森(Watson)品牌的人工智能服务局限于自家云计算服务,而是会允许其他企业在自己的数据中心里使用和运行这个平台."客户很难把人 ...
- Clickhouse 时区转换(下)
Clickhouse 时区转换续—时区参数转换 天天加班,时间不够,主要还是我太懒,流汗,,,,,,另外如果这篇学习笔记超过100阅读量并有评论,我可能半夜也会爬起来更新的. 相信大家看我之前记录的这 ...
- elementUI字体图标不显示问题
原文链接: 点我 自己搭建的Vue项目,没有使用vue-cli,引入elementUI时提示字体图标404,找不到文件,如下错误: GET http://localhost:9090/WEB-INF/ ...
- pytho xlrd简介
xlrd:是什么? xlrd是python的一个模块,主要用来对Excel进行读的操作,相对应的,xlwd就是对Excel进行写的模块了. xlrd中有哪些方法可以用呢? 1.打开Excel文件读取数 ...
- C语言程序报告五
C程序设计实验报告 姓 名:赖瑾 实验地点:家 实验时间: 2020年4月21日 实验项目:6.3.1练习1 编写由三角形三边求面积的函数 6.3.1练习2 编写求N阶乘的函数 6.3.1练习3 求两 ...