第七篇: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 ...
随机推荐
- 2019.11.13课堂实验之用Linux下的shell脚本完成两文本交替输出
有两个文本如下,实际中并不知道两文本各有多少行: 文本1.txt aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ccccccccccccccccccccccccccc ...
- Windows环境,获取当前线程的ID,GetCurrentThreadId
GetCurrentThreadId 打印格式:0x%08lx 头文件:processthreadsapi.h (include Windows Server 2003, Windows Vista, ...
- 即将进行论文答辩的我发现MyEclipse 2016 激活过期害得我又一次把 MyEclipse 2016 给重新激活注册,详细的图文解说激活过程
背景: 在家美滋滋的上着网课享受着因为疫情带来的平静,没想到随着微信.钉钉铃声响起打破了我半年以来的平静的生活:通知我们过完劳动节要进行答辩,由于我的答辩项目是由 MyEclipse 这个工具编写的我 ...
- bind()函数的深入理解及两种兼容方法分析
在JavaScript中,bind()函数仅在IE9+.Firefox4+.Chrome.Safari5.1+可得到原生支持.本文将深入探讨bind()函数并对两种兼容方法进行分析比较.由于本文将反复 ...
- 疯子的算法总结(九) 图论中的矩阵应用 Part 2 矩阵树 基尔霍夫矩阵定理 生成树计数 Matrix-Tree
定理: 1.设G为无向图,设矩阵D为图G的度矩阵,设C为图G的邻接矩阵. 2.对于矩阵D,D[i][j]当 i!=j 时,是一条边,对于一条边而言无度可言为0,当i==j时表示一点,代表点i的度. 即 ...
- HDU 1233 最小生成树模板题,练练模板
还是畅通工程 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- Linux 上搭建 Snort+BASE 入侵检测系统
配置实验环境 由于本人电脑的存储空间不足,无法再承担安装一个虚拟机的开销,因此在阿里云上申请了一个云服务器进行本次实验.服务器配置如下: 1 核 - 2GB 内存 - 40GB 系统盘 操作系统:Ub ...
- MODIS系列之NDVI(MOD13Q1)五:NDVI处理流程
前言:(个人建议) 1.进行数据处理工作,由于通常数据量比较大.所以在个人电脑中,要将基础数据.不断增长的过程数据.结果数据等分门别类,使得简单易找. 2.将重要数据备份,因为在数据处理过程中,由于出 ...
- SSM的医院管理系统录像
视频观看地址:http://mp.toutiao.com/preview_article/?pgc_id=6806135073323090444
- 用PHP获取网页上的信息相对于xpath效率低点
用php实现对网页的抓取,及信息的收集,其实就是爬数据,具体实现步骤如下,首先应引入两个文件curl_html_get.php和save_file.php文件,两个文件具体代码是这样的curl_htm ...