Texto a Voz para TranslatePress: Qué funciona y cómo configurarlo

14 min de lectura 20 min de escucha
Texto a Voz para TranslatePress: Qué funciona y cómo configurarlo

TranslatePress traduce el HTML renderizado de una página en tiempo de solicitud y almacena cada traducción en tablas locales de la base de datos. Hay un único ID de entrada por artículo, y los cambios de idioma ocurren mediante trp_translate(), no a través de entradas duplicadas. Este detalle define por completo cómo debe funcionar el texto a voz en un sitio con TranslatePress.

Este es el quinto y último artículo de nuestra serie de TTS multilingüe. Ya cubrimos WPML, Polylang, Weglot y GTranslate. TranslatePress ocupa un lugar intermedio entre ellos desde el punto de vista técnico, y la configuración de audio lo refleja.

Cómo difiere TranslatePress de WPML, Polylang y Weglot

WPML y Polylang crean una entrada separada por cada idioma. Cada traducción tiene su propio ID, su propio post_content y su propio permalink. Generar audio es directo porque cada idioma es un objeto de WordPress independiente.

Weglot adopta el enfoque opuesto. Las traducciones viven en los servidores de Weglot y se inyectan en la página a través de un proxy o subdominio. La base de datos original de WordPress nunca recibe el texto traducido, razón por la que el TTS del lado del servidor en Weglot es difícil sin hooks de JavaScript.

TranslatePress es el punto intermedio. Hay una sola entrada por artículo, por lo que post_content solo contiene el idioma predeterminado. Pero cada traducción se almacena localmente en tu base de datos de WordPress, en las tablas wp_trp_. Puedes leerlas, consultarlas y pasarlas a un motor de TTS. Eso cambia el enfoque de audio respecto a cualquiera de los otros cuatro plugins.

Dónde se guardan realmente las traducciones

TranslatePress almacena las traducciones en tablas dedicadas con el prefijo wp_trp_. Cada par de idiomas tiene su propia tabla de diccionario, identificada como wp_trp_dictionary_<source>_<target>. También existe wp_trp_original_strings para las cadenas de origen y tablas gettext para las traducciones de temas y plugins.

El almacenamiento es direccional. Una traducción al alemán de un sitio en inglés vive en el diccionario inglés-alemán. Para recuperarla se necesita la misma dirección. La función pública que importa es trp_translate(), que recibe una cadena de contenido y un código de idioma y devuelve la versión traducida.

if ( function_exists( 'trp_translate' ) ) {
    $translated = trp_translate( $post->post_content, 'de_DE' );
    // Pasa $translated al motor de TTS, no $post->post_content.
}

Para una integración de TTS, esa función es la fuente de verdad. Leer post_content directamente siempre devuelve el idioma predeterminado, sin importar en qué URL esté el visitante. Consulta la documentación de integración con TranslatePress para ver cómo TTSWP maneja esto de nuestra parte.

Diagrama de trp_translate() convirtiendo un post_content en tres salidas de audio localizadas
Un ID de entrada, un post_content, múltiples salidas de audio traducidas mediante trp_translate().

El problema con los códigos de configuración regional

TranslatePress usa códigos de configuración regional completos, no slugs. El alemán es de_DE, no de. El francés es fr_FR. El portugués de Brasil es pt_BR. Cualquier integración que asuma slugs de dos letras al estilo Polylang fallará silenciosamente en TranslatePress.

La documentación para desarrolladores de TranslatePress es explícita al respecto. El código de idioma que se pasa a trp_translate() es el código de configuración regional que aparece en Ajustes, TranslatePress, General, y no es necesariamente el mismo que el slug de idioma en la URL. Un slug suelto como de no coincide con ningún diccionario, por lo que la función regresa a la cadena original sin ninguna advertencia. Si escribes código personalizado, normaliza los códigos de idioma antes de llamar a trp_translate(), y almacena el mismo formato de configuración regional junto a tus archivos de audio para poder vincularlos después.

Estructura de URL y caché

TranslatePress usa un subdirectorio por idioma de forma predeterminada. Tu página en inglés vive en site.com/blog/post y la versión en alemán en site.com/de/blog/post. También existe la opción de usar un subdirectorio para el idioma predeterminado, lo que hace que todos los idiomas sean simétricos.

Esto funciona bien para el caché. Las URLs distintas generan claves de caché distintas por idioma. WP Rocket, LiteSpeed y las cachés de borde de CDN tratan /de/blog/post como un recurso separado de /blog/post, de modo que tu archivo de audio en alemán se sirve con la página en alemán y el audio en inglés con la página en inglés. Nuestra documentación de integración de caché cubre las reglas de exclusión si las necesitas.

El riesgo está en el complemento de pago de Detección Automática de Idioma del Usuario. Redirige a los visitantes según el idioma del navegador, lo que puede chocar con las cachés de página y servir la redirección incorrecta al usuario equivocado. Cubrimos el mismo patrón en el artículo sobre Polylang. Pocos sitios con TranslatePress usan la detección automática porque es un complemento de pago, pero si lo usas, excluye la lógica de redirección del caché.

