ã¦ã§ãé³å£° API ã¯ãé³å£°èªèã¨é³å£°åæï¼text to speech ã¾ã㯠tts ã¨ãã¦ãç¥ããã¦ãã¾ãï¼ã¨ãã 2 ã¤ã®ç°ãªãåéã®æ©è½ãæä¾ãã¦ãããã¢ã¯ã»ã·ããªãã£ã¨å¶å¾¡ã¡ã«ããºã ã«è峿·±ãæ°ããå¯è½æ§ãããããã¾ãããã®è¨äºã§ã¯ã両æ¹ã®åéã®ç°¡åãªç´¹ä»ã¨ãã¢ãæä¾ãã¾ãã
é³å£°èªèé³å£°èªèã§ã¯ã端æ«ã®ãã¤ã¯ãéãã¦é³å£°ãåä¿¡ããé³å£°èªèãµã¼ãã¹ã«ãã£ã¦ææ³ã®ãªã¹ãï¼åºæ¬çã«ã¯ç¹å®ã®ã¢ããªã§èªèããããèªå½ï¼ã¨ç §åããã¾ããåèªãå¥ãæ£å¸¸ã«èªèãããã¨ãçµæï¼ã¾ãã¯çµæã®ãªã¹ãï¼ãããã¹ãæååã¨ãã¦è¿ããããã®çµæã¨ãã¦ãããªãã¢ã¯ã·ã§ã³ãéå§ãããã¨ãã§ãã¾ãã
ã¦ã§ãé³å£° API ã«ã¯ããã®ããã®ä¸å¿çãªå¶å¾¡ã¤ã³ã¿ã¼ãã§ã¤ã¹ã§ãã SpeechRecognition
ã¨ãææ³ãçµæãªã©ã表ç¾ããããã®ããã¤ãã®å¯æ¥ã«é¢é£ããã¤ã³ã¿ã¼ãã§ã¤ã¹ãããã¾ããä¸è¬çã«ãé³å£°èªèã«ã¯ç«¯æ«ä¸ã§å©ç¨å¯è½ãªæ¢å®ã®é³å£°èªèã·ã¹ãã ã使ç¨ããã¾ããæè¿ã®ã»ã¨ãã©ã® OS ã«ã¯é³å£°ã³ãã³ããçºè¡ããããã®é³å£°èªèã·ã¹ãã ãæè¼ããã¦ãã¾ããmacOS ã® DictationãiOS ã® SiriãWindows 10 ã® CortanaãAndroid ã® Speech ãªã©ãæ³åãã¦ãã ããã
ã¡ã¢: Chrome ãªã©ã®ä¸é¨ã®ãã©ã¦ã¶ã¼ã§ã¯ãã¦ã§ããã¼ã¸ã§é³å£°èªèã使ç¨ããããã«ãµã¼ãã¼ãã¼ã¹ã®èªèã¨ã³ã¸ã³ãå¿ è¦ã§ããé³å£°ãèªèå¦çã®ããã«ã¦ã§ããµã¼ãã¹ã«éä¿¡ãããããããªãã©ã¤ã³ã§ã¯æ©è½ãã¾ããã
ãã¢ã¦ã§ãé³å£°èªèã®ç°¡åãªä½¿ãæ¹ã示ãããã«ã Speech color changer ã¨ãããã¢ãæ¸ãã¦ã¿ã¾ãããç»é¢ãã¿ãã/ã¯ãªãã¯ããHTML ã®è²ã®ãã¼ã¯ã¼ããè¨ãã¨ãã¢ããªã®èæ¯è²ããã®è²ã«å¤ããã¾ãã
ãã¢ãå®è¡ããã«ã¯ã Chrome çã®å¯¾å¿ãã¦ããã¢ãã¤ã«ãã©ã¦ã¶ã¼ã§ã©ã¤ããã¢ã® URL ã«ç§»åãã¦ãã ããã
ãã©ã¦ã¶ã¼ã®å¯¾å¿ç¶æ³ã¦ã§ãé³å£° API ã®é³å£°èªèã®ãµãã¼ãã¯ãé常 Chrome for Desktop 㨠Android ã«éããã¦ãã¾ã â Chrome ã¯ãã¼ã¸ã§ã³ 33 ä»è¿ãããµãã¼ããã¦ãã¾ãããæ¥é è¾ä»ãã®ã¤ã³ã¿ã¼ãã§ã¤ã¹ã使ç¨ãã¦ããããã webkitSpeechRecognition
ãªã©ã®æ¥é è¾ä»ããã¼ã¸ã§ã³ãå«ããå¿
è¦ãããã¾ãã
ã¢ããªã® HTML 㨠CSS ã¯æ¬å½ã«ç°¡åã§ããã¿ã¤ãã«ãèª¬ææ®µè½ã診æã¡ãã»ã¼ã¸ãåºåãã div ãããã ãã§ãã
<h1>Speech color changer</h1>
<p>Tap/click then say a color to change the background color of the app.</p>
<div>
<p class="output"><em>â¦diagnostic messages</em></p>
</div>
ãã® CSS ã§ã¯ãä»ã®ç«¯æ«ã§ãåé¡ãªãè¦ããããã«ãé常ã«ã·ã³ãã«ãªã¬ã¹ãã³ã·ãã®ã¹ã¿ã¤ã«ä»ãããã¦ãã¾ãã
JavaScriptJavaScript ãããå°ã詳ããè¦ã¦ã¿ã¾ãããã
Chrome 対å¿åè¿°ããããã«ãChrome ã¯ç¾å¨æ¥é è¾ä»ãã®ããããã£ã§é³å£°èªèã«å¯¾å¿ãã¦ããã®ã§ãé©åãªãªãã¸ã§ã¯ãã Chrome ã«ä¾çµ¦ããããã¦å°æ¥çãªå®è£ ã§æ¥é è¾ãªãã®æ©è½ããµãã¼ãããå¯è½æ§ãè¸ã¾ãã以ä¸ã®è¡ãã³ã¼ãã®æåã«è¿½å ãã¦ãã¾ãã
const SpeechRecognition = window.SpeechRecognition || webkitSpeechRecognition;
const SpeechGrammarList = window.SpeechGrammarList || webkitSpeechGrammarList;
const SpeechRecognitionEvent =
window.SpeechRecognitionEvent || webkitSpeechRecognitionEvent;
ææ³
ã³ã¼ãã®æ¬¡ã®é¨åã§ã¯ãã¢ããªãèªèããææ³ãå®ç¾©ãã¾ããæ¬¡ã®å¤æ°ã¯ææ³ãä¿æããããã«å®ç¾©ããã¦ãã¾ãã
const colors = [
"aqua",
"azure",
"beige",
"bisque",
"black",
"blue",
"brown",
"chocolate",
"coral" /* ⦠*/,
];
const grammar = `#JSGF V1.0; grammar colors; public <color> = ${colors.join(
" | ",
)};`;
使ç¨ããã¦ããææ³å½¢å¼ã¯ JSpeech Grammar Format (JSGF) ã§ã â ããã«ã¤ãã¦ã®è©³ç´°ã¯ãªã³ã¯å ã®ä»æ§æ¸ãåç §ãã¦ãã ãããããããä»ã®ã¨ããã¯æã£åãæ©ãå®è¡ãã¦ã¿ã¾ãããã
#JSGF V1.0;
â ã¯ã使ç¨ããã¦ãããã©ã¼ãããã¨ãã¼ã¸ã§ã³ã示ãã¾ããããã¯å¸¸ã«æåã«å«ããå¿
è¦ãããã¾ããpublic
ã¯ãããªãã¯ã«ã¼ã«ã§ãããã¨ã宣è¨ããè§æ¬å¼§å
ã®æååã¯ãã®ç¨èªã®èªèå (color
) ãå®ç¾©ããçå·ã®å¾ã«ç¶ãé
ç®ã®ãªã¹ãã¯ãç¨èªã®é©åãªå¤ã¨ãã¦èªèããåãå
¥ãããã代æ¿å¤ã§ããããããããã¤ãæåã§åºåããã¦ãããã¨ã«æ³¨æãã¦ãã ãããæ¬¡ã«ããã¹ããã¨ã¯ãã¢ããªã±ã¼ã·ã§ã³ã®èªèãå¶å¾¡ããé³å£°èªèã¤ã³ã¹ã¿ã³ã¹ãå®ç¾©ãããã¨ã§ãããã㯠SpeechRecognition()
ã³ã³ã¹ãã©ã¯ã¿ã¼ã使ç¨ãã¦è¡ãã¾ããã¾ããSpeechGrammarList()
ã³ã³ã¹ãã©ã¯ã¿ã¼ã使ç¨ãã¦ãææ³ãå«ãæ°ããé³å£°ææ³ãªã¹ãã使ãã¾ãã
const recognition = new SpeechRecognition();
const speechRecognitionList = new SpeechGrammarList();
SpeechGrammarList.addFromString()
ã¡ã½ããã使ã£ã¦ãªã¹ãã« grammar
ã追å ãã¾ãã ãã®ã¡ã½ããã¯è¿½å ãããæååã弿°ã¨ãã¦åãã¨ããããã«ãªãã·ã§ã³ã§ããªã¹ãå
ã§å©ç¨å¯è½ãªä»ã®ææ³ã¨ã®é¢ä¿ã«ããã¦ãã®ææ³ã®éè¦åº¦ãæå®ããéã¿å¤ãåãåãã¾ãï¼0 ãã 1 ã¾ã§ã®ç¯å²ã§æå®ã§ãã¾ãï¼ã追å ãããææ³ã¯SpeechGrammar
ãªãã¸ã§ã¯ãã®ã¤ã³ã¹ã¿ã³ã¹ã¨ãã¦ãªã¹ãå
ã§å©ç¨ã§ãã¾ãã
speechRecognitionList.addFromString(grammar, 1);
次ã«ã SpeechGrammarList
ã SpeechRecognition.grammars
ããããã£ã®å¤ã¨ãã¦è¨å®ãã¦ãé³å£°èªèã¤ã³ã¹ã¿ã³ã¹ã«è¿½å ãã¦ãã¾ããä»ã«ããèªèã¤ã³ã¹ã¿ã³ã¹ã®ããããã£ãããã¤ãè¨å®ãã¦ãããæ¬¡ã«ç§»ãã¾ãã
SpeechRecognition.continuous
: èªèãéå§ããããã³ã«é£ç¶ããçµæããã£ããã£ãã (true
) ããã¾ãã¯åä¸ã®çµæã ãããã£ããã£ãã (false
) ããå¶å¾¡ãã¾ããSpeechRecognition.lang
: èªèã®è¨èªãè¨å®ãã¾ãããããè¨å®ãããã¨ã¯è¯ãç¿æ
£ã§ãããããæ¨å¥¨ããã¾ããSpeechRecognition.interimResults
: é³å£°èªèã·ã¹ãã ãä¸éçãªçµæãè¿ãããæçµçãªçµæã ããè¿ããå®ç¾©ãã¾ãããã®ã·ã³ãã«ãªãã¢ã§ã¯æçµçãªçµæã§ååã§ããSpeechRecognition.maxAlternatives
: çµæãã¨ã«è¿ããã代æ¿åè£æ°ãè¨å®ãã¾ããããã¯ãçµæãå®å
¨ã«æç¢ºã§ã¯ãªããã¦ã¼ã¶ã¼ãæ£ãããã®ã鏿ã§ããããã«ä»£æ¿åè£ã®ãªã¹ãã表示ãããå ´åãªã©ã«ä¾¿å©ãªå ´åãããã¾ãããããããã®ã·ã³ãã«ãªãã¢ã§ã¯å¿
è¦ãªãã®ã§ããã§ã¯ 1 ã¤ã ãæå®ãã¾ãï¼ããã¯å®éã«ã¯ããã©ã«ãã§ãï¼ãrecognition.grammars = speechRecognitionList;
recognition.continuous = false;
recognition.lang = "en-US";
recognition.interimResults = false;
recognition.maxAlternatives = 1;
é³å£°èªèã®éå§
åºåå
ã® <div>
㨠HTML è¦ç´ ã¸ã®åç
§ãåå¾ï¼è¨ºæã¡ãã»ã¼ã¸ãåºåããããå¾ã§ã¢ããªã®èæ¯è²ãæ´æ°ãããã§ããããã«ããããï¼ããå¾ãç»é¢ãã¿ãã/ã¯ãªãã¯ãããã¨ãã«é³å£°èªèãµã¼ãã¹ãéå§ãããããã« onclick ãã³ãã©ã¼ãå®è£
ãã¾ãããã㯠SpeechRecognition.start()
ãå¼ã³åºããã¨ã§å®ç¾ãã¦ãã¾ãã forEach()
ã¡ã½ããã¯ä½è²ãè¨ã£ã¦ãããã示ãè²ä»ãã¤ã³ã¸ã±ã¼ã¿ã¼ãåºåããããã«ä½¿ããã¦ãã¾ãã
const diagnostic = document.querySelector(".output");
const bg = document.querySelector("html");
const hints = document.querySelector(".hints");
let colorHTML = "";
colors.forEach((color, i) => {
console.log(color, i);
colorHTML += `<span style="background-color:${color};"> ${color} </span>`;
});
hints.innerHTML = `Tap or click then say a color to change the background color of the app. Try ${colorHTML}.`;
document.body.onclick = () => {
recognition.start();
console.log("Ready to receive a color command.");
};
çµæã®åãåãã¨å¦ç
é³å£°èªèãéå§ãããã¨ãçµæããã®ä»ã®å¨è¾ºæ
å ±ãåå¾ããããã«ä½¿ç¨ã§ããå¤ãã®ã¤ãã³ããã³ãã©ã¼ãããã¾ãï¼SpeechRecognition
ã®ã¤ãã³ã ãåç
§ãã¦ãã ããï¼ãæãä¸è¬çãªãã®ã¯ result
ã¤ãã³ãã§ãæåããçµæãåä¿¡ããã¨ãã«çºçãã¾ãã
recognition.onresult = (event) => {
const color = event.results[0][0].transcript;
diagnostic.textContent = `Result received: ${color}.`;
bg.style.backgroundColor = color;
console.log(`Confidence: ${event.results[0][0].confidence}`);
};
ããã® 2 è¡ç®ã¯ã¡ãã£ã¨è¤éãããªã®ã§ãé ã追ã£ã¦èª¬æãã¦ããã¾ããããSpeechRecognitionEvent.results
ããããã£ã¯ã SpeechRecognitionResult
ãªãã¸ã§ã¯ããå«ã SpeechRecognitionResultList
ãªãã¸ã§ã¯ããè¿ãã¾ããããã¯ã²ãã¿ã¼ãæã£ã¦ããã®ã§é
åã®ããã«ã¢ã¯ã»ã¹ã§ããæåã® [0]
㯠0 ã®ä½ç½®ã«ãã SpeechRecognitionResult
ãè¿ãã¾ããå SpeechRecognitionResult
ãªãã¸ã§ã¯ãã«ã¯ãåã
ã«èªèãããåèªãå«ã SpeechRecognitionAlternative
ãªãã¸ã§ã¯ããå«ã¾ãã¦ãã¾ãããããã¯é
åã®ããã«ã¢ã¯ã»ã¹ã§ããããã«ã²ãã¿ã¼ãæã£ã¦ãã¾ã â 2 çªç®ã® [0]
ã¯ããããã£ã¦ä½ç½® 0 ã® SpeechRecognitionAlternative
ãè¿ãã¾ããæ¬¡ã«ããã® transcript
ããããã£ãè¿ãã¦åã
ã®èªèçµæãå«ãæååãæååã¨ãã¦åå¾ããèæ¯è²ããã®è²ã«è¨å®ããèªèãããè²ã UI ã®è¨ºæã¡ãã»ã¼ã¸ã¨ãã¦å ±åãã¾ãã
ã¾ãã speechend
ã¤ãã³ãã使ç¨ãã¦é³å£°èªèãµã¼ãã¹ã®å®è¡ã忢ãã¾ãï¼1 ã¤ã®åèªãèªèããããããçºè©±ããçµãã£ãã SpeechRecognition.stop()
) ã使ç¨ãã¾ãï¼ã
recognition.onspeechend = () => {
recognition.stop();
};
ã¨ã©ã¼ãèªèãããªãçºè©±ã®ãã³ããªã³ã°
æå¾ã® 2 ã¤ã®ãã³ãã©ã¯ãå®ç¾©ãããææ³ã«ãªãé³å£°ãèªèãããã±ã¼ã¹ãã¨ã©ã¼ãçºçããã±ã¼ã¹ãå¦çããããã®ãã®ã§ãã nomatch
ã¯æåã«è¨åããã±ã¼ã¹ãå¦çãããã¨ã«ãªã£ã¦ããããã§ãããä»ã®ã¨ããæ£ããåä½ãã¦ããããã«ã¯è¦ããªããã¨ã«æ³¨æãã¦ãã ããï¼ã¨ã«ããèªèããããã®ãè¿ãã ãã§ãï¼ã
recognition.onnomatch = (event) => {
diagnostic.textContent = "I didn't recognize that color.";
};
error
ã¯ãèªèã«æåãã¦å®éã«ã¨ã©ã¼ãçºçããã±ã¼ã¹ãå¦çãã¾ã â SpeechRecognitionErrorEvent.error
ããããã£ã«ã¯ãè¿ãããå®éã®ã¨ã©ã¼ãå«ã¾ãã¾ãã
recognition.onerror = (event) => {
diagnostic.textContent = `Error occurred in recognition: ${event.error}`;
};
é³å£°åæ
é³å£°åæ (å¥å text-to-speech ã¾ã㯠tts) ã¯ãã¢ããªå ã®ããã¹ããé³å£°ã«åæããæ©å¨ã®ã¹ãã¼ã«ã¼ã¾ãã¯é³å£°åºåæ¥ç¶ããåçãããã¨ãæãã¾ãã
ã¦ã§ãé³å£° API ã«ã¯ããã®ããã®ä¸å¿çãªå¶å¾¡ã¤ã³ã¿ã¼ãã§ã¤ã¹ â SpeechSynthesis
ããããããã«ãåæãããï¼çºè©±ã¨ãå¼ã°ããï¼ããã¹ããçºè©±ã«ä½¿ç¨ãããé³å£°ãªã©ã表ç¾ããã坿¥ã«é¢é£ãã夿°ã®ã¤ã³ã¿ã¼ãã§ã¤ã¹ãããã¾ããç¹°ãè¿ãã«ãªãã¾ãããã»ã¨ãã©ã® OS ã¯ä½ããã®é³å£°åæã·ã¹ãã ãä¿æãã¦ãããå©ç¨å¯è½ãªå ´åã¯ãã®ã¿ã¹ã¯ã®ããã« API ã使ç¨ããããã¨ã«ãªãã¾ãã
ã¦ã§ãé³å£°åæã®åºæ¬çãªä½¿ãæ¹ã示ãããã«ã Speak easy synthesis ã¨ãããã¢ãæä¾ãã¦ãã¾ããããã«ã¯ãåæããããã¹ããå ¥åããããã¹ããçºå£°ãããã¨ãã«ä½¿ç¨ããé³ç¨ãé度ãããã³é³å£°ãè¨å®ããããã®ä¸é£ã®ãã©ã¼ã ã³ã³ããã¼ã«ãè¨è¼ããã¦ãã¾ããããã¹ããå ¥åããå¾ã Enter/Return ãæ¼ãã¨ããã®ããã¹ããçºè©±ãããã®ãèããã¨ãã§ãã¾ãã
ãã¢ãå®è¡ããã«ã¯ãChromeãªã©ã®å¯¾å¿ãã¦ããã¢ãã¤ã«ãã©ã¦ã¶ã¼ã§ã©ã¤ããã¢ã® URL ã«ç§»åãã¦ãã ããã
ãã©ã¦ã¶ã¼ã®å¯¾å¿Web Speech APIã®é³å£°åæã¸ã®å¯¾å¿ã¯ã主æµã®ãã©ã¦ã¶ã¼ã§ã¾ã é²ãã§ããããç¾å¨ã§ã¯ä»¥ä¸ã®ãã®ã«éããã¦ãã¾ãã
about:config
ã§ media.webspeech.synth.enabled
ãã©ãã°ã true
ã«åãæ¿ãããã¨ã§ãªã³ã«ãããã¨ãå¯è½ã§ããHTMLã¨CSSã¯ãã¿ã¤ãã«ã使ç¨ãããããã®ããã¤ãã®æç¤ºãããã³ããã¤ãã®åç´ãªã³ã³ããã¼ã«ãæã¤å½¢å¼ãå«ãããããã¨ã¦ãåç´ãªãã®ã§ãã <select>
è¦ç´ ã¯æåã¯ç©ºã§ãããJavaScript ã§ <option>
ãå
¥åãã¦ãã¾ãï¼å¾è¿°ãã¾ãï¼ã
<h1>Speech synthesizer</h1>
<p>
Enter some text in the input below and press return to hear it. change voices
using the dropdown menu.
</p>
<form>
<input type="text" class="txt" />
<div>
<label for="rate">Rate</label
><input type="range" min="0.5" max="2" value="1" step="0.1" id="rate" />
<div class="rate-value">1</div>
<div class="clearfix"></div>
</div>
<div>
<label for="pitch">Pitch</label
><input type="range" min="0" max="2" value="1" step="0.1" id="pitch" />
<div class="pitch-value">1</div>
<div class="clearfix"></div>
</div>
<select></select>
</form>
JavaScript
ãã®ã¢ããªãåããã¦ãã JavaScript ã調ã¹ã¦ã¿ã¾ãããã
夿°ã®è¨å®ã¾ãæåã«ãUI ã«é¢ä¿ãããã¹ã¦ã® DOM è¦ç´ ã¸ã®åç
§ãåå¾ãã¾ãããããè峿·±ãã®ã¯ Window.speechSynthesis
ã¸ã®åç
§ãåå¾ãããã¨ã§ãããã㯠API ã®ã¨ã³ããªã¼ãã¤ã³ãã§ãããã¦ã§ãé³å£°åæã®å¶å¾¡ã¤ã³ã¿ã¼ãã§ã¤ã¹ã§ãã SpeechSynthesis
ã®ã¤ã³ã¹ã¿ã³ã¹ãè¿ãã¾ãã
const synth = window.speechSynthesis;
const inputForm = document.querySelector("form");
const inputTxt = document.querySelector(".txt");
const voiceSelect = document.querySelector("select");
const pitch = document.querySelector("#pitch");
const pitchValue = document.querySelector(".pitch-value");
const rate = document.querySelector("#rate");
const rateValue = document.querySelector(".rate-value");
const voices = [];
select è¦ç´ ã®çæ
<select>
è¦ç´ ã«ç«¯æ«ãå©ç¨ã§ããæ§ã
ãªé³å£°ãªãã·ã§ã³ãå
¥åããããã«ã populateVoiceList()
颿°ãæ¸ãã¾ãããæåã« SpeechSynthesis.getVoices()
ãå¼ã³åºãã SpeechSynthesisVoice
ãªãã¸ã§ã¯ãã§è¡¨ããããå©ç¨ã§ãããã¹ã¦ã®é³å£°ã®ãªã¹ããè¿ãã¾ããæ¬¡ã«ããã®ãªã¹ããèµ°æ»ãã¾ãã ããããã®é³å£°ã«å¯¾ã㦠<option>
è¦ç´ ã使ãããã®ããã¹ãã³ã³ãã³ããé³å£°ã®ååï¼SpeechSynthesisVoice.name
ããåå¾ï¼ãé³å£°ã®è¨èªï¼SpeechSynthesisVoice.lang
ããåå¾ï¼ãé³å£°ãåæã¨ã³ã¸ã³ã®æ¢å®ã®é³å£°ã§ããã° -- DEFAULT
ï¼SpeechSynthesisVoice.default
ã true
ãè¿ãã¦ãããã調ã¹ããã¨ã«ãã確èªã§ãã¾ãï¼ã表示ããããè¨å®ãã¾ãã
ã¾ãã option ãã¨ã« data-
屿§ã使ããããã«é³å£°ã®ååã¨è¨èªãæ ¼ç´ãã¦ãå¾ã§ç°¡åã«åå¾ã§ããããã«ãã¾ããããã¦ããã® option ã select ã®åã¨ãã¦è¿½å ãã¾ãã
function populateVoiceList() {
voices = synth.getVoices();
for (const voice of voices) {
const option = document.createElement("option");
option.textContent = `${voice.name} (${voice.lang})`;
if (voice.default) {
option.textContent += " â DEFAULT";
}
option.setAttribute("data-lang", voice.lang);
option.setAttribute("data-name", voice.name);
voiceSelect.appendChild(option);
}
}
ãã®é¢æ°ãå®è¡ããããã«ãªã£ããã以ä¸ã®ããã«ãã¾ããããã¯ã Firefox ã voiceschanged
ã¤ãã³ãã«å¯¾å¿ãã¦ãããã SpeechSynthesis.getVoices()
ãçºè¡ãããã¨å£°ã®ãªã¹ããè¿ãã ãã«ãªã£ã¦ãã¾ãããã§ãããããã Chrome ã§ã¯ãã¤ãã³ããçºè¡ãããã®ãå¾
ã£ã¦ãããªã¹ãã使ããå¿
è¦ããããããä¸è¨ã®ãã㪠if æãè¨è¼ãã¦ãã¾ãã
populateVoiceList();
if (speechSynthesis.onvoiceschanged !== undefined) {
speechSynthesis.onvoiceschanged = populateVoiceList;
}
å
¥åãããããã¹ãã®çºè©±
次ã«ãããã¹ããã£ã¼ã«ãã«å
¥åãããããã¹ãã話ãå§ããããã®ã¤ãã³ããã³ãã©ã¼ã使ãã¾ãã Enter/Return ãæ¼ãããã¨ãã«ã¢ã¯ã·ã§ã³ãèµ·ããããã«ããã©ã¼ã ã§ onsubmit ãã³ãã©ã¼ã使ç¨ãã¦ãã¾ããã¾ããã³ã³ã¹ãã©ã¯ã¿ã¼ã使ç¨ãã¦æ°ãã SpeechSynthesisUtterance()
ã¤ã³ã¹ã¿ã³ã¹ã使ãã弿°ã¨ãã¦ããã¹ãå
¥åã®å¤ã渡ããã¾ãã
次ã«ãã©ã®é³å£°ã使ç¨ããããèããå¿
è¦ãããã¾ããããã§ã¯ HTMLSelectElement
ã® selectedOptions
ããããã£ã使ã£ã¦ãç¾å¨é¸æããã¦ãã <option>
è¦ç´ ãè¿ãã¾ããæ¬¡ã«ããã®è¦ç´ ã® data-name
屿§ã使ç¨ãã¦ããã®å±æ§ã®å¤ã¨ä¸è´ããååãæã¤ SpeechSynthesisVoice
ãªãã¸ã§ã¯ããæ¢ãã¾ããä¸è´ããé³å£°ãªãã¸ã§ã¯ããSpeechSynthesisUtterance.voice
ããããã£ã®å¤ã¨ãã¦è¨å®ãã¾ãã
æå¾ã«ã SpeechSynthesisUtterance.pitch
㨠SpeechSynthesisUtterance.rate
ã«ã該å½ããç¯å²ã®ãã©ã¼ã è¦ç´ ã®å¤ãè¨å®ãã¦ãã¾ããããã¦ããã¹ã¦ã®æºåãæ´ã£ãã¨ããã§ã SpeechSynthesis.speak()
ãå¼ã³åºãã¦ã SpeechSynthesisUtterance
ã¤ã³ã¹ã¿ã³ã¹ã弿°ã«æ¸¡ãã¦çºè©±ãå§ãã¾ãã
inputForm.onsubmit = (event) => {
event.preventDefault();
const utterThis = new SpeechSynthesisUtterance(inputTxt.value);
const selectedOption = voiceSelect.selectedOptions[0].getAttribute('data-name');
for (const voice of voices) {
if (voice.name === selectedOption) {
utterThis.voice = voice;
}
}
utterThis.pitch = pitch.value;
utterThis.rate = rate.value;
synth.speak(utterThis);
ãã³ãã©ã¼ã®æå¾ã®é¨åã§ã¯ã pause
ã¤ãã³ããè¨è¿°ãã¦ã SpeechSynthesisEvent
ãããã«æçãªç¨éã§ä½¿ç¨ã§ãããã示ãã¦ãã¾ãã SpeechSynthesis.pause()
ãå¼ã³åºãããã¨ãé³å£°ã䏿忢ãããæåçªå·ã¨ååãå ±åããã¡ãã»ã¼ã¸ãè¿ãã¾ãã
utterThis.onpause = (event) => {
const char = event.utterance.text.charAt(event.charIndex);
console.log(
`Speech paused at character ${event.charIndex} of "${event.utterance.text}", which is "${char}".`,
);
};
æå¾ã«ãããã¹ãå ¥åã«å¯¾ã㦠blur() ãå¼ã³åºãã¦ãã¾ããããã¯ä¸»ã« Firefox OS ä¸ã§ãã¼ãã¼ããé ãããã®ãã®ã§ãã
表示ããã¦ãããããã¨ã¬ã¼ãã®å¤ã®æ´æ°ã³ã¼ãã®æå¾ã®é¨åã§ã¯ãã¹ã©ã¤ãã¼ã®ä½ç½®ãç§»åããããã³ã«ã UI ã«è¡¨ç¤ºããã pitch
/rate
å¤ãæ´æ°ãã¦ãã¾ãã
pitch.onchange = () => {
pitchValue.textContent = pitch.value;
};
rate.onchange = () => {
rateValue.textContent = rate.value;
};
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4