2017-06-03 53 views
1

雖然試圖確定一個解決How to use Web Speech API at chromium?發現如何在鉻瀏覽器上創建文本或將文本轉換爲音頻?

var voices = window.speechSynthesis.getVoices(); 

返回一個空數組voices標識符。

不能肯定,如果缺乏在Chromium瀏覽器的支持與此相關的問題Not OK, Google: Chromium voice extension pulled after spying concerns

問題:

1)是否有能夠實現創建或鉻瀏覽器文本轉換音頻的要求的任何變通辦法?

2)如何才能,開發者社區,創建的音頻文件,這反映了常見和不常見單詞的開源數據庫;配以適當的CORS標題?

回答

1

有跡象表明,已經發現了一些可能的解決方法,能夠以從文本創建音頻的能力;其中兩個需要請求外部資源,另一個使用@masswerk使用meSpeak.js

使用在Download the Audio Pronunciation of Words from Google中描述的方法,該方法不能夠預先確定哪些字實際上存在爲資源上的文件而沒有writing a shell script或執行HEAD請求以檢查是否發生網絡錯誤。例如,「do」這個詞在下面使用的資源中不可用。

window.addEventListener("load",() => { 
 

 
    const textarea = document.querySelector("textarea"); 
 

 
    const audio = document.createElement("audio"); 
 

 
    const mimecodec = "audio/webm; codecs=opus"; 
 

 
    audio.controls = "controls"; 
 

 
    document.body.appendChild(audio); 
 

 
    audio.addEventListener("canplay", e => { 
 
    audio.play(); 
 
    }); 
 

 
    let words = textarea.value.trim().match(/\w+/g); 
 

 
    const url = "https://ssl.gstatic.com/dictionary/static/sounds/de/0/"; 
 

 
    const mediatype = ".mp3"; 
 

 
    Promise.all(
 
    words.map(word => 
 
     fetch(`https://query.yahooapis.com/v1/public/yql?q=select * from data.uri where url="${url}${word}${mediatype}"&format=json&callback=`) 
 
     .then(response => response.json()) 
 
     .then(({query: {results: {url}}}) => 
 
     fetch(url).then(response => response.blob()) 
 
     .then(blob => blob) 
 
    ) 
 
    ) 
 
) 
 
    .then(blobs => { 
 
    // const a = document.createElement("a"); 
 
    audio.src = URL.createObjectURL(new Blob(blobs, { 
 
        type: mimecodec 
 
       })); 
 
    // a.download = words.join("-") + ".webm"; 
 
    // a.click() 
 
    }) 
 
    .catch(err => console.log(err)); 
 
});
<textarea>what it does my ninja?</textarea>

資源在Wikimedia Commons Category:Public domain是沒有必要從同一個目錄服務,看How to retrieve Wiktionary word content?wikionary API - meaning of words

如果資源的精確位置是已知的,聲音可以請求,雖然URL可包括比這個詞本身其他前綴。

fetch("https://upload.wikimedia.org/wikipedia/commons/c/c5/En-uk-hello-1.ogg") 
 
.then(response => response.blob()) 
 
.then(blob => new Audio(URL.createObjectURL(blob)).play());

不能完全確定如何使用Wikipedia APIHow to get Wikipedia content using Wikipedia's API?Is there a clean wikipedia API just for retrieve content summary?只得到的音頻文件。對於結尾爲.ogg的文本,需要解析JSON響應,然後需要爲資源本身提供第二個請求。

fetch("https://en.wiktionary.org/w/api.php?action=parse&format=json&prop=text&callback=?&page=hello") 
.then(response => response.text()) 
.then(data => { 
    new Audio(location.protocol + data.match(/\/\/upload\.wikimedia\.org\/wikipedia\/commons\/[\d-/]+[\w-]+\.ogg/).pop()).play() 
}) 
// "//upload.wikimedia.org/wikipedia/commons/5/52/En-us-hello.ogg\" 

它記錄

Fetch API cannot load https://en.wiktionary.org/w/api.php?action=parse&format=json&prop=text&callback=?&page=hello. No 'Access-Control-Allow-Origin' header is present on the requested resource 

如果不是從同一產地要求。我們需要再次嘗試使用YQL,但不確定如何制定查詢以避免錯誤。

第三種方法使用的meSpeak.js略加修改以生成音頻而不使外部請求。該修改是建立一個適當的回調.loadConfig()方法上述方法是,它需要大約14個半秒鐘的三個文件加載之前的音頻是

fetch("https://gist.githubusercontent.com/guest271314/f48ee0658bc9b948766c67126ba9104c/raw/958dd72d317a6087df6b7297d4fee91173e0844d/mespeak.js") 
 
    .then(response => response.text()) 
 
    .then(text => { 
 
    const script = document.createElement("script"); 
 
    script.textContent = text; 
 
    document.body.appendChild(script); 
 

 
    return Promise.all([ 
 
     new Promise(resolve => { 
 
     meSpeak.loadConfig("https://gist.githubusercontent.com/guest271314/8421b50dfa0e5e7e5012da132567776a/raw/501fece4fd1fbb4e73f3f0dc133b64be86dae068/mespeak_config.json", resolve) 
 
     }), 
 
     new Promise(resolve => { 
 
     meSpeak.loadVoice("https://gist.githubusercontent.com/guest271314/fa0650d0e0159ac96b21beaf60766bcc/raw/82414d646a7a7ef11bb04ddffe4091f78ef121d3/en.json", resolve) 
 
     }) 
 
    ]) 
 
    }) 
 
    .then(() => { 
 
    // takes approximately 14 seconds to get here 
 
    console.log(meSpeak.isConfigLoaded()); 
 
    meSpeak.speak("what it do my ninja", { 
 
     amplitude: 100, 
 
     pitch: 5, 
 
     speed: 150, 
 
     wordgap: 1, 
 
     variant: "m7" 
 
    }); 
 
}) 
 
.catch(err => console.log(err));

一個警告回放。但是,避免了外部請求。

這將是一個正的之一或兩者1)創建FOSS,顯影劑保持數據庫,或兩者兼有常見的和不常見的話聲音的目錄; 2)進一步開發meSpeak.js以減少三個必需文件的加載時間;並使用基於Promise的方法來提供文件加載進度和應用程序準備情況的通知。

在這個用戶的估計,這將是一個有用的資源,如果自己創造的,並有助於文件的在線數據庫,與特定詞的音頻文件迴應開發商。不完全確定github是否是主持音頻文件的適當場所?如果對此類項目感興趣,則必須考慮可能的選項。

相關問題