クイック スタート:Speech SDK、UWP を使用して音声優先仮想アシスタントを作成するQuickstart: Create a voice-first virtual assistant with the Speech SDK, UWP

音声認識音声合成音声翻訳のクイックスタートも利用できます。Quickstarts are also available for speech recognition, speech synthesis, and speech translation.

この記事では、Speech SDK を使用して C# のユニバーサル Windows プラットフォーム (UWP) アプリケーションを開発します。In this article, you'll develop a C# Universal Windows Platform (UWP) application by using the Speech SDK. このプログラムは、以前に作成および構成されたボットに接続して、クライアント アプリケーションからの音声優先仮想アシスタント エクスペリエンスを可能にします。The program will connect to a previously authored and configured bot to enable a voice-first virtual assistant experience from the client application. このアプリケーションは、Speech SDK NuGet パッケージと Microsoft Visual Studio 2019 (任意のエディション) を使用して作成します。The application is built with the Speech SDK NuGet Package and Microsoft Visual Studio 2019 (any edition).

注意

ユニバーサル Windows プラットフォームを使用すると、PC、Xbox、Surface Hub、その他のデバイスなど、Windows 10 をサポートする任意のデバイスで動作するアプリを開発できます。The Universal Windows Platform lets you develop apps that run on any device that supports Windows 10, including PCs, Xbox, Surface Hub, and other devices.

前提条件Prerequisites

このクイック スタートでは以下が必要です。This quickstart requires:

省略可能:すぐに開始Optional: Get started fast

このクイックスタートでは、音声対応のボットに接続するクライアント アプリケーションの作成方法を順を追って説明します。This quickstart will describe, step by step, how to make a client application to connect to your speech-enabled bot. このクイック スタートで使用されている、すぐにコンパイルできる完全なソース コードは、Speech SDK のサンプルのページの quickstart フォルダーに含まれています。If you prefer to dive right in, the complete, ready-to-compile source code used in this quickstart is available in the Speech SDK Samples under the quickstart folder.

Visual Studio プロジェクトを作成するCreate a Visual Studio project

ユニバーサル Windows プラットフォーム (UWP) 開発用の Visual Studio プロジェクトを作成するためには、Visual Studio 開発オプションの設定、プロジェクトの作成、ターゲット アーキテクチャの選択、オーディオ キャプチャの設定、Speech SDK のインストールが必要となります。To create a Visual Studio project for Universal Windows Platform (UWP) development, you need to set up Visual Studio development options, create the project, select the target architecture, set up audio capture, and install the Speech SDK.

Visual Studio の開発オプションを設定するSet up Visual Studio development options

最初に、UWP 開発向けに Visual Studio を正しく設定します。To start, make sure you're set up correctly in Visual Studio for UWP development:

  1. Visual Studio 2019 を開いてスタート ウィンドウを表示します。Open Visual Studio 2019 to display the Start window.

    スタート ウィンドウ - Visual Studio

  2. [コードなしで続行] を選択して Visual Studio IDE に移動します。Select Continue without code to go to the Visual Studio IDE.

  3. Visual Studio のメニュー バーから、 [ツール] > [ツールと機能を取得] の順に選択して Visual Studio インストーラーを開き、 [変更中] ダイアログ ボックスを表示します。From the Visual Studio menu bar, select Tools > Get Tools and Features to open Visual Studio Installer and view the Modifying dialog box.

    [ワークロード] タブ、[変更中] ダイアログ ボックス、Visual Studio インストーラー

  4. [ワークロード] タブの [Windows] で、 [ユニバーサル Windows プラットフォーム開発] ワークロードを見つけます。In the Workloads tab, under Windows, find the Universal Windows Platform development workload. そのワークロードの横のチェック ボックスが既にオンになっている場合は、 [変更中] ダイアログ ボックスを閉じて、手順 6. に進んでください。If the check box next to that workload is already selected, close the Modifying dialog box, and go to step 6.

  5. [ユニバーサル Windows プラットフォーム開発] チェック ボックスをオンにし、 [変更] を選択して、 [開始する前] ダイアログ ボックスで [続行] を選択し、UWP 開発ワークロードをインストールします。Select the Universal Windows Platform development check box, select Modify, and then in the Before we get started dialog box, select Continue to install the UWP development workload. 新しい機能のインストールにはしばらく時間がかかります。Installation of the new feature may take a while.

  6. Visual Studio インストーラーを閉じます。Close Visual Studio Installer.

プロジェクトを作成してターゲット アーキテクチャを選択するCreate the project and select the target architecture

次に、プロジェクトを作成します。Next, create your project:

  1. Visual Studio メニュー バーで、 [ファイル] > [新規] > [プロジェクト] の順に選択して [新しいプロジェクトの作成] ウィンドウを表示します。In the Visual Studio menu bar, choose File > New > Project to display the Create a new project window.

    新しいプロジェクトの作成 - Visual Studio

  2. [空白のアプリ (ユニバーサル Windows)] を探して選択します。Find and select Blank App (Universal Windows). このプロジェクト タイプの (Visual Basic ではなく) C# バージョンを選択してください。Make sure that you select the C# version of this project type (as opposed to Visual Basic).

  3. [次へ] を選択して、 [新しいプロジェクトの構成] 画面を表示します。Select Next to display the Configure your new project screen.

    新しいプロジェクトの構成 - Visual Studio

  4. [プロジェクト名] に「helloworld」と入力します。In Project name, enter helloworld.

  5. [場所] で、ご自分のプロジェクトの保存先フォルダーに移動して選択するか、フォルダーを作成します。In Location, navigate to and select or create the folder to save your project in.

  6. [作成] を選択して [新しいユニバーサル Windows プラットフォーム プロジェクト] ウィンドウに移動します。Select Create to go to the New Universal Windows Platform Project window.

    [新しいユニバーサル Windows プラットフォーム プロジェクト] ダイアログ ボックス - Visual Studio

  7. [最小バージョン] (2 番目のドロップダウン ボックス) で、Speech SDK の最小要件である [Windows 10 Fall Creators Update (10.0; Build 16299)] を選択します。In Minimum version (the second drop-down box), choose Windows 10 Fall Creators Update (10.0; Build 16299), which is the minimum requirement for the Speech SDK.

  8. [ターゲットのバージョン] (1 番目のドロップダウン ボックス) で、 [最小バージョン] の値と同じかそれより大きい値を選択します。In Target version (the first drop-down box), choose a value identical to or later than the value in Minimum version.

  9. [OK] を選択します。Select OK. Visual Studio IDE に戻ります。このとき、新しいプロジェクトが作成されて [ソリューション エクスプローラー] ウィンドウに表示された状態になっています。You're returned to the Visual Studio IDE, with the new project created and visible in the Solution Explorer pane.

    helloworld プロジェクト - Visual Studio

次に、ターゲット プラットフォーム アーキテクチャを選択します。Now select your target platform architecture. Visual Studio ツール バーの [ソリューション プラットフォーム] ドロップダウン ボックスを見つけます。In the Visual Studio toolbar, find the Solution Platforms drop-down box. (表示されない場合は、 [表示] > [ツール バー] > [標準] の順に選択すると、 [ソリューション プラットフォーム] を含んだツール バーが表示されます。)64 ビット Windows を実行している場合は、ドロップダウン ボックスで [x64] を選択します。(If you don't see it, choose View > Toolbars > Standard to display the toolbar containing Solution Platforms.) If you're running 64-bit Windows, choose x64 in the drop-down box. 64 ビット Windows でも 32 ビット アプリケーションを実行できるため、必要に応じて [x86] を選択してもかまいません。64-bit Windows can also run 32-bit applications, so you can choose x86 if you prefer.

注意

Speech SDK では、Intel 互換プロセッサのみがサポートされています。The Speech SDK only supports Intel-compatible processors. ARM プロセッサは現在サポートされていません。ARM processors are currently not supported.

オーディオ キャプチャを設定するSet up audio capture

次に、プロジェクトでオーディオ入力をキャプチャできるようにします。Then allow the project to capture audio input:

  1. ソリューション エクスプローラー[Package.appxmanifest] をダブルクリックしてパッケージ アプリケーション マニフェストを開きます。In Solution Explorer, double-click Package.appxmanifest to open the package application manifest.

  2. [機能] タブを選択します。Select the Capabilities tab.

    [機能] タブ、パッケージ アプリケーション マニフェスト - Visual Studio

  3. [マイク] 機能のチェック ボックスをオンにします。Select the box for the Microphone capability.

  4. メニュー バーで [ファイル] > [Package.appxmanifest の保存] を選択して変更内容を保存します。From the menu bar, choose File > Save Package.appxmanifest to save your changes.

Speech SDK のインストールInstall the Speech SDK

最後に、Speech SDK NuGet パッケージをインストールし、自分のプロジェクト内の Speech SDK を参照します。Finally, install the Speech SDK NuGet package, and reference the Speech SDK in your project:

  1. ソリューション エクスプローラーでソリューションを右クリックし、 [ソリューションの NuGet パッケージの管理] を選択して [NuGet - ソリューション] ウィンドウに移動します。In Solution Explorer, right-click your solution, and choose Manage NuGet Packages for Solution to go to the NuGet - Solution window.

  2. [参照] を選択します。Select Browse.

    ソリューションのパッケージの管理ダイアログ ボックスのスクリーン ショット

  3. [パッケージ ソース][nuget.org] を選択します。In Package source, choose nuget.org.

  4. [検索] ボックスに「Microsoft.CognitiveServices.Speech」と入力し、このパッケージが検索結果に表示されたらそれを選択します。In the Search box, enter Microsoft.CognitiveServices.Speech, and then choose that package after it appears in the search results.

    ソリューションのパッケージの管理ダイアログ ボックスのスクリーン ショット

  5. 検索結果の横のパッケージ状態ウィンドウで、自分の helloworld プロジェクトを選択します。In the package status pane next to the search results, select your helloworld project.

  6. [インストール] を選択します。Select Install.

  7. [変更のプレビュー] ダイアログ ボックスで [OK] を選択します。In the Preview Changes dialog box, select OK.

  8. [ライセンスへの同意] ダイアログ ボックスでライセンスを確認し、 [同意する] を選択します。In the License Acceptance dialog box, view the license, and then select I Accept. パッケージのインストールが開始されます。インストールが完了すると、"Successfully installed 'Microsoft.CognitiveServices.Speech 1.7.0' to helloworld" と同様のメッセージが [出力] ウィンドウに表示されます。The package installation begins, and when installation is complete, the Output pane displays a message similar to the following text: Successfully installed 'Microsoft.CognitiveServices.Speech 1.7.0' to helloworld.

サンプル コードを追加するAdd sample code

今度は、アプリケーションのユーザー インターフェイスを定義する XAML コードを追加し、C# のコードビハインド実装を追加します。Now add the XAML code that defines the user interface of the application, and add the C# code-behind implementation.

XAML コードXAML code

まず、次の XAML コードを追加してアプリケーションのユーザー インターフェイスを作成します。First, you'll create the application's user interface by adding the XAML code:

  1. ソリューション エクスプローラーで、MainPage.xaml を開きます。In Solution Explorer, open MainPage.xaml.

  2. デザイナーの XAML ビューで、内容全体を次のコード スニペットに置き換えます。In the designer's XAML view, replace the entire contents with the following code snippet:

    <Page
        x:Class="helloworld.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:helloworld"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    
        <Grid>
            <StackPanel Orientation="Vertical" HorizontalAlignment="Center"  
                        Margin="20,50,0,0" VerticalAlignment="Center" Width="800">
                <Button x:Name="EnableMicrophoneButton" Content="Enable Microphone"  
                        Margin="0,0,10,0" Click="EnableMicrophone_ButtonClicked" 
                        Height="35"/>
                <Button x:Name="ListenButton" Content="Talk to your bot" 
                        Margin="0,10,10,0" Click="ListenButton_ButtonClicked" 
                        Height="35"/>
                <StackPanel x:Name="StatusPanel" Orientation="Vertical" 
                            RelativePanel.AlignBottomWithPanel="True" 
                            RelativePanel.AlignRightWithPanel="True" 
                            RelativePanel.AlignLeftWithPanel="True">
                    <TextBlock x:Name="StatusLabel" Margin="0,10,10,0" 
                               TextWrapping="Wrap" Text="Status:" FontSize="20"/>
                    <Border x:Name="StatusBorder" Margin="0,0,0,0">
                        <ScrollViewer VerticalScrollMode="Auto"  
                                      VerticalScrollBarVisibility="Auto" MaxHeight="200">
                            <!-- Use LiveSetting to enable screen readers to announce 
                                 the status update. -->
                            <TextBlock 
                                x:Name="StatusBlock" FontWeight="Bold" 
                                AutomationProperties.LiveSetting="Assertive"
                                MaxWidth="{Binding ElementName=Splitter, Path=ActualWidth}" 
                                Margin="10,10,10,20" TextWrapping="Wrap"  />
                        </ScrollViewer>
                    </Border>
                </StackPanel>
            </StackPanel>
            <MediaElement x:Name="mediaElement"/>
        </Grid>
    </Page>
    

デザイン ビューが更新されてアプリケーションのユーザー インターフェイスが表示されます。The Design view is updated to show the application's user interface.

C# のコードビハインド ソースC# code-behind source

次に、アプリケーションが想定どおりに動作するよう、コードビハインド ソースを追加します。Then you add the code-behind source so that the application works as expected. コードビハインド ソースには、次の内容が含まれています。The code-behind source includes:

  • Speech 名前空間と Speech.Dialog 名前空間の using ステートメントusing statements for the Speech and Speech.Dialog namespaces
  • ボタン ハンドラーに接続された、マイクへのアクセスを確実にするための簡単な実装A simple implementation to ensure microphone access, wired to a button handler
  • アプリケーション内のメッセージとエラーを表示する基本的な UI ヘルパーBasic UI helpers to present messages and errors in the application
  • 後で設定される初期化コード パスのランディング ポイントA landing point for the initialization code path that will be populated later
  • テキスト読み上げを再生するヘルパー (ストリーミングのサポートなし)A helper to play back text-to-speech (without streaming support)
  • 後で設定されるリスニングを開始するための空のボタン ハンドラーAn empty button handler to start listening that will be populated later

コードビハインド ソースを追加するには、次の手順を実行します。To add the code-behind source, follow these steps:

  1. ソリューション エクスプローラーで、コードビハインドのソース ファイル MainPage.xaml.cs を開きますIn Solution Explorer, open the code-behind source file MainPage.xaml.cs. (MainPage.xaml にグループ化されています)。(It's grouped under MainPage.xaml.)

  2. ファイルの内容を次のコード スニペットに置き換えます。Replace the file's contents with the following code snippet:

    using Microsoft.CognitiveServices.Speech;
    using Microsoft.CognitiveServices.Speech.Audio;
    using Microsoft.CognitiveServices.Speech.Dialog;
    using System;
    using System.Diagnostics;
    using System.IO;
    using System.Text;
    using Windows.Foundation;
    using Windows.Storage.Streams;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    using Windows.UI.Xaml.Media;
    
    namespace helloworld
    {
        public sealed partial class MainPage : Page
        {
            private DialogServiceConnector connector;
    
            private enum NotifyType
            {
                StatusMessage,
                ErrorMessage
            };
    
            public MainPage()
            {
                this.InitializeComponent();
            }
    
            private async void EnableMicrophone_ButtonClicked(
                object sender, RoutedEventArgs e)
            {
                bool isMicAvailable = true;
                try
                {
                    var mediaCapture = new Windows.Media.Capture.MediaCapture();
                    var settings = 
                        new Windows.Media.Capture.MediaCaptureInitializationSettings();
                    settings.StreamingCaptureMode = 
                        Windows.Media.Capture.StreamingCaptureMode.Audio;
                    await mediaCapture.InitializeAsync(settings);
                }
                catch (Exception)
                {
                    isMicAvailable = false;
                }
                if (!isMicAvailable)
                {
                    await Windows.System.Launcher.LaunchUriAsync(
                        new Uri("ms-settings:privacy-microphone"));
                }
                else
                {
                    NotifyUser("Microphone was enabled", NotifyType.StatusMessage);
                }
            }
    
            private void NotifyUser(
                string strMessage, NotifyType type = NotifyType.StatusMessage)
            {
                // If called from the UI thread, then update immediately.
                // Otherwise, schedule a task on the UI thread to perform the update.
                if (Dispatcher.HasThreadAccess)
                {
                    UpdateStatus(strMessage, type);
                }
                else
                {
                    var task = Dispatcher.RunAsync(
                        Windows.UI.Core.CoreDispatcherPriority.Normal, 
                        () => UpdateStatus(strMessage, type));
                }
            }
    
            private void UpdateStatus(string strMessage, NotifyType type)
            {
                switch (type)
                {
                    case NotifyType.StatusMessage:
                        StatusBorder.Background = new SolidColorBrush(
                            Windows.UI.Colors.Green);
                        break;
                    case NotifyType.ErrorMessage:
                        StatusBorder.Background = new SolidColorBrush(
                            Windows.UI.Colors.Red);
                        break;
                }
                StatusBlock.Text += string.IsNullOrEmpty(StatusBlock.Text) 
                    ? strMessage : "\n" + strMessage;
    
                if (!string.IsNullOrEmpty(StatusBlock.Text))
                {
                    StatusBorder.Visibility = Visibility.Visible;
                    StatusPanel.Visibility = Visibility.Visible;
                }
                else
                {
                    StatusBorder.Visibility = Visibility.Collapsed;
                    StatusPanel.Visibility = Visibility.Collapsed;
                }
                // Raise an event if necessary to enable a screen reader 
                // to announce the status update.
                var peer = Windows.UI.Xaml.Automation.Peers.FrameworkElementAutomationPeer.FromElement(StatusBlock);
                if (peer != null)
                {
                    peer.RaiseAutomationEvent(
                        Windows.UI.Xaml.Automation.Peers.AutomationEvents.LiveRegionChanged);
                }
            }
    
            // Waits for and accumulates all audio associated with a given 
            // PullAudioOutputStream and then plays it to the MediaElement. Long spoken 
            // audio will create extra latency and a streaming playback solution 
            // (that plays audio while it continues to be received) should be used -- 
            // see the samples for examples of this.
            private void SynchronouslyPlayActivityAudio(
                PullAudioOutputStream activityAudio)
            {
                var playbackStreamWithHeader = new MemoryStream();
                playbackStreamWithHeader.Write(Encoding.ASCII.GetBytes("RIFF"), 0, 4); // ChunkID
                playbackStreamWithHeader.Write(BitConverter.GetBytes(UInt32.MaxValue), 0, 4); // ChunkSize: max
                playbackStreamWithHeader.Write(Encoding.ASCII.GetBytes("WAVE"), 0, 4); // Format
                playbackStreamWithHeader.Write(Encoding.ASCII.GetBytes("fmt "), 0, 4); // Subchunk1ID
                playbackStreamWithHeader.Write(BitConverter.GetBytes(16), 0, 4); // Subchunk1Size: PCM
                playbackStreamWithHeader.Write(BitConverter.GetBytes(1), 0, 2); // AudioFormat: PCM
                playbackStreamWithHeader.Write(BitConverter.GetBytes(1), 0, 2); // NumChannels: mono
                playbackStreamWithHeader.Write(BitConverter.GetBytes(16000), 0, 4); // SampleRate: 16kHz
                playbackStreamWithHeader.Write(BitConverter.GetBytes(32000), 0, 4); // ByteRate
                playbackStreamWithHeader.Write(BitConverter.GetBytes(2), 0, 2); // BlockAlign
                playbackStreamWithHeader.Write(BitConverter.GetBytes(16), 0, 2); // BitsPerSample: 16-bit
                playbackStreamWithHeader.Write(Encoding.ASCII.GetBytes("data"), 0, 4); // Subchunk2ID
                playbackStreamWithHeader.Write(BitConverter.GetBytes(UInt32.MaxValue), 0, 4); // Subchunk2Size
    
                byte[] pullBuffer = new byte[2056];
    
                uint lastRead = 0;
                do
                {
                    lastRead = activityAudio.Read(pullBuffer);
                    playbackStreamWithHeader.Write(pullBuffer, 0, (int)lastRead);
                }
                while (lastRead == pullBuffer.Length);
    
                var task = Dispatcher.RunAsync(
                    Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
                {
                    mediaElement.SetSource(
                        playbackStreamWithHeader.AsRandomAccessStream(), "audio/wav");
                    mediaElement.Play();
                });
            }
    
            private void InitializeDialogServiceConnector()
            {
                // New code will go here
            }
    
            private async void ListenButton_ButtonClicked(
                object sender, RoutedEventArgs e)
            {
                // New code will go here
            }
        }
    }
    
  3. InitializeDialogServiceConnector のメソッド本体に、次のコード スニペットを追加します。Add the following code snippet to the method body of InitializeDialogServiceConnector. このコードにより、サブスクリプション情報を使用して DialogServiceConnector が作成されます。This code creates the DialogServiceConnector with your subscription information.

    // create a DialogServiceConfig by providing a bot secret key 
    // and Cognitive Services subscription key
    // the RecoLanguage property is optional (default en-US); 
    // note that only en-US is supported in Preview
    const string channelSecret = "YourChannelSecret"; // Your channel secret
    const string speechSubscriptionKey = "YourSpeechSubscriptionKey"; // Your subscription key
    
    // Your subscription service region. 
    // Note: only a subset of regions are currently supported
    const string region = "YourServiceRegion"; 
    
    var botConfig = DialogServiceConfig.FromBotSecret(
        channelSecret, speechSubscriptionKey, region);
    botConfig.SetProperty(PropertyId.SpeechServiceConnection_RecoLanguage, "en-US");
    connector = new DialogServiceConnector(botConfig);
    

    注意

    Direct Line Speech (プレビュー) は、Speech Services のリージョンの一部でのみ現在利用できます。Direct Line Speech (Preview) is currently available in a subset of Speech Services regions. 音声優先仮想アシスタントをサポートしているリージョンの一覧を参照し、ご使用のリソースがそれらのリージョンのいずれかにデプロイされていることを確認します。Please refer to the list of supported regions for voice-first virtual assistants and ensure your resources are deployed in one of those regions.

    注意

    ボットの構成とチャネル シークレットの取得については、Direct Line Speech チャネルに関する Bot Framework のドキュメントを参照してください。For information on configuring your bot and retrieving a channel secret, see the Bot Framework documentation for the Direct Line Speech channel.

  4. YourChannelSecretYourSpeechSubscriptionKeyYourServiceRegion の各文字列を、実際のボット、音声サブスクリプション、リージョンの値に置き換えます。Replace the strings YourChannelSecret, YourSpeechSubscriptionKey, and YourServiceRegion with your own values for your bot, speech subscription, and region.

  5. InitializeDialogServiceConnector のメソッド本体の最後に、次のコード スニペットを追加します。Append the following code snippet to the end of the method body of InitializeDialogServiceConnector. このコードは、ボットのアクティビティや音声認識の結果などの情報を伝達する DialogServiceConnector が依存するイベントのハンドラーを設定します。This code sets up handlers for events relied on by DialogServiceConnector to communicate its bot activities, speech recognition results, and other information.

    // ActivityReceived is the main way your bot will communicate with the client 
    // and uses bot framework activities
    connector.ActivityReceived += async (sender, activityReceivedEventArgs) =>
    {
        NotifyUser(
            $"Activity received, hasAudio={activityReceivedEventArgs.HasAudio} activity={activityReceivedEventArgs.Activity}");
    
        if (activityReceivedEventArgs.HasAudio)
        {
            SynchronouslyPlayActivityAudio(activityReceivedEventArgs.Audio);
        }
    };
    
    // Canceled will be signaled when a turn is aborted or experiences an error condition
    connector.Canceled += (sender, canceledEventArgs) =>
    {
        NotifyUser($"Canceled, reason={canceledEventArgs.Reason}");
        if (canceledEventArgs.Reason == CancellationReason.Error)
        {
            NotifyUser(
                $"Error: code={canceledEventArgs.ErrorCode}, details={canceledEventArgs.ErrorDetails}");
        }
    };
    
    // Recognizing (not 'Recognized') will provide the intermediate recognized text 
    // while an audio stream is being processed
    connector.Recognizing += (sender, recognitionEventArgs) =>
    {
        NotifyUser($"Recognizing! in-progress text={recognitionEventArgs.Result.Text}");
    };
    
    // Recognized (not 'Recognizing') will provide the final recognized text 
    // once audio capture is completed
    connector.Recognized += (sender, recognitionEventArgs) =>
    {
        NotifyUser($"Final speech-to-text result: '{recognitionEventArgs.Result.Text}'");
    };
    
    // SessionStarted will notify when audio begins flowing to the service for a turn
    connector.SessionStarted += (sender, sessionEventArgs) =>
    {
        NotifyUser($"Now Listening! Session started, id={sessionEventArgs.SessionId}");
    };
    
    // SessionStopped will notify when a turn is complete and 
    // it's safe to begin listening again
    connector.SessionStopped += (sender, sessionEventArgs) =>
    {
        NotifyUser($"Listening complete. Session ended, id={sessionEventArgs.SessionId}");
    };
    
  6. MainPage クラスの ListenButton_ButtonClicked メソッドの本体に次のコード スニペットを追加します。Add the following code snippet to the body of the ListenButton_ButtonClicked method in the MainPage class. 既に構成は確立済みであり、イベント ハンドラーも登録してあるため、後は、リッスンする DialogServiceConnector をこのコードで設定します。This code sets up DialogServiceConnector to listen, since you already established the configuration and registered the event handlers.

    if (connector == null)
    {
        InitializeDialogServiceConnector();
        // Optional step to speed up first interaction: if not called, 
        // connection happens automatically on first use
        var connectTask = connector.ConnectAsync();
    }
    
    try
    {
        // Start sending audio to your speech-enabled bot
        var listenTask = connector.ListenOnceAsync();
    
        // You can also send activities to your bot as JSON strings -- 
        // Microsoft.Bot.Schema can simplify this
        string speakActivity = 
            @"{""type"":""message"",""text"":""Greeting Message"", ""speak"":""Hello there!""}";
        await connector.SendActivityAsync(speakActivity);
    
    }
    catch (Exception ex)
    {
        NotifyUser($"Exception: {ex.ToString()}", NotifyType.ErrorMessage);
    }
    
  7. メニュー バーから [ファイル] > [すべて保存] を選択して変更内容を保存します。From the menu bar, choose File > Save All to save your changes.

アプリケーションの構築と実行Build and run the application

アプリケーションをビルドしてテストする準備が整いました。Now you are ready to build and test your application.

  1. メニュー バーから [ビルド] > [ソリューションのビルド] を選択してアプリケーションをビルドします。From the menu bar, choose Build > Build Solution to build the application. これで、コードは、エラーなしでコンパイルされます。The code should compile without errors now.

  2. [デバッグ] > [デバッグの開始] の順に選択するか、F5 キーを押して、アプリケーションを起動します。Choose Debug > Start Debugging (or press F5) to start the application. [helloworld] ウィンドウが表示されます。The helloworld window appears.

    サンプル UWP 仮想アシスタント アプリケーション (C#) - クイックスタート

  3. [Enable Microphone] を選択し、アクセス許可要求がポップアップ表示されたら、 [はい] を選択します。Select Enable Microphone, and when the access permission request pops up, select Yes.

    マイクへのアクセス許可要求

  4. [Talk to your bot] を選択し、デバイスのマイクに向かって英語のフレーズや文章を話します。Select Talk to your bot, and speak an English phrase or sentence into your device's microphone. 音声が Direct Line Speech チャネルに送信されてテキストに変換され、ウィンドウに表示されます。Your speech is transmitted to the Direct Line Speech channel and transcribed to text, which appears in the window.

次の手順Next steps

関連項目See also