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

devtools/2025/1/17 19:30:01/

代码地址: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/devtools/151342.html

相关文章

栈算法篇——LIFO后进先出,数据与思想的层叠乐章(下)

文章目录 前言第一章&#xff1a;比较含退格的字符串1.1 题目链接&#xff1a;https://leetcode.cn/problems/backspace-string-compare/description/1.2 题目分析&#xff1a;1.3 思路讲解&#xff1a;1.4 代码实现&#xff1a; 第二章&#xff1a;基本计算器||2.1 题目链接&a…

Clojure语言的正则表达式

Clojure语言中的正则表达式 正则表达式是一种用于描述字符串模式的强大工具&#xff0c;在进行文本处理和验证时显得尤为重要。Clojure作为一门现代的编程语言&#xff0c;充分利用了Java的正则表达式功能&#xff0c;使得处理字符串和模式匹配变得更加简洁和高效。本文将深入…

ASP.NET Core - .NET 6 以上版本的入口文件

ASP.NET Core - .NET 6 以上版本的入口文件 自从.NET 6 开始&#xff0c;微软对应用的入口文件进行了调整&#xff0c;移除了 Main 方法和 Startup 文件&#xff0c;使用顶级语句的写法&#xff0c;将应用初始化的相关配置和操作全部集中在 Program.cs 文件中&#xff0c;如下&…

HarmonyOS NEXT开发进阶(七):页面跳转

文章目录 一、前言二、页面跳转三、页面返回四、页面返回前增加确认对话框4.1 系统的默认询问框4.2 自定义询问框 五、拓展阅读 一、前言 APP开发过程中&#xff0c;多页面跳转场景十分常见&#xff0c;例如&#xff0c;登录 -> 首页 -> 个人中心。在鸿蒙开发中&#xf…

go采集注册表

package mainimport ("fmt""golang.org/x/sys/windows/registry""log""os""strconv""strings" )func USBSTOR_Enum() {// 打开注册表键keyPath : SYSTEM\CurrentControlSet\Services\USBSTOR\Enumk, err : regist…

双线性插值算法:原理、实现、优化及在图像处理和多领域中的广泛应用与发展趋势(一)

一、头文件和命名空间 #include <opencv2/opencv.hpp>&#xff1a;这是 OpenCV 库的头文件&#xff0c;它包含了许多用于图像处理、计算机视觉任务的类和函数。OpenCV 是一个强大的开源计算机视觉库&#xff0c;提供了大量的工具和算法&#xff0c;可用于图像的读取、处…

jenkins-系统配置概述

一. 引文&#xff1a; Jenkins除了强大的功能插件实现的持续交付集成外&#xff0c; 本身也是有一些比较重要的可配项。 接下来我们来看一看。 配置入口: 系统管理-->系统设置 二. 基础配置&#xff1a; 1.主目录(home directory): Jenkins所有的数据文件存放路径(可通过…

LeetCode - #183 Swift 实现查询未下订单的客户

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…