Descrições de áudio com o Narrador

Concluído

A sintetização de voz evoluiu bastante desde a época das vozes robóticas e pronúncias formais artificiais. O Narrador fornece um leitor de ecrã incorporado no Windows, que pode ser uma ótima ajuda para os utilizadores portadores de deficiência visual. No entanto, teremos de configurar a nossa aplicação para a utilizarmos bem.

Nesta unidade, vai aprender:

  • A ativar o Narrador e a testá-lo numa aplicação sem atributos de narração especiais;
  • A adicionar atributos especiais a uma aplicação para melhorar a fluência de narração;
  • A eliminar algum desleixo nas nossas cadeias e mensagens para que elas soem bem;
  • Que as lacunas na narração podem ser preenchidas por uma instância personalizada de um sintetizador de voz.

O Narrador

Garanta que a aplicação Calculadora Científica está em execução. Teremos de alterar o XAML e o code-behind para garantir que a aplicação proporciona a melhor experiência aos utilizadores que utilizam o Narrador.

Ativar e testar o Narrador

  1. Escreva "definições do narrador" na barra de pesquisa do Windows e, em seguida, selecione Definições do Narrador da Facilidade de Acesso. Isto fará com que o seguinte ecrã apareça.

Turning on the narrator.

  1. Ative a opção Utilizar o Narrador e, em seguida, minimize esta janela. A narração pode ser mais problemática quando se alterna entre software de programação e aplicações, pelo que recomendamos que mantenha esta janela aberta. Desta forma, poderá desativá-la quando alterar o seu código e voltar a ativá-la para efeitos de teste.

  2. Realce o botão Mostrar constantes da calculadora e observe como o Narrador lida com a descrição: Mostrar constantes (pausar) botão. Queremos ajudar o Narrador a fazer com que as respetivas descrições sejam o mais úteis possível, o que significa que vamos ter de trabalhar com as funcionalidades incorporadas dele. Uma dessas funcionalidades consiste em anunciar o tipo de elemento de interface de utilizador (neste caso, "botão").

  3. Agora, selecione o botão X2 e repare na pronúncia. "X2" é uma abreviatura comum de raiz quadrada em matemática, mas o Narrador não o sabe. O Narrador também não reconhecerá, entre outros, Sin, Asen e Cos, especialmente se também for possível pronunciar termos técnicos como palavras comuns. Teremos de ajudar o Narrador a pronunciar corretamente estes termos.

  4. Selecione outros botões (operações, números) e esteja atento à qualidade da narração. Há áreas em que é boa e áreas em que precisa de ser aperfeiçoada.

  5. Volte ao botão Mostrar constantes, selecione-o e, em seguida, selecione as diversas constantes e esteja atento à narração. Selecione algumas das constantes e avalie a utilidade da pronúncia. A pronúncia não é útil se formos um pouco preguiçosos e utilizarmos abreviaturas (tais como "Gms", "Ozs", "Cms", etc.). Os termos abreviados não são úteis se os utilizadores não os conseguirem entender.

  6. Finalmente, insira o seguinte cálculo: SqrtAtan0.5. Sem selecionar =, selecione a apresentação de texto do cálculo e repare na forma como o Narrador lida com isso. Agora, prima = e selecione novamente a apresentação de texto. Felizmente, o Narrador consegue lidar bastante bem com números longos.

  7. Abra a janela de definições do Narrador e desative a narração, por agora.

Tendo em conta o nosso teste do Narrador com a calculadora, é evidente que temos alguns problemas a resolver: a pronúncia de funções e operações matemáticas e a clareza da lista de constantes.

Tornar as cadeias de texto naturais

Nesta secção, vamos ajudar o Narrador a soar mais natural durante a utilização de qualquer funcionalidade da calculadora. Certifique-se de que o Visual Studio está aberto com o projeto da calculadora científica.

  1. Quando um elemento de interface de utilizador é realçado e narrado, o Narrador começa por testar a existência da propriedade AutomationProperites.Name. Se encontrar uma, essa propriedade será a palavra ou expressão utilizada. Se não encontrar nenhuma, será utilizada a propriedade Content. Desta forma, temos de adicionar a propriedade AutomationProperites.Name com um nome claramente pronunciável para todos os elementos de interface de utilizador que não são bem pronunciados. No ficheiro MainPage.xaml, adicione as seguintes propriedades de nome às respetivas entradas xaml. Demore o tempo que precisar, visto que esta é uma lista longa e terá de adicionar as entradas uma de cada vez. Corte e cole a partir da lista abaixo ou utilize as funcionalidades de entrada rápida de atributos do 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. Em seguida, vamos abordar o desleixo da lista de constantes. Abra o ficheiro MainPage.xaml.cs e localize o método LoadConstants.

  2. Substitua a lista de cadeias pelo seguinte, reparando que todos os termos abreviados foram substituídos por termos por extenso.

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. Agora, execute a aplicação e ative a narração. Para ser minucioso, terá de realçar cada uma das funções matemáticas, operações matemáticas e constantes para que o Narrador as leia. Já soam todas naturalmente e são compreensíveis? Se não, corrija as cadeias ou adicione ou ajuste a propriedade AutomationProperites.Name.

  2. Tente introduzir um cálculo com parêntesis e várias funções matemáticas (não importa se não fizerem sentido no âmbito da Matemática) e, em seguida, realce a apresentação de texto. Vamos ter de fazer algum código para corrigir isto.

