古事連記帖

趣味のこと、技術的なこと、適当につらつら書きます。

Windows Phone 8で音声合成をつかう

Windows Phone Advent Calendarの15日目です。


Windows Phoneにはリリース当初から音声認識機能と、音声合成機能があります。Siriよりも先に実装されていた機能でしたが、それが使えたのは欧米諸国に限られていました。

まだ日本で発売されていないWindows Phone 8から、ようやく日本語での音声認識と音声合成が実装され、Windowsボタン長押しして音声認識待機画面を出してから「起動 カレンダー」などと話しかけることができるようになりました。

そんな新機能から、音声合成(Text to Speech)について。
日本語の音声合成エンジンを積んだ端末で、喋らせるだけならすぐできます。
WMAppManifest.xmlの「機能」タブにある「ID_CAP_SPEECH_RECOGNITION」にチェックを入れて、使用できるようにしてから、以下のコードを記述します。

private async void Speech()
{
    var speech = new Windows.Phone.Speech.Synthesis.SpeechSynthesizer();
    var voice = Windows.Phone.Speech.Synthesis.InstalledVoices.All.FirstOrDefault(w => w.Language == "ja-JP" && w.Gender == Windows.Phone.Speech.Synthesis.VoiceGender.Female);
    speech.SetVoice(voice);
    await speech.SpeakTextAsync("こんにちは。今日の天気はいかがでしょう?");
}

これだけで喋らせることが出来ます。とても簡単ですね!


喋らせるための下準備として、

var voice = Windows.Phone.Speech.Synthesis.InstalledVoices.All.FirstOrDefault(f => f.Language == "ja-JP" && f.Gender == Windows.Phone.Speech.Synthesis.VoiceGender.Female);

を記述しています。見たとおりですが、端末にインストールされている音声合成エンジンの中から、「日本語を話す、女性の声」のエンジンを検索して返しています。
存在しない場合は null が返ります。
もちろん、Gender を Windows.Phone.Speech.Synthesis.VoiceGender.Male に変えれば、男性の声に変わります。インストールされていれば。

喋らせるメソッドが非同期メソッドなので、awaitで終了を待機させています。

喋らす言葉は万能ではない?

日本語を喋らせられるので、いろいろ喋らせたいところですが、日本語の特性上どうしても音声合成にとって難しいものがあります。漢字です。大抵は正しく発音してくれるはずですが、一部の地名や特殊な読みは難しいようです。
位置情報を捕捉して、住所を喋らせるアプリを書いていたときにいろいろ悩まされました…。

一番つらいのは、「東京都」を「東京/都」と文節を分けてしまい「とうきょう/みやこ」と読んでしまったあたりです。難読地名ならまだしも、まさか「東京都」をそう読んでしまうとは…*1
とはいえ、リスク回避にひらがなで読ませようとすると、文節がわからなくなるのか、変なイントネーションになったり、「は」「へ」などの読み方によって音が変わる読みを正しく発音してくれないなどの問題もあります…。

また、細かいアクセント等をxml様のマークアップ記述できるSSML (Speech Synthesis Markup Language) も対応していますが、1.0準拠なので、日本語に対応した1.1が使えないという残念な感じだったりします…。

ただ、読ませる分にはとても便利なので、ぜひ遊んでみて下さい。

*1:Windows 8の音声合成だと正しく読んでくれますが、「千葉県」を「せんようけん」と読んでくれるお茶目な子でもあります