2017-06-03 2 views
1

Bei dem Versuch, eine Lösung zu, um zu bestimmen How to use Web Speech API at chromium? gefunden, daßWie erstellt oder konvertiert Text im Chrome-Browser Audio?

var voices = window.speechSynthesis.getVoices(); 

ein leeres Array für voices Identifizierer zurückgibt.

Nicht sicher, wenn der Mangel an Unterstützung bei Chrom-Browser auf dieses Problem bezogen ist Not OK, Google: Chromium voice extension pulled after spying concerns?

Fragen:

1) Gibt es Workarounds, die das Erfordernis der Schaffung oder die Konvertierung von Audio von Text in Chrom-Browser implementieren können?

2) Wie können wir, die Entwicklergemeinschaft, eine Open-Source-Datenbank mit Audiodateien erstellen, die sowohl gängige als auch unübliche Wörter wiedergeben; serviert mit entsprechenden CORS Header?

Antwort

1

Es gibt mehrere mögliche Problemumgehungen, die die Möglichkeit bieten, Audio aus Text zu erstellen; Zwei davon erfordern die Anforderung einer externen Ressource, die andere verwendet meSpeak.js von @masswerk.

Ansatz bei Download the Audio Pronunciation of Words from Google beschrieben verwenden, die aus nicht in der Lage, leidet vorab zu bestimmen, welche Wörter existieren tatsächlich als Datei an die Ressource ohne writing a shell script oder eine HEAD Anfrage durchführen zu überprüfen, ob ein Netzwerkfehler auftritt. Zum Beispiel ist das Wort "do" bei der unten verwendeten Ressource nicht verfügbar.

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>

Resources bei Wikimedia Commons Category:Public domain nicht aus demselben Verzeichnis bedient erforderlich, siehe How to retrieve Wiktionary word content?, wikionary API - meaning of words.

Wenn der genaue Speicherort der Ressource bekannt ist, kann das Audio angefordert werden, obwohl die URL andere Präfixe als das Wort selbst enthalten kann.

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());

Nicht ganz sicher, wie die Is there a clean wikipedia API just for retrieve content summary?Wikipedia API, How to get Wikipedia content using Wikipedia's API?, verwenden nur die Audio-Datei zu erhalten. Die JSON Antwort müsste für Text geklärt werden, der in .ogg endet, dann müsste eine zweite Anfrage für die Ressource selbst gemacht werden.

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\" 

die

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 

meldet sich, wenn sie nicht vom gleichen Ursprung angefordert. Wir müssten versuchen, YQL wieder zu verwenden, obwohl nicht sicher, wie die Abfrage formuliert wird, um Fehler zu vermeiden.

Der dritte Ansatz verwendet eine leicht modifizierte Version von meSpeak.js, um das Audio ohne eine externe Anforderung zu generieren.Die Modifizierung wurde einen richtigen Rückruf für .loadConfig() Methode ist

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));

Einen Nachteil des obigen Ansatzes zu schaffen, dass es etwa 14 und eine halbe Sekunde, bis die drei Dateien, bevor das Audio zu laden nimmt, ist abgespielt. Vermeidet jedoch externe Anforderungen.

Es wäre positiv für eines oder beide 1) Erstellen Sie eine FOSS, Entwickler verwaltet Datenbank oder Verzeichnis von Sounds für beide gemeinsame und ungewöhnliche Wörter; 2) Durchführen einer weiteren Entwicklung von meSpeak.js, um die Ladezeit der drei notwendigen Dateien zu reduzieren; und verwenden Sie Promise basierte Ansätze, um Benachrichtigungen über den Fortschritt des Ladens der Dateien und die Bereitschaft der Anwendung bereitzustellen.

Nach Einschätzung dieser Benutzer wäre es eine nützliche Ressource, wenn Entwickler selbst eine Online-Datenbank von Dateien erstellen und beisteuern, die mit einer Audiodatei des bestimmten Worts geantwortet haben. Nicht ganz sicher, ob der geeignete Ort für Audiodateien ist? Muss die möglichen Optionen berücksichtigen, wenn das Interesse an einem solchen Projekt gezeigt wird.

Verwandte Themen