日本語音声の読み上げを行うユニバーサルアプリを作る

2014年7月25日(金)
薬師寺 国安

MainPage.xamlのデザイン画面上に配置したButton1をダブルクリックします。するとコードエディタが起動し

private void Button1_Click(object sender, RoutedEventArgs e)
{
}

のコードが自動生成されますので、この中にコードを記述します。

ロジックコード(MainPage.xaml.vb)

まずは、名前空間を読み込みます(リスト2)。

リスト2 名前空間の読み込み

コンテキスト メニューおよびメッセージダイアログのサポートを提供するクラスの含まれる、Windows.UI.Popups名前空間を読み込みます。

using Windows.UI.Popups;

音声合成(TTS)にテキスト文字列を変換する、音声合成エンジン(声)を構成するためのサポートを提供するクラスの含まれる、Windows.Media.SpeechSynthesis名前空間を読み込みます。

※オーディオストリームとも呼ばれる

using Windows.Media.SpeechSynthesis;

次に、[読み上げ開始]ボタンがクリックされた時の処理です(リスト3)

リスト3 [読み上げ開始]ボタンがクリックされた時の処理

TextBox1に何も入力されていなかった場合は、警告メッセージを出します。デフォルトでは「太宰治」の「人間失格」の一部が表示されます。この文章を消去して、自由な文章を入力することが可能です。

データが入力されていた場合は、以下の処理を行います。

ランダムアクセスストリームとの間で、音声合成エンジンによって生成されたオーディオデータの読み取りと書きこみをサポートするSpeechSynthesisStreamクラス型のmyStreamを宣言します。
音声機能へのアクセスを提供する、新しいSpeechSynthesizerのインスタンス、mySynthオブジェクトを作成します。
SynthesizeTextToStreamAsyncメソッドで、指定した文字列から、音声出力を非同期に生成しmyStreamで参照します。
SetSourceメソッドで、指定されたストリームおよびMIME型を使用してSourceプロパティを設定します。Playメソッドで音声を再生します。

private async void Button1_Click(object sender, RoutedEventArgs e)
{
  if (TextBox1.Text == "")
  {
    MessageDialog message = new MessageDialog("文章を入力してください。");
    await message.ShowAsync();
  }
  else
  {
  SpeechSynthesisStream myStream;
  using (var mySynth = new SpeechSynthesizer())
  {
    myStream = await mySynth.SynthesizeTextToStreamAsync(TextBox1.Text);
  }
    MediaElement1.SetSource(myStream, myStream.ContentType);
   MediaElement1.Play();
  }
}

次に、ソリューションエクスプローラー内のPackage.appxmanifestをダブルクリックして開きます。

ここで、「機能」タブ内にある「機能:」の「マイク」にチェックを入れてください。Windowsアプリでは、特にこの「マイク」にチェックを入れなくても音声で喋らすことはできるのですが、Windows Phone 8.1と共有した場合は、Windows Phone 8.1のPackage.appxmanifest内の「マイク」にチェックを入れておかないと、エラーになってしまいます。そこで、共有化を図るためにWindows アプリでも「マイク」にチェックを入れておきます(図3)。

図3:Package.appxmanifest の「機能」タブ内の「機能:」にある「マイク」にチェックを入れる

リスト3を実行すると図4のように表示されます。[読み上げ開始]ボタンをクリックすると、女性の声で文章が読み上げられます。読み上げ精度はおよそ90%といったところで、中には間違った読み方をする漢字もあります。

図4:文章を読み上げている(クリックで拡大)

図4を見ると画面の上部左隅に何かの数値が表示されています。これはフレームレートカウンターといい、アプリケーションのパフォーマンスを監視する機能です。フレームレートカウンターが表示されたままだとWindows ストアの審査でリジェクトされるため、ソリューションエクスプローラー内のApp.xaml.csを開き、下記のコードをコメントアウトして非表示にします(リスト4)。

リスト4 フレームレートカウンターを非表示にするためコメントアウトするコード

//#if DEBUG
//            if (System.Diagnostics.Debugger.IsAttached)
//            {
//                this.DebugSettings.EnableFrameRateCounter = true;
//            }
//#endif

これで、Windows アプリは完成しました。この中にWindows Phone 8.1のプロジェクトを読み込みましょう。

  • 日本語音声読み上げユニバーサルアプリ

    『ユニバーサルWindowsアプリ開発』 第4回のサンプルプログラムです。
薬師寺国安事務所

薬師寺国安事務所代表。Visual Basic プログラミングと、マイクロソフト系の技術をテーマとした、書籍や記事の執筆を行う。
1950年生まれ。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。1997年に薬師寺聖とコラボレーション・ユニット PROJECT KySS を結成。2003年よりフリーになり、PROJECT KySS の活動に本格的に参加、.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。Windows Phoneアプリ開発を経て、現在はWindows ストア アプリを多数公開中

Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)。Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)。Microsoft MVP for Development Platforms-Windows Platform Development (Oct 2014-Sep 2015)。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています