第七篇:wed版语音机器人

wed版语音机器人:

  GitHub项目地址:https://github.com/Yang915/WebToy

  特别说明:该项目在本机测试,通过浏览器调用系统麦克风(https请求),实际环境在Firefox进行测试,其他浏览器不确保正常运行!!!

项目目录说明:

  

项目主程序:main.py

 1 import os
 2 from flask import Flask, render_template, request
 3
 4 from BP_get_answer import app_get_answer  # 返回应答语音的蓝图模块
 5
 6 app = Flask(__name__)
 7 app.debug = True
 8
 9 app.register_blueprint(app_get_answer)  # 注册蓝图
10
11
12 @app.route(‘/ai_uploader‘, methods=[‘GET‘, ‘POST‘])
13 def answer():
14     # 接收前端发来的语音消息,并指定路径保存
15     reco_file = request.files.get(‘reco‘)
16     # 调用uuid三方模块生成唯一文件名
17     from uuid import uuid4
18     filename = f‘{uuid4()}.wav‘
19
20     filepath = os.path.join(os.path.dirname(__file__), ‘audio‘, ‘questions‘, filename)
21     reco_file.save(filepath)
22     # print(‘语音问题保存路径:‘,filepath)
23
24     # 调用语音识别模块,对语音信息进行格式转换保存在指定目录,然后进行识别,得到文字信息
25     from ASR import asr
26     text_question = asr(filepath)
27     # print(‘语音问题文本‘,text_question)
28
29     # 调用自然语言处理模块,对文字信息进行处理,得到回复文字信息
30     from NLP import nlp
31     text_answer = nlp(text_question)
32     # print(‘语音回答文本‘,text_answer)
33
34     # 调用语音合成模块,对回复的文字信息进行合成并保存在指定目录下
35     from TTS import tts
36     answer_filepath = tts(text_answer)
37     print(‘语音回答文件路径:‘, answer_filepath)
38
39     # 获取语音应答消息文件名并返回
40     answer_filename = os.path.basename(answer_filepath)
41     return {‘filename‘: answer_filename}
42
43
44 # 返回展示页面
45 @app.route(‘/record‘)
46 def get_record():
47     return render_template(‘WebToy.html‘)
48
49
50 if __name__ == ‘__main__‘:
51     app.run()

main.py

模板页面展示:WebToy.html(静态文件从github可以获取)

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title id="title"></title>
 6
 7 </head>
 8 <body>
 9 <audio id="player" autoplay controls></audio>
10 <p>
11     <button onclick="start_reco()">开始录音</button>
12 </p>
13 <p>
14     <button onclick="ai_reco()" style="background-color: cornflowerblue">发送语音指令</button>
15 </p>
16 </body>
17 <script type="application/javascript" src="/static/jquery-3.3.1.min.js"></script>
18 <script type="text/javascript" src="/static/Recorder.js"></script>
19 <script type="application/javascript">
20     var serv = "http://127.0.0.1:5000";
21     var audio_context = new AudioContext();//音频内容对象
22     navigator.getUserMedia = (navigator.getUserMedia ||
23         navigator.webkitGetUserMedia ||
24         navigator.mozGetUserMedia ||
25         navigator.msGetUserMedia);
26
27     navigator.getUserMedia({audio: true}, create_stream, function (err) {
28         console.log(err)
29     });
30
31     function create_stream(user_media) {
32         var stream_input = audio_context.createMediaStreamSource(user_media);
33         reco = new Recorder(stream_input);
34     }
35
36
37     function start_reco() {
38         reco.record();
39     }
40
41     function ai_reco() {
42         reco.stop();
43
44         reco.exportWAV(function (wav_file) {
45             console.log(wav_file);
46             var formdata = new FormData(); // form 表单 {key:value}
47             formdata.append("reco", wav_file); // form input type="file"
48             $.ajax({
49                 url: serv + "/ai_uploader",
50                 type: ‘post‘,
51                 processData: false,
52                 contentType: false,
53                 data: formdata,
54                 dataType: ‘json‘,
55                 success: function (data) {
56                     //console.log(data.filename);
57                     var filename = data.filename;
58                     document.getElementById(‘player‘).src = serv + ‘/get_answer/‘ + filename;
59                 }
60             })
61         });
62
63         reco.clear();
64     }
65
66 </script>
67 </html>

WebToy.html

分支--语音识别:ASR.py

 1 import os
 2 from aip import AipSpeech
 3
 4 APP_ID = ‘16815394‘
 5 API_KEY = ‘jM4b8GIG9gzrzySTRq3szK2E‘
 6 SECRET_KEY = ‘iE626cEpjT1iAVwh24XV5h1QFuR8FPD2‘
 7
 8 client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
 9