El problema de la traducción de la interfaz del reproductor

Este problema es exclusivo de TranslatePress. El plugin detecta y traduce cadenas insertadas por JavaScript, lo cual es poco habitual. La mayoría de las herramientas de traducción ignoran el contenido renderizado por JS. TranslatePress lo captura en el DOM después del renderizado y ofrece traducirlo.

El efecto secundario es que las etiquetas del reproductor de audio, como «Reproducir», «Pausar» y «Escuchar este artículo», aparecen en el editor de TranslatePress como cadenas traducibles. Si esas cadenas se traducen automáticamente sin revisión, el reproductor puede terminar con texto de botones extraño o incorrecto y, peor aún, con etiquetas de accesibilidad mal traducidas que confunden a los lectores de pantalla.

Hay dos soluciones dentro de TranslatePress. Agrega el atributo data-no-translation a cualquier elemento que quieras excluir. O usa los selectores de exclusión en Ajustes Avanzados para omitir contenedores enteros por selector CSS. Ambas opciones están documentadas en los ajustes propios de TranslatePress. Para el reproductor de TTSWP en particular, excluye el contenedor del reproductor por clase y deja que nuestras etiquetas traducidas lleguen a través de los propios archivos de idioma del plugin.

Qué excluir

  • El elemento contenedor del reproductor de audio
  • Las etiquetas ARIA en los controles de reproducción, pausa y progreso
  • Los indicadores de tiempo y duración
  • Cualquier etiqueta de nombre de voz o de idioma renderizada por TTSWP

Si quieres personalizar el estilo del reproductor después de excluirlo, nuestra documentación de CSS personalizado cubre los selectores.

El problema de desincronización al editar contenido

TranslatePress vincula cada traducción a la cadena de origen exacta. Si editas el original, TranslatePress crea una nueva cadena de origen y desvincula la traducción existente. La Memoria de Traducción sugiere la traducción anterior, pero hasta que un humano la confirme, el idioma de destino regresa al original.

Para el texto a voz, esto significa que el audio puede desincronizarse con el texto traducido después de cualquier edición. Agregar una coma en inglés desvincula la traducción de ese fragmento en todos los idiomas. Tu audio en alemán sigue diciendo la oración anterior, pero el texto visible en alemán ya muestra la nueva.

Lista de verificación práctica después de editar contenido:

  1. Confirma la nueva cadena de origen en el editor de TranslatePress para cada idioma activo.
  2. Regenera el audio en la entrada del idioma predeterminado primero.
  3. Regenera el audio para cada idioma, luego reproduce el audio en cada URL localizada para confirmar que el nuevo archivo coincide con el texto visible.
  4. Limpia la caché de página para cada URL localizada, no solo la predeterminada.

Cómo configurar TTSWP en un sitio con TranslatePress

Este es el flujo actual. La documentación de integración siempre describe el comportamiento más reciente.

  1. Instala TTSWP desde el directorio de plugins de WordPress.org. La guía de instalación te lleva paso a paso.
  2. Conecta el plugin al backend de TTSWP. Los planes gratuitos incluyen créditos de bienvenida para que puedas probar el flujo completo antes de pagar. Consulta cómo conectar tu sitio.
  3. Confirma que TranslatePress está activo y que al menos un idioma de destino está configurado con un código de configuración regional completo.
  4. Asigna una voz por idioma usando el mapeo de idioma a voz. Asigna una voz en alemán a de_DE, una en francés a fr_FR, y así sucesivamente. Consulta la selección de voces para ver el catálogo disponible.
  5. Publica o actualiza una entrada. El audio se genera primero para el idioma predeterminado.
  6. Reproduce el audio en cada URL traducida. La generación ocurre bajo demanda. La primera vez que un visitante reproduce audio en un idioma secundario, TranslatePress le indica a TTSWP qué idioma está activo, y TTSWP genera y almacena en caché el archivo para ese idioma. Las reproducciones siguientes usan el archivo en caché.
  7. Excluye el reproductor de TranslatePress usando data-no-translation o un selector en Ajustes Avanzados para que las etiquetas del reproductor estén controladas por las propias traducciones de TTSWP.

TTSWP almacena un archivo de audio por entrada e idioma, y el reproductor sigue el idioma de la URL en la que está el visitante. En /de/blog/post el reproductor carga el archivo en alemán; en la URL predeterminada carga el archivo en el idioma predeterminado. Con la traducción automática activa, TTSWP lee el texto traducido directamente desde TranslatePress antes de enviarlo a ElevenLabs, de modo que el audio coincide con lo que el visitante ve en la página.

TranslatePress gratuito vs. de pago para TTS

La versión gratuita de TranslatePress admite un idioma adicional, incluye 2,000 palabras traducidas con IA de TranslatePress y permite usar Google Translate con tu propia clave de API. Eso es suficiente para tener un blog bilingüe con audio coincidente en dos idiomas.

