Uso de la voz para invocar elementos de la interfaz de usuario

Voice Enabled Shell (VES) es una extensión de Windows Speech Platform que ofrece una experiencia de voz de primera clase dentro de las aplicaciones, permitiendo a los usuarios utilizar la voz para invocar controles en pantalla e insertar texto mediante dictado. VES se esfuerza por ofrecer una experiencia común de extremo a extremo en todos los shells y dispositivos Windows, con el mínimo esfuerzo por parte de los desarrolladores de aplicaciones. Para ello, aprovecha Microsoft Speech Platform y el marco de automatización de IU (UIA).

Tutorial de la experiencia del usuario

Lo que sigue es una visión general de lo que un usuario experimentaría al utilizar VES en Xbox, y debería ayudar a establecer el contexto antes de sumergirse en los detalles de cómo funciona VES.

  • El usuario enciende la consola Xbox y quiere navegar por sus aplicaciones para encontrar algo que le interese:

    Usuario: "Hola Cortana, abre Mis juegos y aplicaciones"

  • El usuario se deja en modo de escucha activa (ALM), lo que significa que la consola ahora está escuchando al usuario para invocar un control visible en la pantalla, sin necesidad de decir" "Hola Cortana" cada vez. Ahora el usuario puede cambiar para ver las aplicaciones y desplazarse por la lista de aplicaciones:

    Usuario: "aplicaciones"

  • Para desplazarse por la vista, el usuario simplemente puede decir:

    Usuario: "desplazar hacia abajo"

  • El usuario ve el gráfico de la aplicación que le interesa pero ha olvidado el nombre. El usuario pide que se muestren las etiquetas de sugerencias de voz:

    Usuario: "mostrar etiquetas"

  • Ahora que está claro qué decir, se puede iniciar la aplicación:

    Usuario: "películas y televisión"

  • Para salir del modo de escucha activo, el usuario indica a Xbox que deje de escuchar:

    Usuario: "dejar de escuchar"

  • Más adelante, se puede iniciar una nueva sesión de escucha activa con:

    Usuario: "Hola Cortana, hacer una selección" o "Hola Cortana, seleccionar"

Dependencia de automatización de la interfaz de usuario

VES es un cliente automatización de la interfaz de usuario y se basa en la información expuesta por la aplicación a través de sus proveedores de automatización de la interfaz de usuario. Esta es la misma infraestructura que ya está usando la función Narrador en plataformas Windows. Automatización de la interfaz de usuario permite el acceso mediante programación a los elementos de la interfaz de usuario, incluido el nombre del control, su tipo y los patrones de control que implementa. A medida que la interfaz de usuario cambia en la aplicación, VES reacciona a los eventos de actualización de UIA y vuelve a analizar el árbol de automatización de la interfaz de usuario actualizado para encontrar todos los elementos procesables, utilizando esta información para construir una gramática de reconocimiento de voz.

Todas las aplicaciones UWP tienen acceso al marco de automatización de la interfaz de usuario y pueden exponer información sobre la interfaz de usuario independientemente del marco gráfico en el que se basen (XAML, DirectX/Direct3D, etc.). En algunos casos, como XAML, la mayor parte del trabajo pesado lo realiza el marco, lo que reduce en gran medida el trabajo necesario para dar soporte a Narrador y VES.

Para obtener más información sobre Automatización de la interfaz de usuario consulte Conceptos básicos de automatización de la interfaz de usuario.

Nombre de invocación de control

VES emplea la siguiente heurística para determinar qué frase registrar con el reconocedor de voz como nombre del control (es decir, lo que el usuario tiene que decir para invocar el control). Esta es también la frase que aparecerá en la etiqueta de consejos de voz.

Origen del nombre en orden de prioridad:

  1. Si el elemento tiene una propiedad LabeledBy asociada, VES utilizará la AutomationProperties.Name de esta etiqueta de texto.
  2. AutomationProperties.Name del elemento. En XAML, el contenido de texto del control se usará como valor predeterminado para AutomationProperties.Name.
  3. Si el control es un ListItem o Button, VES buscará el primer elemento secundario con un AutomationProperties.Name válido.

Controles accionables

