展品讲解语音对话系统 实验报告

2023-11-02 11:59

本文主要是介绍展品讲解语音对话系统 实验报告,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

展品讲解语音对话系统 实验报告

  • 1. 任务定义
  • 2. 实验环境
  • 3. 系统功能
  • 4. 方法说明
    • 4.1 本地录音
      • 4.1.1 初始化
      • 4.1.2 录音
      • 4.1.3 保存音频
    • 4.2 百度语音识别
      • 4.2.1 初始化
      • 4.2.2 语音识别
    • 4.3 图灵机器人回答
      • 4.3.1 在图灵机器人平台新增语料库
      • 4.3.2 初始化
      • 4.3.3 获得回复
    • 4.4 处理回答内容并语音回答
  • 5. 演示视频及源码

1. 任务定义

  • 搭建以展品讲解为主要内容的语音对话系统
    1. 展品导览:通过对话,确认用户感兴趣的展品(假设展品为展馆内所展示的物品或图、画),以及导引用户参观其余展品。
    2. 展品讲解:通过对话,介绍展品。能够回答用户关于展品的n>1个提问。
    3. 闲聊:打招呼、再见、自我介绍等。
  • 实现方法不限

2. 实验环境

  • Windows 10
  • python 3.7.8
  • 图灵机器人
  • 百度语音识别

3. 系统功能

  • 机器人自我介绍
  • 打招呼和再见
  • 画展概况介绍
  • 指定展品编号进行介绍
  • 指定作者介绍其展品
  • 介绍展品作者信息
  • 介绍剩余展品内容
  • 部分闲聊

4. 方法说明

4.1 本地录音

4.1.1 初始化

framerate = 16000       # 采样率
num_samples = 2000      # 采样点
channels  = 1           # 声道
sampwidth = 2           # 采样宽度2bytes
FILEPATH  = 'speech.wav'

4.1.2 录音

  • 调用PyAudio库进行录音,recordTime为录音时长,默认为4秒
def my_record(recordTime=4):pa = PyAudio()# 打开一个新的音频streamstream = pa.open(format=paInt16, channels=channels,rate=framerate, input=True, frames_per_buffer=num_samples)# 存放录音数据my_buf = [] t = time.time()print('正在录音...')while time.time() < t + recordTime:  # 设置录音时间(秒)# 循环read,每次read 2000framesstring_audio_data = stream.read(num_samples)my_buf.append(string_audio_data)print('录音结束.')save_wave_file(FILEPATH, my_buf)stream.close()

4.1.3 保存音频

filepath:保存音频路径
data:音频内容

def save_wave_file(filepath, data):wf = wave.open(filepath, 'wb')wf.setnchannels(channels)wf.setsampwidth(sampwidth)wf.setframerate(framerate)wf.writeframes(b''.join(data))wf.close()

4.2 百度语音识别

4.2.1 初始化

# 百度语音识别的APIKey和SecretKey
base_url = "https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=%s&client_secret=%s"
APIKey = "***************"
SecretKey = "*****************"HOST = base_url % (APIKey, SecretKey)

4.2.2 语音识别

  • 获取音频内容
  • file:音频文件路径
def get_audio(file):with open(file, 'rb') as f:data = f.read()return data
  • 获取token信息
def getToken(host):res = requests.post(host)return res.json()['access_token']
  • 将音频内容上传到百度语音识别系统并获取结果
  • speech_data:音频内容
  • token:token信息
  • dev_pid:百度语音识别提供的几种语言选择,1537为普通话
# 传入语音二进制数据,token
# dev_pid为百度语音识别提供的几种语言选择
def speech2text(speech_data, token, dev_pid=1537):FORMAT = 'wav'RATE = '16000'CHANNEL = 1CUID = '********'SPEECH = base64.b64encode(speech_data).decode('utf-8')data = {'format': FORMAT,'rate': RATE,'channel': CHANNEL,'cuid': CUID,'len': len(speech_data),'speech': SPEECH,'token': token,'dev_pid':dev_pid}url = 'https://vop.baidu.com/server_api'headers = {'Content-Type': 'application/json'}# r=requests.post(url,data=json.dumps(data),headers=headers)print('正在识别...')r = requests.post(url, json=data, headers=headers)Result = r.json()if 'result' in Result:return Result['result'][0]else:return Result

4.3 图灵机器人回答

4.3.1 在图灵机器人平台新增语料库

在这里插入图片描述

4.3.2 初始化

# 图灵机器人的API_KEY、API_URL
turing_api_key = "********************"
api_url = "http://openapi.tuling123.com/openapi/api/v2"
headers = {'Content-Type': 'application/json;charset=UTF-8'}

4.3.3 获得回复

  • 将问题上传到图灵机器人系统获得回复
  • text_words:问题文本内容
  • result:图灵机器人的回答