10
11 # 读取文件
12 def get_file_content(filepath):
13     # 文件格式转换成pcm(前提是需要安装ffmpeg软件并配置环境变量)
14     filename = os.path.basename(filepath)
15     pcm_filename = filename.split(‘.‘)[0] + ‘.pcm‘
16     pcm_filepath = os.path.join(os.path.dirname(__file__), ‘audio‘, ‘pcm‘, pcm_filename)
17     cmd_str = f‘ffmpeg -y  -i {filepath}  -acodec pcm_s16le -f s16le -ac 1 -ar 16000 {pcm_filepath}‘  # ffmpeg软件安装及环境变量配置
18     os.system(cmd_str)  # 调用os.system()在CMD执行命令
19     filepath = pcm_filepath
20
21     with open(filepath, ‘rb‘) as fp:
22         return fp.read()
23
24
25 # 识别本地文件
26 def asr(filePath):
27     pcm_file = get_file_content(filePath)
28     result = client.asr(pcm_file, ‘pcm‘, 16000, {
29         ‘dev_pid‘: 1536,
30     })
31     print(result)
32     try:
33         text = result.get(‘result‘)[0]
34     except:
35         text = ‘[email protected]#$%^&^%$#$%^&*‘
36     # print(text)
37     return text

ASR.py

