第七篇: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 ...
随机推荐
- 打印js对象内容
function writeObj(obj){ var description = ""; for(var i in obj){ var property=obj[i]; desc ...
- 创建线程的方式三:实现Callable接口-----JDK5.0 新增
package com.yhqtv.java2; /* * 创建线程的方式三:实现Callable接口-----JDK5.0 新增 * * 如何理解实现Callable接口的方式创建多线程比实现Run ...
- Vue Router路由守卫妙用:异步获取数据成功后再进行路由跳转并传递数据,失败则不进行跳转
问题引入 试想这样一个业务场景: 在用户输入数据,点击提交按钮后,这时发起了ajax请求,如果请求成功, 则跳转到详情页面并展示详情数据,失败则不跳转到详情页面,只是在当前页面给出错误消息. 难点所在 ...
- 关于SQL语言,这些你不得不了解!
一.SQL概述 关系数据库标准语言SQL(结构化查询语言). 结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言, ...
- postman(环境设置)
1.点击小齿轮进入到环境变量添加页面,点击add添加环境变量 2.新增环境输入变量名称和变量值 3.添加成功 4.接口中设置变量,切换环境进行传参 5.调用环境变量断言 调用环境变量中的phone变量 ...
- git的下载与安装
Git的下载地址:https://git-scm.com/download/win 第一步:根据自己电脑的位数下载Git 第二步:下载安装包,放到指定的文件夹 第三步:更换路径安装Git(也可以放在C ...
- 惠普 HP Pavilion 15 Notebook PC清灰教程总结 惠普g4系列清灰加内存条教程
最近天气热的电脑都受不了,风扇总是异响,声音很大,感觉是散热不行了,就把电脑清一下灰,虽然之前也清过,但是基本都忘记了,机子比较老,找不到具体教程,清灰过程中因为不熟悉有点费劲,手动记录一下,方便下次 ...
- 两个命令把 Vim 打造成 Python IDE
运行下面两个命令,即可把 Vim(含插件)配置成 Python IDE.目前支持 MAC 和 Ubuntu. Shell curl -O https://raw.githubusercontent ...
- memcached线程模型
直接上图: memcached使用多线程模型,一个master线程,多个worker线程,master和worker通过管道实现通信. 每个worker线程有一个队列,队列元素为CQ_ITEM. ty ...
- Linux时间的相关的操作
时间(修改时区,修改时间,同步网络时间) 查看当前系统时间 date 修改时区 cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 修改当前系统时间 ...