// ==UserScript== // @name 英语单词划词自动朗读 (Edge版) // @namespace http://tampermonkey.net/ // @version 1.0 // @description 鼠标选中英语单词后,自动调用浏览器发音引擎朗读,辅助英语学习。 // @author TaiNai // @match *://*/* // @grant none // @license MIT // @downloadURL https://update.greasyfork.icu/scripts/574707/%E8%8B%B1%E8%AF%AD%E5%8D%95%E8%AF%8D%E5%88%92%E8%AF%8D%E8%87%AA%E5%8A%A8%E6%9C%97%E8%AF%BB%20%28Edge%E7%89%88%29.user.js // @updateURL https://update.greasyfork.icu/scripts/574707/%E8%8B%B1%E8%AF%AD%E5%8D%95%E8%AF%8D%E5%88%92%E8%AF%8D%E8%87%AA%E5%8A%A8%E6%9C%97%E8%AF%BB%20%28Edge%E7%89%88%29.meta.js // ==/UserScript== (function() { 'use strict'; // 配置项 const CONFIG = { autoRead: true, // 是否开启自动朗读 onlyEnglish: true, // 是否只朗读纯英文 maxWordLength: 45, // 单词最大长度(防止误读长句子) rate: 1.0, // 语速 (0.1 - 10) volume: 1.0, // 音量 (0 - 1) lang: 'en-US' // 朗读语言 (美式: en-US, 英式: en-GB) }; let lastSelection = ''; // 核心监听事件 document.addEventListener('mouseup', function(e) { // 稍微延时,确保选区已经完成 setTimeout(() => { handleSelection(); }, 10); }); function handleSelection() { const selection = window.getSelection(); const text = selection.toString().trim(); // 1. 基本非空判断 if (!text) return; // 2. 防止重复朗读 (如果你连续点同一个词) // if (text === lastSelection) return; lastSelection = text; // 3. 核心过滤逻辑:判断是否为“单词” // 正则解释:^[a-zA-Z]+(-[a-zA-Z]+)*$ // 允许纯字母,或者带连字符的词 (如 well-known),但不允许中间有空格 const isWord = /^[a-zA-Z]+(-[a-zA-Z]+)*['’]?[a-zA-Z]*$/.test(text); // 如果开启了“只读单词”且选中的不是单词(比如选了一整句),则不读 if (CONFIG.onlyEnglish && !isWord) { // 这里可以放宽逻辑,如果你想读短语,可以把 !isWord 去掉 return; } // 4. 长度限制 (防止误选一大段代码或乱码) if (text.length > CONFIG.maxWordLength) return; // 5. 执行朗读 speakText(text); } function speakText(text) { // 如果正在读,先打断之前的 window.speechSynthesis.cancel(); const msg = new SpeechSynthesisUtterance(); msg.text = text; msg.volume = CONFIG.volume; msg.rate = CONFIG.rate; msg.pitch = 1; msg.lang = CONFIG.lang; // 尝试获取更高质量的 Edge 在线语音 (如果有的话) const voices = window.speechSynthesis.getVoices(); // 优先寻找 Microsoft 的自然语音 const edgeVoice = voices.find(v => v.name.includes('Microsoft') && v.lang.includes('en-US')); if (edgeVoice) { msg.voice = edgeVoice; } window.speechSynthesis.speak(msg); // 可选:在控制台输出,方便调试 console.log(`[太奶助学] 正在朗读: ${text}`); } // 预加载语音列表(解决Chrome/Edge首次加载语音列表为空的问题) window.speechSynthesis.onvoiceschanged = () => { window.speechSynthesis.getVoices(); }; })();