一、關於HTML5語音Web Speech API
HTML5中和Web Speech相關的API實際上有兩類,一類是“語音識別(Speech Recognition)”,另外一個就是“語音合成(Speech Synthesis)”,這兩個名詞聽上去很高大上,實際上指的分別是“語音轉文字”,和“文字變語音”。
而本文要介紹的就是這里的“語音合成-文字變語音”。為什么稱為“合成”呢?比方說你Siri發音“你好,世界!” 實際上是把“你”、“好”、“世”、“界”這4個字的讀音給合並在一起,因此,稱為“語音合成”。
“語音識別”和“語音合成”看上去像是正反兩方面,應該帶有鏡面氣質,實際上,至少從兼容性來看,兩者並無法直接對等。“語音識別(Speech Recognition)”目前的就Chrome瀏覽器和Opera瀏覽器默認支持,但是,“語音合成(Speech Synthesis)”的兼容性要好上太多了Chrome,FF,Edge,Safari等等都是支持的。
使用的基本套路如下:
-
創建SpeechRecognition的新實例。由於到目前為止,瀏覽器還沒有廣泛支持,所以需要webKit的前綴:
var newRecognition = webkitSpeechRecognition();
- 設置是持續聽還是聽到聲音之后就關閉接收。通過設置continuous屬性值實現。一般聊天溝通使用false屬性值,如果是寫文章寫公眾號之類的則可以設置為true,如下示意:
newRecognition.continuous = true;
- 控制語音識別的開啟和停止,可以使用start()和stop()方法:
// 開啟 newRecognition.start(); // 停止 newRecognition.stop();
- 對識別到的結果進行處理,可以使用一些事件方法,比方說onresult:
newRecognition.onresult = function(event) { console.log(event); }
除了result事件外,還有其他一些事件,例如,soundstart、speechstart、error等。
二、關於語音合成Speech Synthesis API
先從最簡單的例子說起,如果想讓瀏覽器讀出“你好,世界!”的聲音,可以下面的JS代碼:
var utterThis = new window.SpeechSynthesisUtterance('你好,世界!'); window.speechSynthesis.speak(utterThis);
沒錯,只需要這么一點代碼就足夠了,大家可以在自己瀏覽器的控制台里面運行上面兩行代碼,看看有沒有讀出聲音。
上面代碼出現了兩個長長的對象,SpeechSynthesisUtterance
和speechSynthesis
,就是語音合成Speech Synthesis API的核心。
首先是SpeechSynthesisUtterance
對象,主要用來構建語音合成實例,例如上面代碼中的實例對象utterThis
。我們可以直接在構建的時候就把要讀的文字內容寫進去:
var utterThis = new window.SpeechSynthesisUtterance('你好,世界!');
又或者是使用實例對象的一些屬性,包括:
text
– 要合成的文字內容,字符串。lang
– 使用的語言,字符串, 例如:"zh-cn"
voiceURI
– 指定希望使用的聲音和服務,字符串。volume
– 聲音的音量,區間范圍是0
到1
,默認是1
。rate
– 語速,數值,默認值是1
,范圍是0.1
到10
,表示語速的倍數,例如2
表示正常語速的兩倍。pitch
– 表示說話的音高,數值,范圍從0
(最小)到2
(最大)。默認值為1
。
因此上面的代碼也可以寫作:
var utterThis = new window.SpeechSynthesisUtterance(); utterThis.text = '你好,世界!';
不僅如此,該實例對象還暴露了一些方法:
onstart
– 語音合成開始時候的回調。onpause
– 語音合成暫停時候的回調。onresume
– 語音合成重新開始時候的回調。onend
– 語音合成結束時候的回調。
接下來是speechSynthesis
對象,主要作用是觸發行為,例如讀,停,還原等:
-
speak()
– 只能接收SpeechSynthesisUtterance
作為唯一的參數,作用是讀合成的話語。 -
stop()
– 立即終止合成過程。 -
pause()
– 暫停合成過程。 -
resume()
– 重新開始合成過程。 -
getVoices
– 此方法不接受任何參數,用來返回瀏覽器支持的語音包列表,是個數組,例如,在我的電腦下,Firefox瀏覽器返回的語言包是兩個:語言包Firefox瀏覽器Firefox瀏覽器下的語言包運行結果而在chrome瀏覽器下,數量就很驚人了:
Chrome瀏覽器下返回的語言包雖然數量很多,是有種給人中看不中用的感覺,為什么這么說呢!在我的chrome瀏覽器下,不知道為什么,不會讀任何聲音,但是同樣的demo見面,公司的電腦就可以,我后來仔細查了一下,有可能(20%可能性)是我家里的電腦win7版本是閹割版,沒有安裝或配置TTS引擎。
手機Safari瀏覽器也不會讀。
其中,17是普通話大陸:
普通話中國大陸語言包另外,
getVoices
的獲取是個異步的過程,因此,你可以直接在控制台輸入,speechSynthesis.getVoices()
返回的是一個空數組,沒關系,多試幾次,或者搞個定時器之類的。
三、語音合成Speech Synthesis API有什么用
對於盲人或弱視用戶,往往會借助一些輔助設備或者軟件訪問我們的網頁,其原理是通過觸摸或定位某些元素發出聲音,來讓用戶感知內容。
有了語音合成Speech Synthesis API,對於這類用戶,以及開發人員自己,都會帶來一定的便利性。
作者:被床封印怎么都吃不胖的程序猿
鏈接:https://www.jianshu.com/p/92dec635f6c5
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
喜歡這篇文章?歡迎打賞~~