news 2026/10/22 2:26:33

监听 edge大声朗读 样式变化

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
监听 edge大声朗读 样式变化
<msreadoutspan class="msreadout-line-highlight msreadout-inactive-highlight">黛玉方进入房时,只见两个人搀着一位鬓发如银的老母迎上来,黛玉便<msreadoutspan class="msreadout-word-highlight">知</msreadoutspan>是他</msreadoutspan> <msreadoutspan class="msreadout-line-highlight msreadout-inactive-highlight">黛玉一一拜见过。贾母又说:“请姑娘们来。今日远客才来,<msreadoutspan class="msreadout-word-highlight">可以</msreadoutspan>不必上学去</msreadoutspan>

<p>“血米放在陈家,又不会跑,何况族中还有着贺章族 <msreadoutspan class="msreadout-line-highlight"> 叔,家族随时都可 <msreadoutspan class="msreadout-word-highlight">动手</msreadoutspan> 。” </msreadoutspan> </p>

目的是将edge朗读的内容,发送到 有声小说书屋软件中,显示

方案一:

// 防止重复处理:改用文本内容作为 key(避免 DOM 元素重建导致重复) const processedTexts = new Set(); // 判断是否是“行级”朗读片段 function isLineSpan(el) { return ( el.tagName?.toLowerCase() === 'msreadoutspan' && el.classList.contains('msreadout-line-highlight') ); } // 全局变量:用于缓冲和定时器 let sentenceBuffer = []; let sendTimer = null; const SEND_DELAY = 150; // 合并窗口:150ms // 判断两个字符串之间是否应加空格(仅当前后都是英文字母时) function shouldAddSpace(prev, current) { if (!prev || !current) return false; const lastChar = prev[prev.length - 1]; const firstChar = current[0]; const isEnglishLetter = /[a-zA-Z]/; return isEnglishLetter.test(lastChar) && isEnglishLetter.test(firstChar); } // 处理一个朗读片段 function processLineSpan(span) { const fullText = span.textContent.trim(); if (!fullText) return; // ✅ 关键:用文本内容防重(不是 DOM 元素) if (processedTexts.has(fullText)) { // console.log('⏭️ 跳过重复文本:', fullText); return; } // 添加到已处理集合 processedTexts.add(fullText); // 防内存泄漏:只保留最近 50 条 if (processedTexts.size > 50) { const arr = Array.from(processedTexts); processedTexts.clear(); arr.slice(-30).forEach(t => processedTexts.add(t)); // 保留最近 30 条 } console.log('📜 收到片段:', fullText); sentenceBuffer.push(fullText); // 重置发送定时器 if (sendTimer) clearTimeout(sendTimer); sendTimer = setTimeout(() => { // 智能拼接句子 let combinedText = ''; for (let i = 0; i < sentenceBuffer.length; i++) { if (i === 0) { combinedText = sentenceBuffer[i]; } else { if (shouldAddSpace(sentenceBuffer[i - 1], sentenceBuffer[i])) { combinedText += ' ' + sentenceBuffer[i]; } else { combinedText += sentenceBuffer[i]; } } } // 清空缓冲区 sentenceBuffer = []; if (combinedText) { console.log('📤 发送完整句子:', combinedText); sendToTtsServer(combinedText); } }, SEND_DELAY); } // 发送文本到本地 TTS 服务 function sendToTtsServer(text) { fetch('http://127.0.0.1:8088/tts', { method: 'POST', body: text, headers: { 'Content-Type': 'text/plain; charset=utf-8' } }) .then(response => response.ok ? response.text() : Promise.reject(response.status)) .then(data => console.log('📡 服务器响应:', data)) .catch(error => console.error('💥 网络错误:无法连接到“有声小说书屋”程序', error)); } // 监听 DOM 变化 const observer = new MutationObserver(mutations => { for (const mutation of mutations) { if (mutation.type === 'childList') { for (const node of mutation.addedNodes) { if (node.nodeType === Node.ELEMENT_NODE) { // 如果新节点本身就是目标 span if (isLineSpan(node)) { processLineSpan(node); } // 如果新节点内部包含目标 span if (node.querySelectorAll) { try { node.querySelectorAll('msreadoutspan.msreadout-line-highlight').forEach(processLineSpan); } catch (e) { // 降级:某些环境可能不支持自定义标签选择器 const walk = (el) => { if (isLineSpan(el)) processLineSpan(el); el.children?.forEach(walk); }; walk(node); } } } } } } }); // 扫描页面中已存在的朗读行 document.querySelectorAll('msreadoutspan.msreadout-line-highlight').forEach(processLineSpan); // 开始监听整个页面 observer.observe(document.body, { childList: true, subtree: true }); console.log('监听页面朗读行(含嵌套)已启动...');

方案二;

