Compartilhar via


Usando a fala para invocar elementos da interface do usuário

O Shell Habilitado para Voz (VES) é uma extensão da Plataforma de Fala do Windows que permite uma experiência de fala de primeira classe dentro de aplicativos, permitindo que os usuários usem a fala para invocar controles na tela e inserir texto por meio de ditado. O VES se esforça para fornecer uma experiência comum de ponta a ponta em todos os Shells e dispositivos Windows, com o mínimo de esforço exigido dos desenvolvedores de aplicativos. Para conseguir isso, ele aproveita a plataforma de fala da Microsoft e a estrutura de automação da interface do usuário (UIA).

Passo a passo da experiência do usuário

A seguir está uma visão geral do que um usuário experimentaria ao usar o VES no Xbox e deve ajudar a definir o contexto antes de mergulhar nos detalhes de como o VES funciona.

  • O usuário liga o console Xbox e deseja navegar por seus aplicativos para encontrar algo de interesse:

    Usuário: "Olá Cortana, abra Meus Jogos e Aplicativos"

  • O usuário é deixado no Modo de Escuta Ativa (ALM), o que significa que o console agora está escutando para que o usuário invoque um controle visível na tela, sem precisar dizer "Ei Cortana" todas as vezes. O usuário agora pode alternar para exibir aplicativos e rolar pela lista de aplicativos:

    Usuário: "aplicativos"

  • Para rolar a exibição, o usuário pode simplesmente dizer:

    Usuário: "role para baixo"

  • O usuário vê a arte da caixa do aplicativo em que está interessado, mas esqueceu o nome. O usuário solicita que os rótulos de dica de voz sejam exibidos:

    Usuário: "mostrar rótulos"

  • Agora que está claro o que dizer, o aplicativo pode ser iniciado:

    Usuário: "filmes e TV"

  • Para sair do modo de escuta ativa, o usuário diz ao Xbox para parar de ouvir:

    Usuário: "pare de ouvir"

  • Mais tarde, uma nova sessão de escuta ativa pode ser iniciada com:

    Usuário: "Ei Cortana, faça uma seleção" ou "Ei Cortana, selecione"

Dependência de automação da interface do usuário

O VES é um cliente de Automação da Interface do Usuário e depende das informações expostas pelo aplicativo por meio de seus provedores de Automação da Interface do Usuário. Essa é a mesma infraestrutura que já está sendo usada pelo recurso Narrador em plataformas Windows. A Automação da Interface do Usuário permite o acesso programático aos elementos da interface do usuário, incluindo o nome do controle, seu tipo e quais padrões de controle ele implementa. À medida que a interface do usuário muda no aplicativo, o VES reagirá aos eventos de atualização da interface do usuário e analisará novamente a árvore de automação da interface do usuário atualizada para localizar todos os itens acionáveis, usando essas informações para criar uma gramática de reconhecimento de fala.

Todos os aplicativos UWP têm acesso à estrutura de Automação da Interface do Usuário e podem expor informações sobre a interface do usuário, independentemente da estrutura gráfica em que são criados (XAML, DirectX/Direct3D, etc.). Em alguns casos, como o XAML, a maior parte do trabalho pesado é feita pela estrutura, reduzindo consideravelmente o trabalho necessário para dar suporte ao Narrador e ao VES.

Para saber mais sobre a automação da interface do usuário, veja Fundamentos da automação da interface do usuário.

Nome da invocação de controle

O VES emprega a seguinte heurística para determinar qual frase registrar com o reconhecedor de fala como o nome do controle (ou seja, o que o usuário precisa falar para invocar o controle). Essa também é a frase que vai aparecer no rótulo da dica de voz.

Origem do Nome em ordem de prioridade:

  1. Se o elemento tiver uma LabeledBy propriedade anexada, o VES usará o AutomationProperties.Name rótulo desse texto.
  2. AutomationProperties.Name do elemento. Em XAML, o conteúdo de texto do controle será usado como o valor padrão para AutomationProperties.Name.
  3. Se o controle for um ListItem ou Button, o VES procurará o primeiro elemento filho com um AutomationProperties.Namearquivo .

Controles acionáveis

O VES considera um controle acionável se implementar um dos seguintes padrões de controle de automação:

  • InvokePattern (por exemplo: Botão)- Representa os controles que iniciam ou executam uma ação única não ambígua e não mantêm o estado quando ativado.

  • TogglePattern (por exemplo: Caixa de Seleção) - Representa um controle que pode percorrer um conjunto de estados e manter um estado uma vez definido.

  • SelectionItemPattern (por exemplo: Combo Box) - Representa um controle que atua como um contêiner para uma coleção de itens filho selecionáveis.

  • ExpandCollapsePattern (por exemplo: Caixa de Combinação) - Representa controles que se expandem visualmente para exibir conteúdo e recolhem para ocultar conteúdo.

  • ScrollPattern (por exemplo: Lista) - Representa controles que atuam como contêineres roláveis para uma coleção de elementos filho

Contêineres roláveis

