国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
>
什么是語音合成API,它是如何工作的?
我如何在Web應用程序中實現(xiàn)語音合成API?
我可以自定義語音輸出的語音和語言嗎?
語音合成API的局限性是什么?
如何在使用語音合成API時處理錯誤?
我可以暫停和恢復語音輸出嗎?
語音合成API在所有瀏覽器中都受支持嗎?
我可以在移動應用程序中使用語音合成API嗎?
如何測試語音合成API?
在哪里可以找到有關語音合成API的更多信息?
首頁 web前端 js教程 說話的網(wǎng)頁和語音綜合API

說話的網(wǎng)頁和語音綜合API

Feb 22, 2025 am 09:23 AM

Talking Web Pages and the Speech Synthesis API

核心要點

  • 語音合成API允許網(wǎng)站通過朗讀文本為用戶提供信息,這可以極大地幫助視障用戶和多任務處理的用戶。
  • 語音合成API提供多種方法和屬性來自定義語音輸出,例如語言、語速和音調。此API還包括啟動、暫停、恢復和停止語音合成過程的方法。
  • 目前,語音合成API僅被Chrome 33完全支持,并且部分支持iOS 7的Safari瀏覽器。該API需要更廣泛的瀏覽器支持才能在網(wǎng)站上實際應用。

幾周前,我簡要討論了NLP及其相關技術。在處理自然語言時,需要考慮兩個不同但互補的方面:自動語音識別 (ASR) 和文本轉語音 (TTS)。在介紹Web語音API的文章中,我討論了Web語音API,這是一個在Web瀏覽器中提供語音輸入和文本轉語音輸出功能的API。您可能已經(jīng)注意到,我只介紹了如何在網(wǎng)站上實現(xiàn)語音識別,而不是語音合成。在本文中,我們將填補這一空白,描述語音合成API。語音識別為用戶,特別是殘疾用戶,提供了向網(wǎng)站提供信息的機會。回想一下我強調的用例:> 在網(wǎng)站上,用戶可以使用語音導航頁面或填充表單字段。用戶也可以在駕駛時與頁面交互,而無需將視線從道路上移開。這些都不是微不足道的用例。

