Usare il parlato per invocare gli elementi dell'interfaccia utente
Voice Enabled Shell (VES) è un'estensione della Windows Speech Platform che consente un'esperienza vocale di prim'ordine all'interno delle app, permettendo agli utenti di utilizzare la voce per invocare i controlli sullo schermo e per inserire testo tramite dettatura. VES si sforza di fornire un'esperienza comune end-to-end di "vedo-non vedo" su tutte le shell e i dispositivi Windows, con il minimo sforzo da parte degli sviluppatori di app. Per raggiungere questo obiettivo, sfrutta la Microsoft Speech Platform e il framework UI Automation (UIA).
Esperienza utente
Quella che segue è una panoramica di ciò che un utente può sperimentare quando utilizza VES su Xbox e dovrebbe aiutare a definire il contesto prima di immergersi nei dettagli del funzionamento di VES.
L'utente accende la console Xbox e vuole sfogliare le sue app per trovare qualcosa di interessante:
Utente: "Ehi Cortana, apri i miei giochi e le mie applicazioni"
L'utente viene lasciato in modalità di ascolto attivo (ALM), il che significa che la console è in attesa che l'utente invochi un controllo visibile sullo schermo, senza dover dire ogni volta "Ehi Cortana". L'utente può ora passare alla visualizzazione delle app e scorrere l'elenco delle app:
Utente: "applicazioni"
Per scorrere la vista, l'utente può semplicemente dire:
Utente: "Scorri verso il basso"
L'utente vede la grafica dell'applicazione a cui è interessato ma ha dimenticato il nome. L'utente chiede di visualizzare le etichette dei suggerimenti vocali:
Utente: "mostra etichette"
Ora che è chiaro cosa dire, l'app può essere lanciata:
Utente: "film e TV"
Per uscire dalla modalità di ascolto attivo, l'utente dice a Xbox di smettere di ascoltare:
Utente: "Smetti di ascoltare"
In seguito, si può iniziare una nuova sessione di ascolto attivo con:
Utente: "Ehi Cortana, fai una selezione" o "Ehi Cortana, seleziona"
Dipendenza dall'automazione dell'interfaccia utente
VES è un client di UI Automation e si basa sulle informazioni esposte dall'applicazione attraverso i suoi fornitori di UI Automation. Si tratta della stessa infrastruttura già utilizzata dalla funzione Narrator sulle piattaforme Windows. L'automazione dell'interfaccia utente consente l'accesso programmatico agli elementi dell'interfaccia utente, compreso il nome del controllo, il suo tipo e i modelli di controllo che implementa. Quando l'interfaccia utente cambia nell'applicazione, VES reagisce agli eventi di aggiornamento UIA e analizza nuovamente l'albero dell'automazione dell'interfaccia utente aggiornata per trovare tutti gli elementi che possono essere utilizzati, utilizzando queste informazioni per costruire una grammatica di riconoscimento vocale.
Tutte le app UWP hanno accesso al framework UI Automation e possono esporre informazioni sull'interfaccia utente indipendentemente dal framework grafico su cui sono costruite (XAML, DirectX/Direct3D, ecc.). In alcuni casi, come XAML, la maggior parte del lavoro pesante viene svolto dal framework, riducendo notevolmente il lavoro necessario per supportare Narrator e VES.
Per maggiori informazioni sull'automazione dell'interfaccia utente, consulta Fondamenti di automazione dell'interfaccia utente.
Nome dell'invocazione di controllo
VES impiega la seguente euristica per determinare quale frase registrare con il riconoscitore vocale come nome del controllo (cioè quello che l'utente deve pronunciare per invocare il controllo). Questa è anche la frase che apparirà nell'etichetta del suggerimento vocale.
Fonte del nome in ordine di priorità:
- Se l'elemento ha una proprietà
LabeledBy
, VES utilizzerà il sitoAutomationProperties.Name
di questa etichetta di testo. AutomationProperties.Name
dell'elemento. In XAML, il contenuto del testo del controllo verrà utilizzato come valore predefinito perAutomationProperties.Name
.- Se il controllo è un ListItem o un Pulsante, VES cercherà il primo elemento figlio con un
AutomationProperties.Name
valido.
Controlli attuabili
VES considera un controllo attivabile se implementa uno dei seguenti modelli di controllo dell'automazione:
InvokePattern (es. Button) - Rappresenta i controlli che iniziano o eseguono una singola azione non ambigua e non mantengono lo stato quando vengono attivati.
TogglePattern (es. Check Box) - Rappresenta un controllo che può passare attraverso una serie di stati e mantenere uno stato una volta impostato.
SelectionItemPattern (es. Combo Box) - Rappresenta un controllo che funge da contenitore per una collezione di elementi figli selezionabili.
ExpandCollapsePattern (es. Combo Box) - Rappresenta i controlli che si espandono visivamente per visualizzare il contenuto e si chiudono per nasconderlo.
ScrollPattern (es. List) - Rappresenta i controlli che agiscono come contenitori scorrevoli per una collezione di elementi figli.
Contenitori scorrevoli
Per i contenitori scorrevoli che supportano lo ScrollPattern, VES ascolterà i comandi vocali come "scorri a sinistra", "scorri a destra", e così via e invocherà Scroll con i parametri appropriati quando l'utente attiva uno di questi comandi. I comandi di scorrimento vengono iniettati in base al valore delle proprietà HorizontalScrollPercent
e VerticalScrollPercent
. Ad esempio, se HorizontalScrollPercent
è maggiore di 0, verrà aggiunto "scroll left", se è minore di 100, verrà aggiunto "scroll right" ecc.
Sovrapposizione di narratori
L'applicazione Narrator è anche un client di UI Automation e utilizza la proprietà AutomationProperties.Name
come una delle fonti del testo che legge per l'elemento dell'interfaccia utente attualmente selezionato. Per offrire una migliore esperienza di accessibilità, molti sviluppatori di app sono ricorsi a sovraccaricare la proprietà Name
con un lungo testo descrittivo con l'obiettivo di fornire maggiori informazioni e contesto quando viene letto dal narratore. Tuttavia, ciò causa un conflitto tra le due caratteristiche: VES ha bisogno di frasi brevi che corrispondano o si avvicinino al testo visibile del controllo, mentre Narrator beneficia di frasi più lunghe e descrittive per fornire un contesto migliore.
Per risolvere questo problema, a partire dall'aggiornamento Windows 10 Creators Update, Narrator è stato aggiornato in modo da considerare anche la proprietà AutomationProperties.HelpText
. Se questa proprietà non è vuota, il Narratore parlerà il suo contenuto in aggiunta a AutomationProperties.Name
. Se HelpText
è vuoto, il Narratore leggerà solo il contenuto di Nome. In questo modo sarà possibile utilizzare stringhe descrittive più lunghe dove necessario, mantenendo però una frase più breve e adatta al riconoscimento vocale nella proprietà Name
.
Per maggiori informazioni consulta Automation Properties for Accessibility Support in UI.
Modalità di ascolto attivo (ALM)
Entrare in ALM
Su Xbox, il VES non è costantemente in ascolto di input vocali. L'utente deve entrare esplicitamente in modalità di ascolto attivo dicendo:
- "Ehi Cortana, seleziona" oppure
- "Ehi Cortana, fai una selezione"
Ci sono molti altri comandi di Cortana che al termine lasciano l'utente in ascolto attivo, ad esempio "Hey Cortana, accedi" o "Hey Cortana, vai a casa".
L'inserimento di ALM avrà il seguente effetto:
Nell'angolo in alto a destra apparirà la scritta Cortana, che indicherà all'utente la possibilità di dire ciò che vede. Mentre l'utente parla, in questa posizione verranno mostrati anche i frammenti di frase riconosciuti dal riconoscitore vocale.
VES analizza l'albero UIA, trova tutti i controlli azionabili, registra il loro testo nella grammatica di riconoscimento vocale e avvia una sessione di ascolto continuo.
Uscire da ALM
Il sistema rimarrà in ALM mentre l'utente interagisce con l'interfaccia utente utilizzando la voce. Ci sono due modi per uscire da ALM:
- L'utente dice esplicitamente "smetti di ascoltare" oppure
- Se non c'è un riconoscimento positivo entro 17 secondi dall'ingresso in ALM o dall'ultimo riconoscimento positivo, si verifica un timeout
Invocazione dei controlli
In ALM l'utente può interagire con l'interfaccia utente utilizzando la voce. Se l'interfaccia utente è configurata correttamente (con le proprietà del nome che corrispondono al testo visibile), l'utilizzo della voce per eseguire le azioni dovrebbe essere un'esperienza naturale e senza interruzioni. L'utente dovrebbe essere in grado di dire semplicemente ciò che vede sullo schermo.
Interfaccia utente in sovrimpressione su Xbox
Il nome che VES ricava per un controllo può essere diverso dal testo effettivamente visibile nell'interfaccia utente. Questo può essere dovuto alla proprietà Name
del controllo o all'elemento LabeledBy
collegato che è stato esplicitamente impostato su una stringa diversa. Oppure, il controllo non ha un testo GUI ma solo un'icona o un'immagine.
In questi casi, gli utenti hanno bisogno di un modo per vedere cosa deve essere detto per invocare tale controllo. Pertanto, una volta in ascolto attivo, i suggerimenti vocali possono essere visualizzati dicendo "mostra etichette". Questo fa sì che le etichette dei suggerimenti vocali appaiano in cima a tutti i controlli che possono essere eseguiti.
Il limite è di 100 etichette, quindi se l'interfaccia utente dell'app ha un numero di controlli azionabili superiore a 100, ce ne saranno alcuni che non avranno le etichette dei suggerimenti vocali. La scelta delle etichette in questo caso non è deterministica, in quanto dipende dalla struttura e dalla composizione dell'interfaccia utente corrente, enumerata per prima nell'albero UIA.
Una volta che le etichette dei suggerimenti vocali vengono visualizzate, non c'è alcun comando per nasconderle; rimarranno visibili fino a quando non si verificherà uno dei seguenti eventi:
- l'utente invoca un controllo
- l'utente si allontana dalla scena corrente
- l'utente dice "smetti di ascoltare"
- la modalità di ascolto attivo si esaurisce
Posizione delle etichette dei suggerimenti vocali
Le etichette dei suggerimenti vocali sono centrate orizzontalmente e verticalmente all'interno del BoundingRectangle del controllo. Quando i controlli sono piccoli e strettamente raggruppati, le etichette possono sovrapporsi o essere oscurate da altre e VES cercherà di allontanarle per separarle e renderle visibili. Tuttavia, non è garantito che funzioni il 100% delle volte. Se l'interfaccia utente è molto affollata, è probabile che alcune etichette vengano oscurate da altre. Controllare l'interfaccia utente con "mostra etichette" per verificare che ci sia uno spazio adeguato per la visibilità dei suggerimenti vocali.
Caselle combinate
Quando una casella combinata viene espansa, ogni singolo elemento della casella combinata riceve la propria etichetta vocale e spesso si trova sopra i controlli esistenti dietro l'elenco a discesa. Per evitare di presentare una confusione di etichette (in cui le etichette delle voci della casella combinata si mescolano con le etichette dei controlli dietro la casella combinata), quando una casella combinata viene espansa vengono mostrate solo le etichette delle sue voci figlie; tutte le altre etichette dei suggerimenti vocali vengono nascoste. L'utente può quindi selezionare una delle voci a discesa o "chiudere" la casella combinata.
Etichette sulle caselle combinate chiuse:
Etichette sulla casella combinata espansa:
Controlli scrollabili
Per i controlli scorrevoli, i suggerimenti vocali per i comandi di scorrimento saranno centrati su ciascuno dei bordi del controllo. I suggerimenti vocali verranno mostrati solo per le direzioni di scorrimento che sono attivabili, quindi ad esempio se lo scorrimento verticale non è disponibile, "scorri verso l'alto" e "scorri verso il basso" non verranno visualizzati. Quando sono presenti più regioni scrollabili, la VES utilizzerà degli ordinali per distinguerle (es. "Scorri a destra 1", "Scorri a destra 2", ecc.).
Risoluzione dell'ambiguità
Quando più elementi dell'interfaccia utente hanno lo stesso nome o il riconoscitore vocale ha trovato più candidati, VES entra in modalità di disambiguazione. In questa modalità verranno mostrate le etichette dei suggerimenti vocali per gli elementi coinvolti, in modo che l'utente possa selezionare quello giusto. L'utente può uscire dalla modalità di disambiguazione dicendo "annulla".
Ad esempio:
In modalità ascolto attivo, prima della disambiguazione, l'utente dice: "Sono ambiguo":
Entrambi i pulsanti sono stati abbinati; la disambiguazione è iniziata:
Mostra l'azione del clic quando è stato scelto "Seleziona 2":
Interfaccia utente di esempio
Ecco un esempio di interfaccia utente basata su XAML, che imposta AutomationProperties.Name in diversi modi:
<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>
Utilizzando l'esempio precedente, ecco come apparirà l'interfaccia utente con e senza etichette vocali.
In modalità di ascolto attivo, senza etichette visualizzate:
In modalità ascolto attivo, dopo che l'utente dice "mostra etichette":
Nel caso di button1
, XAML popola automaticamente la proprietà AutomationProperties.Name
utilizzando il testo dei contenuti visibili del controllo. Questo è il motivo per cui c'è un'etichetta di suggerimento vocale anche se non c'è un set esplicito di AutomationProperties.Name
.
Con button2
, impostiamo esplicitamente AutomationProperties.Name
su qualcosa di diverso dal testo del controllo.
Con comboBox
, abbiamo usato la proprietà LabeledBy
per fare riferimento a label1
come fonte dell'automazione Name
, e in label1
abbiamo impostato AutomationProperties.Name
su una frase più naturale rispetto a quella che viene resa sullo schermo ("Giorno della settimana" piuttosto che "Seleziona il giorno della settimana").
Infine, con button3
, VES prende Name
dal primo elemento figlio poiché button3
non ha un set AutomationProperties.Name
.