VES considera que un control es accionable si aplica uno de los siguientes patrones de control de automatización:

  • InvokePattern (por ejemplo, botón)- Representa los controles que inician o realizan una única acción inequívoca y que no mantienen el estado cuando se activan.

  • TogglePattern (por ejemplo, casilla de verificación) - Representa un control que puede recorrer un conjunto de estados y mantener un estado una vez establecido.

  • SelectionItemPattern (por ejemplo, cuadro combinado) - Representa un control que actúa como contenedor para una colección de elementos secundarios seleccionables.

  • ExpandCollapsePattern (por ejemplo, cuadro combinado): representa controles que se expanden visualmente para mostrar contenido y se contraen para ocultar contenido.

  • ScrollPattern (por ejemplo, lista) - Representa controles que actúan como contenedores desplazables para una colección de elementos secundarios.

Contenedores desplazables

Para los contenedores desplazables que admiten ScrollPattern, VES escuchará comandos de voz como "desplazarse a la izquierda", "desplazarse a la derecha", etc. e invocará Scroll con los parámetros adecuados cuando el usuario desencadene uno de estos comandos. Los comandos de desplazamiento se insertan en función del valor de las propiedades HorizontalScrollPercent y VerticalScrollPercent. Por ejemplo, si HorizontalScrollPercent es mayor que 0, se añadirá "desplazarse a la izquierda", si es menor que 100, se añadirá "desplazarse a la derecha", etc.

Superposición del narrador

La aplicación Narrador también es un cliente de Automatización de la interfaz de usuario y usa la propiedad AutomationProperties.Name como uno de los orígenes del texto que lee para el elemento de interfaz de usuario seleccionado actualmente. Para proporcionar una mejor experiencia de accesibilidad, muchos desarrolladores de aplicaciones han recurrido a sobrecargar la propiedad Name con texto descriptivo largo con el objetivo de proporcionar más información y contexto cuando lo lea Narrador. Sin embargo, esto provoca un conflicto entre las dos funciones: VES necesita frases cortas que coincidan o coincidan estrechamente con el texto visible del control, mientras que narrador se beneficia de frases más largas y descriptivas para dar un mejor contexto.

Para resolver esto, a partir de Actualización de Windows 10 para creadores, el Narrador se actualizó para examinar también la propiedad AutomationProperties.HelpText. Si esta propiedad no está vacía, el Narrador pronunciará su contenido además de AutomationProperties.Name. Si HelpText está vacío, Narrador solo leerá el contenido de Nombre. Esto permitirá que las cadenas descriptivas más largas se usen cuando sea necesario, pero mantiene una frase de reconocimiento de voz más corta en la propiedad Name.

Un diagrama que muestra el código detrás del botón que incluye AutomationProperties.Name y AutomationProperties.HelpText que muestra que el shell habilitado para voz escucha el nombre Configurar.

Para obtener más información, consulte Propiedades de automatización para la compatibilidad con accesibilidad en la interfaz de usuario.

Modo de escucha activa (ALM)

Especificación de ALM

En Xbox, VES no escucha constantemente la entrada de voz. El usuario debe especificar explícitamente el modo de escucha activa diciendo:

  • "Hola Cortana, seleccionar" o
  • "Hola Cortana, hacer una selección"

Hay otros comandos de Cortana que también dejan al usuario en escucha activa al finalizar, por ejemplo, "Hola Cortana, iniciar sesión" o "Hola Cortana, ir al inicio".

La entrada de ALM tendrá el siguiente efecto:

  • La superposición de Cortana se mostrará en la esquina superior derecha, indicando al usuario que puede decir lo que ve. Mientras el usuario habla, los fragmentos de frases que reconoce el reconocedor de voz también se mostrarán en esta ubicación.

  • VES analiza el árbol de UIA, busca todos los controles accionables, registra su texto en la gramática de reconocimiento de voz e inicia una sesión de escucha continua.

    Captura de pantalla con la opción Mostrar etiquetas resaltada.

Salir de ALM

El sistema permanecerá en ALM mientras el usuario interactúa con la interfaz de usuario mediante voz. Hay dos formas de salir de ALM:

  • El usuario dice explícitamente, "dejar de escuchar" o
  • Se producirá un tiempo de espera si no hay un reconocimiento positivo en un plazo de 17 segundos después de entrar en ALM o desde el último reconocimiento positivo

Invocar controles

