Descripciones de audio con el Narrador

Completado

La síntesis de voz ha recorrido un largo camino desde la época de las voces robóticas y las pronunciaciones forzadas. El Narrador proporciona un lector de pantalla integrado en Windows, que puede ser una excelente ayuda para los usuarios con discapacidades visuales. Pero también es necesario configurar nuestra aplicación para usarlo.

En esta unidad, aprenderá a:

  • Activar el Narrador y probarlo en una aplicación sin atributos especiales de narración
  • Agregar atributos especiales a una aplicación para mejorar la fluidez de la narración
  • Limpiar algunos descuidos en nuestras cadenas y mensajes para que suenen bien
  • Esas deficiencias en la narración se pueden solucionar con una instancia personalizada de un sintetizador de voz.

El Narrador

Asegúrese de que la aplicación calculadora científica está en funcionamiento. Es necesario cambiar el XAML y el código subyacente para asegurarse de que proporciona la mejor experiencia para los usuarios que usan el Narrador.

Activación y prueba del Narrador

  1. Escriba "configuración del Narrador" en la barra de búsqueda de Windows y seleccione Ease of Access Narrator settings (Configuración del Narrador para la accesibilidad). Se abre la pantalla siguiente.

Turning on the narrator.

  1. Active el conmutador Usar el Narrador y, luego, minimice esta ventana. La narración puede ser más problemática al cambiar entre aplicaciones y desarrollar software, así que se debe mantener esta ventana abierta. Así podrá desactivarlo al realizar cambios en el código y luego volver a habilitarlo para las pruebas.

  2. Resalte el botón Show constants (Mostrar constantes) de la calculadora y observe cómo el Narrador gestiona la descripción: Botón Show constants (Mostrar constantes) (pausa). Queremos ayudar al Narrador a que sus descripciones sean lo más útiles posibles, lo que significa trabajar con sus características integradas. Una de esas características es anunciar el tipo de elemento de la interfaz de usuario (claramente, en este caso "botón").

  3. Ahora, seleccione el botón Sqrt y observe la pronunciación. "Sqrt" es una forma abreviada común de escribir la raíz cuadrada en matemáticas, pero el Narrador no lo sabe. Igualmente, no reconocerá Sin, Asin, Acos, y así sucesivamente, especialmente cuando términos especializados también se pueden pronunciar como vocablos comunes. Es necesario ayudar al Narrador a pronunciar estas palabras correctamente.

  4. Seleccione otros diversos botones (operaciones, números) y vea cómo funciona la narración. Hay áreas donde lo hace bien y áreas donde necesita mejoras.

  5. Vuelva al botón Show constants (Mostrar constantes), selecciónelo y, luego, seleccione las diversas constantes y observe la narración. Seleccione varias de las constantes y evalúe la utilidad de la pronunciación. En aquellas partes que hemos sido algo vagos y hemos puesto la forma abreviada (por ejemplo, "Gms", "Ozs", "Cms" etc.), la pronunciación no es útil. Los términos en su forma abreviada no son útiles si no los comprenden los usuarios.

  6. Por último, escriba el siguiente cálculo: SqrtAtan0.5. Sin seleccionar =, seleccione la pantalla de texto del cálculo y observe cómo la gestiona el Narrador. Ahora presione = y vuelva a seleccionar la pantalla de texto. Por suerte para nosotros, el Narrador puede gestionar los números largos bastante bien.

  7. Abra la ventana de configuración del Narrador y desactive la narración por ahora.

Según la prueba del Narrador con la calculadora, existen claramente problemas en los que trabajar: la pronunciación de funciones matemáticas y operaciones matemáticas y la claridad de la lista de constantes.

Conseguir que las cadenas de texto suenen naturales