分支--图灵机器人配置模块:TuringRobotAPI.py 

 1 ‘‘‘
 2 图灵机器人API V2.0接入文档:https://www.kancloud.cn/turing/www-tuling123-com/718227
 3 ‘‘‘
 4 import json
 5 import requests
 6 def turingRobotAnswer(text_question):
 7     request_json={
 8         "perception": { #必须参数:输入信息(注意:输入参数必须包含inputText或inputImage或inputMedia)
 9             "inputText": {          #非必须参数:文本信息
10                 "text": text_question     #必须参数:1-128字符    ,直接输入文本
11             },
12         },
13         "userInfo": {   #必须参数:用户参数
14             "apiKey": "11cb5ce350c54016974151892635388b",   #必须参数:32位,机器人标识
15             "userId": "123"                                 #必须参数:长度小于等于32位,用户唯一标识
16         }
17     }
18     result=requests.post(‘http://openapi.tuling123.com/openapi/api/v2‘,json=request_json)#POST请求,参数文档有说明
19     # print(result)
20     text_answer=json.loads(result.content).get(‘results‘)[0].get(‘values‘).get(‘text‘)
21     return text_answer

TuringRobotAPI.py

分支--自然语言处理模块:NLP.py

 1 from aip import AipNlp
 2 from TuringRobotAPI import turingRobotAnswer
 3
 4 APP_ID = ‘16815394‘
 5 API_KEY = ‘jM4b8GIG9gzrzySTRq3szK2E‘
 6 SECRET_KEY = ‘iE626cEpjT1iAVwh24XV5h1QFuR8FPD2‘
 7
 8 NLP_client = AipNlp(APP_ID, API_KEY, SECRET_KEY)
 9
10
11 def nlp(text_question):
12     text_answer = ‘我是无所不知的智能小机器人飞飞!‘
13     score = NLP_client.simnet(text_question, ‘你叫什么名字‘).get(‘score‘)
14     if score < 0.58:
15         text_answer = turingRobotAnswer(text_question)
16     return text_answer

NLP.py

分支--语音合成模块:TTS.py

 1 import os
 2
 3 from aip import AipSpeech
 4
 5 APP_ID = ‘16815394‘
 6 API_KEY = ‘jM4b8GIG9gzrzySTRq3szK2E‘
 7 SECRET_KEY = ‘iE626cEpjT1iAVwh24XV5h1QFuR8FPD2‘
 8
 9 SPEECH_client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
10
11 # TTS合成语音文件(语音合成)
12 VOICE = {‘spd‘: 5, ‘pit‘: 7, ‘vol‘: 6, ‘per‘: 4, }
13
14
15 def tts(text_answer):
16     audio = SPEECH_client.synthesis(text_answer, ‘zh‘, 1, VOICE)
17     from uuid import uuid4
18     answer_filepanme = f‘{uuid4()}.mp3‘
19     answer_filepath = os.path.join(os.path.dirname(__file__), ‘audio‘, ‘answers‘, answer_filepanme)
20
21     if not isinstance(audio, dict):
22         with open(answer_filepath, ‘wb‘) as f:
23             f.write(audio)
24
25     return answer_filepath

TTS.py

分支--语音应答蓝图模块:BP_get_answer.py

 1 import os
 2 from flask import Blueprint, send_file, request
 3
 4 dir_static = os.path.join(‘audio‘, ‘answers‘)
 5 app_get_answer = Blueprint(‘get_answer‘, __name__, static_folder=dir_static, static_url_path=‘/get_answer‘)
 6
 7
 8 @app_get_answer.route(‘/<filename>‘)
 9 def get_answer(filename):
10     return send_file(filename)

BP_get_answer.py

原文地址:https://www.cnblogs.com/open-yang/p/11202683.html

时间: 2024-10-31 01:56:42

第七篇:wed版语音机器人的相关文章

SLAM+语音机器人DIY系列:(七)语音交互与自然语言处理——2.机器人语音交互实现

摘要 这一章将进入机器人语音交互的学习,让机器人能跟人进行语音对话交流.这是一件很酷的事情,本章将涉及到语音识别.语音合成.自然语言处理方面的知识.本章内容: 1.语音交互相关技术 2.机器人语音交互实现 3.自然语言处理云计算引擎 2.机器人语音交互实现 其实要自己做一款语音对话机器人还是很容易的,我们只需要选择好语音识别.语音合成.自然语言处理的技术,就可以在一款树莓派3开发板上实现了.由于语音交互系统的核心技术是云端自然语言处理技术,所以我们可以选择网上免费提供的语音识别.语音合成等现有方

SLAM+语音机器人DIY系列:(六)SLAM建图与自主避障导航——3.ros-navigation机器人自主避障导航

摘要 通过前面的基础学习,本章进入最为激动的机器人自主导航的学习.在前面的学习铺垫后,终于迎来了最大乐趣的时刻,就是赋予我们的miiboo机器人能自由行走的生命.本章将围绕机器人SLAM建图.导航避障.巡航.监控等内容展开.本章内容: 1.在机器人上使用传感器 2.google-cartographer机器人SLAM建图 3.ros-navigation机器人自主避障导航 4.多目标点导航及任务调度 5.机器人巡航与现场监控 3.ros-navigation机器人自主避障导航 前面的学习教程打好

SaltStack 入门到精通 - 第七篇: Targeting

什么是Targeting? Targeting minions 是指那些minion会作为运行命令或是执行状态的目标.这些目标可以是一个主机名,系统信息,定义的分组,甚至是自定义的绑定的对象. 例如命令  salt web1 apache.signal restart 可以重启ID 为web1的minion的apache.当然也可以在top文件中使用web1来作为目标匹配的内容: base:   'web1':     - webserver Targing 有哪些匹配方式? Minion Id

TP3.23开发的分答微信版语音问答系统源码

演示地址:http://yd.168282.com (请在微信中打开演示) 公众号演示:(请直接扫码演示) 9月最新功能如下:1.易答:付费你(我)问,我(你)答,有人付费听,你我分钱.2.录音时自动转MP3格式,支持所有移动端设备3.每晚程序自动结算4.收入.支出 账目明细5.赞赏:如果你觉得答主答得漂亮,可以直接为他点赞6.问题搜索:搜人不够,还想搜问题,我们已经实现了这功能7.拒绝回答:不想回答的问题直接拒绝8.多级分类9.增强答主审核机制10.图文回答,图文提问,可后台开启11.追问功能

Python之路【第七篇】:线程、进程和协程

Python之路[第七篇]:线程.进程和协程 Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #!/usr/bin/env python # -*- coding:utf-8 -*- import threading import time   def show(arg):     time.sleep(1)     print 'thread'+str(arg)   for i in

用仿ActionScript的语法来编写html5——第七篇,自定义按钮

第七篇,自定义按钮 这次弄个简单点的,自定义按钮.其实,有了前面所定义的LSprite,LBitmap等类,定义按钮就很方便了.下面是添加按钮的代码, function gameInit(event){ backLayer = new LSprite(); addChild(backLayer); btn01 = new LButton(new LBitmap(new LBitmapData(imglist["replay_button_up"])),new LBitmap(new L

第七篇 Integration Services:中级工作流管理

本篇文章是Integration Services系列的第七篇,详细内容请参考原文. 简介在上一篇文章,我们创建了一个新的SSIS包,学习了SSIS中的脚本任务和优先约束,并检查包的MaxConcurrentExecutables属性.这一篇我们将检查.演示并测试优先约束赋值为"成功"."完成"."失败"时对工作流的影响.约束赋值如果你按照前一篇的步骤操作过,打开My_First_SSIS_Project解决方案下的Precedence.dtsx

第七篇:创建一个SOUI的Hello World

从0开始一个SOUI项目 1.环境配置 SOUI项目本质是一个基于Win32窗口的应用程序.因此首先我们可以从Win32窗口应用程序向导创建一个简单的Win32项目. 并在第3页选择“Window应用程序” 选择“完成”后生成一个Win32应用程序骨架. 项目的文件结构如下图: 要使用SOUI开发程序程序,首先当然是要找到从SVN获取的SOUI项目代码.假定SOUI项目保存在%SOUIPATH%这个环境变量指向的目录(安装了SOUI向导后会自动创建这个环境变量). 我们需要在VS的include

学习java随笔第七篇:java的类与对象

类 同一个包(同一个目录),类的创建与调用 class Man{ String name; void GetMyName() { System.out.println(name); } } public class Person { public static void main(String arges[]) { Man m=new Man(); m.name="小黄"; m.GetMyName(); } } 运行结果 不同的包(不同目录目录),类的创建与调用 package Peo