vue3实现语音播放功能

该博客详细介绍了如何使用WebSocket进行实时通信,并实现心跳检测功能,确保连接稳定性。当连接关闭或出现错误时,会自动重连。同时,当接收到消息时,会通过语音合成技术读出昨日未完成计划的人员名单。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

onMounted(() => {
				var lockReconnect = false; //避免ws重复连接
				var ws = null; // 判断当前浏览器是否支持WebSocket
				var wsUrl = "ws:121.41.170.54:2346";
				createWebSocket(wsUrl); //连接ws
				function createWebSocket(url) {
					try {
						if ('WebSocket' in window) {
							ws = new WebSocket(url);
						}
						initEventHandle();
					} catch (e) {
						// reconnect(url);
						console.log(e);
					}
				}
				function initEventHandle() {
					ws.onclose = function() {
						reconnect(wsUrl);
						console.log("llws连接关闭!" + new Date().toLocaleString());
					};
					ws.onerror = function() {
						reconnect(wsUrl);
						console.log("llws连接错误!");
					};
					ws.onopen = function() {
						heartCheck.reset().start(); //心跳检测重置
						console.log("llws连接成功!" + new Date().toLocaleString());
			
					};
					ws.onmessage = function(event) { //如果获取到消息,心跳检测重置
						heartCheck.reset().start(); //拿到任何消息都说明当前连接是正常的
						if (event.data != 'pong') {
							console.log(event.data);
							let data = JSON.parse(event.data);
							var name = "昨日计划未完成人员名单如下:";
							if (data.names.length > 0) {
								for (var i = 0; i < data.names.length; i++) {
									name += data.names[i].name + ','
								}
							}
							const synth = window.speechSynthesis;
							const msg = new SpeechSynthesisUtterance();
							msg.text = name; // 文字内容
							msg.lang = "zh-CN"; // 使用的语言:中文
							msg.volume = 1; // 声音音量:0-1
							msg.rate = 0.5; // 语速:0-10
							msg.pitch = 1; // 音高:0-1
							synth.speak(msg); // 播放
			
						}
					};
				}
				// 监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
				window.onbeforeunload = function() {
					ws.close();
				}
			
				function reconnect(url) {
					if (lockReconnect) return;
					lockReconnect = true;
					setTimeout(function() { //没连接上会一直重连,设置延迟避免请求过多
						createWebSocket(url);
						lockReconnect = false;
					}, 2000);
				}
				//心跳检测
				var heartCheck = {
					timeout: 5000, //5秒发一次心跳
					timeoutObj: null,
					serverTimeoutObj: null,
					reset: function() {
						clearTimeout(this.timeoutObj);
						clearTimeout(this.serverTimeoutObj);
						return this;
					},
					start: function() {
						var self = this;
						this.timeoutObj = setTimeout(function() {
							//这里发送一个心跳,后端收到后,返回一个心跳消息,
							//onmessage拿到返回的心跳就说明连接正常
							ws.send("ping");
							// console.log("ping!")
							self.serverTimeoutObj = setTimeout(
								function() { //如果超过一定时间还没重置,说明后端主动断开了
									ws
										.close(); //如果onclose会执行reconnect,我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次
								}, self.timeout)
						}, this.timeout)
					}
				}
			});

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值