// 防止重复处理:记录已处理的外层 line span 元素 const processedLineSpans = new Set(); // 判断是否是“完整句子”的外层容器 function isLineContainer(el) { return ( el.tagName?.toLowerCase() === 'msreadoutspan' && el.classList.contains('msreadout-line-highlight') ); } // 发送完整句子到 TTS 服务 function sendToTtsServer(text) { if (!text.trim()) return; fetch('http://127.0.0.1:8088/tts', { method: 'POST', body: text, headers: { 'Content-Type': 'text/plain; charset=utf-8' } }) .then(response => response.ok ? response.text() : Promise.reject(response.status)) .then(data => console.log('📡 TTS 发送成功:', data)) .catch(error => console.error('💥 网络错误:无法连接到“有声小说书屋”程序', error)); } // 处理一个完整的句子容器 function processLineContainer(span) { if (processedLineSpans.has(span)) return; processedLineSpans.add(span); // ✅ 关键:textContent 自动合并所有嵌套文本(忽略内部标签) const fullText = span.textContent.trim(); if (fullText) { console.log('📤 发送完整句子:', fullText); sendToTtsServer(fullText); } } // MutationObserver:监听新插入的节点 const observer = new MutationObserver(mutations => { for (const mutation of mutations) { if (mutation.type === 'childList') { for (const node of mutation.addedNodes) { if (node.nodeType === Node.ELEMENT_NODE) { // 如果新节点本身就是 line 容器 if (isLineContainer(node)) { processLineContainer(node); } // 如果新节点内部包含 line 容器(比如批量插入) if (node.querySelectorAll) { try { node.querySelectorAll('msreadoutspan.msreadout-line-highlight') .forEach(processLineContainer); } catch (e) { // 降级遍历(兼容性兜底) const walk = (el) => { if (isLineContainer(el)) processLineContainer(el); el.children?.forEach(walk); }; walk(node); } } } } } } }); // 扫描页面中已存在的完整句子(防止遗漏初始内容) document.querySelectorAll('msreadoutspan.msreadout-line-highlight') .forEach(processLineContainer); // 开始监听整个页面 observer.observe(document.body, { childList: true, subtree: true }); console.log('监听页面完整朗读行(一次性发送)已启动...');

方案三

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/22 8:38:03

网安零基础必冲!upload-labs 文件上传漏洞保姆级通关教程

什么是文件上传漏洞&#xff1f; 环境 靶场&#xff1a;upload-labs 服务器&#xff1a;centos7 数据库&#xff1a;mysql5.7 php&#xff1a;5.5 nginx&#xff1a;1.24 在开始之前先介绍一款windows defender卸载工具&#xff0c;提高渗透效率&#xff0c;不然文件上传成功…

作者头像 李华
网站建设 2026/10/22 16:54:34

vue基于Springboot框架 新能源充电桩报修管理系统

目录已开发项目效果实现截图开发技术系统开发工具&#xff1a;核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&…

作者头像 李华
网站建设 2026/10/22 7:35:10

v3基于SpringBoot的酒店管理系统

源码可s领取!!V3 基于 Spring Boot 的酒店管理系统是一款专为酒店行业设计的综合性管理解决方案。它依托 Spring Boot 框架的强大功能&#xff0c;旨在帮助酒店实现高效运营、提升服务质量&#xff0c;涵盖从客房管理到客户服务的一系列核心业务流程。核心功能模块客房管理客房…

作者头像 李华
网站建设 2026/10/21 16:30:57

Git安装Windows版本并配置清华镜像用于TensorFlow贡献开发

Git安装Windows版本并配置清华镜像用于TensorFlow贡献开发 在人工智能技术迅猛发展的今天&#xff0c;越来越多的开发者希望通过参与像 TensorFlow 这样的顶级开源项目来提升自身能力、拓展影响力。然而&#xff0c;一个看似简单的操作——从 GitHub 克隆源码&#xff0c;却可…

作者头像 李华
网站建设 2026/10/22 14:48:12

Langchain-Chatchat 0.3.1 Windows本地部署指南

Langchain-Chatchat 0.3.1 Windows本地部署实战指南 在企业对数据安全要求日益严格的今天&#xff0c;如何在不依赖云端服务的前提下&#xff0c;构建一个能理解私有文档内容的智能问答系统&#xff1f;这正是 Langchain-Chatchat 的价值所在。它将大语言模型&#xff08;LLM&…

作者头像 李华
网站建设 2026/10/21 12:34:12

私有云ACK:企业智能化转型的安全基座与算力引擎

私有云ACK&#xff1a;企业智能化转型的安全基座与算力引擎 在数字化转型浪潮下&#xff0c;企业对云基础设施的需求正从“可用”向“安全可控、弹性高效、智能协同”升级。阿里云容器服务Kubernetes版&#xff08;ACK&#xff09;推出的私有云解决方案&#xff0c;通过深度整…

作者头像 李华