Para contêineres roláveis que suportam o ScrollPattern, o VES escutará comandos de voz como "scroll left", "scroll right", etc. e invocará Scroll com os parâmetros apropriados quando o usuário acionar um desses comandos. Os comandos de rolagem são injetados com base no valor das HorizontalScrollPercent propriedades e VerticalScrollPercent . Por exemplo, se HorizontalScrollPercent for maior que 0, "rolar para a esquerda" será adicionado, se for menor que 100, "rolar para a direita" será adicionado e assim por diante.

Sobreposição do narrador

O aplicativo Narrador também é um cliente de Automação da Interface do Usuário e usa a AutomationProperties.Name propriedade como uma das fontes para o texto que lê para o elemento da interface do usuário selecionado no momento. Para fornecer uma melhor experiência de acessibilidade, muitos desenvolvedores de aplicativos recorreram à sobrecarga da Name propriedade com um longo texto descritivo com o objetivo de fornecer mais informações e contexto quando lido pelo Narrador. No entanto, isso causa um conflito entre os dois recursos: o VES precisa de frases curtas que correspondam ou coincidam com o texto visível do controle, enquanto o Narrador se beneficia de frases mais longas e descritivas para dar um melhor contexto.

Para resolver isso, a partir do Windows 10 Creators Update, o Narrador foi atualizado para também examinar a AutomationProperties.HelpText propriedade. Se essa propriedade não estiver vazia, o Narrador falará seu conteúdo além de AutomationProperties.Name. Se HelpText estiver vazio, o Narrador lerá apenas o conteúdo de Nome. Isso permitirá que cadeias de caracteres descritivas mais longas sejam usadas quando necessário, mas mantém uma frase amigável de reconhecimento de fala mais curta na Name propriedade.

Um diagrama mostrando o código por trás do botão que inclui AutomationProperties.Name e AutomationProperties.HelpText mostrando que o Shell Habilitado para Voz escuta o Name Configure.

Para obter mais informações, consulte Propriedades de automação para suporte de acessibilidade na interface do usuário.

Modo de Escuta Ativa (ALM)

Inserindo ALM

No Xbox, o VES não está constantemente ouvindo a entrada de fala. O usuário precisa entrar no Modo de Escuta Ativa explicitamente, dizendo:

  • "Olá Cortana, selecione", ou
  • "Olá Cortana, faça uma seleção"

Existem vários outros comandos da Cortana que também deixam o usuário em escuta ativa após a conclusão, por exemplo, "Ei Cortana, faça o login" ou "Ei Cortana, ir para casa".

A entrada de ALM terá o seguinte efeito:

  • A sobreposição da Cortana será mostrada no canto superior direito, dizendo ao usuário que ele pode dizer o que vê. Enquanto o usuário estiver falando, fragmentos de frase que são reconhecidos pelo reconhecedor de fala também serão mostrados nesse local.

  • O VES analisa a árvore UIA, localiza todos os controles acionáveis, registra seu texto na gramática de reconhecimento de fala e inicia uma sessão de escuta contínua.

    Captura de tela com a opção Para ver o rótulo dizer Mostrar rótulos realçada.

Saindo do ALM

O sistema permanecerá no ALM enquanto o usuário estiver interagindo com a interface do usuário usando voz. Há duas maneiras de sair do ALM:

  • O usuário diz explicitamente, "pare de ouvir", ou
  • Um tempo limite ocorrerá se não houver um reconhecimento positivo dentro de 17 segundos após a entrada no ALM ou desde o último reconhecimento positivo

Invocando controles

Quando no ALM, o usuário pode interagir com a interface do usuário usando voz. Se a interface do usuário estiver configurada corretamente (com as propriedades Name correspondendo ao texto visível), usar a voz para executar ações deve ser uma experiência perfeita e natural. O usuário deve ser capaz de apenas dizer o que vê na tela.

Sobrepor interface do usuário no Xbox

O nome VES deriva para um controle pode ser diferente do texto visível real na interface do usuário. Isso pode ser devido à Name propriedade do controle ou do elemento anexado LabeledBy ser explicitamente definido como cadeia de caracteres diferente. Ou, o controle não tem texto GUI, mas apenas um ícone ou elemento de imagem.

Nesses casos, os usuários precisam de uma maneira de ver o que precisa ser dito para invocar tal controle. Portanto, uma vez em escuta ativa, as dicas de voz podem ser exibidas dizendo "mostrar rótulos". Isso faz com que os rótulos de dica de voz apareçam sobre cada controle acionável.

Há um limite de 100 rótulos, portanto, se a interface do usuário do aplicativo tiver mais controles acionáveis do que 100, haverá alguns que não terão rótulos de dica de voz mostrados. Os rótulos escolhidos nesse caso não são determinísticos, pois dependem da estrutura e da composição da interface do usuário atual enumerada pela primeira vez na árvore da UIA.

Depois que os rótulos de dica de voz forem mostrados, não há nenhum comando para ocultá-los, eles permanecerão visíveis até que um dos seguintes eventos ocorra:

  • usuário invoca um controle
  • usuário navega para fora da cena atual
  • usuário diz: "pare de ouvir"
  • modo de escuta ativa expira o tempo limite

