JavaScript 中實現(xiàn)文字轉(zhuǎn)語音最直接的方式是使用 web speech api 的 speechsynthesis。1. 通過創(chuàng)建 speechsynthesisutterance 對象并調(diào)用 speechsynthesis.speak() 方法實現(xiàn)基礎(chǔ)語音合成;2. 使用 volume、rate、pitch 屬性分別控制音量(0-1)、語速(默認(rèn) 1)和音調(diào)(默認(rèn) 1);3. 通過 speechsynthesis.getvoices() 獲取可用語音列表,并異步設(shè)置 voice 屬性以切換語音;4. web speech api 的局限包括瀏覽器兼容性、部分功能依賴網(wǎng)絡(luò)、語音質(zhì)量參差、文本長度限制及錯誤處理不完善,如需更高要求可考慮第三方服務(wù)。
實現(xiàn)文字轉(zhuǎn)語音,JavaScript 中最直接的方式就是使用 Web Speech API 的語音合成功能,也就是 SpeechSynthesis。它允許你通過瀏覽器內(nèi)置的語音引擎將文本轉(zhuǎn)換成語音。
function textToSpeech(text) { const utterance = new SpeechSynthesisUtterance(text); speechSynthesis.speak(utterance); } // 調(diào)用示例 textToSpeech("你好,世界!");
這段代碼創(chuàng)建了一個 SpeechSynthesisUtterance 對象,并將要轉(zhuǎn)換的文本傳遞給它。然后,speechSynthesis.speak() 方法會觸發(fā)語音合成并播放。
如何調(diào)整語音的音量、語速和音調(diào)?
SpeechSynthesisUtterance 對象提供了多種屬性來控制語音的輸出效果。你可以調(diào)整 volume(音量,0 到 1 之間)、rate(語速,正常語速是 1)、和 pitch(音調(diào),正常音調(diào)是 1)。
function textToSpeechAdvanced(text, volume = 1, rate = 1, pitch = 1) { const utterance = new SpeechSynthesisUtterance(text); utterance.volume = volume; utterance.rate = rate; utterance.pitch = pitch; speechSynthesis.speak(utterance); } // 調(diào)用示例:降低音量,加快語速 textToSpeechAdvanced("這是一段測試文本。", 0.5, 1.5);
注意,不同的瀏覽器和操作系統(tǒng)對這些屬性的解釋可能略有不同,所以實際效果可能會有一些差異。
如何選擇不同的語音?
Web Speech API 允許你選擇不同的語音(voices)。你可以通過 speechSynthesis.getVoices() 方法獲取可用的語音列表。這個方法返回一個 SpeechSynthesisVoice 對象的數(shù)組。
function getAvailableVoices() { return new promise(resolve => { let voices = speechSynthesis.getVoices(); if (voices.length) { resolve(voices); return; } // 有些瀏覽器需要監(jiān)聽 voiceschanged 事件才能獲取語音列表 speechSynthesis.onvoiceschanged = () => { voices = speechSynthesis.getVoices(); resolve(voices); }; }); } async function textToSpeechWithVoice(text, voiceName) { const voices = await getAvailableVoices(); const selectedVoice = voices.find(voice => voice.name === voiceName); if (!selectedVoice) { console.warn(`Voice "${voiceName}" not found.`); textToSpeech(text); // 使用默認(rèn)語音 return; } const utterance = new SpeechSynthesisUtterance(text); utterance.voice = selectedVoice; speechSynthesis.speak(utterance); } // 調(diào)用示例:使用 "Microsoft Xiaoxiao - Chinese (Simplified)" 語音 textToSpeechWithVoice("你好,世界!", "Microsoft Xiaoxiao - Chinese (Simplified)");
這段代碼首先異步獲取可用的語音列表。然后,它查找指定名稱的語音,并將其設(shè)置為 SpeechSynthesisUtterance 對象的 voice 屬性。如果找不到指定的語音,則會使用默認(rèn)語音。
需要注意的是,語音列表可能需要一些時間才能加載完成。因此,通常需要監(jiān)聽 voiceschanged 事件,或者使用 Promise 來確保語音列表已經(jīng)準(zhǔn)備好。另外,不同瀏覽器提供的語音種類也會有所不同。在 chrome 中,語音列表通常會立即返回,而在 firefox 中,可能需要等待 voiceschanged 事件觸發(fā)。
Web Speech API有哪些局限性?
雖然 Web Speech API 非常方便,但它也有一些局限性:
- 依賴瀏覽器支持: 并非所有瀏覽器都完全支持 Web Speech API。老版本的瀏覽器可能不支持,或者支持程度有限。
- 依賴網(wǎng)絡(luò)連接 (某些情況): 某些語音合成引擎可能需要網(wǎng)絡(luò)連接才能工作,尤其是在使用高質(zhì)量的語音時。
- 語音質(zhì)量: 語音質(zhì)量取決于瀏覽器內(nèi)置的語音引擎。有些語音聽起來可能比較機械化,不夠自然。
- 文本長度限制: 某些瀏覽器可能對可以合成的文本長度有限制。如果文本太長,可能需要將其分割成較小的片段。
- 錯誤處理: 錯誤處理可能比較困難。如果語音合成失敗,API 可能不會提供詳細(xì)的錯誤信息。
總的來說,Web Speech API 是一個快速實現(xiàn)文字轉(zhuǎn)語音的有效方法,但需要注意其局限性,并根據(jù)實際需求選擇合適的解決方案。對于需要更高質(zhì)量、更穩(wěn)定、更可控的語音合成,可能需要考慮使用第三方的語音合成服務(wù)。