En esta sección, ayudaremos al Narrador a que suene natural al usar cualquier característica de la calculadora. Asegúrese de que Visual Studio está abierto con el proyecto de la calculadora científica.

  1. Cuando se resalta y se narra un elemento de la interfaz de usuario, el Narrador comprueba primero la propiedad AutomationProperites.Name. Si encuentra alguna, esa es la palabra o frase que se utiliza. En caso contrario, se usa la propiedad Content. Por lo tanto, para todos esos elementos de la interfaz de usuario que no se pronuncian bien, es necesario agregar la propiedad AutomationProperites.Name con un nombre que se pueda pronunciar claramente. En el archivo MainPage.xaml, agregue las siguientes propiedades de nombre a sus entradas XAML respectivas. Tómese su tiempo, ya que se trata de una lista larga y deberá agregar las entradas de una en una. Corte y pegue en la lista siguiente o use las características rápidas de entrada de atributos de Visual Studio.
 <Button x:Name="ButtonNMemoryPlus" AutomationProperties.Name="Memory plus" Content="M+"
 <Button x:Name="ButtonNMemoryMinus" AutomationProperties.Name="Memory minus" Content="M-"
 <Button x:Name="ButtonNMemoryMultiply" AutomationProperties.Name="Memory times" Content="M*"
 <Button x:Name="ButtonNMemoryDivide" AutomationProperties.Name="Memory divided by" Content="M/"
 <Button x:Name="ButtonLeft" AutomationProperties.Name="Open" Content="("
 <Button x:Name="ButtonSqrt" AutomationProperties.Name="Square root" Content="Sqrt"
 <Button x:Name="ButtonPow" AutomationProperties.Name="to the Power of" Content="^"
 <Button x:Name="ButtonPi" AutomationProperties.Name="Pi" Content="&#928;"
 <Button x:Name="ButtonRight" AutomationProperties.Name="Close" Content=")"
 <Button x:Name="ButtonArcsine" AutomationProperties.Name="Arc sine" Content="Asin"
 <Button x:Name="ButtonArccosine" AutomationProperties.Name="Arc cosine" Content="Acos"
 <Button x:Name="ButtonArctangent" AutomationProperties.Name="Arc tangent" Content="Atan"
 <Button x:Name="ButtonSin" AutomationProperties.Name="Sine" Content="Sin"
 <Button x:Name="ButtonCos" AutomationProperties.Name="Cosine" Content="Cos"
 <Button x:Name="ButtonTan" AutomationProperties.Name="Tangent" Content="Tan"
 <Button x:Name="ButtonNegative" AutomationProperties.Name="Negative" Content="-N"
 <Button x:Name="ButtonPlus" AutomationProperties.Name="plus" Content="+"
 <Button x:Name="ButtonMinus" AutomationProperties.Name="minus" Content="-"
 <Button x:Name="ButtonMultiply" AutomationProperties.Name="times" Content="*"
 <Button x:Name="ButtonDivide" AutomationProperties.Name="divided by" Content="/"
 <Button x:Name="ButtonEquals" AutomationProperties.Name="equals" Content="="
 <TextBox x:Name="TextDisplay" AutomationProperties.Name="Calculation"
 <Button x:Name="ButtonClr" AutomationProperties.Name="Clear" Content="Clr"
 <Button x:Name="ButtonDel" AutomationProperties.Name="Delete" Content="Del"
   />
  1. A continuación, vamos a ver los descuidos de la lista de constantes. Abra el archivo MainPage.xaml.cs y busque el método LoadConstants.

  2. Reemplace la lista de cadenas por lo siguiente y observe que todos los términos abreviados se remplazan por la forma larga.

string[] initialConstants = {
                "Acceleration due to gravity = 9.80665",
                "Bars to pounds per square inch = 14.5037738",
                "Centimeters to inches = 0.393700787",
                "Degrees to radians = 0.0174532925",
                "Feet to meters = 0.3048",
                "Grams to ounces = 0.035273",
                "Inches to centimeters = 2.540",
                "Inches to millimeters = 25.4",
                "Kilograms to pounds = 2.20462262",
                "Kilometers to miles = 0.621371192",               
                "Liters to pints = 2.11337642",
                "Meters to feet= 3.2808",
                "Miles to kilometers = 1.609344",
                "Millimeters to inches = 0.0393700787",
                "Ounces to grams = 28.3495",
                "Pints to liters = 0.473176473",   
                "Pounds per square inch to bars = 0.0689475729",
                "Pounds to kilograms = 0.45359237",                            
                "Radians to degrees = 57.2957795",
                "Speed of light in meters per second = 299792458",
                "Speed of light in miles per second = 186282.397"
            };
  1. Ahora ejecute la aplicación y active la narración. Para ser más riguroso, deberá resaltar cada una de las funciones matemáticas, operaciones y constantes para que el Narrador las lea. ¿Suenan ahora todas ellas naturales y se entienden? Si no es así, realice correcciones en las cadenas o agregue o ajuste la propiedad AutomationProperites.Name.

  2. Pruebe a escribir un cálculo entre corchetes y varias funciones matemáticas (da igual que no tengan sentido matemático) y, luego, resalte la pantalla de texto. Para solucionar esto, es necesario usar código.

Adición de código para ayudar al Narrador

Gracias a nuestros cambios, el Narrador funciona ahora perfectamente con los elementos de la interfaz de usuario. Sin embargo, hay algunos casos donde un mensaje hablado sería de ayuda, pero el evento desencadenador no es un elemento de la interfaz de usuario. También, nos gustaría mejorar la pronunciación del cálculo. Aquí vamos a agregar un sintetizador de voz para gestionar los mensajes de error y algún pequeño cambio en el código para gestionar el cálculo.

  1. Abra el archivo MainPage.xaml.cs y actualice las instrucciones using para incluir lo siguiente.
