Voces recomendadas para Web Speech API
Este repositorio es parte de un proyecto más amplio, destinado a identificar las mejores prácticas para implementar una función de lectura en voz alta en aplicaciones de lectura.
Con cientos de voces disponibles de forma predeterminada en varios navegadores y sistemas operativos, puede resultar complicado para los desarrolladores proporcionar valores predeterminados sensatos y una lista seleccionada de voces.
Con su enfoque en la selección de voces, el objetivo de este proyecto es documentar voces de mayor calidad disponibles en varias plataformas y proporcionar una manera fácil de implementar estas recomendaciones utilizando archivos de configuración JSON.
Casos de uso
- Proporcionar la mejor voz predeterminada posible por idioma
- Mostrar una lista ordenada de voces, según la calidad.
- Mostrar nombres de voz fáciles de usar
- Filtrado de voces recomendadas por género y edad (adultos versus niños)
- Filtrar voces novedosas y de baja calidad
- Vista previa de una voz con un enunciado de prueba
Manifestación
Está disponible una demostración en vivo basada en el proyecto Readium Speech.
Esta demostración implementa las mejores prácticas para la selección de voz junto con los datos de este repositorio.
Lista de idiomas admitidos
El objetivo de este proyecto es admitir los 43 idiomas disponibles en Windows y macOS.
En su estado actual, cubre 43 idiomas:
- Árabe (Argelia, Bahrein, Egipto, Irak, Jordania, Kuwait, Líbano, Libia, Marruecos, Omán, Qatar, Arabia Saudita, Siria, Túnez, Emiratos Árabes Unidos, Yemen)
- vasco
- Bengalí (India y Bangladesh)
- Bhojpuri
- búlgaro
- catalán
- Chino:
- Chino mandarín (China continental, Taiwán)
- Chino Wu (también conocido como "shanghainés")
- Chino Yue (también conocido como "cantonés")
- croata
- checo
- danés
- Holandés (Países Bajos y Bélgica)
- Inglés (Estados Unidos, Reino Unido, Australia, Canadá, Hong Kong, India, Irlanda, Kenia, Nueva Zelanda, Nigeria, Escocia, Singapur, Sudáfrica y Tanzania)
- finlandés
- Francés (Francia, Canadá, Bélgica y Suiza)
- gallego
- Alemán (Alemania, Austria y Suiza)
- Griego
- hebreo
- hindi
- húngaro
- indonesio
- italiano
- japonés
- canarés
- coreano
- malayo
- marathi
- noruego
- persa
- Polaco
- Portugués (Portugal y Brasil)
- rumano
- ruso
- eslovaco
- esloveno
- Español (España, Argentina, Bolivia, Chile, Colombia, Costa Rica, Cuba, República Dominicana, Ecuador, El Salvador, Guinea Ecuatorial, Guatemala, Honduras, México, Nicaragua, Panamá, Paraguay, Perú, Puerto Rico, Estados Unidos, Uruguay y Venezuela)
- sueco
- Tamil (India, Sri Lanka, Malasia y Singapur)
- telugu
- tailandés
- turco
- ucranio
- vietnamita
Lista de voces para filtrar
En el otro extremo del espectro, este proyecto también identifica una serie de voces que deberían filtrarse desde un componente selector de voces.
Algunos de ellos son perjudiciales para la experiencia de lectura general, mientras que otros tienen una calidad muy baja en plataformas donde hay mejores opciones precargadas disponibles.
- Voces novedosas (dispositivos Apple)
- Voces de muy baja calidad (dispositivos Apple y Chrome OS)
Principios rectores
- Cada lista de voces está ordenada y destinada a proporcionar una experiencia auditiva óptima en todos los navegadores/sistemas operativos/idiomas cubiertos por este proyecto.
- Pero cada lista también incluye opciones predeterminadas, para garantizar que siempre haya algo confiable en qué apoyarse.
- Con estos dos objetivos en mente, las voces de mayor calidad se enumeran en la parte superior de la lista, mientras que las voces de menor calidad o especializadas se enumeran en la parte inferior.
- La cantidad de voces puede parecer abrumadora (más de 110 voces solo en inglés), pero en la práctica, solo algunas de ellas estarán disponibles para los usuarios en cada uno de sus dispositivos.
- Los nombres de voz devueltos por Web Speech API no son fáciles de usar, razón por la cual esta lista proporciona nombres alternativos que generalmente incluyen un nombre (o un género) junto con la región asociada a la voz.
- Siempre que sea posible, intentaré incluir una buena combinación de opciones predeterminadas y de alta calidad para ambos sexos.
- Pero hay que priorizar la lista de alguna manera, las voces femeninas actualmente figuran por encima de las masculinas. Dado que el género asociado a cada voz está documentado, esto permite a los implementadores volver a priorizar/filtrar la lista en función de este criterio.
- Las variantes regionales también se agrupan en una única lista en lugar de separarse deliberadamente en sus propios archivos. En algunos dispositivos, es posible que sólo estén disponibles dos o tres voces y separar las variantes regionales no tendría mucho sentido.
- Pero las variantes regionales deben tener alguna prioridad en la lista. Por ahora, las regiones con las mejores selecciones de voces se enumeran arriba, pero se recomienda encarecidamente a los implementadores que consideren las preferencias regionales del usuario.
Sintaxis
Hay un esquema JSON disponible para validación o para posibles contribuyentes interesados en abrir un PR para nuevos idiomas o adiciones de voz.
Etiqueta
Se requiere label
para cada voz recomendada y proporciona una etiqueta amigable para los humanos para cada voz.
Esta cadena está traducida al idioma de destino y normalmente contiene la siguiente información:
- Nombre (si está disponible)
- Género (cuando falta el nombre)
- País/región
Ejemplo 1: voces naturales de Microsoft
Si bien los nombres documentados por Microsoft para sus voces naturales son fácilmente comprensibles, tienden a ser muy largos y todos están traducidos al inglés.
{
"label" : " Isabella (Italia) " ,
"name" : " Microsoft Isabella Online (Natural) - Italian (Italy) " ,
"language" : " it-IT "
}
Ejemplo 2: voces de Chrome OS
Chrome OS proporciona una serie de voces de alta calidad a través de sus subsistemas Android, pero vienen con algunos de los peores nombres posibles para un usuario final.
{
"label" : " Female voice 1 (US) " ,
"name" : " Android Speech Recognition and Synthesis from Google en-us-x-tpc-network " ,
"language" : " en-US "
}
Nombres
name
es obligatorio para cada voz recomendada y se utiliza como identificador principal para las voces en este proyecto.
Los nombres son en su mayoría estables en todos los navegadores, lo que significa que para la mayoría de las voces, una sola cadena es suficiente.
Pero lamentablemente hay algunos valores atípicos: las voces de Android, iOS, iPadOS y macOS.
Para esas voces, al menos una parte de la cadena suele estar localizada, los nombres pueden ser inconsistentes entre los navegadores y pueden cambiar según la cantidad de variantes instaladas.
Debido a esto, cada lista también puede contener las siguientes propiedades:
-
altNames
con una serie de cadenas alternativas para una voz determinada - y
localizedName
que identifica el patrón de cadena utilizado para localizar estas voces
Ejemplo 3: versión alternativa de una voz precargada de Apple
{
"label" : " Samantha (US) " ,
"name" : " Samantha " ,
"localizedName" : " apple " ,
"altNames" : [
" Samantha (Enhanced) " ,
" Samantha (English (United States)) "
],
"language" : " en-US "
}
Idiomas
Se requiere language
para cada voz recomendada.
Contiene una etiqueta de idioma BCP 47 donde un código de idioma de dos letras en minúscula va seguido de un código de país de dos letras en mayúscula.
Los códigos de idioma y país se separan mediante un guión (-).
Algunas voces también son capaces de manejar otro idioma, por ejemplo, una voz en español para los Estados Unidos también podría ser capaz de manejar inglés.
Por este motivo, también está disponible una propiedad additionalLanguages
, aunque actualmente se utiliza con poca frecuencia.
Contiene una lista de idiomas que utilizan sólo códigos de dos letras, sin subetiquetas.
Algunas voces nuevas de Microsoft también son capaces de reproducirse en varios idiomas. El cambio de idioma no se admite en medio de una oración, pero la salida parece capaz de detectar automáticamente el idioma de cada oración y adoptarse en consecuencia.
Para admitir esto, la salida podría cambiar automáticamente a una voz diferente en el proceso.
Estas voces se identifican mediante el booleano multiLingual
.
Ejemplo 4: Voz con salida multilingüe
{
"label" : " Emma (US) " ,
"name" : " Microsoft EmmaMultilingual Online (Natural) - English (United States) " ,
"language" : " en-US " ,
"multiLingual" : true
}
Ejemplo 5: Voz capaz de manejar un idioma secundario
{
"label" : " Sylvie (Canada) " ,
"name" : " Microsoft Sylvie Online (Natural) - French (Canada) " ,
"language" : " fr-CA " ,
"otherLanguages" : [
" en "
]
}
Voces de género y niños
gender
es una propiedad opcional para cada voz, que documenta el género asociado a cada voz.
Se admiten los siguientes valores: female
, male
o neutral
.
children
también es opcional e identifica las voces de los niños mediante un valor booleano.
Ejemplo 6: Voz de niñas
{
"label" : " Ana (US) " ,
"name" : " Microsoft Ana Online (Natural) - English (United States) " ,
"language" : " en-US " ,
"gender" : " female " ,
"children" : true
}
Calidad
quality
es una propiedad opcional para cada voz, que documenta la calidad de las distintas variantes de una voz.
Se admiten los siguientes valores:
- muy alto
- Calidad de síntesis de voz muy alta, casi indistinguible para los humanos.
- alto
- Alta calidad de síntesis de voz similar a la humana
- normal
- Calidad normal de la síntesis de voz.
- bajo
- Baja calidad de síntesis de voz, no humana
- muy bajo
- Calidad de síntesis de voz muy baja, pero aún inteligible
Ejemplo 7: una voz de Apple disponible en tres variantes de calidad
{
"label" : " Ava (US) " ,
"name" : " Ava " ,
"note" : " This voice can be installed on all Apple devices and offers three variants. Like all voices that can be installed on Apple devices, it suffers from inconsistent naming due to localization. " ,
"altNames" : [
" Ava (Premium) " ,
" Ava (Enhanced) " ,
" Ava (English (United States)) " ,
],
"language" : " en-US " ,
"gender" : " female " ,
"quality" : [
" low " ,
" normal " ,
" high "
],
"rate" : 1 ,
"pitch" : 1 ,
"os" : [
" macOS " ,
" iOS " ,
" iPadOS "
]
}
SO y navegador
Tanto os
como browser
son propiedades opcionales. Se utilizan para indicar en qué sistemas operativos y navegadores está disponible una voz.
Estas dos propiedades deben interpretarse por separado y no como una combinación.
Ejemplo 8: una voz de Microsoft disponible tanto en Edge como en Windows
{
"label" : " Denise (France) " ,
"name" : " Microsoft Denise Online (Natural) - French (France) " ,
"note" : " This voice is preloaded in Edge on desktop. In other browsers, it requires the user to run Windows 11 and install the voice pack. " ,
"language" : " fr-FR " ,
"gender" : " female " ,
"os" : [
" Windows "
],
"browser" : [
" Edge "
]
}
Además, preloaded
indica si la voz está precargada en todos los SO y navegadores que se han identificado.
Con el enfoque actual, no es posible indicar que una voz está disponible en Chrome y Windows, pero requiere una descarga en Windows, por ejemplo.
Ejemplo 9: una voz de Google precargada en Chrome Desktop
{
"label" : " Google female voice (UK) " ,
"name" : " Google UK English Female " ,
"language" : " en-GB " ,
"gender" : " female " ,
"browser" : [
" ChromeDesktop "
],
"preloaded" : true
}
Velocidad y tono del habla
Cuando se utiliza Web Speech API, SpeechSynthesisUtterance
admite valores opcionales para:
-
rate
para controlar la velocidad del habla. - y
pitch
para controlar el tono
Cada voz documentada en este repositorio admite las siguientes propiedades opcionales:
-
pitchControl
es un valor booleano que por defecto es true
e indica si una voz puede controlarse el tono. -
rate
es un número entero entre 0,1 y 10 que por defecto es 1 y proporciona una velocidad de voz predeterminada recomendada para cada voz. -
pitch
es un número entero entre 0 y 2 que por defecto es 1 y proporciona un tono predeterminado recomendado para cada voz.
Ejemplo 10: voz de Microsoft donde no se puede ajustar el tono
{
"label" : " Ana (US) " ,
"name" : " Microsoft Ana Online (Natural) - English (United States) " ,
"language" : " en-US " ,
"gender" : " female " ,
"pitchControl" : false
}
Ejemplo 11: Voz de Google con velocidades y tono recomendados
{
"label" : " Voix Google féminine (France) " ,
"name" : " Google français " ,
"language" : " fr-FR " ,
"gender" : " female " ,
"rate" : 1 ,
"pitch" : 0.8
}
Notas adicionales
A través del trabajo realizado para documentar una lista de voces recomendadas, también terminé probando varios navegadores/sistemas operativos para ver cómo se comportan. Esta sección pretende resumir parte de esta información.
También está disponible una etiqueta dedicada para realizar un seguimiento de los problemas externos informados a Apple, Google, Microsoft o Mozilla.
General
- La API Web Speech devuelve los siguientes campos a través del método
getVoices()
: name
, voiceURI
, lang
, localService
y default
. - Si bien
voiceURI
debería ser la forma más consistente de identificar una voz en teoría, en la práctica esto no podría estar más lejos de la verdad. La mayoría de los navegadores utilizan el mismo valor que name
para voiceURI
y no imponen la unicidad. - Como veremos en las notas para navegadores/SO específicos,
name
también se implementa de manera inconsistente y puede devolver valores diferentes para la misma voz en el mismo dispositivo. -
localService
indica si una voz está disponible para uso sin conexión y parece funcionar como se esperaba, razón por la cual la lista actual de voces recomendadas no contiene esa información. -
lang
parece ser mayormente confiable en todas las implementaciones, devolviendo un idioma usando etiquetas de idioma BCP 47, con el idioma principal en minúsculas y la subetiqueta en mayúsculas ( pt-BR
). - Desafortunadamente hay algunos valores atípicos:
- En Android, Samsung y Chrome utilizan un guión bajo como separador:
en_us
(problema relacionado) - Mientras que Firefox en Android se vuelve aún más creativo, usa códigos de tres letras para los idiomas y agrega una cadena adicional al final:
eng-US-f000
(problema relacionado)
-
default
está destinado a indicar si una voz es la voz predeterminada para el idioma actual de la aplicación. En teoría, esto debería ser extremadamente útil, pero en la práctica es muy difícil de usar debido a inconsistencias entre implementaciones, contexto limitado (predeterminado del sistema versus predeterminado del usuario) y la falta de capacidad para configurar una voz predeterminada por idioma. - Además del uso de
default
, los implementadores siempre deben considerar el uso del encabezado HTTP Accept-Language
, ya que contiene una lista ordenada de idioma/región preferida para un usuario determinado.
Androide
- Por ahora, solo hemos cubierto las pruebas y la documentación en las versiones básicas de Android, disponibles en los dispositivos Google Pixel. La lista de voces disponibles puede variar mucho según el OEM, el dispositivo y la versión de Android.
- Debido a la naturaleza de Android, documentar todas estas variaciones será muy difícil. Se realizarán más intentos en versiones futuras de este proyecto mediante el uso de granjas de dispositivos (problema relacionado).
- En las versiones recientes de Android básico, hay una excelente selección de voces de alta calidad que cubren una amplia gama de idiomas/regiones (67 en abril de 2024).
- Para usar estas voces, el usuario debe profundizar bastante en la configuración del sistema para descargarlas (solo el idioma de su sistema y algunos de los idiomas más populares están precargados de forma predeterminada) o seleccionar su voz preferida por idioma/región.
- Desafortunadamente, Chrome en Android no devuelve la lista de voces disponibles para los usuarios, sino que devuelve una lista sin filtrar de idiomas/regiones (problema relacionado).
- Para empeorar las cosas, todas estas voces y regiones están localizadas con la configuración regional del sistema.
- Entre otras cosas, esto significa que incluso los idiomas y regiones que requieren la instalación de un paquete de voz aparecerán en la lista devuelta por Web Speech API (problema relacionado).
- Si el usuario selecciona un idioma/región para el cual se debe descargar el paquete de voz, Chrome usará de forma predeterminada una voz en inglés (problema relacionado).
- Incluso cuando se ha instalado un paquete de voz, es posible que el usuario deba seleccionar una voz predeterminada para cada región antes de poder utilizar un idioma/región.
- Con este enfoque deficiente para la selección de voz, Chrome en Android tampoco indica el idioma/región preferida del usuario de forma
default
(problema relacionado).
Escritorio cromado
- En el escritorio, Chrome viene precargado con una selección limitada de 19 voces de alta calidad en 15 idiomas.
- Todas estas voces requieren acceso en línea para usarlas, sin recurrir a una variante fuera de línea de menor calidad.
- Desafortunadamente, estas voces también están plagadas de un error si cualquier expresión leída por Web Speech API tarda más de 14 segundos (problema relacionado) y no devuelve eventos de límites (problema relacionado).
- En las circunstancias actuales, estas voces de Google han tenido una prioridad inferior a sus homólogas de Microsoft/Apple en la lista de voces recomendadas.
- En general, es desafortunado que Chrome Desktop esté muy por detrás de Android y Chrome OS en lo que respecta a la variedad de voces e idiomas admitidos de forma predeterminada (problema relacionado).
Sistema operativo Chrome
- Chrome OS viene con cuatro conjuntos de voces: voces de Chrome OS, voces de Android (más de 50 idiomas), voces naturales y voces eSpeak (38 idiomas).
- De forma predeterminada, Chrome OS descarga las voces de Chrome OS para el idioma de su sistema, mientras que las voces de Android y eSpeak están disponibles para todos los idiomas.
- Google también está agregando gradualmente soporte para voces naturales, que son básicamente variantes de mayor calidad de sus voces de Android con el beneficio adicional de trabajar sin conexión. Las voces naturales requieren que el usuario vaya a la configuración del sistema para instalarlas.
- Chrome OS tiene una desafortunada tendencia a desinstalar paquetes de voz cada vez que se instala una nueva actualización de Chrome OS, lo que sucede muy a menudo.
- La mayoría de las voces de Android ofrecen variantes en línea y fuera de línea y están a la par en calidad con lo que ofrece Apple en términos de voces descargables.
- Estas voces de Android tienen algunos de los peores nombres en cualquier plataforma/navegador, lo que las hace difícilmente utilizables sin el tipo de reetiquetado que ofrece este proyecto.
- Las voces de Android también sufren problemas de latencia y/o disponibilidad. En algunos casos, la lectura del primer enunciado en voz alta puede tardar hasta un minuto.
- Las voces de Chrome están un paso por debajo de las voces de Android, pero ofrecen una selección decente para los idiomas más comunes.
- Las voces de eSpeak deben evitarse a toda costa debido a su calidad extremadamente baja y se han documentado por separado para filtrarlas.
Borde
- En el escritorio, Edge ofrece la mejor selección de voces de alta calidad con más de 250 voces precargadas en 75 idiomas (a partir de abril de 2024).
- Todas estas voces denominadas "naturales" dependen del aprendizaje automático (ML) y, por lo tanto, requieren acceso en línea para utilizarlas.
- Un pequeño número de esas voces también son multilingües y parecen ser capaces de detectar el idioma de una frase y adaptarse en consecuencia. Desafortunadamente, esto no funciona tan bien cuando hay un cambio de idioma en medio de una oración.
- Al menos en macOS, hay un error extraño en el que Edge solo muestra 18 voces naturales inicialmente, pero esto se extiende a más de 250 una vez que se ha utilizado Web Speech API para generar una expresión.
- También hay problemas adicionales que los implementadores deben tener en cuenta al usar estas voces: no admiten el ajuste de tono (problema relacionado) y es necesario escapar una cantidad de caracteres para evitar problemas de reproducción (problema relacionado).
- En dispositivos móviles, Edge no es tan interesante:
- Es completamente inutilizable en Android ya que devuelve una lista vacía de voces, lo que hace imposible su uso con Web Speech API (problema relacionado).
- En iOS/iPadOS, todos los navegadores actualmente se ven obligados a utilizar Safari como motor, lo que significa que Edge se comporta exactamente como Safari Mobile.
Firefox
- En el escritorio, Firefox parece bastante sencillo cuando se trata de selección de voz.
- A diferencia de Chrome y Edge, Firefox no viene con ninguna voz propia precargada.
- Firefox tiene un enfoque diferente para
voiceURI
donde cada voz se identifica verdaderamente mediante una URN única. - Dado que esto es exclusivo de Firefox, los archivos JSON actuales no documentan estos URI todavía, pero esto podría ser una adición futura.
- En macOS, Firefox requiere un reinicio completo del sistema para que aparezcan nuevas voces en la lista.
iOS y iPadOS
- Ambos sistemas operativos vienen con el mismo conjunto de voces precargadas y voces descargables que macOS. Lea la sección de macOS a continuación para obtener información adicional sobre las voces disponibles.
- Por una razón desconocida, algunas voces precargadas también aparecen dos veces pero proporcionan la misma salida de audio.
- Todos los navegadores deben ejecutarse en la vista web del sistema, lo que significa que son solo un caparazón encima de Safari Mobile en lugar de navegadores verdaderamente diferentes.
- Esta situación podría cambiar debido a la Ley del Mercado Digital en Europa, lo que obligará a Apple a cambiar su política sobre navegadores y vistas web de terceros.
macos
- macOS proporciona una lista extensa de voces en 45 idiomas, tanto precargadas como descargables.
- Estas voces pueden tener hasta tres variantes diferentes, según la calidad de la salida (y el tamaño de la descarga).
- Las voces de mayor calidad son probablemente las que están disponibles para Siri, pero desafortunadamente no están disponibles a través de Web Speech API (problema relacionado).
- En el otro extremo del espectro, Apple tuvo la desafortunada idea de precargar una amplia gama de voces raras y de baja calidad, como los paquetes de voces Eloquence (8 voces) y Effects (15 voces).
- La existencia de estas voces por sí sola es una buena razón para filtrar las voces disponibles para los usuarios de macOS y resaltar las recomendadas en este repositorio.
- A diferencia de otras plataformas/SO, macOS decidió localizar los nombres de las voces. Esto no sería un problema si
voiceURI
pudiera usarse como un identificador confiable para voces, pero ese no es el caso (problema relacionado). - En su estado actual, este repositorio solo documenta localizaciones para los idiomas admitidos oficialmente y no los 45 idiomas admitidos por el motor TTS de macOS.
Safari
- Para bien o para mal, el comportamiento de Safari es mayormente consistente entre sus versiones de escritorio y móvil.
- Las voces descargables no aparecen en la lista devuelta por Web Speech API (problema relacionado).
- Peor aún, al instalar variantes de mayor calidad de voces precargadas, estas voces desaparecen en Safari, lo que significa que idiomas enteros podrían desaparecer por completo.
- Todas las voces devuelven
true
por default
en Safari, lo que hace imposible detectar y seleccionar el sistema/usuario predeterminado (problema relacionado).
ventanas
- Microsoft proporciona una página muy útil que enumera todas las voces disponibles en Windows 10 y 11 para un total de 98 voces en 36 idiomas.
- Las voces naturales brindan una experiencia mucho mejor, pero requieren una versión actualizada de Windows 11 y deben descargarse (con el beneficio adicional de que también funcionan sin conexión).
- Microsoft ha tardado en agregar estas voces naturales a Windows 11 en general. Hasta hace poco, sólo estaban disponibles las voces estadounidenses (3 voces). La lista ahora es un poco más larga (23 voces en 8 idiomas), pero sigue muy por detrás de lo que ofrecen a través de Edge (más de 250 voces en 75 idiomas).
- Desafortunadamente, estas voces de mayor calidad no aparecen correctamente en Chrome o Firefox actualmente (problema relacionado). Solo aparecen en Edge, donde están precargados de todos modos, pero estrictamente para uso en línea.