Localização dos rótulos de dica de voz

Os rótulos de ponta de voz são centralizados horizontal e verticalmente dentro do BoundingRectangle do controle. Quando os controles são pequenos e bem agrupados, os rótulos podem se sobrepor/ficar obscurecidos por outros e o VES tentará separá-los para separá-los e garantir que eles estejam visíveis. No entanto, não é garantido que funcione 100% do tempo. Se houver uma interface do usuário muito lotada, isso provavelmente resultará em alguns rótulos sendo obscurecidos por outros. Por favor, revise sua interface do usuário com "mostrar rótulos" para garantir que haja espaço adequado para visibilidade da dica de voz.

Captura de tela dos rótulos da ponta de voz horizontal e verticalmente centralizados dentro do retângulo delimitador do controle.

Caixas de combinação

Quando uma caixa de combinação é expandida, cada item individual na caixa de combinação recebe seu próprio rótulo de dica de voz e, muitas vezes, eles estarão no topo dos controles existentes atrás da lista suspensa. Para evitar apresentar uma confusão desordenada e confusa de rótulos (onde os rótulos de item da caixa de combinação são misturados com os rótulos dos controles atrás da caixa de combinação) quando uma caixa de combinação é expandida, apenas os rótulos de seus itens filhos serão mostrados; todos os outros rótulos de dica de voz serão ocultos. O usuário pode então selecionar um dos itens suspensos ou "fechar" a caixa de combinação.

  • Rótulos em caixas de combinação recolhidas:

    Captura de tela da janela de saída Vídeo e som com rótulos em caixas de combinação recolhidas.

  • Rótulos na caixa de combinação expandida:

    Captura de tela da janela de saída Vídeo e som com rótulos em caixas de combinação expandidas.

Controles roláveis

Para controles roláveis, as dicas de voz para os comandos de rolagem serão centralizadas em cada uma das bordas do controle. As dicas de voz só serão mostradas para as direções de rolagem que são acionáveis, portanto, por exemplo, se a rolagem vertical não estiver disponível, "rolar para cima" e "rolar para baixo" não serão mostrados. Quando várias regiões roláveis estão presentes, a VES usará ordinais para diferenciá-las (por exemplo. "Rolar para a direita 1", "Rolar para a direita 2", etc.).

Captura de tela das dicas de voz Rolar para a esquerda e Rolar para a direita em uma interface de usuário de rolagem horizontal.

Desambiguidade

Quando vários elementos da interface do usuário tiverem o mesmo Nome ou o reconhecedor de fala corresponder a vários candidatos, o VES entrará no modo de desambiguação. Neste modo, rótulos de dica de voz serão mostrados para os elementos envolvidos para que o usuário possa selecionar o correto. O usuário pode cancelar fora do modo de desambiguação dizendo "cancelar".

Por exemplo:

  • No Modo de Escuta Ativa, antes da desambiguação; usuário diz: "Eu sou ambíguo":

    Captura de tela do modo de escuta ativa com a opção Agora você pode dizer o que vê exibida e sem rótulos nos botões.

  • Ambos os botões correspondiam; desambiguação iniciada:

    Captura de tela do modo de escuta ativa com a opção Qual você deseja exibir e os rótulos Item 1 e Item 2 nos botões.

  • Mostrando a ação de clique quando "Selecionar 2" foi escolhido:

    Captura de tela do modo de escuta ativa com a opção Agora você pode dizer o que você vê exibida e o rótulo Sou Ambíguo no primeiro botão.

Interface de usuário de exemplo

Aqui está um exemplo de uma interface do usuário baseada em XAML, definindo o AutomationProperties.Name de várias maneiras:

<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>

Usando o exemplo acima, aqui está a aparência da interface do usuário com e sem rótulos de dica de voz.

  • No Modo de Escuta Ativa, sem rótulos mostrados:

    Captura de ecrã do Modo de Escuta Ativa com a opção Para ver etiquetas, digamos Mostrar etiquetas apresentadas e nenhuma etiqueta apresentada.

  • No Modo de Escuta Ativa, após o usuário dizer "mostrar rótulos":

    Captura de tela do Modo de Escuta Ativa com a opção Se você tiver terminado, diga Parar de escuta exibida e os rótulos mostrados nos controles da interface de usuário.

No caso do button1, o XAML preenche automaticamente a AutomationProperties.Name propriedade usando texto do conteúdo de texto visível do controle. É por isso que há um rótulo de dica de voz, mesmo que não haja um conjunto explícito AutomationProperties.Name.

Com button2, definimos explicitamente o AutomationProperties.Name para algo diferente do texto do controle.

Com comboBox, usamos a LabeledBy propriedade para referenciar label1 como a fonte da automação Namee, em label1 nós, definimos a AutomationProperties.Namepara uma frase mais natural do que o que é renderizado na tela ("Dia da Semana" em vez de "Selecionar Dia da Semana").

Finalmente, com button3, o VES pega o Name do primeiro elemento filho, uma vez que button3 ele mesmo não tem um conjunto AutomationProperties.Name.

Confira também