Usando SSML en nuestras Alexa skills
Tags: alexa, alexaskills, ssml
Published: 2019-10-16 09:08:02

---
title: Usando SSML en nuestras Alexa skills
published: true
tags: alexa,alexaskills,ssml
canonical_url: https://www.kinisoftware.com/usando-la-potencia-de-ssml-en-nuestros-alexa-skills/
---

Una vez que tenemos una skill funcionando podemos centrarnos en detalles que van a conseguir una experiencia conversacional más dinámica, entretenida y natural. Una de las cosas que descubrí que más me gustaron de Alexa es la posibilidad de usar un lenguaje de marcado en las respuestas para aplicar todo tipo de efectos a la voz.

El [Speech Synthesis Markup Language (SSML)](https://en.wikipedia.org/wiki/Speech_Synthesis_Markup_Language) es un lenguaje de marcado que provee un estándar para darle a nuestros skill diferentes efectos a la hora de hablar. Alexa soporta un [subconjunto de los tags definidos en la especificación SSML.](https://developer.amazon.com/docs/custom-skills/speech-synthesis-markup-language-ssml-reference.html)

En [mi skill de "Estrenos de cine"](https://www.amazon.es/Kinisoftware-Estrenos-de-cine/dp/B07MKCLZ62) he usado alguno de esos tags. Os voy a enseñar esos y alguna referencia breve a otros que me parecen muy interesantes pero que aún no he tenido oportunidad de usar.

## Uso de SSML en la skill Estrenos de Cine

Darle un toque personal a las respuestas de voz de nuestro skill me parece clave y, además, hace mucho más entretenido su uso. En el caso de Estrenos de Cine, además de usar algunos tags para hacerlo más dinámico y curioso, me encontré con la casuística de que no todos los títulos de las películas se traducen al español.

### Uso de la etiqueta "lang" para los títulos

[La API que estoy usando](https://developers.themoviedb.org/3) para [obtener las películas](https://developers.themoviedb.org/3/movies/get-upcoming) me permite:

- Pasar un parámetro a la query con el idioma correspondiente en [ISO 639-1](https://en.wikipedia.org/wiki/ISO_639-1). Esto no es un problema porque Alexa me lo da en cada request. Muy útil si en el futuro quiero hacer la skill para otros idiomas.
- Saber, en la respuesta, la siguiente info de cada películas: idioma original, título original y título. Este último será diferente del original si ha sido traducido al idioma pasado en la query de la petición.

Jugando con la info del modelo de respuesta puedo saber si el título de una película ha sido traducida, ya que título original y título son distintos. En caso contrario asumo que no ha sido traducida y que se usa el idioma original.

Viendo ejemplos de respuestas detecté los siguientes casos:

- Películas cuyo título ha sido traducido íntegramente al castellano. Por ejemplo, el modelo de respuesta sería:

```
original_language: 'en'
original_title: 'The Lion King' 
title: 'El Rey León'

```

Para este caso no tendremos problema alguno. Comparando títulos veremos que son distintos y deducimos que ha sido traducido. No tendremos que marcar la respuesta de Alexa.

- Películas cuyo título ha sido traducido parcialmente al castellano. Por ejemplo: 

```
original_language: 'en'
original_title: 'The Avengers: Endgame' 
title: 'Vengadores: Endgame'

```

En este caso tenemos un problema. Los títulos son distintos, con lo cual creeremos que ha sido traducido. Y sí, pero parcialmente. Aquí sólo podemos confiar en que Alexa lo hará lo mejor posible para la parte del título que no sea español.

Es cierto que me he planteado usar algún servicio web que analice palabras y me diga el idioma. Amazon tiene uno que hace eso. Pero me parece demasiado costoso para lo que estaba montando. Aunque si queremos la mejor experiencia, con ese modelo, tendríamos que hacer algo así.

- Películas cuyo título sigue siendo en su idioma original. Por ejemplo: 

```
original_language: 'en'
original_title: 'Yesterday' 
title: 'Yesterday'

```

Aquí, al ser iguales, asumimos que viene en su idioma original y, aquí sí, podríamos hacer uso de SSML para marcar correctamente cómo debe decirlo Alexa.

- "Corner cases".  Luego, para rizar el rizo tenemos otros casos como:

```
original_language: 'en'
original_title: 'Toy Story 4' 
title: 'Toy Story 4'

```

Este caso es bastante gracioso ya que ambos títulos son iguales y, por tanto, usaré el idioma original. Pero, debido a eso, Alexa responderá diciendo en inglés "Toy Story four" en vez de "Toy Story cuatro" :)

```
original_language: 'en'
original_title: 'IT 2' 
title: 'IT Chapter 2'

```

O, aquí, otro ejemplo en el que poco podemos hacer. Ambos títulos son distintos, creeremos que ha sido traducido pero, en realidad, está en inglés pero es distinto. No lo marcaremos y Alexa lo dirá en español. Shit happens!

Una vez detectados los casos en los que podemos marcar correctamente la respuesta vamos a usar [la etiqueta "lang"](https://developer.amazon.com/docs/custom-skills/speech-synthesis-markup-language-ssml-reference.html#lang) para el título que está en su idioma original. Esta etiqueta nos permite indicar distintos códigos de idioma aunque no están todos soportados. Debido a eso nos podríamos encontrar con un título en un idioma que Alexa no soporta. Yo tomé la decisión de meter un log para detectar ese caso y, al menos, si en el futuro se soporta, poder añadirlo.

{% gist https://gist.github.com/kinisoftware/3b0c3a35b1af1b911aa5decea0f633c4 %}
### Uso de "speechcons" para hacer respuestas más naturales

Definiría "[speechcons](https://developer.amazon.com/docs/custom-skills/speech-synthesis-markup-language-ssml-reference.html#supported-speechcons)" como palabras o expresiones con una entonación especial ya ofrecidas por Alexa de forma nativa en distintos lenguajes. [Hay un listado enorme de opciones](https://developer.amazon.com/docs/custom-skills/speechcon-reference-interjections-spanish.html) y os recomiendo echarles un vistazo porque algunas son muy divertidas. Os aseguro que vais a estar un buen rato probando todas ya que podemos escuchar un ejemplo de cada una desde la propia web de la documentación.

En el caso de mi skill decidí usar un par de speechcons para confirmar al usuario que estaba haciendo la petición sobre lo que me había pedido. Uso, de forma aleatoria, entre varios disponibles para hacer cada interacción distinta.

{% gist https://gist.github.com/kinisoftware/b7808637575852f26f5051bcb1deb5d3 %}
## Otros ejemplos interesantes de SSML

De las etiquetas que he mirado quiero destacar:

- `<audio>`, [que te permite reproducir un mp3 en la respuesta de tu skill](https://developer.amazon.com/docs/custom-skills/speech-synthesis-markup-language-ssml-reference.html#audio). Hace poco participé en un Hackaton donde usamos esta etiqueta para meter un clip de la duración que nos interesaba con cierto sonido dentro. Extra ball: Amazon ya tiene una librería de sonidos que se pueden usar :)
- `<break>`, [que nos permite meter pausas en la respuesta](https://developer.amazon.com/docs/custom-skills/speech-synthesis-markup-language-ssml-reference.html#audio). Este es interesante para generar una respuesta de una duración determinada pero con pausas que ya sepamos. Por ejemplo, se podría hacer que  Alexa diga algo, esté "callada" durante 20 segundos, y luego continúe.
- `<prosody>`, [que nos permite modificar la velocidad o volumen de la parte de la respuesta que queramos](https://developer.amazon.com/docs/custom-skills/speech-synthesis-markup-language-ssml-reference.html#prosody). Muy útil si quieres, por ejemplo, animar al usuario o simular que una cuenta atrás más rápida de lo normal.
- `<say-as>`, [uno de los más versátiles](https://developer.amazon.com/docs/custom-skills/speech-synthesis-markup-language-ssml-reference.html#say-as). Ya lo hemos visto en los speechcons. Nos permite describir cómo un texto debe ser interpretado. Sobre todo útil para temas de números o fechas.
- `<voice>`, [para cambiar la voz de Alexa usando las voces de Amazon Polly](https://developer.amazon.com/docs/custom-skills/speech-synthesis-markup-language-ssml-reference.html#voice).

* * *

El juego con SSML nos va a permitir crear experiencias más cercanas a una interacción natural con otra persona. Combinar bien las etiquetas que usamos aportará mucha personalidad a nuestra skill y se nota a la hora de usarla.