En ALM el usuario puede interactuar con la interfaz de usuario mediante voz. Si la interfaz de usuario está configurada correctamente (con las propiedades Nombre que coinciden con el texto visible), el uso de voz para realizar acciones debe ser una experiencia natural sin problemas. El usuario debería poder decir lo que ve en la pantalla.

Superposición de la interfaz de usuario en Xbox

El VES del nombre deriva de un control puede ser diferente del texto visible real en la interfaz de usuario. Esto puede deberse a la propiedad Name del control o al elemento LabeledBy asociado que se establece explícitamente en una cadena diferente. O bien, el control no tiene texto de GUI, sino solo un icono o elemento de imagen.

En estos casos, los usuarios necesitan una manera de ver lo que se debe decir para invocar este control. Por lo tanto, una vez en escucha activa, se pueden mostrar sugerencias de voz diciendo "mostrar etiquetas". Esto hace que las etiquetas de sugerencias de voz aparezcan encima de cada control accionable.

Hay un límite de 100 etiquetas, por lo que si la interfaz de usuario de la aplicación tiene controles más accionables que 100, habrá algunos que no tendrán etiquetas de sugerencia de voz mostradas. Las etiquetas que se eligen en este caso no son deterministas, ya que depende de la estructura y composición de la interfaz de usuario actual como la primera enumerada en el árbol de UIA.

Una vez que se muestran las etiquetas de sugerencia de voz no hay ningún comando para ocultarlas, permanecerán visibles hasta que se produzca uno de los siguientes eventos:

  • el usuario invoca un control
  • el usuario se aleja de la escena actual
  • el usuario dice, "dejar de escuchar"
  • se agota el tiempo de espera del modo de escucha activo

Ubicación de las etiquetas de sugerencias de voz

Las etiquetas de sugerencia de voz se centran horizontal y verticalmente dentro del boundingRectangle del control. Cuando los controles son pequeños y están estrechamente agrupados, las etiquetas pueden superponerse o ocultarse por otras personas y VES intentará separarlas para asegurarse de que son visibles. Sin embargo, no se garantiza que esto funcione el 100 % del tiempo. Si hay una interfaz de usuario muy llena, es probable que algunas etiquetas estén ocultas por otras. Revise la interfaz de usuario con "mostrar etiquetas" para asegurarse de que hay suficiente espacio para la visibilidad de la sugerencia de voz.

Captura de pantalla de las etiquetas de sugerencias de voz horizontal y verticalmente centradas dentro del rectángulo delimitador del control.

Cuadros combinados

Cuando un cuadro combinado se expande cada elemento individual del cuadro combinado obtiene su propia etiqueta de sugerencia de voz y, a menudo, estos estarán encima de los controles existentes detrás de la lista desplegable. Para evitar presentar un lodo confuso y desordenado de etiquetas (donde las etiquetas de elementos de cuadro combinado se mezclan con las etiquetas de los controles detrás del cuadro combinado) cuando se expande un cuadro combinado solo se mostrarán las etiquetas de sus elementos secundarios; todas las demás etiquetas de sugerencia de voz se ocultarán. A continuación, el usuario puede seleccionar uno de los elementos desplegables o "cerrar" el cuadro combinado.

  • Etiquetas en cuadros combinados contraídos:

    Captura de pantalla de la ventana de salida de vídeo de visualización y sonido con etiquetas en los cuadros combinados contraídos.

  • Etiquetas en el cuadro combinado expandido:

    Captura de pantalla de la ventana de salida de vídeo de visualización y sonido con etiquetas en un cuadro combinado expandido.

Controles desplazables

Para los controles desplazables, las sugerencias de voz para los comandos de desplazamiento se centrarán en cada uno de los bordes del control. Las sugerencias de voz solo se mostrarán para las direcciones de desplazamiento que son accionables, por lo que, por ejemplo, si el desplazamiento vertical no está disponible, no se mostrará "desplazarse hacia arriba" ni "desplazarse hacia abajo". Cuando hay varias regiones desplazables, VES usará ordinales para diferenciarlas (por ejemplo, "Desplazarse hacia la derecha 1", "Desplazarse hacia la derecha 2", etc.).

Captura de pantalla de las sugerencias de voz Desplazarse hacia la izquierda y Desplazarse hacia la derecha en una interfaz de usuario de desplazamiento horizontal.

Anulación de ambigüedades