因此,我們可以將其視為從用戶到網(wǎng)站的通道。語音合成則相反,它使網(wǎng)站能夠通過朗讀文本為用戶提供信息。這對于盲人以及通常視力障礙的人特別有用。語音合成的用例與語音識別一樣多。想想一些新車中實現(xiàn)的系統(tǒng),它們可以朗讀您的文本或電子郵件,這樣您就不必將視線從道路上移開。使用計算機的視障人士熟悉像JAWS這樣的軟件,這些軟件可以朗讀桌面上顯示的任何內容,從而允許他們執(zhí)行任務。這些應用程序很棒,但它們價格昂貴。借助語音合成API,我們可以幫助使用我們網(wǎng)站的人們,無論他們是否有殘疾。例如,假設您正在撰寫博客文章(就像我現(xiàn)在正在做的那樣),為了提高其可讀性,您將其分成幾個段落。這不是使用語音合成API的好機會嗎?事實上,我們可以對我們的網(wǎng)站進行編程,以便一旦用戶將鼠標懸停在(或聚焦于)文本上,揚聲器的圖標就會出現(xiàn)在屏幕上。如果用戶單擊該圖標,我們將調用一個函數(shù)來合成給定段落的文本。這是一個非微不足道的改進。更好的是,它對我們作為開發(fā)人員的開銷非常低,對我們的用戶沒有任何開銷。下面顯示了此概念的基本實現(xiàn)。語音合成API演示現(xiàn)在我們對該API的用例有了更多了解,讓我們了解其方法和屬性。方法和屬性語音合成API定義了一個名為SpeechSynthesis的接口,其結構在此處顯示。與上一篇文章一樣,本文不會涵蓋規(guī)范中描述的所有屬性和方法。原因是它太復雜,無法在一篇文章中涵蓋。但是,我們將解釋足夠的元素,讓您輕松理解未涵蓋的元素。### SpeechSynthesisUtterance 對象我們需要了解的第一個對象是SpeechSynthesisUtterance對象。它表示合成器將朗讀的語音(即文本)。此對象非常靈活,并且可以通過多種方式進行自定義。除了文本之外,我們還可以設置用于發(fā)音文本的語言、語速甚至音調。以下是其屬性列表:- text – 指定要合成的語音(文本)的字符串。- lang – 表示語音合成語言的字符串(例如“en-GB”或“it-IT”)。- voiceURI – 指定語音合成語音和Web應用程序希望使用的語音合成服務的地址的字符串。- volume – 表示文本音量的數(shù)字。其范圍從0(最小)到1(最大)(包括),默認值為1。- rate – 表示語音語速的數(shù)字。它相對于語音的默認速率而言。默認值為1。值為2表示語音將以默認速度的兩倍朗讀。不允許使用低于0.1或高于10的值。- pitch – 表示語音音調的數(shù)字。其范圍從0(最?。┑?(最大)(包括)。默認值為1。要實例化此對象,我們可以將要合成的文本作為構造函數(shù)參數(shù)傳遞,或者省略文本并在稍后設置它。以下代碼是第一種情況的示例。// 創(chuàng)建語音對象var utterance = new SpeechSynthesisUtterance('My name is Aurelio De Rosa');第二種情況是構造SpeechSynthesisUtterance然后分配參數(shù),如下所示。// 創(chuàng)建語音對象var utterance = new SpeechSynthesisUtterance();utterance.text = 'My name is Aurelio De Rosa';utterance.lang = 'it-IT';utterance.rate = 1.2;此對象公開的一些方法是:- onstart – 設置在合成開始時觸發(fā)的回調。- onpause – 設置在語音合成暫停時觸發(fā)的回調。- onresume – 設置在合成恢復時觸發(fā)的回調。- onend – 設置在合成結束時觸發(fā)的回調。SpeechSynthesisUtterance對象允許我們設置要朗讀的文本以及配置其朗讀方式。目前,我們只創(chuàng)建了表示語音的對象。我們仍然需要將其與合成器綁定。### SpeechSynthesis 對象SpeechSynthesis對象不需要實例化。它屬于window對象,可以直接使用。此對象公開了一些方法,例如:- speak() – 接受SpeechSynthesisUtterance對象作為其唯一參數(shù)。此方法用于合成語音。- stop() – 立即終止合成過程。- pause() – 暫停合成過程。- resume() – 恢復合成過程。另一個有趣的方法是getVoices()。它不接受任何參數(shù),用于檢索特定瀏覽器可用的語音列表(數(shù)組)。列表中的每個條目都提供信息,例如名稱、助記符名稱(為開發(fā)人員提供語音提示,例如“Google US English”)、lang(語音的語言,例如it-IT)和voiceURI(此語音的語音合成服務的地址)。重要說明:在Chrome和Safari中,voiceURI屬性名為voice。因此,我們將在本文中構建的演示使用voice而不是voiceURI。瀏覽器兼容性不幸的是,在撰寫本文時,唯一支持語音合成API的瀏覽器是Chrome 33(完全支持)和iOS 7的Safari(部分支持)。演示本節(jié)提供了語音合成API的簡單演示。此頁面允許您輸入一些文本并將其合成。此外,還可以設置您想要使用的速率、音調和語言。您還可以隨時使用提供的相應按鈕停止、暫?;蚧謴臀谋镜暮铣?。在將偵聽器附加到按鈕之前,因為對該API的支持非常有限,所以我們對實現(xiàn)進行測試。通常,測試非常簡單,包括以下代碼:if (window.SpeechSynthesisUtterance === undefined) { // 不支持} else { // 讀取我的文本}如果測試失敗,我們將向用戶顯示消息“API不支持”。一旦驗證了支持,我們就會在標記中放入的特定選擇框中動態(tài)加載可用的語音。請注意,Chrome中的getVoices()方法存在問題(#340160)。因此,我使用setInterval()為此創(chuàng)建了一個解決方法。然后,我們?yōu)槊總€按鈕附加一個處理程序,以便它們可以調用其特定操作(播放、停止等)。此處提供了代碼的實時演示。此外,此演示以及我迄今為止構建的所有其他演示都可以在我的HTML5 API演示存儲庫中找到。```

charset="UTF-8"> name="viewport" content="width=device-width, initial-scale=1.0"/>

>Speech Synthesis API Demo>
  • { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; }