La versión de pago agrega idiomas adicionales ilimitados, el SEO Pack para slugs traducidos, meta y control de hreflang, soporte para DeepL, cuentas de traductores, el complemento de Detección Automática de Idioma del Usuario y diferentes dominios por idioma. Para un sitio que necesita más de dos idiomas, etiquetas hreflang para motores de búsqueda o traducciones con calidad DeepL antes de generar el TTS, la versión de pago es la opción práctica. La calidad del audio en sí no depende del plan.

SEO y AEO con audio por idioma

El SEO Pack permite configurar etiquetas hreflang por idioma, con opciones para configuración regional específica por país, idioma independiente de región, o ambas. Para los motores de búsqueda y los motores de respuesta de IA, eso es lo que indica qué audio corresponde a qué región.

Agrega una entrada de esquema AudioObject por URL de idioma, con el valor correcto de inLanguage que coincida con el hreflang. Google y Bing reconocen el par de idiomas, y en nuestras propias pruebas, los motores de IA como Perplexity y ChatGPT Search citan con más frecuencia los artículos enriquecidos con audio cuando el esquema es correcto y la URL del audio responde. Escribimos más sobre esto en el artículo sobre AEO y audio.

Problemas frecuentes y cómo resolverlos

ProblemaCausaSolución
El audio se reproduce en el idioma incorrectoEl texto se obtiene de post_content en lugar de trp_translate()Pasa el texto por trp_translate( $content, $locale ) con el código de configuración regional completo
Los botones del reproductor están mal traducidosTranslatePress capturó las etiquetas del reproductor insertadas por JSAgrega data-no-translation al contenedor del reproductor o exclúyelo por selector en Ajustes Avanzados
El audio desaparece después de editar el contenidoEditar el origen desvincula las traducciones y, por extensión, el audio por idiomaConfirma las traducciones en el editor de TranslatePress y luego regenera el audio por idioma
Código de configuración regional incorrectoLa integración pasa de en lugar de de_DENormaliza al código de configuración regional completo antes de llamar a trp_translate()
Diseño RTL roto para árabe o hebreoEl CSS del reproductor no es compatible con RTLUsa CSS personalizado para adaptar los controles del reproductor a configuraciones regionales RTL
Caché redirige al idioma incorrectoEl complemento de Detección Automática de Idioma del Usuario interactúa con la caché de páginaExcluye la redirección de la caché o desactiva la detección

Nota sobre accesibilidad

La narración de audio respalda varios criterios de éxito de WCAG cuando el reproductor se puede operar con teclado y está correctamente etiquetado. Si excluyes el reproductor de TranslatePress, mantén las etiquetas ARIA intactas en las propias traducciones de TTSWP. Nuestra guía de audio WCAG cubre los criterios en detalle, y el tutorial principal de configuración es un buen punto de partida.

Preguntas frecuentes

¿TranslatePress funciona con texto a voz?

Sí. TranslatePress almacena las traducciones localmente en tablas wp_trp_ de la base de datos, y la función trp_translate() devuelve el contenido traducido del lado del servidor. Una integración de TTS puede leer el texto traducido y generar audio por idioma, siempre que identifique el audio por ID de entrada más código de configuración regional y use códigos completos como de_DE en lugar de slugs.

¿Necesito la versión de pago de TranslatePress para el audio?

No. La versión gratuita admite un idioma adicional e incluye traducción mediante TranslatePress AI, Google Translate con tu propia clave, o edición manual. Eso es suficiente para un sitio bilingüe con audio coincidente. La versión de pago agrega idiomas ilimitados, SEO Pack, DeepL y complementos de detección, útiles si necesitas más de dos idiomas o control de hreflang.

¿Por qué los botones del reproductor están mal traducidos?

TranslatePress detecta las cadenas insertadas por JS, por lo que las etiquetas del reproductor de audio aparecen en su editor y pueden traducirse automáticamente. Para solucionarlo, agrega data-no-translation al contenedor del reproductor, o excluye el contenedor del reproductor en Ajustes Avanzados con un selector CSS. Así las etiquetas del reproductor provienen de los propios archivos de idioma de TTSWP.

¿Por qué el audio dejó de coincidir con la traducción?

Editar la cadena original en TranslatePress crea una nueva cadena de origen y desvincula la traducción existente. La Memoria de Traducción la sugiere de nuevo, pero hasta que la confirmes, el idioma de destino regresa al original. Regenera el audio en la entrada predeterminada y en cada idioma después de cualquier edición de contenido, y luego limpia la caché para cada URL localizada.

¿En qué se diferencia TranslatePress de Weglot para TTS?

Weglot almacena las traducciones en sus propios servidores y las inyecta en la página, por lo que WordPress nunca recibe el texto traducido del lado del servidor. TranslatePress almacena cada traducción en tu base de datos local y expone trp_translate() para acceso del lado del servidor. Eso hace que la generación de audio por idioma sea más directa en TranslatePress que en Weglot.

Próximos pasos

Instala Texto a Voz - TTSWP desde el directorio de plugins de WordPress.org, conéctalo a tu cuenta y asigna una voz por cada idioma que ya tienes configurado en TranslatePress. Publica una entrada, reproduce el audio en cada URL traducida y confirma que el audio coincide con el texto visible. Si algo no cuadra, la documentación de integración con TranslatePress es el primer lugar donde buscar.