使用vue3实现语音交互的前端页面

news/2025/1/16 21:44:29/

代码地址:https://github.com/ZZD3627/my-third-vue.git

需求
1.前端实现录音并将音频传到通过http请求将音频传递到后端
2.基于后端识别的语音及后端返回的内容进行语音沟通
实现
1.使用MediaRecorder在前端使用录音功能
2.使用SpeechSynthesis实现将后端传来的文字进行播放

其中一个页面的代码:

<script setup lang="ts">
import { ref, onMounted } from 'vue';
import SpeechSynthesis from '../components/SpeechSynthesis.vue'; // 导入语音合成组件let mediaRecorder: MediaRecorder | null = null;
let audioChunks: Blob[] = [];
const pureColor = ref('#FF66B2');  // 默认纯色const recording = ref(false);  // 录音状态
const isSending = ref(false);   // 发送音频状态
const transcript = ref('');     // 显示的识别结果
const robotReply = ref('');     // 显示机器人的回复
const userId = ref(''); // 用户ID
const responseText = ref(''); // 接口返回的文本内容// 语音播报函数
const playSpeech = (text: string) => {const utterance = new SpeechSynthesisUtterance(text);utterance.pitch = 1;utterance.rate = 1;window.speechSynthesis.speak(utterance);
};// 页面加载时播报欢迎语
onMounted(() => {const timestamp = new Date().getTime();  // 获取当前时间戳playSpeech("可爱的我,你不喜欢吗");userId.value = `default_user_${timestamp}`;
});// 启动或停止录音
const toggleRecording = () => {if (recording.value) {mediaRecorder?.stop();  // 停止录音} else {startRecording();  // 开始录音}
};// 开始录音
const startRecording = () => {navigator.mediaDevices.getUserMedia({ audio: true }).then((stream) => {mediaRecorder = new MediaRecorder(stream);mediaRecorder.start();audioChunks = [];  // 清空音频数据mediaRecorder.ondataavailable = (event) => {audioChunks.push(event.data);  // 收集音频数据};mediaRecorder.onstop = () => {recording.value = false;isSending.value = true;sendAudio();  // 自动调用后台接口};recording.value = true;}).catch((error) => {console.error('获取麦克风权限失败', error);});
};// 发送音频数据到后端
const sendAudio = () => {const formData = new FormData();const audioBlob = new Blob(audioChunks, { type: 'audio/wav' });formData.append('user_id', userId.value); // 添加用户 IDformData.append('audio', audioBlob, 'recording.wav'); // 添加音频文件formData.append('scene', 'sweet_girl')fetch('http://127.0.0.1:5000/dialogue', {method: 'POST',body: formData,}).then(response => {if (!response.ok) {throw new Error('上传失败');}return response.json();}).then(data => {// 解析后端返回的数据transcript.value = `识别结果: ${data.transcript}`;robotReply.value = `机器人回复: ${data.reply}`;responseText.value = data.reply;  // 设置返回的机器人回复文本// 播放机器人回复的语音playSpeech(data.reply);}).catch((error) => {console.error('请求失败:', error);transcript.value = '请求失败,请检查后端服务!';});
};
</script><template><div><h1 :style="{ color: pureColor }"><Chrome v-model="pureColor" />我们的聊天会有点甜哦</h1><!-- 用户输入ID --><input :style="{ color: pureColor }" v-model="userId" type="text" placeholder="请输入用户 ID" /><!-- 录音按钮 --><button :style="{ color: pureColor }" @click="toggleRecording">{{ recording ? '停止录音' : '开始录音' }}</button><!-- 显示识别结果 --><div v-if="transcript"><p>{{ transcript }}</p></div><!-- 显示机器人的回复 --><div v-if="robotReply"><p>{{ robotReply }}</p></div><!-- 语音合成播放 --><SpeechSynthesis :text="responseText" :rate="1" :pitch="1" :selectedVoice="null" /></div>
</template><style scoped>
/* 添加页面样式 */
button {padding: 10px 15px;margin: 10px;font-size: 16px;cursor: pointer;
}input {padding: 8px;font-size: 16px;margin: 10px;width: 100%;max-width: 300px;
}
</style>

页面截图:
在这里插入图片描述


http://www.ppmy.cn/news/1563715.html

相关文章

大数据学习(34)-mapreduce详解

&&大数据学习&& &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 承认自己的无知&#xff0c;乃是开启智慧的大门 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一下博主哦&#x1f91…

Git | git reset命令详解

关注&#xff1a;CodingTechWork 引言 Git 是一款非常流行的分布式版本控制工具&#xff0c;它帮助开发者有效地管理代码历史&#xff0c;支持多种功能来帮助团队协作、追踪修改和维护代码质量。git reset是 Git 中最强大、最复杂的命令之一&#xff0c;它的主要作用是重置当前…

node.js中实现token的生成与验证

Token&#xff08;令牌&#xff09;是一种用于在客户端和服务器之间安全传输信息的加密字符串。在Web开发中&#xff0c;Token常用于身份验证和授权&#xff0c;确保用户能够安全地访问受保护的资源。 作用与意义 身份验证&#xff1a;Token可以用来验证用户的身份&#xff0…

六种主流虚拟化技术全解析:OpenStack、KVM、Hyper-V、VMware、Xen及Docker

秒懂虚拟化&#xff08;一&#xff09;&#xff1a;从概念到网络、存储虚拟化全解析&#xff0c;通俗解读版-CSDN博客 秒懂虚拟化&#xff08;二&#xff09;&#xff1a;服务器虚拟化、操作系统虚拟化、服务虚拟化全解析&#xff0c;通俗解读版_hostos和guestos-CSDN博客 秒…

uniapp省市区懒加载封装

一、z-region.vue 直接复制就可用&#xff0c;需要修改请求接口 getAddressList vue2和vue3皆可使用&#xff08;微信小程序&#xff0c;H5支持&#xff09; <template><view><view class"list"><picker class"picker" mode"…

PHP智慧小区物业管理小程序

&#x1f31f;智慧小区物业管理小程序&#xff1a;重塑社区生活&#xff0c;开启便捷高效新篇章 &#x1f31f; 智慧小区物业管理小程序是一款基于PHPUniApp精心雕琢的智慧小区物业管理小程序&#xff0c;它犹如一股清新的科技之风&#xff0c;吹进了现代智慧小区的每一个角落…

安装 MySQL 数据库

安装 MySQL 数据库 下载地址: https://downloads.mysql.com/archives/community/ 解压 mysql-8.0.20-winx64.zip 到 MySQL 文件夹 中在 MySQL 目录 下 、新建一个 my.ini 文件 (MySQL的配置文件) [mysqld] basedirD:/Program Files/MySQL datadirD:/Program Files/MySQL/dat…

浅谈云计算13 | 网络虚拟化

网络虚拟化 一、网络虚拟化技术原理剖析1.1 网络虚拟化基础概念2.2 关键技术原理2.2.1 虚拟交换机原理2.2.2 虚拟机网络连接原理2.2.3 网络功能虚拟化&#xff08;NFV&#xff09;原理 三、网络虚拟化的应用场景3.1 数据中心中的应用3.1.1 资源隔离与多租户支持3.1.2 网络流量优…