<code>  body
  {
    max-width: 500px;
    margin: 2em auto;
    padding: 0 0.5em;
    font-size: 20px;
  }

  h1,
  .buttons-wrapper
  {
    text-align: center;
  }

  .hidden
  {
    display: none;
  }

  #text,
  #log
  {
    display: block;
    width: 100%;
    height: 5em;
    overflow-y: scroll;
    border: 1px solid #333333;
    line-height: 1.3em;
  }

  .field-wrapper
  {
    margin-top: 0.2em;
  }

  .button-demo
  {
    padding: 0.5em;
    display: inline-block;
    margin: 1em auto;
  }
></code>

>

Speech Synthesis API>
<code><h3>></h3>Play area>
 action="" method="get">
  <label> for="text"></label>Text:>
   id="text">>
  <div> class="field-wrapper">
    <label> for="voice"></label>Voice:>
     id="voice">>
  </div>>
  <div> class="field-wrapper">
    <label> for="rate"></label>Rate (0.1 - 10):>
     type="number" id="rate" min="0.1" max="10" value="1" step="any" />
  </div>>
  <div> class="field-wrapper">
    <label> for="pitch"></label>Pitch (0.1 - 2):>
     type="number" id="pitch" min="0.1" max="2" value="1" step="any" />
  </div>>
  <div> class="buttons-wrapper">
     id="button-speak-ss" class="button-demo">Speak>
     id="button-stop-ss" class="button-demo">Stop>
     id="button-pause-ss" class="button-demo">Pause>
     id="button-resume-ss" class="button-demo">Resume>
  </div>>
>

 id="ss-unsupported" class="hidden">API not supported>

<h3>></h3>Log>
<div> id="log"></div>>
 id="clear-all" class="button-demo">Clear all>

>
  // Test browser support
  if (window.SpeechSynthesisUtterance === undefined) {
    document.getElementById('ss-unsupported').classList.remove('hidden');
    ['button-speak-ss', 'button-stop-ss', 'button-pause-ss', 'button-resume-ss'].forEach(function(elementId) {
      document.getElementById(elementId).setAttribute('disabled', 'disabled');
    });
  } else {
    var text = document.getElementById('text');
    var voices = document.getElementById('voice');
    var rate = document.getElementById('rate');
    var pitch = document.getElementById('pitch');
    var log = document.getElementById('log');

    // Workaround for a Chrome issue (#340160 - https://code.google.com/p/chromium/issues/detail?id=340160)
    var watch = setInterval(function() {
      // Load all voices available
      var voicesAvailable = speechSynthesis.getVoices();

      if (voicesAvailable.length !== 0) {
        for(var i = 0; i               voices.innerHTML += '                                  'data-voice-uri="' + voicesAvailable[i].voiceURI + '">' +
                              voicesAvailable[i].name +
                              (voicesAvailable[i].default ? ' (default)' : '') + '';
        }

        clearInterval(watch);
      }
    }, 1);

    document.getElementById('button-speak-ss').addEventListener('click', function(event) {
      event.preventDefault();

      var selectedVoice = voices.options[voices.selectedIndex];

      // Create the utterance object setting the chosen parameters
      var utterance = new SpeechSynthesisUtterance();

      utterance.text = text.value;
      utterance.voice = selectedVoice.getAttribute('data-voice-uri');
      utterance.lang = selectedVoice.value;
      utterance.rate = rate.value;
      utterance.pitch = pitch.value;

      utterance.onstart = function() {
        log.innerHTML = 'Speaker started' + '<br>' + log.innerHTML;
      };

      utterance.onend = function() {
        log.innerHTML = 'Speaker finished' + '<br>' + log.innerHTML;
      };

      window.speechSynthesis.speak(utterance);
    });

    document.getElementById('button-stop-ss').addEventListener('click', function(event) {
      event.preventDefault();

      window.speechSynthesis.cancel();
      log.innerHTML = 'Speaker stopped' + '<br>' + log.innerHTML;
    });

    document.getElementById('button-pause-ss').addEventListener('click', function(event) {
      event.preventDefault();

      window.speechSynthesis.pause();
      log.innerHTML = 'Speaker paused' + '<br>' + log.innerHTML;
    });

    document.getElementById('button-resume-ss').addEventListener('click', function(event) {
      event.preventDefault();

      if (window.speechSynthesis.paused === true) {
        window.speechSynthesis.resume();
        log.innerHTML = 'Speaker resumed' + '<br>' + log.innerHTML;
      } else {
        log.innerHTML = 'Unable to resume. Speaker is not paused.' + '<br>' + log.innerHTML;
      }
    });

    document.getElementById('clear-all').addEventListener('click', function() {
      log.textContent = '';
    });
  }
