情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

Windows Phone 8 の音声合成 (TTS)

2014/06/18

対象: Windows Phone 8 および Windows Phone Silverlight 8.1 のみ

Windows.Phone.Speech.Synthesis API を使用すると、TTS (Text-To-Speech) とも呼ばれる合成音声を Windows Phone 8 アプリで生成することができます。たとえば、アプリでユーザーに対する入力の要求、メッセージ内容の読み上げ、検索結果の提示などを行うことができます。

メモメモ:

TTS を使用するには、アプリのマニフェストに ID_CAP_SPEECH_RECOGNITION 機能を設定する必要があります。この機能を設定しないと、アプリが正しく機能しない可能性があります。詳細については、「Windows Phone 8 のアプリ機能とハードウェア要件」を参照してください。

最も早く簡単に TTS を生成するには、プレーンテキスト文字列を SpeechSynthesizerSpeakTextAsync(String) メソッドに提供します。次のコード例では、ボタンの Click イベントのハンドラーでこの処理を行う方法を示します。

private async void ButtonSimpleTTS_Click(object sender, RoutedEventArgs e)
{
  SpeechSynthesizer synth = new SpeechSynthesizer();
    
  await synth.SpeakTextAsync("You have a meeting with Peter in 15 minutes.");
}

一般的に、await 演算子を SpeakTextAsync メソッドに適用し、SpeakTextAsync を含む Async 修飾子をメソッドで使用します。非同期 SpeakTextAsync メソッドの前に await 演算子があるので、SpeakTextAsync はすぐに制御を戻し、音声シンセサイザーによるテキスト文字列の読み上げが終了するまで待機しません。ただし、await 演算子は、SpeakTextAsync が完了するまで、演算子が含まれるメソッドの実行を中断します。

Windows Phone 8 には、さまざまな言語の読み上げ音声が含まれています。各音声は、特定の国/地域で話されている 1 つの言語で合成音声を生成します。SpeechSynthesizer オブジェクトを作成した後、読み込む音声の言語を指定できます。SpeechSynthesizer インスタンスは、電話にインストールされている任意の音声を読み込み、それを使用して読み上げ音声を生成できます。言語が指定されていない場合、この API はユーザーが電話の [設定]/[音声認識言語] で選択した言語と一致する音声を読み込みます。

次の例では、音声シンセサイザーのインスタンスを作成し、LINQ クエリを使用してその言語を設定します。この LINQ クエリはインストールされている各音声を記述する VoiceInformation オブジェクトを検索して、言語プロパティの値が "fr-FR" (フランスで話されているフランス語を示す) であるオブジェクトを見つけます。変数 frenchVoices は VoiceInformation オブジェクトとして暗黙的に型指定されます。

SpeechSynthesizerSetVoice(VoiceInformation) メソッドに対する引数は、LINQ クエリによって返される音声のインデックスを指定します。このクエリは 2 つの音声を返します。女性と男性の 2 つのフランス語の音声がインストールされているからです。フランス語を話す女性または男性の音声のみを返すには、性別をフィルター処理する式を where 句に追加します。

// Declare the SpeechSynthesizer object at the class level.
SpeechSynthesizer synth;

// Handle the button click event.
private async void SpeakFrench_Click_1(object sender, RoutedEventArgs e)
{
  // Initialize the SpeechSynthesizer object.
  synth = new SpeechSynthesizer();

  // Query for a voice that speaks French.
  IEnumerable<VoiceInformation> frenchVoices = from voice in InstalledVoices.All
                     where voice.Language == "fr-FR"
                     select voice;
            
  // Set the voice as identified by the query.
  synth.SetVoice(frenchVoices.ElementAt(0));

  // Count in French.
  await synth.SpeakTextAsync("un, deux, trois, quatre");
} 

音声合成記述言語 (SSML) を使用して、特定の言語の読み上げ音声を選択することもできます。詳細については、「音声合成記述言語リファレンス」を参照してください。

音声シンセサイザーは、プレーン テキストまたは音声合成記述言語 (SSML) Version 1.0 に準拠したマークアップを含むテキストを読み上げることができます。コード内に SSML マークアップを挿入することも、コードからスタンドアロンの SSML ドキュメントを参照することもできます。音声合成 API には音声出力を開始する 3 つのメソッドがあり、それぞれ許可されたソース形式の 1 つを読み上げます。

  • SpeechSynthesizerSpeakTextAsync(String).メソッドの引数として指定したプレーン テキストの文字列を読み上げます。詳細については、このトピックの最初にあるコード例を参照してください。

  • SpeechSynthesizerSpeakSsmlAsync(String).メソッドの引数として指定した SSML マークアップを含むテキストの文字列を読み上げます。

  • SpeechSynthesizerSpeakSsmlFromUriAsync(Uri).メソッドの引数で参照しているスタンドアロン SSML ドキュメントの内容を読み上げます。

SpeakSsmlAsync のコード例

SpeakSsmlAsync メソッドを使用して SSML マークアップを含むテキストの文字列を読み上げる方法を次のコード例に示します。

// Speaks a string of text with SSML markup.
private async void SpeakSsml_Click(object sender, RoutedEventArgs e)
{
   SpeechSynthesizer synth = new SpeechSynthesizer();

   // Build an SSML prompt in a string.
   string ssmlPrompt = "<speak version=\"1.0\" ";
   ssmlPrompt += "xmlns=\"http://www.w3.org/2001/10/synthesis\" xml:lang=\"en-US\">";
   ssmlPrompt += "This voice speaks English. </speak>";

   // Speak the SSML prompt.
   await synth.SpeakSsmlAsync(ssmlPrompt);
}

SpeakSsmlFromUriAsync のコード例

SpeakSsmlFromUriAsync メソッドを使用してスタンドアロン SSML ドキュメントの内容を読み上げる方法を次のコード例に示します。

// Speaks the content of a standalone SSML file.
private async void SpeakSsmlFromFile_Click(object sender, RoutedEventArgs e)
{
   SpeechSynthesizer synth = new SpeechSynthesizer();

   // Set the path to the SSML-compliant XML file.
   string path = Package.Current.InstalledLocation.Path + "\\ChangeVoice.ssml";
   Uri changeVoice = new Uri(path, UriKind.Absolute);

   // Speak the SSML prompt.
   await synth.SpeakSsmlFromUriAsync(changeVoice);
}

SSML プロンプト ファイルが正しく展開されるようにするには、ソリューション エクスプローラーから [追加] > [既存の項目] を使用してソリューションにファイルを追加します。このファイルの [ビルド アクション] プロパティを [コンテンツ] に設定し、[出力ディレクトリにコピー] プロパティを [新しい場合はコピーする] に設定します。次に、前のコード例に示されている path 構文を使用して SSML プロンプトを参照します。

この機能を使用しているときに TTS のエラーや例外が発生することがあります。これらのエラーおよび例外の詳細については、「Windows Phone 8 の音声アプリにおけるエラーの処理」を参照してください。

表示: