Envío de actividad de Comandos personalizados a una aplicación cliente

Importante

Comandos personalizados se retirará el 30 de abril de 2026. Desde el 30 de octubre de 2023 no se puede crear nuevas aplicaciones de Comandos personalizados en Speech Studio. En relación con este cambio, LUIS se retirará el 1 de octubre de 2025. Desde el 1 de abril de 2023, no se pueden crear nuevos recursos de LUIS.

En este artículo, aprenderá a enviar actividades desde una aplicación de Comandos personalizados a una aplicación cliente que ejecute el SDK de Voz.

Debe realizar las siguientes tareas:

  • Definir y enviar una carga JSON personalizada desde la aplicación de comandos personalizados.
  • Recibir y visualizar el contenido de la carga JSON personalizada desde una aplicación cliente del SDK de Voz en C# de UWP.

Requisitos previos

Configuración del envío de actividad a un cliente

  1. Abra la aplicación de Comandos personalizados que creó anteriormente.

  2. Seleccione el comando TurnOnOff, seleccione ConfirmationResponse en regla de finalización y, a continuación, seleccione Agregar una acción.

  3. En Nuevo tipo de acción, seleccione Send activity to client (enviar una actividad al cliente).

  4. Copie el código JSON siguiente en Activity content (Contenido de la actividad).

    {
       "type": "event",
       "name": "UpdateDeviceState",
       "value": {
         "state": "{OnOff}",
         "device": "{SubjectDevice}"
       }
     }
    
  5. Seleccione Guardar para crear una nueva regla con una acción Enviar actividad, Entrenar y Publicar el cambio

    Send Activity completion rule

Integración con la aplicación cliente

En Procedimiento: Configuración de una aplicación de comandos personalizados con el SDK de Voz (versión preliminar) creó una aplicación cliente de UWP con el SDK de Voz que administraba comandos como turn on the tv, turn off the fan. Después de agregar algunos objetos visuales, puede ver el resultado de esos comandos.

Para agregar cuadros etiquetados con texto que indique encendido o apagado, agregue el siguiente bloque XML de StackPanel a MainPage.xaml.

<StackPanel Orientation="Vertical" H......>
......
</StackPanel>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Margin="20">
    <Grid x:Name="Grid_TV" Margin="50, 0" Width="100" Height="100" Background="LightBlue">
        <StackPanel>
            <TextBlock Text="TV" Margin="0, 10" TextAlignment="Center"/>
            <TextBlock x:Name="State_TV" Text="off" TextAlignment="Center"/>
        </StackPanel>
    </Grid>
    <Grid x:Name="Grid_Fan" Margin="50, 0" Width="100" Height="100" Background="LightBlue">
        <StackPanel>
            <TextBlock Text="Fan" Margin="0, 10" TextAlignment="Center"/>
            <TextBlock x:Name="State_Fan" Text="off" TextAlignment="Center"/>
        </StackPanel>
    </Grid>
</StackPanel>
<MediaElement ....../>

Adición de bibliotecas de referencia

Dado que ha creado una carga JSON, ahora necesita agregar una referencia a la biblioteca JSON.NET para controlar la deserialización.

  1. Haga clic con el botón derecho en la solución.

  2. Elija Administrar paquetes NuGet para la Solución, Seleccionar Examinar

  3. Si ya instaló Newtonsoft.json, asegúrese de que su versión sea como mínimo 12.0.3. Si no es así, vaya a Administrar paquetes NuGet para la Solución-Actualizaciones y busque Newtonsoft.json para actualizarlo. Esta guía usa la versión 12.0.3.

    Send Activity payload

  4. Además, asegúrese de que el paquete NuGet Microsoft. NETCore. UniversalWindowsPlatform sea al menos 6.2.10. Esta guía usa la versión 6.2.10.

En "MainPage.xaml.cs", agregue

using Newtonsoft.Json; 
using Windows.ApplicationModel.Core;
using Windows.UI.Core;

Control de la carga recibida

En InitializeDialogServiceConnector, reemplace el controlador de eventos ActivityReceived por el código siguiente. El controlador de eventos ActivityReceived modificado extrae la carga de la actividad y cambia el estado visual del televisor o el ventilador, respectivamente.

connector.ActivityReceived += async (sender, activityReceivedEventArgs) =>
{
    NotifyUser($"Activity received, hasAudio={activityReceivedEventArgs.HasAudio} activity={activityReceivedEventArgs.Activity}");

    dynamic activity = JsonConvert.DeserializeObject(activityReceivedEventArgs.Activity);
    var name = activity?.name != null ? activity.name.ToString() : string.Empty;

    if (name.Equals("UpdateDeviceState"))
    {
        Debug.WriteLine("Here");
        var state = activity?.value?.state != null ? activity.value.state.ToString() : string.Empty;
        var device = activity?.value?.device != null ? activity.value.device.ToString() : string.Empty;

        if (state.Equals("on") || state.Equals("off"))
        {
            switch (device)
            {
                case "tv":
                    await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(
                        CoreDispatcherPriority.Normal, () => { State_TV.Text = state; });
                    break;
                case "fan":
                    await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(
                        CoreDispatcherPriority.Normal, () => { State_Fan.Text = state; });
                    break;
                default:
                    NotifyUser($"Received request to set unsupported device {device} to {state}");
                    break;
            }
        }
        else { 
            NotifyUser($"Received request to set unsupported state {state}");
        }
    }

    if (activityReceivedEventArgs.HasAudio)
    {
        SynchronouslyPlayActivityAudio(activityReceivedEventArgs.Audio);
    }
};

Prueba

  1. Inicio de la aplicación
  2. Seleccione Habilitar micrófono.
  3. Seleccionar el botón Hablar.
  4. Diga turn on the tv.
  5. El estado visual del televisor debe cambiar a "Encendido".

    Screenshot that shows that the visual state of the T V is now on.

Pasos siguientes