JavaScriptでMacに歌ってもらう

最近のChrome, SafariJavaScriptには音声合成APIが入っています。
使い方は簡単で、JavaScriptコンソール等で

var msg = new SpeechSynthesisUtterance('こんにちは!');
msg.lang = "ja-JP"; // 言語指定
window.speechSynthesis.speak(msg);

のようにするだけで喋ってくれます。


音声エンジンを変えることも可能です。使える音声の一覧を

var voices = speechSynthesis.getVoices();

で取得すると、voicesに音声オブジェクトのリストが返ってくるので、この中のlangやnameを見て使いたいものを

msg.voice = voices[3];

などとSpeechSynthesisUtteranceオブジェクトのvoice属性に指定すればOKです。


MacだとOSの音声合成エンジンを呼び出すことができます。Mac1984年から脈々とMacInTalkという音声合成エンジンを受け継いできており、Mac OS Xになっても昔のVoiceがまだ利用できます。その中には、MacInTalk 3で収録された、歌を歌ってくれるという遊び心あふれるVoiceも未だに入っています。当時はこれを33MHzの68030とかで合成していたんですよね。そんなVoiceがJavaScriptで呼び出せるなんて、ちょっと感慨深いものがあります。というわけでやってみない手はありません。

さっそく動かしてみる

MacJavaScriptで歌わせるサンプル: http://jsfiddle.net/ApvvB/7/


上記のページで、Bells, Cellos, Pipe Organ, Good News, Bad Newsのボタンを押すと、それぞれのVoiceでラララーと歌ってくれます。
defaultは0番のボイスで読み上げ、stopは歌うのを停止させるボタンです。


rate,pitch,volumeのスライダーを動かすと、早さ、音程、音量を変えられます。が、rateは歌には効かないようでした。

Mac OS XSafari, Chromeで動作を確認できました。


ChromeはonLoadの中でvoicesを取得しようとすると、なぜか空のリストが返ってくるので、ボタンをクリックされたタイミングで取得するよう注意が必要でした。

おまけ

ちなみに、端末上で

say -v Bells 'have a nice day'

などとしても、歌わせることが可能です。