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:
- Se o elemento tiver uma
LabeledBy
propriedade anexada, o VES usará oAutomationProperties.Name
rótulo desse texto. AutomationProperties.Name
do elemento. Em XAML, o conteúdo de texto do controle será usado como o valor padrão paraAutomationProperties.Name
.- Se o controle for um ListItem ou Button, o VES procurará o primeiro elemento filho com um
AutomationProperties.Name
arquivo .
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.
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.
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.
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:
Rótulos na caixa de combinação expandida:
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.).
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":
Ambos os botões correspondiam; desambiguação iniciada:
Mostrando a ação de clique quando "Selecionar 2" foi escolhido:
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:
No Modo de Escuta Ativa, após o usuário dizer "mostrar rótulos":
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 Name
e, em label1
nós, definimos a AutomationProperties.Name
para 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
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de