using System.Threading.Tasks;
using Windows.Media.SpeechSynthesis;
using Windows.UI.Xaml.Automation;
  1. Agregue lo siguiente a la lista de variables globales.
        // Declare variables needed for speech output.
        SpeechSynthesizer speech;
        MediaElement mediaElement;
  1. Inicialice estas variables en el método MainPage, de forma que ahora el código tenga este aspecto.
        public MainPage()
        {
            this.InitializeComponent();

            // Hide the error field.
            textError.Visibility = Visibility.Collapsed;

            LoadConstants();

            calculation = new ArrayList();
            backupCalculation = new ArrayList();

            mode = Emode.Calculate;

            // The objects for controlling and playing audio.
            speech = new SpeechSynthesizer();
            mediaElement = new MediaElement();
        }
  1. Es recomendable agregar un conmutador para alternar u otro elemento de la interfaz de usuario para que el usuario pueda decidir si quiere ayuda para la narración. En el archivo MainPage.xaml, justo encima de la entrada listConstants (cerca de las últimas entradas de elementos de la interfaz de usuario), agregue lo siguiente.
        <ToggleSwitch x:Name="ToggleNarration"
            Margin="551,407,0,0"
            HorizontalAlignment="Left"
            VerticalAlignment="Top"
            Header="Narration help"
            IsOn="True" />

Nota:

Es importante obtener estos elementos en el orden correcto en el archivo XAML. Si no es así, se producirán efectos de transparencia, como que esta entrada aparezca en la lista de constantes.

  1. En MainPage.xaml.cs, agregue un método SayAsync para decir una línea cualquiera de texto. Observe el uso de las variables speech y mediaElement que acabamos de agregar, y que esta es una tarea asincrónica.
        private async Task SayAsync(string text)
        {
            // Narrate the given text if narration help is on.
            if (ToggleNarration.IsOn == true)
            {
                // Generate the audio stream from plain text.
                SpeechSynthesisStream stream = await speech.SynthesizeTextToStreamAsync(text);

                // Send the stream to the media object, then play it.
                mediaElement.SetSource(stream, stream.ContentType);
                mediaElement.Play();
            }
        }
  1. Ahora tenemos que agregar llamadas al método SayAsync. Comience con el bloque catch del método CalculateAsync.
            catch
            {
                TextError.Visibility = Visibility.Visible;
                CopyCalculation(backupCalculation, calculation);
                await SayAsync("Oops, there is an error in your calculation.");
            }
  1. Todavía en el método CalculateAsync, agregue la siguiente llamada a SayAsync después de las líneas aquí mostradas.
                    // Add the entry to the next calculation, just in case the user wants to add to it.
                    OneEntry resultEntry = new OneEntry(Etoken.Number, result, txt);
                    calculation.Add((object)resultEntry);

                    await SayAsync($"The result is: {txt}");
  1. Ahora, busque el método Button_Click y cambie la entrada predeterminada del bloque de conmutación por lo siguiente. Esta acción hará que el cálculo se pueda pronunciar.
                default:

                    // User has clicked a math or digit button.
                    string tag = b.Tag.ToString();
                    string txt = "";

                    // If in narrative mode, then use a full English string for the display text, if a full string has been specified.
                    if (ToggleNarration.IsOn == true)
                    {
                        txt = b.GetValue(AutomationProperties.NameProperty).ToString();
                    }

                    // Use the content of the button as the equation text.
                    if (txt.Length == 0)
                    {
                        txt = b.Content.ToString();
                    }

                    MathEntry(txt, tag);
                    break;
  1. Para probar el código, ejecute la aplicación. Asegúrese de que el Narrador y el botón de alternancia Narration help (Ayuda de narración) están activados. Escriba un cálculo absurdo (como Sqrt (, que aparecerá como Raíz cuadrada abrir). ¿Recibe un mensaje de error que suena natural al seleccionar =? Observe que la misma voz se usa para el método SayAsync y el Narrador, lo que mantiene la experiencia de audio fluida.

  2. Realice el cálculo y observe que el texto se deletrea en la pantalla. Si luego resalta la pantalla, el Narrador lee claramente el texto. Aunque algunas operaciones de selección podrían ser aún algo problemáticas, esto es suficiente para proporcionar una experiencia de usuario más accesible.

Agregue una opción de síntesis de voz a su aplicación para rellenar los huecos en la narración que podrían ayudar a los usuarios. Esta opción es totalmente específica de la aplicación, así que lo primero es conseguir que el Narrador lea con facilidad los elementos de la interfaz de usuario. Puede que solo haga falta una cantidad mínima de narración adicional, como ha sido aquí el caso.

Resumen de la unidad

En esta unidad, aprendimos que la síntesis de voz es ahora excepcionalmente buena, al menos en comparación con cómo solía ser. Aprendimos que una buena cantidad de narración se incluye de forma gratuita con Windows con solo activar el Narrador. Sin embargo, también hemos visto que los descuidos en las cadenas de mensajes se vuelven aparentes fácilmente cuando se usa el Narrador. Para una aplicación accesible, es necesario asegurarse de que nuestras cadenas de mensajes sean claras y rigurosas.

También hemos aprendido que el Narrador no es perfecto y que, en determinados casos, hay que ayudarlo. Por ejemplo, una palabra matemática como "sin" no se pronuncia correctamente dado que la forma abreviada es una palabra en sí misma. Pero la configuración de XAML para corregir este problema está fácilmente disponible y no es difícil de implementar.