></code>

結論

本文介紹了語音合成API。這是一個合成文本并改善我們網(wǎng)站用戶(尤其是視障用戶)整體體驗的API。正如我們所看到的,此API公開了多個對象、方法和屬性,但使用起來并不困難。不幸的是,目前其瀏覽器支持非常差,Chrome和Safari是唯一支持它的瀏覽器。希望更多瀏覽器會效仿,讓您能夠實際考慮在您的網(wǎng)站上使用它。我已經(jīng)決定這么做了。別忘了玩演示,如果您喜歡這篇文章,請發(fā)表評論。我真的很想聽聽您的意見。關于網(wǎng)頁和語音合成API的常見問題 (FAQ)

什么是語音合成API,它是如何工作的?

語音合成API是一個基于Web的接口,允許開發(fā)人員將文本轉語音功能集成到他們的應用程序中。它的工作原理是使用計算機生成的語音將書面文本轉換為口語單詞。這是通過將文本分解成語音成分,然后將這些成分合成成語音來實現(xiàn)的。該API提供了一系列語音和語言供選擇,允許開發(fā)人員自定義語音輸出以滿足他們的需求。

我如何在Web應用程序中實現(xiàn)語音合成API?

在您的Web應用程序中實現(xiàn)語音合成API涉及幾個步驟。首先,您需要創(chuàng)建一個新的SpeechSynthesisUtterance實例,并將其text屬性設置為要朗讀的文本。然后,您可以設置其他屬性,例如語音、音調和速率,來自定義語音輸出。最后,調用SpeechSynthesis接口的speak方法來啟動語音合成。

我可以自定義語音輸出的語音和語言嗎?

是的,語音合成API提供了一系列您可以選擇的語音和語言。您可以通過設置SpeechSynthesisUtterance實例的voice和lang屬性來設置語音和語言。該API還允許您調整語音的音調和速率以進一步自定義輸出。

語音合成API的局限性是什么?

雖然語音合成API是一個強大的工具,但它確實有一些局限性。例如,語音和語言的可用性可能因瀏覽器和操作系統(tǒng)而異。此外,語音輸出的質量可能會有所不同,并且可能并不總是聽起來很自然。此外,該API不提供對特定單詞或短語的發(fā)音的控制。

如何在使用語音合成API時處理錯誤?

語音合成API提供了一個錯誤事件,您可以監(jiān)聽該事件。在語音合成過程中發(fā)生錯誤時,將觸發(fā)此事件。您可以通過向SpeechSynthesisUtterance實例添加事件偵聽器并提供將在觸發(fā)事件時調用的回調函數(shù)來處理此事件。

我可以暫停和恢復語音輸出嗎?

是的,語音合成API提供了暫停和恢復方法,您可以使用這些方法來控制語音輸出。您可以調用SpeechSynthesis接口上的這些方法來暫停和恢復語音。

語音合成API在所有瀏覽器中都受支持嗎?

語音合成API在大多數(shù)現(xiàn)代瀏覽器中都受支持,包括Chrome、Firefox、Safari和Edge。但是,語音和語言的可用性可能因瀏覽器和操作系統(tǒng)而異。

我可以在移動應用程序中使用語音合成API嗎?

是的,語音合成API可以在移動應用程序中使用。但是,語音和語言的可用性可能因移動操作系統(tǒng)而異。

如何測試語音合成API?

您可以通過創(chuàng)建一個使用API將書面文本轉換為語音的簡單網(wǎng)頁來測試語音合成API。然后,您可以嘗試不同的語音、語言、音調和速率,看看它們如何影響語音輸出。

在哪里可以找到有關語音合成API的更多信息?

您可以在萬維網(wǎng)聯(lián)盟 (W3C) 提供的官方文檔中找到有關語音合成API的更多信息。還有許多在線教程和文章提供了有關如何使用該API的詳細解釋和示例。

以上是說話的網(wǎng)頁和語音綜合API的詳細內容。更多信息請關注PHP中文網(wǎng)其他相關文章!

本站聲明
本文內容由網(wǎng)友自發(fā)貢獻,版權歸原作者所有,本站不承擔相應法律責任。如您發(fā)現(xiàn)有涉嫌抄襲侵權的內容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅動的應用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機

