Chromeでは、voiceschanged
はページの読み込みspeechSynthesis.getVoices()
時voiceschanged
に起動するため、起動時に呼び出すイベントリスナーがある限り、空の配列を音声で埋めるために最初に持っていた関数を呼び出す必要はありません。
// Store voices
let voices = [];
function getVoices() {
voices = speechSynthesis.getVoices();
// Create an option for each voice in array
voices.forEach((voice) => {
const option = document.createElement('option');
option.value = voice.name;
option.innerText = `${voice.name} ${voice.lang}`;
voicesSelect.appendChild(option);
});
}
// Voices changed
speechSynthesis.addEventListener('voiceschanged', getVoices);
// Not needed (in Chrome at least) because voiceschanged event fires on page load, calling getVoices due to event listener (trying to figure out why)
// getVoices();
私はこの振る舞いを理解しようとしているだけです-音声が変化したときのMDNの説明は、私が知る限りそれを説明していません:
Web Speech APIのvoiceschangedイベントは、SpeechSynthesis.getVoices()メソッドによって返されるSpeechSynthesisVoiceオブジェクトのリストが変更されたときに発生します(voiceschangedイベントが発生したとき)。
ChromeがAPI呼び出しを終了すると音声のリストが変更され、Chromeユーザーのみが利用できる音声のリストが取得されるため、イベントが発生します。証明:
インターネットに接続されていない2つの音声はかなり退屈で、安価なオーディオ制作で使用されていることがほとんど認識できることに気付くでしょう。しかし、Google Chromeのものは流動的で、ほとんど影響力がありません。もちろん、このイベントはボイスがロードされたときに発生する必要があります。Web SpeechAPI仕様のW3Cエラッタをざっと見てください。ボイスがロードされるたびに、voiceschanged
イベントが発生します。
voiceschanged:getVoicesメソッドが返すSpeechSynthesisVoiceListの内容が変更されたときに発生します。例としては、リストが非同期で決定されるサーバー側の合成、またはクライアント側の音声がインストール/アンインストールされる場合があります。
そして、実際には、リンクしたMDNWebドキュメントの最後の行を見てください...
ただし、Chromeでは、リストにデータを入力する前にイベントが発生するのを待つ必要があるため、以下に示すifステートメントの下部にあります。
音声合成APIベースのソースコード(私のオープンソースプロジェクトPronounceThatから)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加