2012年2月4日土曜日

Microsoft Speech Platform 11.0 で喋らせてみる

Kinect for WIndows も登場したので、少し前にリリースされていた Microsoft Speech Platform 11.0 を使った音声合成(しゃべらせる)や音声認識もこれから注目が集まっていくんじゃないかなー、などと思いながら触ってみました。既にサンプルを作られている方もたくさんいらっしゃるので細かい事は書きませんが、そこに至るまでで結構苦労したのでそのあたりについてまとめておきます。


今回の試行錯誤にあたって、かおるんダイアリーを参考にさせてもらいました。感謝!

まず必要になるのはランタイムです。これは x86 版と x64 版があります。x86 環境は特に気にせずいけるのですが、x64 環境の場合は両方入れておくことをお勧め、というか入れてください。アプリがどちらで動作しているかによって、必要となるランタイムが変わってしまうので、x64 環境では基本として両方のインストールを行う、という認識でいいと思います。

続いて必要になるのはランタイムランゲージと言われる各言語版の音声データみたいなものです。日本語であれば ja-JP とファイル名に付与されているものを利用します。MSSpeech_SR_ja-JP_TELE.msi が音声認識用、MSSpeech_TTS_ja-JP_Haruka.msi が音声合成用となっています。

そして SDK。環境に合わせて・・・というところですが、もし x64 環境で x86 アプリを作るかも、というなら迷わず両方インストールしていいと思います。

そこまでインストール出来たらようやく開発なのですが、Express Edition を利用している場合は注意が必要です。Microsoft Speech Platform を利用する場合、x86 用か x64 用かを明示的にしていしてビルドする必要があります。As Any がデフォルトなので、ライブラリを利用しようとした瞬間に BadImageFormatException が発生してしまいます。なお、Express Edition にてビルド構成を変更させるには次のように行います。

VSSettings

Visual Studio の「ツール」メニューの「オプション」をクリックすると上記のダイアログが表示されます。全ての設定を表示するようにダイアログ下部にチェックをつけ、プロジェクトとソリューションの全般、をクリックします。

そうすると上記のような表示になりますので、ビルド構成の詳細を表示、にチェックをつけOKをクリックします。

そうするとビルドのメニューに構成マネージャが追加されますので、それをクリック。

VSSettings2

このようなものが表示されますので、プラットフォームのところを明示的に指定するようにしてください。ここで指定したプラットフォームと参照設定をおこなうライブラリは合わせる必要があります。x64 の場合は、Program Files\Microsoft SDKs\Speech\v11.0\Assembly フォルダに、x86 の場合は上記フォルダか、Program FIles(x86) 以下略なフォルダにライブラリが用意されています。

そして実際に喋らせるためのコードは次のようになります。

   1: Imports Microsoft.Speech.Synthesis
   2: Imports System.Media
   3: Imports System.IO
   4: Imports System.Xml
   5:  
   6: Module Module1
   7:  
   8:     Sub Main()
   9:  
  10:         'インストールされている言語から日本語を選択
  11:         Dim sp As New SpeechSynthesizer
  12:         For Each insVoice In sp.GetInstalledVoices
  13:             If insVoice.VoiceInfo.Culture.Name.Equals("ja-JP") Then
  14:                 sp.SelectVoice(insVoice.VoiceInfo.Name)
  15:                 Exit For
  16:             End If
  17:         Next
  18:  
  19:         Dim pb As New PromptBuilder
  20:         Dim spl As New SoundPlayer With {.Stream = New MemoryStream}
  21:  
  22:         pb.AppendText("これはサンプルプログラムです。")
  23:         pb.AppendText("PromptBuilder を利用しています。")
  24:  
  25:         sp.SetOutputToWaveStream(spl.Stream)
  26:         sp.Speak(pb)
  27:         spl.Stream.Position = 0
  28:         spl.PlaySync()
  29:  
  30:     End Sub
  31:  
  32: End Module

これだけで日本語で喋ってくれます。漢字もそのまま読み上げますし、途中に含まれている英文も読み上げてくれます。非常に簡単です。

また SSML(Speech Synthesis Markup Language)にも対応しており、XML 形式での文言指定も可能です。こちらを利用するとイントネーションの微調整や話す速度の調整もできるようですが、どこまで対応できているのかは調査しきれていません。

   1: pb.AppendSsmlMarkup("お前、生きて<sub alias=""ここ"">英国</sub>から")
   2: pb.AppendSsmlMarkup("<sub alias=""かえれる"">帰れる</sub>と思うなよ。")
   3: pb.AppendSsmlMarkup("<break time=""1s"" />")
   4: pb.AppendSsmlMarkup("ぶち<sub alias=""ころす"">殺す</sub>ぞ、<sub alias=""ヒューマン"">人間</sub>")

こんな感じで設定してあげると次のように話してくれます。

色々と手をこんだ SSML を作成してあげるともっと面白く使えそうです。

0 件のコメント:

コメントを投稿