Video Face Swap

Video Face Swap

使用我們完全免費的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

Java vs. JavaScript:清除混亂 Java vs. JavaScript:清除混亂 Jun 20, 2025 am 12:27 AM

Java和JavaScript是不同的編程語言,各自適用于不同的應用場景。Java用于大型企業(yè)和移動應用開發(fā),而JavaScript主要用于網(wǎng)頁開發(fā)。

JavaScript評論:簡短說明 JavaScript評論:簡短說明 Jun 19, 2025 am 12:40 AM

JavascriptconcommentsenceenceEncorenceEnterential gransimenting,reading and guidingCodeeXecution.1)單inecommentsareusedforquickexplanations.2)多l(xiāng)inecommentsexplaincomplexlogicorprovideDocumentation.3)

如何在JS中與日期和時間合作? 如何在JS中與日期和時間合作? Jul 01, 2025 am 01:27 AM

JavaScript中的日期和時間處理需注意以下幾點:1.創(chuàng)建Date對象有多種方式,推薦使用ISO格式字符串以保證兼容性;2.獲取和設置時間信息可用get和set方法,注意月份從0開始;3.手動格式化日期需拼接字符串,也可使用第三方庫;4.處理時區(qū)問題建議使用支持時區(qū)的庫,如Luxon。掌握這些要點能有效避免常見錯誤。

為什么要將標簽放在的底部? 為什么要將標簽放在的底部? Jul 02, 2025 am 01:22 AM

PlacingtagsatthebottomofablogpostorwebpageservespracticalpurposesforSEO,userexperience,anddesign.1.IthelpswithSEObyallowingsearchenginestoaccesskeyword-relevanttagswithoutclutteringthemaincontent.2.Itimprovesuserexperiencebykeepingthefocusonthearticl

JavaScript與Java:開發(fā)人員的全面比較 JavaScript與Java:開發(fā)人員的全面比較 Jun 20, 2025 am 12:21 AM

JavaScriptIspreferredforredforwebdevelverment,而Javaisbetterforlarge-ScalebackendsystystemsandSandAndRoidApps.1)JavascriptexcelcelsincreatingInteractiveWebexperienceswebexperienceswithitswithitsdynamicnnamicnnamicnnamicnnamicnemicnemicnemicnemicnemicnemicnemicnemicnddommanipulation.2)

什么是在DOM中冒泡和捕獲的事件? 什么是在DOM中冒泡和捕獲的事件? Jul 02, 2025 am 01:19 AM

事件捕獲和冒泡是DOM中事件傳播的兩個階段,捕獲是從頂層向下到目標元素,冒泡是從目標元素向上傳播到頂層。1.事件捕獲通過addEventListener的useCapture參數(shù)設為true實現(xiàn);2.事件冒泡是默認行為,useCapture設為false或省略;3.可使用event.stopPropagation()阻止事件傳播;4.冒泡支持事件委托,提高動態(tài)內容處理效率;5.捕獲可用于提前攔截事件,如日志記錄或錯誤處理。了解這兩個階段有助于精確控制JavaScript響應用戶操作的時機和方式。

JavaScript:探索用于高效編碼的數(shù)據(jù)類型 JavaScript:探索用于高效編碼的數(shù)據(jù)類型 Jun 20, 2025 am 12:46 AM

javascripthassevenfundaMentalDatatypes:數(shù)字,弦,布爾值,未定義,null,object和symbol.1)numberSeadUble-eaduble-ecisionFormat,forwidevaluerangesbutbecautious.2)

如何減少JavaScript應用程序的有效載荷大?。? />
								</a>
								<a href=如何減少JavaScript應用程序的有效載荷大??? Jun 26, 2025 am 12:54 AM

如果JavaScript應用加載慢、性能差,問題往往出在payload太大,解決方法包括:1.使用代碼拆分(CodeSplitting),通過React.lazy()或構建工具將大bundle拆分為多個小文件,按需加載以減少首次下載量;2.移除未使用的代碼(TreeShaking),利用ES6模塊機制清除“死代碼”,確保引入的庫支持該特性;3.壓縮和合并資源文件,啟用Gzip/Brotli和Terser壓縮JS,合理合并文件并優(yōu)化靜態(tài)資源;4.替換重型依賴,選用輕量級庫如day.js、fetch

See all articles