Google Chromeの合成音声を試してみた

Macではsayコマンドでお馴染みの合成音声が、Google Chromeでも使えるようになったらしいので試してみた。Webページ経由ではなく、Google ChromeJavaScriptコンソールを用いた。

サンプルコードにある通り、message と voice を定義する必要がある。

https://gist.github.com/laclefyoshi/8627514

voice一覧の後半に、AlexからZavoxはMacの読み上げ (say)で使われる声と同じものが現れた。おそらく、Macに (日本語用音声である) KyokoさんやOtoyaくんをインストールすれば、ここに現れると思われる。

https://gist.github.com/laclefyoshi/8627542

messageには最低限、テキストとそれに対応するvoice、言語を設定する必要がある。

> msg.text = "JavaScript (JS) is a dynamic computer programming language."
> msg.voice = voices[0]
> msg.lang = voices[0].lang  # "en-US"

最後に、再生。

> window.speechSynthesis.speak(msg)

英語音声で、英語テキスト。

括弧など記号は発音されていない。読み上げさせる際に必要になる状況もありえるだろうが、発音させることはできるのだろうか。

次に、日本語音声で、英語テキスト。

> msg.text = "JavaScript (JS) is a dynamic computer programming language."
> msg.voice = voices[7]
> msg.lang = voices[7].lang  # "ja-JP"

若干悪意すら感じる日本人 (カタカナっぽい) 英語になった。

中国語音声で、英語テキスト。

> msg.text = "JavaScript (JS) is a dynamic computer programming language."
> msg.voice = voices[9]
> msg.lang = voices[9].lang  # "zh-CN"

ピンインとして解釈されたようだ。

最後に、日本語音声で、日本語テキスト。

> msg.text = "JavaScript(ジャヴァスクリプト)とは、プログラミング言語のひとつである。"
> msg.voice = voices[7]
> msg.lang = voices[7].lang

??

「パーセントユー」と言っていることから、escapeされた文字列を読み上げているようだ。しかも、全部読み切れずに途中で切れてしまった。

> escape("JavaScript(ジャヴァスクリプト)とは、プログラミング言語のひとつである。")
"JavaScript%uFF08%u30B8%u30E3%u30F4%u30A1%u30B9%u30AF%u30EA%u30D7%u30C8%uFF09%u3068%u306F%u3001%u30D7%u30ED%u30B0%u30E9%u30DF%u30F3%u30B0%u8A00%u8A9E%u306E%u3072%u3068%u3064%u3067%u3042%u308B%u3002"

ならばと、unescape("日本語")をmsg.textに与えてみたが、ダメだった。コンソールを使っているのが悪いのかと、Webページに書いてやってみたが、やはりescapeされた文字列を読んでしまう。この問題の解決は、今後の課題とする。

ところで、よく聞いてみると、30A1を「さんじゅうえーいち」と読んでいたり、3068を「さんぜんろくじゅうはち」と読んでいたり、連続する数字の読みをちゃんと判別していることが分かる。

音声認識よりは目立たない地味なAPIだが、今後、ボーカロイド並みの実装になれば楽しいだろうと思う (すでにpitchやrateなどそれっぽい属性が付いているが、活用できなかった)。