第七篇: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 ...
随机推荐
- java 8中构建无限的stream
目录 简介 基本使用 自定义类型 总结 java 8中构建无限的stream 简介 在java中,我们可以将特定的集合转换成为stream,那么在有些情况下,比如测试环境中,我们需要构造一定数量元素的 ...
- 图论--网络流--费用流--POJ 2156 Minimum Cost
Description Dearboy, a goods victualer, now comes to a big problem, and he needs your help. In his s ...
- CodeForces-259B]Little Elephant and Magic Square
Little Elephant loves magic squares very much. A magic square is a 3 × 3 table, each cell contains ...
- CF906D Power Tower
扩展欧拉定理 CF906D Power Tower 洛谷交的第二个黑题 题意 给出一个序列\(w-1,w_2,\cdots,w_n\),以及\(q\)个询问 每个询问给出\(l,r\),求: \[w_ ...
- 编译警告:warning: operation on ‘i’ may be undefined
dest[i++]=src[i]; 这行代码,编译时会遇到警告: warning: operation on ‘i’ may be undefined(对于i变量的操作,有可能是未定义的) 改成 de ...
- PinPoint APM搭建全过程
Pinpoint简介 Pinpoint是一款对Java编写的大规模分布式系统的APM工具,有些人也喜欢称呼这类工具为调用链系统.分布式跟踪系统.我们知道,前端向后台发起一个查询请求,后台服务可能要调用 ...
- js循环数组方法some和forEach怎么用
forEach不支持break和return.一般普通循环都是用forEach ar arr1=["aa","bb","aa"," ...
- Codeforces Round #626 D. Present
D. Present 题目大意:给你一个大小是n的序列,求两两之间相加进行异或之后的答案. 这个题目我并没有想到怎么写,有点偷懒于是就去看了题解.. 题解很套路... 题解: 因为这个是用到了异或,所 ...
- 数据结构与算法:栈(Stack)的实现
栈在程序设计当中是一个十分常见的数据结构,它就相当于一个瓶子,可以往里面装入各种元素,最先装进这个瓶子里的元素,要把后装进这个瓶子里的全部元素拿出来完之后才能够把他给拿出来.假设这个瓶子在桌上平放,左 ...
- MATLAB矩阵的表示
矩阵是matlab中最基本的数据对象. l 矩阵的建立 l 冒号表达式 l 结构矩阵和单元矩阵 1.矩阵的建立 (1)利用直接输入法建立矩阵:将矩阵的元素用中括号括起来,按矩阵行的顺序输入各元素 ...