# 图灵机器人回复
def Turing(text_words=""):req = {"reqType": 0,"perception": {"inputText": {"text": text_words},"selfInfo": {"location": {"city": "北京","province": "北京","street": "北京邮电大学西土城校区"}}},"userInfo": {"apiKey": '**************',"userId": "GZR"}}req["perception"]["inputText"]["text"] = text_words# 获得回复response = requests.request("post", api_url, json=req, headers=headers)response_dict = json.loads(response.text)# 提取回复内容result = response_dict["results"][0]["values"]["text"]print("NAO Robot said: " + result)return result

4.4 处理回答内容并语音回答

  • 处理图灵机器人的回答内容并进行语音回复
  • response:图灵机器人的回答
  • engine:语音引擎
  • allPaints:剩余尚未介绍展品
def answer(response, engine, allPaints):# 如果不需要全部介绍if response != '全部':temp = response[1]engine.say(response)engine.runAndWait()# 判断是否是介绍一幅展品,如果是则将其从剩余未介绍展品中剔除并介绍,否则正常回复if temp in allPaints:allPaints.remove(temp)temp = ""for i in allPaints:temp += itemp += '、'print("这里还剩下" + temp + "号画,请问需要继续介绍哪一幅画?")engine.say("这里还剩下" + temp + "号画,请问需要继续介绍哪一幅画?")engine.runAndWait()# 介绍全部剩余展品else:engine.say("那我就开始啦!")engine.runAndWait()for i in range(len(allPaints)):result = "介绍一下第{}幅画".format(allPaints[i])response = Turing(result)engine.say(response)engine.runAndWait()# 剩余展品清空allPaints = []

5. 演示视频及源码

  • 见附件

这篇关于展品讲解语音对话系统 实验报告的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/330445

相关文章

Mac系统下卸载JAVA和JDK的步骤

《Mac系统下卸载JAVA和JDK的步骤》JDK是Java语言的软件开发工具包,它提供了开发和运行Java应用程序所需的工具、库和资源,:本文主要介绍Mac系统下卸载JAVA和JDK的相关资料,需... 目录1. 卸载系统自带的 Java 版本检查当前 Java 版本通过命令卸载系统 Java2. 卸载自定

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

Linux系统中的firewall-offline-cmd详解(收藏版)

《Linux系统中的firewall-offline-cmd详解(收藏版)》firewall-offline-cmd是firewalld的一个命令行工具,专门设计用于在没有运行firewalld服务的... 目录主要用途基本语法选项1. 状态管理2. 区域管理3. 服务管理4. 端口管理5. ICMP 阻断

Java进程CPU使用率过高排查步骤详细讲解

《Java进程CPU使用率过高排查步骤详细讲解》:本文主要介绍Java进程CPU使用率过高排查的相关资料,针对Java进程CPU使用率高的问题,我们可以遵循以下步骤进行排查和优化,文中通过代码介绍... 目录前言一、初步定位问题1.1 确认进程状态1.2 确定Java进程ID1.3 快速生成线程堆栈二、分析

Windows 系统下 Nginx 的配置步骤详解

《Windows系统下Nginx的配置步骤详解》Nginx是一款功能强大的软件,在互联网领域有广泛应用,简单来说,它就像一个聪明的交通指挥员,能让网站运行得更高效、更稳定,:本文主要介绍W... 目录一、为什么要用 Nginx二、Windows 系统下 Nginx 的配置步骤1. 下载 Nginx2. 解压

如何确定哪些软件是Mac系统自带的? Mac系统内置应用查看技巧

《如何确定哪些软件是Mac系统自带的?Mac系统内置应用查看技巧》如何确定哪些软件是Mac系统自带的?mac系统中有很多自带的应用,想要看看哪些是系统自带,该怎么查看呢?下面我们就来看看Mac系统内... 在MAC电脑上,可以使用以下方法来确定哪些软件是系统自带的:1.应用程序文件夹打开应用程序文件夹

windows系统上如何进行maven安装和配置方式

《windows系统上如何进行maven安装和配置方式》:本文主要介绍windows系统上如何进行maven安装和配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录1. Maven 简介2. maven的下载与安装2.1 下载 Maven2.2 Maven安装2.

使用Python实现Windows系统垃圾清理

《使用Python实现Windows系统垃圾清理》Windows自带的磁盘清理工具功能有限,无法深度清理各类垃圾文件,所以本文为大家介绍了如何使用Python+PyQt5开发一个Windows系统垃圾... 目录一、开发背景与工具概述1.1 为什么需要专业清理工具1.2 工具设计理念二、工具核心功能解析2.

Linux系统之stress-ng测压工具的使用

《Linux系统之stress-ng测压工具的使用》:本文主要介绍Linux系统之stress-ng测压工具的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、理论1.stress工具简介与安装2.语法及参数3.具体安装二、实验1.运行8 cpu, 4 fo

javascript fetch 用法讲解

《javascriptfetch用法讲解》fetch是一个现代化的JavaScriptAPI,用于发送网络请求并获取资源,它是浏览器提供的全局方法,可以替代传统的XMLHttpRequest,这篇... 目录1. 基本语法1.1 语法1.2 示例:简单 GET 请求2. Response 对象3. 配置请求