speechSynthesis.getVoices()で配列が返ってくるらしいので、
var text = "hello";
var msg = new SpeechSynthesisUtterance();
msg.text = text;
msg.voice = "Alex";
speechSynthesis.speak(msg);
というコードを書いてみましたがmsg.voice = "Alexがうまくいかずエラーが出る。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWvBdbUMFyK3wOz2_OGggww14DmbbSskjmYOIqLcIZvZiJkXPA3GVjrQPrvG3MoS9vhz0Yk7L_C-Dtg7RK6vgWs5XXSBiSFK0gwH8Q59dyM7hyphenhyphenBkn_UQfsGwboGnJXIMUTULXljty_dcI/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2019-03-10+21.51.37.png)
いろいろ試してみると、speechSynthesis.onvoiceschanged で解決したので、備忘録として短いコードを書き残しておこう。
(ブラウザによるのかも ちなみに手元のブラウザはChrome)
デモ
以下のボタンをクリックすると Alex の声で hello と言ってくれる。
これをGoogle Apps ScriptのWebアプリで実現するコードを以下に残しました。
コード.gsfunction doGet() { return HtmlService.createHtmlOutputFromFile("index"); } | 意訳この機能がやること 指定したHTMLファイルを表示する |
index.html<!DOCTYPE html> <html> <body> <button id="bt">Say hello</button> <script> speechSynthesis.onvoiceschanged = getVoices; document.getElementById('bt').onclick = speak; var voices; function getVoices() { voices = speechSynthesis.getVoices(); } function speak() { var text = "hello"; var msg = new SpeechSynthesisUtterance(); msg.text = text; msg.voice = voices[1];//Alex speechSynthesis.speak(msg); } </script> </body> </html> |
補足:失敗したコード
以下のようにindex.htmlを書くと、こんなエラーが出た
Uncaught TypeError: Failed to set the 'voice' property on 'SpeechSynthesisUtterance': The provided value is not of type 'SpeechSynthesisVoice'.at HTMLTextAreaElement.speak
index.html
<!DOCTYPE html> <html> <body> <button id="bt">Say hello</button> <script> document.getElementById('bt').onclick = speak; function speak() { var text = "hello"; var msg = new SpeechSynthesisUtterance(); msg.text = text; msg.voice = "Alex"; speechSynthesis.speak(msg); } </script> </body> </html> |
speechSynthesis.onvoiceschanged = getVoices;
を実行しないとだめらしい。
参考
SpeechSynthesis.onvoiceschanged
SpeechSynthesis.onvoiceschanged
SpeechSynthesis.getVoices()