Cuando varios elementos de la interfaz de usuario tienen el mismo nombre, o el reconocedor de voz encuentra varios candidatos, VES entra en modo de desambiguación. En este modo se mostrarán las etiquetas de sugerencias de voz para los elementos implicados para que el usuario pueda seleccionar el correcto. El usuario puede cancelar el modo de desambiguación diciendo "cancelar".

Por ejemplo:

  • En modo de escucha activa, antes de la desambiguación; el usuario dice: "Soy ambiguo":

    Captura de pantalla del modo de escucha activo con la opción Ahora puede decir lo que ve que se muestra y no hay etiquetas en los botones.

  • Ambos botones coinciden; se inició la desambiguación:

    Captura de pantalla del modo de escucha activo con la opción ¿Cuál quería? mostrada y las etiquetas Elemento 1 y Elemento 2 en los botones.

  • Mostrar la acción de clic cuando se eligió "Seleccionar 2":

    Captura de pantalla del modo de escucha activo con la opción Ahora puede decir lo que ve y la etiqueta Soy ambiguo en el primer botón.

Ejemplo de interfaz de usuario

Este es un ejemplo de una interfaz de usuario basada en XAML, estableciendo el AutomationProperties.Name de varias maneras:

<Page
    x:Class="VESSampleCSharp.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:VESSampleCSharp"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">
    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <Button x:Name="button1" Content="Hello World" HorizontalAlignment="Left" Margin="44,56,0,0" VerticalAlignment="Top"/>
        <Button x:Name="button2" AutomationProperties.Name="Launch Game" Content="Launch" HorizontalAlignment="Left" Margin="44,106,0,0" VerticalAlignment="Top" Width="99"/>
        <TextBlock AutomationProperties.Name="Day of Week" x:Name="label1" HorizontalAlignment="Left" Height="22" Margin="168,62,0,0" TextWrapping="Wrap" Text="Select Day of Week:" VerticalAlignment="Top" Width="137"/>
        <ComboBox AutomationProperties.LabeledBy="{Binding ElementName=label1}" x:Name="comboBox" HorizontalAlignment="Left" Margin="310,57,0,0" VerticalAlignment="Top" Width="120">
            <ComboBoxItem Content="Monday" IsSelected="True"/>
            <ComboBoxItem Content="Tuesday"/>
            <ComboBoxItem Content="Wednesday"/>
            <ComboBoxItem Content="Thursday"/>
            <ComboBoxItem Content="Friday"/>
            <ComboBoxItem Content="Saturday"/>
            <ComboBoxItem Content="Sunday"/>
        </ComboBox>
        <Button x:Name="button3" HorizontalAlignment="Left" Margin="44,156,0,0" VerticalAlignment="Top" Width="213">
            <Grid>
                <TextBlock AutomationProperties.Name="Accept">Accept Offer</TextBlock>
                <TextBlock Margin="0,25,0,0" Foreground="#FF5A5A5A">Exclusive offer just for you</TextBlock>
            </Grid>
        </Button>
    </Grid>
</Page>

El uso del ejemplo anterior aquí es el aspecto de la interfaz de usuario con y sin etiquetas de sugerencia de voz.

  • En el modo de escucha activa, sin etiquetas mostradas:

    Captura de pantalla del modo de escucha activo con las etiquetas Para ver, por ejemplo, la opción Mostrar etiquetas se muestra y no se muestra ninguna etiqueta.

  • En el modo de escucha activa, después de que el usuario diga "mostrar etiquetas":

    Captura de pantalla del modo de escucha activa con la opción Si ha terminado, diga Dejar de escuchar en pantalla y las etiquetas mostradas en los controles de la interfaz de usuario.

En el caso de button1, XAML rellena automáticamente la propiedad AutomationProperties.Name mediante texto del contenido de texto visible del control. Este es el motivo por el que hay una etiqueta de sugerencia de voz aunque no haya un AutomationProperties.Name explícito establecido.

Con button2, establecemos explícitamente el AutomationProperties.Name en algo distinto del texto del control.

Con comboBox, usamos la propiedad LabeledBy para hacer referencia a label1 como origen de la automatización Name, y en label1 establecemos el AutomationProperties.Name en una frase más natural que lo que se representa en la pantalla ("Día de la semana" en lugar de "Seleccionar día de la semana").

Por último, con button3, VES toma el Name del primer elemento secundario, ya que button3 no tiene un AutomationProperties.Name establecido.

Consulte también