Texto a voz con JavaScript y la API de speechSynthesis

Publicado por parzibyte en

Conversor texto a audio con JavaScript

En este post vamos a ver cómo usar la API de speechSynthesis con JavaScript, presente en la mayoría de los navegadores web. Esto permitirá hacer un conversor de texto a voz con JS, sin librerías externas ni frameworks.

La tecnología TTS, Text to speech, texto a voz o síntesis de voz es algo que permite convertir texto a habla, es decir, ingresamos el texto y luego escuchamos una voz que lo “lee”.

Conversor texto a audio con JavaScript

Conversor texto a audio con JavaScript

Gracias a esta API de speechSynthesis con JavaScript podemos agregar más funcionalidades a nuestras aplicaciones web, y hay buenas noticias, pues funciona (al momento de escribir esto) en Chrome, Firefox y Edge. También en Android usando Chrome y Firefox.

Veamos entonces cómo consumir esta API.

Código completo y demostración

Puedes ver el vídeo en mi canal de YT (si vas por ahí, suscríbete): https://youtu.be/BlUOl6ze2Aw

También puedes probar la webapp directamente aquí, y ver el código fuente completo en el repositorio de GitHub (durante el post mostraré solamente las partes más importantes).

Comprobar si existe la API de speechSynthesis

Para saber si existe la API en el navegador del usuario comprobamos que "speechSynthesis" sea una propiedad de window, usamos el operador in aunque podríamos usar un if(window.speechSynthesis)

Pequeña aclaración de window.speechSynthesis y speechSyntesis

Al inicio comprobamos que la variable esté en window usando in, pero más tarde al usar la API no usamos window.speechSynthesis, sino simplemente speechSynthesis.

Esto es porque cualquier cosa que le pertenece a window es global, así que podemos usar a speechSynthesis sin acceder a window.

Las voces

Dependiendo del navegador web, idiomas, sistemas operativos y todas esas cosas habrán más o menos lenguajes. Por ejemplo, Chrome tiene más idiomas que los que ofrece Edge. Desconozco la razón, pero las voces no siempre serán las mismas.

Para obtener las voces que podemos usar llamamos a getVoices. Eso regresará un arreglo de objetos que tienen la siguiente estructura:

Al indicarle a speechSynthesis que “hable” debemos indicarle el idioma obtenido de esta lista de getVoices.

En el ejemplo obtenemos las voces y las ponemos en un select.

El evento onvoiceschanged

Las voces, en algunos navegadores, son cargadas de manera asíncrona para no interrumpir el hilo principal ni congelar la app.

Por ello es que en ocasiones getVoices devolverá un arreglo vacío, pues todavía no hay voces. Para asegurarnos de que hay voces esperamos el evento onvoiceschanged:

Tal vez te preguntes ¿por qué llamar a getVoices dos veces, no se supone que debemos llamarlo hasta que el evento se dispare? sí y no. JavaScript y los navegadores son caprichosos, así que debemos aplicar trucos.

Por ejemplo, en algunos navegadores el evento no se dispara hasta que se intenta usar la API, es como una paradoja porque, ¿cómo vas a usar la API de TTS si estás esperando el evento, pero para que se dispare el evento debes usar la API?

Así que intentamos cargar las voces, el navegador dirá: oh, quieres cargar voces, seguramente quieres usar la API de speechSynthesis así que voy a cargarla y a desencadenar el evento.

Por otro lado, en algunos navegadores como Safari (me gusta llamarlo El nuevo internet explorer, porque da tantos problemas ahora como Explorer en su tiempo) el evento no existe, así que por eso el código que comprueba y escucha.

Parla

Después de obtener las voces podemos construir un objeto que es instancia de SpeechSynthesisUtterance.

Tiene algunos valores que le establecemos después de crearlo, por ejemplo, la voz o el volumen. A continuación trato de explicar los valores:

  • text: el texto que convertirá a audio.
  • voice: la voz en la que “hablará”.
  • rate: velocidad con la que se dice el texto. Puede ir desde 0.1 hasta 10. Entre más alto sea el valor, más alta la velocidad. Si se pone muy bajo, la reproducción será lenta.
  • pitch: tono de voz. Puede ir desde 0 hasta 2, se permiten los valores flotantes.
  • volume: el volumen. Puede estar entre 0 y 1, se permiten los valores flotantes.

Después de crear nuestro objeto llamamos al método speak y entonces el texto será convertido a audio.

El código es llamado desde el click de un botón.

Limitaciones

Según las investigaciones y pruebas que he hecho no se puede convertir texto a voz sin interacción del usuario. Es decir, no se puede usar inmediatamente al cargar la página, tiene que ser en el click de un botón o algo con lo que el usuario haga interacción.

Me parece que esa limitante es para no entrar a una página y escuchar “Has ganado un premio” o cosas de esas. Sigue las mismas razones por las que un vídeo no puede tener sonido sin interacción del usuario.

Otra limitante es que el audio generado a partir del texto no puede ser guardado como un archivo.

Conclusión

Ahora el chiste de:

¿Puedes hacer que el sistema diga “Bienvenido” y después mi nombre, al iniciar sesión?

Ya no será más un chiste.

Con esto podemos agregar unas pequeñas características a nuestras webapps. Esperemos que estas APIs evolucionen y se queden, porque aunque existen todavía son calificadas como experimentales.

Mira más cosas sobre JavaScript en mi blog.


parzibyte

He trabajado por más de 4 años en el desarrollo de software con experiencia en Java, PHP, JavaScript, HTML, Node.JS, Python, Android y Go. También he trabajado con bases de datos SQL como MySQL y SQLite, así como con bases de datos NoSQL usando MongoDB.Soy bueno utilizando algunos frameworks y herramientas como Firebase, jQuery, AngularJS, VueJS, CodeIgniter, Laravel, BulmaCSS, Bootstrap y Electron.Otros términos que conozco son: Arduino, GraphQL, API's, REST, AJAX, PouchDB, CouchDB, Experiencia de usuario, buenas prácticas de programación, Webpack, NPM, Administración de servidores y programación de scriptsLa plataforma en la que tengo más experiencia es la web, pero en mis ratos libres realizo unos pequeños ejercicios en C# y C.Estoy aquí para ayudarte a resolver tus problemas de programación y depuración :-)

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

A %d blogueros les gusta esto: