精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

利用Web Speech API實(shí)現(xiàn)文本轉(zhuǎn)語音與高亮播放

開發(fā) 前端
Web Speech API得到了很好的支持。CSS高亮API的支持較少。我使用的最新版Chromium和WebKit瀏覽器工作良好。我使用的Firefox版本(Mullvad;ESR 128)不起作用。

Terence Eden的數(shù)字電臺(tái)是一個(gè)使用Web Speech API進(jìn)行文本轉(zhuǎn)語音(TTS)的有趣實(shí)驗(yàn)。現(xiàn)代網(wǎng)絡(luò)瀏覽器內(nèi)置了TTS功能。了解這個(gè)強(qiáng)大的API給了我一個(gè)想法。

我是個(gè)重度播客和有聲書聽眾。我很欣賞博客提供替代音頻版本的做法。《需要引用》和《轉(zhuǎn)向AI》是兩個(gè)典范。我一直想為自己的文章配音,但不像Molly和David那樣,我的聲音更適合默片。我還在開發(fā)一個(gè)RSS閱讀器,TTS將是一個(gè)完美的功能。

語音合成

Web Speech API讓我擺脫了自己聲音的困擾。朗讀整篇文章可以簡(jiǎn)單到三行代碼。

const $post = document.querySelector(".Main > .Prose");
const utterance = new SpeechSynthesisUtterance($post.innerText);
globalThis.speechSynthesis.speak(utterance);

全局的speechSynthesis對(duì)象有speakpauseresume方法。utterance實(shí)例將觸發(fā)pauseend等事件。這些基本元素足以構(gòu)建基本的播放控制。

高亮語音

我想要播放狀態(tài)的視覺追蹤。是否可以在朗讀時(shí)高亮特定單詞?是的!但這需要付出更多的努力。

utterance實(shí)例還會(huì)觸發(fā)boundary事件。

當(dāng)朗讀的語句達(dá)到單詞或句子邊界時(shí)觸發(fā)。 — Web Speech API草案規(guī)范

邊界事件包含兩個(gè)屬性:

  • charIndex — 下一個(gè)字符的起始索引
  • charLength — 下一個(gè)要朗讀的單詞長(zhǎng)度

這非常有前景!CSS高亮API接受起始和結(jié)束范圍。下一個(gè)問題是,語音合成器只有一個(gè)文本塊。無法準(zhǔn)確地將這些數(shù)字映射回DOM節(jié)點(diǎn)。

我想到的解決方案是收集所有文本節(jié)點(diǎn)的數(shù)組。

const nodeList = [];
constcollectNodes = ($parent) => {
for (const $child of $parent.childNodes) {
    if ($child.nodeType === Node.TEXT_NODE) {
      if ($child.textContent.trim() !== "") {
        nodeList.push($child);
      }
    } elseif ($child.nodeType === Node.ELEMENT_NODE) {
      collectNodes($child);
    }
  }
};
const $post = document.querySelector(".Main > .Prose");
collectNodes($post);

我使用遞歸函數(shù)創(chuàng)建一個(gè)扁平數(shù)組,包含博客文章中的所有文本節(jié)點(diǎn)。接下來,我可以遍歷數(shù)組,逐個(gè)朗讀每個(gè)節(jié)點(diǎn)。

const nextWord = () => {
if (nodeList.length === 0) {
    return;
  }
const $text = nodeList.shift();
const utterance = newSpeechSynthesisUtterance($text.textContent);
  utterance.addEventListener("end", nextWord());
  globalThis.speechSynthesis.speak(utterance);
};
nextWord();

這個(gè)函數(shù)通過從列表頂部移除第一個(gè)單詞并朗讀它來工作。使用end事件,它會(huì)重復(fù)這個(gè)過程,直到所有單詞都被朗讀。

現(xiàn)在,當(dāng)我添加boundary事件監(jiān)聽器時(shí),我有了對(duì)父文本節(jié)點(diǎn)的引用。我可以將其用于CSS高亮范圍。

const highlight = newHighlight();
CSS.highlights.set("speech-synth", highlight);

constnextWord = () => {
if (nodeList.length === 0) {
    return;
  }
const $text = nodeList.shift();
const utterance = newSpeechSynthesisUtterance($text.textContent);
  utterance.addEventListener("end", nextWord());
  utterance.addEventListener("boundary", (ev) => {
    highlight.clear();
    const range = newRange();
    range.setStart($text, ev.charIndex);
    range.setEnd($text, ev.charIndex + ev.charLength);
    highlight.add(range);
  });
  globalThis.speechSynthesis.speak(utterance);
};
nextWord();

CSS有一個(gè)特殊的高亮選擇器。

::highlight(speech-synth) {
  background: green;
}

這樣,我就能在朗讀時(shí)高亮每個(gè)單詞。真酷!為了跟蹤高亮的單詞,我將父元素滾動(dòng)到視圖內(nèi)。

$text.parentNode.scrollIntoView({
  behavior: "auto",
  block: "nearest",
});

改進(jìn)

使用此技術(shù)的一些元素(如圖片和視頻)沒有文本內(nèi)容。為此,我添加了額外的條件。首先,我創(chuàng)建一個(gè)映射(稍后解釋)。

const nodeParent = new WeakMap();

然后在collectNodes中,我添加了特殊情況。對(duì)于圖片,我生成一個(gè)帶有“image:”前綴的文本節(jié)點(diǎn),用于朗讀時(shí)的上下文。

const tagName = $child.nodeName.toLowerCase();
if (tagName === "img") {
  const $text = document.createTextNode(`image: ${$child.alt}`);
  nodeParent.set($text, $child);
  nodeList.push($text);
  continue next;
}

boundary事件監(jiān)聽器中,在我應(yīng)用高亮范圍之前,我首先檢查弱映射。如果映射了父元素,我將應(yīng)用不同的樣式。

if (nodeParent.has($text)) {
  const $parent = nodeParent.get($text);
  $parent.dataset.speechSynthHighlight = "true";
  return;
}

這些節(jié)點(diǎn)不能被高亮,所以我應(yīng)用了一個(gè)輪廓。

[data-speech-synth-highlight] {
  outline: 10px solid green;
}

稍后,我會(huì)移除數(shù)據(jù)屬性并清除任何高亮(代碼未顯示)。

我對(duì)視頻和代碼示例做了同樣的事情。我應(yīng)該深入代碼塊并逐字閱讀語法嗎?我選擇不這樣做,因?yàn)槲艺J(rèn)為那會(huì)是糟糕的體驗(yàn)。這并不是要替代專業(yè)的屏幕閱讀器。

瀏覽器支持

Web Speech API得到了很好的支持。CSS高亮API的支持較少。我使用的最新版Chromium和WebKit瀏覽器工作良好。我使用的Firefox版本(Mullvad;ESR 128)不起作用。(當(dāng)Mozilla做的時(shí)候,我才會(huì)再次關(guān)心Firefox。)

macOS上的合成語音足夠好。它聽起來很機(jī)械,會(huì)犯一些語法錯(cuò)誤。但它可用!想必Windows和Linux有類似的語音。

源代碼

您可以查看我的JavaScript源文件以獲取完整代碼。目前它有點(diǎn)混亂!我將其實(shí)現(xiàn)為一個(gè)<speech-synth>自定義元素。我添加了一個(gè)額外的<dialog>的播放控制,用于暫停、恢復(fù)和結(jié)束語音。

在我的博客文章和單獨(dú)的筆記頁面的頂部有一個(gè)“播放合成音頻”按鈕。我希望有人覺得它有用!我將在下周改進(jìn)它。

原文鏈接:https://dbushell.com/2025/07/26/text-to-speech-synthesis/ 

作者:David Bushell

責(zé)任編輯:武曉燕 來源: 前端小石匠
相關(guān)推薦

2015-12-30 14:36:31

LinuxeSpeak語音

2023-07-05 16:07:02

JavaScriptWeb 應(yīng)用程序

2023-07-18 09:00:00

ChatGPT文本轉(zhuǎn)語音

2022-09-26 11:35:50

App開發(fā)技術(shù)框架Speech框架

2011-03-01 15:02:54

Qt

2024-07-31 20:39:49

前端文本JavaScrip

2017-04-20 09:49:35

SwashbuckleWeb API Hel核心

2023-02-24 13:24:52

2022-10-12 08:00:00

語音識(shí)別Node.js音頻質(zhì)量

2024-02-18 13:43:57

文本轉(zhuǎn)語音模型人工智能

2009-06-15 15:43:54

Stripes實(shí)現(xiàn)Ja

2023-12-12 08:26:11

ClipchampAI 自動(dòng)創(chuàng)作AI 文本轉(zhuǎn)語音

2011-10-27 16:24:48

API

2023-09-26 06:23:55

OpenAIChatGPT

2023-08-09 09:36:04

Azure AI微軟

2025-10-17 07:33:14

SpringEdgeTTS語音合成

2023-08-16 08:00:39

API網(wǎng)頁端音頻錄制

2023-05-30 13:30:49

2024-05-23 11:26:02

2018-04-20 10:15:34

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

精品国产乱码久久久久久蜜坠欲下 | 国产精品国产三级国产在线观看| 欧美日韩一区小说| 一区二区三区久久网| av中文字幕在线免费观看| 一区三区视频| 亚洲深夜福利视频| 亚洲图片 自拍偷拍| 波多一区二区| 国产精品无人区| 99影视tv| 中文字幕在线网站| 尤物网精品视频| 亚洲毛片在线观看| 免费欧美一级片| 电影亚洲精品噜噜在线观看| 亚洲美女免费视频| 欧美在线播放一区二区| 性中国古装videossex| 亚洲欧美日韩专区| 久久99精品国产99久久6尤物| 成人免费毛片糖心| 视频精品二区| 欧美久久久久久久久中文字幕| 成人一区二区免费视频| 看黄网站在线| 久久久噜噜噜久久人人看| 亚洲影院污污.| 日批视频免费观看| 在线视频精品| 久久久久久久久综合| 日韩av手机在线免费观看| 免费av一区| 亚洲精品v欧美精品v日韩精品| av在线网址导航| 欧美暴力调教| 欧美日韩激情小视频| 国产精品国三级国产av| 免费大片黄在线观看视频网站| 久久无码av三级| 国产精品久久一区二区三区| a天堂在线视频| 久色婷婷小香蕉久久| 日本中文字幕成人| 国产专区第一页| 伊人久久亚洲热| 欧美日韩国产成人在线| 91插插插插插插| 欧美顶级大胆免费视频| 一本一本久久a久久精品综合小说| 99久久免费看精品国产一区| 在这里有精品| 欧美videos大乳护士334| 中文字幕国产高清| 精品视频在线观看免费观看| 欧美人xxxx| 国产乱码一区二区三区四区| 午夜不卡一区| 欧美精品三级日韩久久| 天天综合网久久| 亚洲男人在线| 欧美一区二区三区啪啪| 国产xxx在线观看| 国产66精品| 日韩成人xxxx| 国产色视频一区二区三区qq号| 日本一区福利在线| 亚洲欧洲美洲在线综合| 日本xxxxxxxxx18| 欧美一二区在线观看| 在线精品国产欧美| 欧美第一页在线观看| 欧美jjzz| 91sa在线看| 午夜精品免费观看| 久久国产精品99久久久久久老狼| 成人av在线亚洲| 精品人妻一区二区三区日产乱码| 国产成人精品影视| 精品在线不卡| 成人好色电影| 亚洲欧美另类图片小说| 免费在线看黄色片| 国产精品专区免费| 欧美日韩国产大片| 久久精品在线播放| 国产精品伦子伦| 欧美女优在线视频| 日韩在线观看免费全| 亚洲色婷婷一区二区三区| 在线免费观看欧美| 国产精品美女无圣光视频| 国产精品一级视频| 成人黄色综合网站| 日韩免费av电影| av免费在线网站| 欧美性猛交丰臀xxxxx网站| 国产探花在线看| 国产精品久久久网站 | 香蕉视频911| 中文字幕乱码一区二区免费| 好吊色视频988gao在线观看| 国产高清不卡| 日韩久久久精品| 久久久久亚洲av无码专区桃色| 天天做天天爱天天爽综合网| 91超碰中文字幕久久精品| 最新中文字幕第一页| 懂色av噜噜一区二区三区av| 日韩欧美视频一区二区| 男人添女人下部高潮视频在线观看| 精品欧美一区二区三区| 中文字幕第66页| 亚洲三级精品| 国模吧一区二区| 一级特黄色大片| 久久久精品国产免费观看同学| 日本丰满大乳奶| 视频一区在线免费看| 亚洲高清一区二| 性色av无码久久一区二区三区| 老妇喷水一区二区三区| 国产精品久久久久久免费观看| 69视频在线| 日韩欧美亚洲范冰冰与中字| 秘密基地免费观看完整版中文 | 永久免费看mv网站入口亚洲| 亚洲国产精品成人无久久精品| 久久99国内精品| 日韩免费电影一区二区| 亚洲少妇视频| 亚洲第一国产精品| 日韩精品一区二区亚洲av性色| 日日摸夜夜添夜夜添精品视频| 国产伦精品一区二区三区四区免费 | 精品一区二区三区亚洲| 国产一区二区日韩| 亚洲精品男人的天堂| 99久久精品国产麻豆演员表| 欧美无砖专区免费| 欧洲一区在线| 欧美成人h版在线观看| 国产露脸91国语对白| 中文字幕不卡在线播放| 男人女人黄一级| 亚洲人成网站77777在线观看| 97精品视频在线观看| 午夜精品久久久久久久99| 亚洲黄色av一区| 在线视频日韩欧美| 欧美成人亚洲| 操人视频欧美| 高清电影在线免费观看| 欧美精品一区二| xxxx 国产| 91在线视频观看| 鲁一鲁一鲁一鲁一澡| 日本中文字幕在线一区| 欧美重口另类videos人妖| 日韩大胆视频| 色婷婷亚洲一区二区三区| 法国伦理少妇愉情| 亚洲精品激情| 久久爱av电影| 亚洲第一会所| 久久精品国产欧美亚洲人人爽| 国产精品美女一区| 亚洲免费成人av| 黄色av电影网站| 国产日韩免费| 色99中文字幕| 精品久久亚洲| 国内精品视频久久| 美国成人毛片| 欧美乱妇20p| 欧美成人黄色网| 久久99国产精品视频| 欧美亚洲日本国产| www色com| 国产最新精品免费| 2019日韩中文字幕mv| 色婷婷狠狠五月综合天色拍| 国产福利视频一区二区| 亚洲精品承认| 精品免费视频一区二区| www.伊人久久| 亚洲人成7777| 超碰97在线资源站| 另类综合日韩欧美亚洲| 国产一区 在线播放| 午夜精品福利影院| 国产中文字幕亚洲| 日本不卡网站| 精品国产美女在线| 无码精品人妻一区二区| 欧洲精品一区二区三区在线观看| 91嫩草丨国产丨精品| 成av人片一区二区| 欧美婷婷精品激情| 亚洲图片在线| 婷婷四房综合激情五月| 97久久亚洲| 国产精品久久久久久久av电影| 1stkiss在线漫画| 亚洲人成免费电影| 亚洲第一天堂网| 在线亚洲一区二区| 国产真实的和子乱拍在线观看| 国产日韩欧美精品电影三级在线| 日本在线视频播放| 日本一区中文字幕| 成人在线观看你懂的| 天天影视欧美综合在线观看| 欧美精品v日韩精品v国产精品| 成人在线视频国产| 国产999精品| 国产三级伦理在线| 不卡av在线网站| 国产一级免费在线观看| 精品福利在线导航| 夜夜嗨aⅴ一区二区三区| 精品国产电影一区| 麻豆亚洲av熟女国产一区二| 中文字幕一区二区在线播放| 亚洲精品午夜视频| 99久久久精品| 韩国三级hd中文字幕有哪些| 蜜臂av日日欢夜夜爽一区| 黄色免费观看视频网站| 国内精品久久久久国产盗摄免费观看完整版| 日韩不卡av| 日韩av午夜| 国产精品手机在线| 亚洲精品一二三**| 亚洲tv在线观看| 亚洲欧美专区| 国产精品揄拍500视频| 欧美黄色网页| 青青久久aⅴ北条麻妃| 国产丝袜精品丝袜| 欧美高清videos高潮hd| 欧美成年黄网站色视频| 爽爽爽爽爽爽爽成人免费观看| 国产小视频福利在线| 日韩精品在线第一页| 性xxxfllreexxx少妇| 精品国产乱码久久久久久免费| 国产成人精品无码高潮| 欧美老肥妇做.爰bbww| 国产精品伦理一区| 在线观看91精品国产麻豆| 亚洲天堂狠狠干| 欧美麻豆精品久久久久久| 伊人色综合久久久| 欧美精品免费视频| 99国产精品久久久久久久成人| 欧美精品三级日韩久久| av手机免费看| 欧美成人精品高清在线播放| 国产成人自拍一区| 日韩黄色在线免费观看| 青青草免费在线视频| 亚洲人线精品午夜| 国产精品久久久久一区二区国产 | 国产一区二区三区福利| 亚洲欧美激情精品一区二区| 国产露出视频在线观看| 日韩在线播放av| av软件在线观看| 久久久久久久久久久久久久久久久久av | 国产美女视频一区二区| 亚洲影院色在线观看免费| 99精品在免费线中文字幕网站一区 | 日韩小视频网址| 国产黄大片在线观看画质优化| 欧美区二区三区| 极品美鲍一区| 国产精品福利观看| 欧美黄色一级| 裸体丰满少妇做受久久99精品| 精品视频99| 欧美少妇一区二区三区| 99精品国产福利在线观看免费 | 久草福利资源在线| 1024成人| 久久久久久久久久久福利| 日本免费新一区视频| 欧美一级免费在线| 97超碰欧美中文字幕| 国产亚洲精品精品精品| 一区二区高清在线| www.久久久久久久| 51精品久久久久久久蜜臀| 日韩在线视频第一页| 亚洲色图美腿丝袜| a级影片在线| 日本乱人伦a精品| 精品视频在线观看免费观看 | 亚洲一区二区中文在线| 欧美一级片免费在线观看| 欧美精品在线观看播放| 视频污在线观看| 日韩视频免费大全中文字幕| 91美女精品| 91久久久精品| 久久99国内| 国产精品三级一区二区| 免费欧美在线视频| 日本少妇毛茸茸| 综合网在线视频| 香蕉污视频在线观看| 日韩欧美一级片| 18免费在线视频| 欧美亚洲第一区| 6080成人| 亚洲va久久久噜噜噜久久狠狠| 在线亚洲观看| 免费欧美一级片| 亚洲欧美在线另类| 91视频在线视频| 亚洲精品狠狠操| 色婷婷视频在线观看| 国产免费一区视频观看免费 | 国产成人午夜视频| 久久久国产一级片| 日本黄色一区二区| 少妇喷水在线观看| 欧美高清第一页| 欧美午夜在线播放| 麻豆md0077饥渴少妇| 久久激情综合网| 又色又爽的视频| 欧美亚洲国产一卡| 国产色在线 com| 欧美亚洲激情视频| 综合成人在线| 久操手机在线视频| 国产91精品免费| 午夜69成人做爰视频| 69堂精品视频| 国产在线激情视频| 国产一区深夜福利| 日韩成人精品一区| 五月天亚洲视频| 国产精品久久综合| 中文在线观看av| 中文字幕一区二区三区电影| 韩国成人在线| 亚洲 国产 欧美一区| 六月婷婷色综合| 91精品少妇一区二区三区蜜桃臀| 欧美日韩在线综合| 男人在线资源站| 亚洲free性xxxx护士白浆| 一个色综合网| 白丝校花扒腿让我c| 亚洲成人av电影在线| 欧美一级一区二区三区| 4k岛国日韩精品**专区| 欧美激情在线精品一区二区三区| 欧美精品无码一区二区三区| 国产亚洲短视频| 日本一区二区三区久久| 色婷婷av一区二区三区在线观看| 欧美成人毛片| 欧美 亚洲 视频| 波多野结衣中文字幕一区二区三区 | 精品久久一区| 天天干天天操天天做| 亚洲摸摸操操av| 老司机午夜福利视频| 欧美中文字幕在线视频| 日韩av二区| 韩国三级在线播放| 亚洲高清不卡在线| 天堂av网在线| 国产精品网站视频| 欧美 亚欧 日韩视频在线 | 一区二区三区黄| 欧美成人黑人xx视频免费观看| 在线观看视频一区二区三区| 伊人成色综合网| 中文乱码免费一区二区| 精品国产九九九| 清纯唯美亚洲激情| 亚洲天堂免费| 波多野结衣办公室33分钟| 欧美日韩精品久久久| 1024在线看片你懂得| 久久综合福利| 国产中文字幕精品| 黄网在线观看视频| 久久精品99久久久香蕉| 精品精品国产毛片在线看| 无限资源日本好片| 亚洲综合成人网| av中文资源在线| 91在线免费看片| 久久亚洲欧美| 久久久久人妻一区精品色欧美|