> For the complete documentation index, see [llms.txt](https://elguerre.gitbook.io/de0an/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://elguerre.gitbook.io/de0an/capitulo-2-antes-de-comenzar.-el-terreno-de-juego/asistente-de-voz-cortana.md).

# Asistente de voz (Cortana)

Cualquier equipo con Windows dispone de un asistente personal digital conocido como **Cortana**. Nombre que proviene de la inteligencia artificial que se encargaba de ayudar al Jefe Maestro en las aventuras de los juegos de Halo.

Cortana nos ayudará a encontrar cosas, a administrar el calendario y a realizar un seguimiento de los paquetes instalados, charlará con nosotros e incluso nos gastará bromas. Cuanto más la usemos más personalizada será nuestra experiencia.

En la siguiente figura podemos ver a Cortana preguntándonos si necesitamos algo a la misma vez que nos muestra el tiempo que hace en nuestras ciudades favoritas.

![](https://240651724-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfrvHBNivOTy0fVKROgzo%2Fuploads%2Fgit-blob-618dc3843ef55b51708dbf993e6d1d11a4bb3e8e%2Fimage60.png?alt=media)

**Figura 38.- Cortana nos pregunta y nos muestra el tiempo**

Se diferencia de sus competidores en que es el primer asistente virtual que incluye una "Libreta" que usa para almacenar toda nuestra información (como usuarios) así como nuestros intereses y rutinas. De esta manera, la información que Cortana dispone sobre nosotros es fácilmente controlable, pudiendo borrar cualquier rastro e incluso introducir gustos y otros aspectos para mejorar el servicio.

Cortana permite su integración en los desarrollos mediante las APIs: “*Windows.ApplicationModel.VoiceCommands*” y “*VCD elements and attributes v1.2*” que necesitan de un archivo de definición de comandos de voz (o *Voice Command Definitions* (VCD)). Un comando de voz es un enunciado dirigido a una aplicación que hace uso de Cortana. La aplicación se puede iniciar en el **primer o segundo plano**, dependiendo del nivel y la complejidad de la interacción. Por ejemplo, los comandos de voz que requieren un contexto adicional o la entrada del usuario se maneja mejor en el primer plano, mientras que los comandos básicos se pueden manejar en segundo plano.

Para la integración de Cortana en nuestra aplicación tendremos que:

1. En el manifiesto de la aplicación:
   1. Habilitar la capacidad de Micrófono para poder interactuar mediante la voz.
   2. Incluir la declaración *Personal Assistant Launch*.
2. Para la activación en segundo plano, crear un proyecto de tipo *Windows Runtime Componente* y, crear una clase *TaskinVoiceCommandService* que implemente la interfaz *IBackgroundTask*. Esta clase se encargará de procesar los comandos recibidos por Cortana y podrá redirigir al usuario a la ventana de la aplicación solicitada.
3. Declarar esta clase/servicio como una declaración de tipo *App Service* en el manifiesto de la aplicación.
4. Crear un fichero de definición de comandos de voz similar al siguiente.

```xml
<?xml version="1.0" encoding="utf-8"?>
<VoiceCommands xmlns="http://schemas.microsoft.com/voicecommands/1.2">
    <CommandSet xml:lang="en-us" Name="TaskinCommandSet_en-us">
        <AppName> Task[in] </AppName>
        <Example> Show Task[in] tasks and projects </Example>
        <Command Name="showProjects">
            <Example> Show projects </Example>
            <ListenFor RequireAppName="BeforeOrAfterPhrase"> show [my] projects </ListenFor>
            <ListenFor RequireAppName="ExplicitlySpecified"> show [my] {builtin:AppName} projects </ListenFor>
            <Feedback> Looking for projects, give me a second </Feedback>
            <Navigate />
        </Command>
        <Command Name="showTasksForProject">
            <Example>show my tasks for Project 1</Example>
            <ListenFor RequireAppName="BeforeOrAfterPhrase"> show [my] tasks for {project} </ListenFor>
            <ListenFor RequireAppName="ExplicitlySpecified"> show [my] {builtin:AppName} tasks for {project} </ListenFor>
            <Feedback> Looking for tasks in project {project}, give me a second </Feedback>
            <VoiceCommandService Target="TaskinVoiceCommandService"/>
        </Command>
        …
        <PhraseList Label="project">
            <Item> Project 1 </Item>
            <Item> Project 2 </Item>
        </PhraseList>
    </CommandSet>
    <!-- Spanish -->
    <CommandSet xml:lang="es-es" Name="TaskinCommandSet_es-es">
        <AppName> Task[in] </AppName>
        <Example> Mostrar tareas y proyectos de Task[in]</Example>
        <Command Name="showTasksForProject">
            <Example>mostrar mis tareas para el Proyecto 1</Example>
            <ListenFor RequireAppName="BeforeOrAfterPhrase"> mostrar [mis] tareas para {project} </ListenFor>
            <ListenFor RequireAppName="ExplicitlySpecified"> mostrar [mis] {builtin:AppName} tareas para {project} </ListenFor>
            <Feedback> Mostrando tareas para el proyecto {project} </Feedback>
            <VoiceCommandService Target="TaskinVoiceCommandService"/>
        </Command>
        …
        <PhraseList Label="project">
            <Item> Proyecto 1 </Item>
            <Item> Proyecto 2 </Item>
        </PhraseList>
    </CommandSet>
</VoiceCommands>
```

5. Incluir en el evento de inicio de la aplicación *OnLaunched* el registro de instalación de los comandos para que Cortana pueda entenderlos.

```csharp
StorageFile vcdStorageFile = await Package.Current.InstalledLocation.GetFileAsync(@"VoiceCommandsDefinitions.xml");
await VoiceCommandDefinitionManager.InstallCommandDefinitionsFromStorageFileAsync(vcdStorageFile);
```

6. Para la activación en primer plano, incluir en el evento de activación de la aplicación *OnActivated* el código para el tratamiento de la elección del usuario si la aplicación ha sido ejecutada mediante comandos de voz.

Para saber si nuestra aplicación está lista para interactuar con Cortana, le haremos la siguiente pregunta: ¿Qué puedo decir? o, *What can I say?* (dependiendo del idioma configurado en el teléfono), tras la cual, Cortana nos ofrecerá el listado de aplicaciones disponibles con las que interactuar. La siguiente figura es un ejemplo de ello en el que se ha utilizado tanto la activación en primero como en segundo plano.

![](https://240651724-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfrvHBNivOTy0fVKROgzo%2Fuploads%2Fgit-blob-82d698d15c2049f2b0441b9287872d78b3a30b27%2Fimage61.png?alt=media)

**Figura 39.- Integración con Cortana**

Al integrar Cortana en la aplicación, ésta puede especificar diferentes tipos de pantallas para los siguientes tipos de funcionalidades:

* Conclusión con éxito
* Manos libres
* Progreso
* Confirmación
* Desambiguación
* Error

Por ejemplo, al mostrar los resultados, puede ocurrir que el usuario tenga que decidir entre múltiples opciones, lo que implicará resolver una ambigüedad esperando hasta que éste tome la decisión para poder continuar.

Para más detalle sobre los comandos de voz, visitar la página: <https://msdn.microsoft.com/en-us/library/windows/apps/dn706593.aspx>.
