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版语音机器人的更多相关文章

  1. 第七篇 :微信公众平台开发实战Java版之如何获取微信用户基本信息

    在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的.对于不同公众号,同一用户的openid不同). 公众号可通过本接口来根据O ...

  2. SLAM+语音机器人DIY系列:(一)Linux基础——2.安装Linux发行版ubuntu系统

    摘要 由于机器人SLAM.自动导航.语音交互这一系列算法都在机器人操作系统ROS中有很好的支持,所以后续的章节中都会使用ROS来组织构建代码:而ROS又是安装在Linux发行版ubuntu系统之上的, ...

  3. SLAM+语音机器人DIY系列:(七)语音交互与自然语言处理——1.语音交互相关技术

    摘要 这一章将进入机器人语音交互的学习,让机器人能跟人进行语音对话交流.这是一件很酷的事情,本章将涉及到语音识别.语音合成.自然语言处理方面的知识.本章内容: 1.语音交互相关技术 2.机器人语音交互 ...

  4. SLAM+语音机器人DIY系列:(六)SLAM建图与自主避障导航——2.google-cartographer机器人SLAM建图

    摘要 通过前面的基础学习,本章进入最为激动的机器人自主导航的学习.在前面的学习铺垫后,终于迎来了最大乐趣的时刻,就是赋予我们的miiboo机器人能自由行走的生命.本章将围绕机器人SLAM建图.导航避障 ...

  5. SLAM+语音机器人DIY系列:(五)树莓派3开发环境搭建——1.安装系统ubuntu_mate_16.04

    摘要 通过前面一系列的铺垫,相信大家对整个miiboo机器人的DIY有了一个清晰整体的认识.接下来就正式进入机器人大脑(嵌入式主板:树莓派3)的开发.本章将从树莓派3的开发环境搭建入手,为后续ros开 ...

  6. SLAM+语音机器人DIY系列:(一)Linux基础——1.Linux简介

    摘要 由于机器人SLAM.自动导航.语音交互这一系列算法都在机器人操作系统ROS中有很好的支持,所以后续的章节中都会使用ROS来组织构建代码:而ROS又是安装在Linux发行版ubuntu系统之上的, ...

  7. SLAM+语音机器人DIY系列:(一)Linux基础——3.Linux命令行基础操作

    摘要 由于机器人SLAM.自动导航.语音交互这一系列算法都在机器人操作系统ROS中有很好的支持,所以后续的章节中都会使用ROS来组织构建代码:而ROS又是安装在Linux发行版ubuntu系统之上的, ...

  8. SLAM+语音机器人DIY系列:(二)ROS入门——1.ROS是什么

    摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...

  9. SLAM+语音机器人DIY系列:(二)ROS入门——2.ROS系统整体架构

    摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...

随机推荐

  1. 解决Cannot use a scalar value as an array

    这是类型转换的问题,看看上方代码是不是先把布尔值或者0值赋给了一个变量,然后下面循环中又把这个变量当作数组用了

  2. myod实验(选做)

    myod实验 实验任务 1 复习c文件处理内容 2 编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能 main与其他分开,制作静态库和动态库 编写Makefile ...

  3. 2019-2020-1 20199328《Linux内核原理与分析》第四周作业

    <Linux内核原理与分析>第四周作业 步骤一 首先我们指定一个内核并指定内存根文件系统,这里的bzImage是vmLinux经过gzip压缩的内核,"b"表示&quo ...

  4. [Linux] 检查是否已有进程在运行

    出处:sblim-sfcb-1.4.9 / sfcBroker.c int process_is_running() { #define STRBUF_LEN 512 #define BUF_LEN ...

  5. centos 服务器上部署 xxl-job 通过 feign 访问 eureka 上注册的 service timeout

    部署方式 1.使用 jar 包部署 出现的问题 1.通过 feign 调用其他服务,出现超时的问题,该问题不是 ribbon.hystrix 没有配置导致的超时,经过测试,即使配置了也没有作用,该方法 ...

  6. python读取txt批量创建文件

    python读取txt批量创建文件 pythonbatchfile 前几天有个小问题, 需要批量建立很多文件夹,, 所以手动写了个小的脚本, 后续可以直接使用 读取目录文件, 然后直接创建相应的文件 ...

  7. Java5-7作业总结(第八次作业)19201421-吴志越

    前言:关于此次三次作业,相比于前3次难度着实高了一个档次,第五次作业,虽然对于工具类没有很高.但是第一题的复杂程度很高,对于正则表达式有很高的要求,需要使用很多正则表达式的方法,而且不能有一处错误,对 ...

  8. 用C++模拟蚊子的运动来检验概率论内容

    背景:在一个很大的方形透明容器内,从某个位置放入适量的蚊子,等待几分钟后观察蚊子的分布. #include <iostream> #include <cstdlib> #inc ...

  9. WebStorm 2019 3.3 安装及破解教程附汉化教程

    WebStorm2019 3.3 安装及破解教程附加汉化教程 安装包及破解补丁 链接: https://pan.baidu.com/s/19ATTAW3Tsm0huIJSqYChTw 提取码:1ei7 ...

  10. POJ 3581 Prime Gap(二分)

    Prime Gap Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 11009 Accepted: 6298 Descriptio ...