Adicionar código para ajudar o Narrador

Graças às nossas alterações, agora o Narrador faz um excelente trabalho a nível dos elementos de interface de utilizador. No entanto, há alguns casos em que uma mensagem falada ajudaria, mas o evento acionador não é um elemento de interface de utilizador. Além disso, gostaríamos de melhorar a pronúncia do cálculo. Aqui, vamos adicionar um sintetizador de voz para lidar com mensagens de erro e fazer algumas pequenas alterações de código para lidar com o cálculo.

  1. Abra o ficheiro MainPage.xaml.cs e atualize as instruções using para que incluam o seguinte.
using System.Threading.Tasks;
using Windows.Media.SpeechSynthesis;
using Windows.UI.Xaml.Automation;
  1. Adicione o seguinte à lista das variáveis globais.
        // Declare variables needed for speech output.
        SpeechSynthesizer speech;
        MediaElement mediaElement;
  1. Inicialize estas variáveis no método MainPage para que agora se assemelhe ao seguinte.
        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. É boa prática adicionar um botão de ativar/desativar ou outro elemento de interface de utilizador para que o utilizador possa decidir se quer ou não a ajuda da narração. No ficheiro MainPage.xaml, adicione o seguinte imediatamente acima da entrada listConstants (perto das últimas entradas de elementos de interface de utilizador).
        <ToggleSwitch x:Name="ToggleNarration"
            Margin="551,407,0,0"
            HorizontalAlignment="Left"
            VerticalAlignment="Top"
            Header="Narration help"
            IsOn="True" />

Nota

É importante ordenar estes elementos pela ordem certa no ficheiro XAML. Caso contrário, obterá efeitos de transparência, tais como o aparecimento dessa entrada na lista de constantes.

  1. Novamente em MainPage.xaml.cs, adicione um método SayAsync para proferir uma qualquer linha de texto. Repare na utilização das variáveis speech e mediaElement que acabámos de adicionar e que esta é uma tarefa assíncrona.
        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. Agora temos de adicionar chamadas ao método SayAsyn. Comece com o bloco catch do método CalculateAsync.
            catch
            {
                TextError.Visibility = Visibility.Visible;
                CopyCalculation(backupCalculation, calculation);
                await SayAsync("Oops, there is an error in your calculation.");
            }
  1. Ainda no método CalculateAsync, adicione a seguinte chamada a SayAsync após as linhas aqui 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. Agora localize o método Button_Click e altere a entrada default: no bloco switch para o seguinte. Isto fará com que o cálculo seja passível de ser pronunciado.
                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. Teste o seu código ao executar a aplicação. Certifique-se de que o Narrador e o botão de alternar da ajuda da narração estão ativados. Introduza um cálculo que não faça sentido (tal como X2 (, que aparecerá como Raiz quadrada, Abrir ). Quando seleciona =, obtém uma mensagem de erro que soa naturalmente? Repare que é utilizada a mesma voz para o seu método SayAsync e para o Narrador, o que permite manter a fluidez da experiência de áudio.

  2. Conclua o cálculo e repare que o texto está escrito no ecrã. Se realçar o ecrã, o cálculo será lido com clareza pelo Narrador. Algumas operações select ainda poderão ser um pouco desafiantes, mas isto é suficiente bom para proporcionar uma experiência muito mais acessível.

A adição de uma opção de sintetização de voz à sua aplicação permite-lhe colmatar qualquer lacuna existente na narração, o que poderá ajudar os seus utilizadores. Isto é bastante específico da aplicação, pelo que a prioridade deve ser fazer com que os elementos de interface de utilizador sejam bem percebidos pelo Narrador. Poderá precisar apenas de uma quantidade mínima de narração adicional conforme aconteceu aqui.

Resumo da unidade

Nesta unidade, ficámos a saber que, hoje em dia, a sintetização de voz é surpreendentemente boa, pelo menos quando comparada com o que costumava ser. Descobrimos que uma boa parte da narração é disponibilizada gratuitamente com o Windows, sendo apenas necessário ativar o Narrador para se usufruir dela. No entanto, também ficámos a saber que o desleixo nas cadeias de mensagens se torna bastante evidente durante a utilização do Narrador. Para criarmos uma aplicação acessível, temos de garantir que as cadeias de mensagens são claras e minuciosas.

Além disso, descobrimos que o Narrador não é perfeito e precisa de ser ajudado em determinadas circunstâncias. Por exemplo, um termo matemático como "sin" (seno) não será pronunciado corretamente porque a abreviatura desta palavra é ela própria uma palavra inglesa. Contudo, as definições XAML que permitem corrigir este problema estão disponíveis e são fáceis de implementar.