Windows アプリでの音声認識

音声認識を使用して、入力を提供し、アクションまたはコマンドを指定し、Windows アプリ SDK アプリでタスクを実行します。

Important

音声認識には MSIX パッケージ ID が必要です。 Windows.Media.SpeechRecognition API は、アプリがパッケージ ID (パッケージ化または外部の場所でパッケージ化) で実行されている場合にのみ使用できます。 パッケージ化されていないアプリでは、これらの API を使用できません。

主要API

Overview

音声認識は、音声認識ランタイム、ランタイムをプログラミングするための認識 API、ディクテーションと Web 検索用のすぐに使用できる文法、およびユーザーが音声認識機能を検出して使用するのに役立つ既定のシステム UI で構成されます。

音声認識を構成する

音声認識をサポートするには、ユーザーはデバイスでマイクを接続して有効にし、アプリがマイクを使用するためのアクセス許可を付与するMicrosoftプライバシー ポリシーを受け入れる必要があります。

アプリのパッケージ マニフェストで マイク デバイス機能を設定して、マイクアクセス許可をユーザーに求めます。 詳細については、「 アプリ機能の宣言」を参照してください。

ユーザーがアクセス権を付与すると、承認されたアプリケーションの一覧の [設定] > [プライバシー > マイク] にアプリが表示されます。 ユーザーはいつでもこの設定を無効にできるため、使用を試みる前に、アプリにマイクアクセス権があることを確認してください。

ディクテーションやその他の音声認識サービス (トピック制約で定義 された定義済みの文法 など) もサポートする場合は、 オンライン音声認識 ([設定] > プライバシー > 音声) が有効になっていることを確認します。

次の例は、マイクが存在するかどうか、およびマイクを使用するアクセス許可がアプリにあるかどうかを確認する方法を示しています。

public class AudioCapturePermissions
{
    private static int NoCaptureDevicesHResult = -1072845856;

    /// <summary>
    /// Checks whether the microphone is available and the app has permission to use it.
    /// Perform this check every time the app gets focus, because the user can change
    /// the setting while the app is suspended or not in focus.
    /// </summary>
    /// <returns>True if the microphone is available.</returns>
    public static async Task<bool> RequestMicrophonePermission()
    {
        try
        {
            var settings = new MediaCaptureInitializationSettings
            {
                StreamingCaptureMode = StreamingCaptureMode.Audio,
                MediaCategory = MediaCategory.Speech
            };
            var capture = new MediaCapture();
            await capture.InitializeAsync(settings);
        }
        catch (TypeLoadException)
        {
            // Media player components are not available.
            return false;
        }
        catch (UnauthorizedAccessException)
        {
            // Permission to use the audio capture device is denied.
            return false;
        }
        catch (Exception exception)
        {
            if (exception.HResult == NoCaptureDevicesHResult)
            {
                // No audio capture devices are present on this system.
                return false;
            }
            throw;
        }
        return true;
    }
}

音声入力を認識する

制約は、アプリが音声入力で認識する単語と語句 (ボキャブラリ) を定義します。 制約は音声認識の中核であり、アプリで認識精度をより高く制御できます。

次の種類の制約を使用できます。

定義済みの文法

定義済みのディクテーションおよび Web 検索文法では、文法を作成しなくても音声認識が提供されます。 これらの文法を使用すると、リモート Web サービスによって認識が実行され、結果がデバイスに返されます。

既定のフリー テキスト ディクテーション文法は、ユーザーが特定の言語で言うことができるほとんどの単語と語句を認識し、短い語句用に最適化されています。 SpeechRecognizer に制約を指定しない場合は、定義済みのディクテーション文法が使用されます。

Web 検索文法には多数の単語と語句が含まれており、ユーザーが通常 Web を検索するときに使用する用語に最適化されています。

定義済みのディクテーションと Web 検索の文法は大きくなる可能性があります。また、オンライン (デバイス上ではない) であるため、カスタム文法がローカルにインストールされている場合ほどパフォーマンスが低下する可能性があります。

これらの定義済みの文法では、最大 10 秒の音声入力が認識され、作成作業は必要ありません。 ただし、ネットワーク接続が必要です。

SpeechRecognitionTopicConstraint を参照してください。

プログラムによるリストの制約

プログラムによるリスト制約は、単語または語句のリストを使用して単純な文法を作成するための軽量なアプローチを提供します。 リスト制約は、短い個別の語句を認識する場合に適しています。 音声認識エンジンは、一致を確認するために音声のみを処理する必要があるため、文法内のすべての単語を指定すると、認識の精度が向上します。 一覧はプログラムで更新することもできます。

SpeechRecognitionListConstraint を参照してください。

SRGS 文法

音声認識文法仕様 (SRGS) 文法は、 SRGS バージョン 1.0 で定義された XML 形式を使用する静的ドキュメントです。 SRGS 文法を使用すると、1 回の認識で複数のセマンティック意味をキャプチャできるため、音声認識エクスペリエンスを最大限に制御できます。

SpeechRecognitionGrammarFileConstraint を参照してください。

音声コマンドの制約

音声コマンド定義 (VCD) XML ファイルを使用して、ユーザーがアプリのアクティブ化時にアクションを開始するように言うことができるコマンドを定義します。 SpeechRecognitionVoiceCommandDefinitionConstraint を参照してください。

制約の概要については、「 カスタム認識制約の定義」を参照してください。

基本的な認識の例

次の例では、音声認識エンジンを作成し、既定のディクテーション制約をコンパイルして、音声入力のリッスンを開始します。

private async void StartRecognizing_Click(object sender, RoutedEventArgs e)
{
    var speechRecognizer = new Windows.Media.SpeechRecognition.SpeechRecognizer();

    // Compile the default dictation grammar.
    await speechRecognizer.CompileConstraintsAsync();

    // Start recognition.
    Windows.Media.SpeechRecognition.SpeechRecognitionResult result =
        await speechRecognizer.RecognizeAsync();

    // Display the recognized text.
    if (result.Status == Windows.Media.SpeechRecognition.SpeechRecognitionResultStatus.Success)
    {
        resultTextBlock.Text = result.Text;
    }
}

この例では、(UI を使用せずに) RecognizeAsync を使用します。 組み込みの認識 UI を使用する場合は、代わりに RecognizeWithUIAsync を呼び出します。 カスタマイズ オプションについては、 SpeechRecognizerUIOptions を参照してください。

認識 UI をカスタマイズする

アプリが SpeechRecognizer.RecognizeWithUIAsync を呼び出すと、システムは複数の画面を順番に表示します。

  • 事前定義された文法(ディクテーションまたは Web 検索)の場合: 聞き取り中処理中認識結果(またはエラー)。
  • リスト制約または SRGS 制約の場合: 聞き取り中「~」と言いましたか(あいまいな場合)→ 「~」と聞き取りました(またはエラー)。

SpeechRecognizerUIOptions クラス (SpeechRecognizer.UIOptions で取得) を使用して、リッスン画面をカスタマイズします。

private async void WeatherSearch_Click(object sender, RoutedEventArgs e)
{
    var speechRecognizer = new Windows.Media.SpeechRecognition.SpeechRecognizer();

    speechRecognizer.RecognitionQualityDegrading += SpeechRecognizer_RecognitionQualityDegrading;

    var webSearchGrammar = new Windows.Media.SpeechRecognition.SpeechRecognitionTopicConstraint(
        Windows.Media.SpeechRecognition.SpeechRecognitionScenario.WebSearch, "webSearch");

    speechRecognizer.UIOptions.AudiblePrompt = "Say what you want to search for...";
    speechRecognizer.UIOptions.ExampleText = @"Ex. 'weather for London'";
    speechRecognizer.Constraints.Add(webSearchGrammar);

    await speechRecognizer.CompileConstraintsAsync();

    Windows.Media.SpeechRecognition.SpeechRecognitionResult result =
        await speechRecognizer.RecognizeWithUIAsync();

    resultTextBlock.Text = result.Text;
}