Text to Speech para Sites com Polylang: O Que Realmente Funciona

16 min de leitura 21 min de escuta
Text to Speech para Sites com Polylang: O Que Realmente Funciona

Conversão de texto em voz real no Polylang significa um arquivo de áudio por post traduzido, no idioma e na voz corretos. Como o Polylang armazena cada tradução como um post WordPress separado com seu próprio ID, a geração de áudio por post funciona nativamente. Os problemas estão na seleção de voz, nos redirecionamentos por cookie e no cache de páginas, não no áudio em si.

Este é o quarto post da nossa série sobre TTS multilíngue. Cobrimos WPML, Weglot e o lançamento do GTranslate 3.3.0. O Polylang tem uma arquitetura parecida com a do WPML, mas com suas próprias particularidades. Aqui está o que testamos e o que realmente funciona em sites em produção com o Conversão de Texto em Voz - TTSWP.

Por que o Polylang importa para text to speech

O Polylang é o plugin gratuito de WordPress multilíngue mais usado. Tem mais de 800.000 instalações ativas e a maior base de instalações gratuitas entre os plugins de tradução de uso geral. A primeira versão foi lançada em 2011, e o plugin ainda é mantido ativamente. Não há limite de idiomas que você pode adicionar, e os pacotes de idiomas do WordPress são baixados automaticamente. A maioria dos sites com Polylang são blogs, pequenos publishers e agências que precisam economizar, que escolheram o plugin pela versão gratuita robusta e pela arquitetura limpa.

Essa popularidade é justamente o problema para plugins de TTS. Muitos dizem que suportam Polylang, mas só testam o idioma padrão. Eles anexam um único arquivo de áudio a um post e servem o mesmo arquivo em todas as traduções. A versão em espanhol toca áudio em inglês. A versão em alemão fica sem som. Os visitantes abandonam o site.

A solução é estrutural. O Polylang não adiciona tabelas extras ao banco de dados nem shortcodes. Ele usa as taxonomias do WordPress, o mesmo recurso que faz categorias e tags funcionarem. Cada tradução existe como um post real. Então a geração de áudio por post, que é como o TTSWP funciona, se alinha perfeitamente com a forma que o Polylang armazena o conteúdo.

Como o Polylang se diferencia do Weglot e do GTranslate

O Polylang duplica os posts. O Weglot e o GTranslate traduzem no momento da renderização. Essa única diferença define tudo sobre o suporte a TTS.

Em um site com Polylang, a tradução para alemão de "Sobre nós" é um post WordPress separado com post ID 412, slug de idioma "de" e seu próprio conteúdo no banco de dados. O WordPress reconhece esse post, a REST API reconhece, e qualquer plugin de TTS que se conecta ao save_post ou ao wp_insert_post também reconhece. A geração de áudio roda uma vez por tradução, no idioma daquela tradução, e o arquivo é armazenado em cache vinculado ao ID daquele post.

O Weglot e o GTranslate funcionam de forma diferente. O texto traduzido só existe quando um usuário acessa a página. Não há um segundo post para associar o áudio. Cobrimos as soluções alternativas para Weglot e GTranslate em posts anteriores. O WPML usa o mesmo modelo de duplicação do Polylang, por isso nosso guia de WPML se aplica aqui com pequenos ajustes.

Para TTS, isso é uma boa notícia. O Polylang oferece exatamente o que você precisa: um ID de post estável por idioma, um slug de idioma conhecido e um permalink que não muda no momento da renderização.

Diagrama comparando a duplicação de posts do Polylang com a tradução em tempo de renderização do Weglot
O Polylang cria um post real por idioma, que é exatamente o que a geração de TTS por post precisa.

As quatro estruturas de URL do Polylang e o que cada uma significa para TTS

O Polylang oferece quatro modos de URL. Cada um muda como caches, CDNs e o código de detecção de idioma enxergam suas páginas. Escolha o errado e o arquivo de áudio correto vai parar atrás da URL errada.

1. Idioma apenas pelo conteúdo (sem código de idioma na URL)

Esse é o caso mais difícil. A URL example.com/sobre serve inglês para um visitante e alemão para outro, com base no cookie ou na detecção do navegador. Caches de página veem uma URL e armazenam uma única variante. Qualquer idioma que o cache capturar primeiro prevalece.

Para TTS, o arquivo de áudio em si está correto, pois é vinculado ao ID do post, não à URL. O problema é a página que incorpora o player. Se a página em inglês cacheada carregar com o embed de áudio em alemão, o player ainda toca em alemão, mas os visitantes esperavam texto em inglês. Não recomendamos esse modo de URL em nenhum site com cache.

2. URLs de diretório (/en/, /de/)

Esse é o padrão e a configuração que recomendamos. Cada idioma tem seu próprio caminho. Os caches tratam /en/sobre e /de/uber-uns como chaves distintas. A página correta carrega com o player correto e o arquivo de áudio correto. Sem truques de cookie.

Fique atento à opção "ocultar informações de idioma na URL para o idioma padrão". Quando ativada, o idioma padrão perde o prefixo. /sobre vira inglês e /de/uber-uns continua alemão. A detecção de idioma por URL em código de terceiros falha nos caminhos do idioma padrão porque não encontra nenhum slug. Se usar essa opção, prefira pll_current_language() em vez de análise de URL.

3. Subdomínio (en.example.com, de.example.com)

Subdomínios dão a cada idioma seu próprio host e namespace de cache. Os players de TTS carregam corretamente por idioma. O custo é o DNS, certificados SSL por subdomínio e análises um pouco mais complexas. Funciona bem em escala.

4. Domínios separados por idioma

Separação completa. example.com para inglês, example.de para alemão. O TTS ainda vincula o áudio ao ID do post dentro de cada instalação WordPress, e o player funciona da mesma forma. Esse modo é comum para marcas que já possuem ccTLDs.

O problema do redirecionamento por cookie

O Polylang pode detectar o idioma do navegador do visitante na primeira visita à sua página inicial. Ele então define o cookie pll_language e redireciona o visitante para a versão correspondente no idioma detectado. Combinado com o cache de página, é aqui que o áudio no idioma errado aparece.

Aqui está a sequência de falhas que reproduzimos. Um visitante francês acessa a página inicial. O Polylang detecta o francês, define o cookie pll_language e redireciona para /fr/. O cache armazena essa resposta de redirecionamento sob a URL da página inicial. O próximo visitante, um falante de inglês, acessa a página inicial e recebe o redirecionamento cacheado para /fr/. Ele cai na página em francês, ouve o áudio em francês e sai do site.

Com URLs de diretório, o problema fica restrito à página inicial, pois todas as outras páginas têm uma chave de cache distinta por idioma. Com o modo "idioma apenas pelo conteúdo", o mesmo problema se espalha para todas as URLs do site.

Três soluções funcionam. A mais simples é desativar a detecção de idioma pelo navegador em qualquer site com cache e deixar os visitantes escolherem pelo seletor de idiomas. A segunda é configurar o plugin de cache para variar ou ignorar o cookie pll_language. A terceira é excluir a página inicial do cache de página para que o redirecionamento de detecção sempre rode ao vivo.

Se você usa WP Rocket, W3 Total Cache ou LiteSpeed, consulte nossa documentação de integração com cache para a configuração de cookies. O Polylang funciona junto com esses plugins de cache, mas coexistir não é o mesmo que ser compatível com múltiplos idiomas. Você ainda precisa configurar o cache manualmente.

Comportamento do AJAX no frontend

O Polylang detecta automaticamente o idioma atual em requisições AJAX do frontend e carrega as strings para aquele idioma. Você também pode passar uma variável lang explícita na requisição para forçar um idioma específico. Para TTS, isso é relevante quando o player de áudio ou o widget de posts relacionados dispara uma chamada AJAX para buscar um post diferente.

Em nossos testes, o Polylang lida com isso sem problemas. Não encontramos as regressões de idioma no AJAX que documentamos no post sobre WPML. Se uma integração personalizada precisar buscar um post em um idioma que não seja o atual, passe lang explicitamente e verifique se function_exists('pll_current_language') antes de usar o resultado.

Configurando o Conversão de Texto em Voz - TTSWP em um site com Polylang

Estes passos partem do pressuposto de que o Polylang já está instalado e que ao menos uma tradução existe.

  1. Instale o Conversão de Texto em Voz - TTSWP direto da página do plugin no WordPress.org. Ative-o. Consulte a documentação de instalação se encontrar algum erro de permissão.
  2. Conecte o plugin ao TTSWP seguindo o guia de conexão. O plano gratuito inclui créditos de boas-vindas para você testar antes de escolher um plano pago.
  3. Abra o post no idioma original e gere o áudio. Confirme que o player aparece no frontend.
  4. Mude para a versão traduzida pelo seletor de idiomas do Polylang no editor de posts. Gere o áudio novamente. O Polylang carregou um ID de post diferente, então o TTSWP trata isso como uma nova geração e salva um arquivo separado.
  5. Escolha a voz para cada tradução. A seleção de voz acontece no nível do post. Veja a documentação de seleção de voz para o ajuste por post.
  6. Verifique no frontend. Abra /en/slug-do-post e /de/slug-do-post em abas diferentes. Dê play em cada uma. As vozes e os idiomas devem corresponder.

Hoje, o mapeamento de voz padrão por idioma no TTSWP prioriza WPML e Weglot. No Polylang, a seleção de voz fica no nível do post e o padrão por idioma funciona por meio da leitura do idioma do post que descrevemos abaixo. Para a maioria dos sites com Polylang, isso é suficiente, pois cada tradução é um post real e a voz é definida uma vez por post. Consulte a documentação de integração com Polylang para o comportamento atual.

Editor de posts do WordPress mostrando o seletor de idiomas do Polylang e o painel de áudio do TTSWP lado a lado
Cada tradução no Polylang é um post separado, então a geração de áudio e a seleção de voz acontecem por tradução.

Como a seleção de voz deve ler o idioma do post

A API correta para ler o idioma de um post no Polylang é pll_get_post_language(). Sempre verifique se a função existe antes de chamá-la, como a própria documentação do Polylang para desenvolvedores recomenda. O padrão é este:

if ( function_exists( 'pll_get_post_language' ) ) {
    $lang = pll_get_post_language( $post_id, 'slug' );
    // $lang agora é 'en', 'de', 'fr', etc.
}

Para o contexto do frontend, pll_current_language() retorna o idioma da requisição atual. As duas funções são estáveis e fazem parte da API pública do Polylang há anos. A lógica de mapeamento de voz deve sempre ler o idioma do post, nunca o padrão do site, caso contrário as traduções herdam a voz errada.

Polylang gratuito versus Polylang Pro para TTS

Nada no Polylang Pro é necessário para o áudio. A versão gratuita do Polylang oferece tudo o que o TTSWP precisa: duplicação por post, slugs de idioma e as funções da API pública mencionadas acima.

O Polylang Pro adiciona tradução automática com DeepL, suporte à REST API, slugs de URL traduzidos e exportação XLIFF para trabalho de tradução terceirizado. Nada disso muda o TTS para posts de blog e páginas. O Polylang para WooCommerce é um complemento pago separado que gerencia páginas da loja, categorias de produtos, atributos e e-mails transacionais. Se você quer narração em descrições de produtos, veja nosso guia de TTS para WooCommerce.

SEO e AEO com áudio por idioma

O Polylang cuida do hreflang automaticamente, que é a maior parte do trabalho de SEO para sites multilíngues. Adicione o schema AudioObject para cada versão de idioma, apontando cada um para o arquivo daquela tradução específica, e você dará um sinal claro para os mecanismos de busca.

Em nossos próprios testes, artigos com áudio e schema AudioObject são citados com mais frequência por mecanismos de busca com IA. Documentamos o método e os resultados em nosso post sobre AEO e áudio. O resumo: um arquivo de áudio por tradução, schema por tradução, e o benefício de AEO vem junto.

Problemas comuns e soluções

SintomaCausa provávelSolução
Tradução toca na voz erradaVoz definida globalmente, não por postAbra o post traduzido, defina a voz naquele post e gere novamente
Um idioma não tem áudioÁudio nunca foi gerado naquela traduçãoAbra o post traduzido no editor e clique em gerar
Página em cache mostra o player no idioma erradoCache armazenando o redirecionamento de detecção ou uma única variante da páginaDesative a detecção de idioma pelo navegador ou configure o cache para variar com o cookie pll_language
Layout do player em árabe ou hebraico está incorretoCSS RTL não aplicado ao playerAdicione substituições RTL via CSS personalizado
Strings da interface do player ficam no idioma padrãoStrings do plugin não registradas para traduçãoRegistre as strings do player com pll_register_string para que o Polylang as exiba na tela de tradução de strings
Áudio gerado no idioma padrão para todos os postsMapeamento de voz lendo o locale do site em vez do idioma do postConfirme o idioma do post via pll_get_post_language($post_id, 'slug')
Ilustração de três caminhos de idioma, cada um com uma chave de cache e arquivo de áudio distintos, incluindo layout RTL para árabe
URLs de diretório dão a cada tradução sua própria chave de cache, evitando que o áudio errado apareça na página errada.

Nota sobre acessibilidade

Adicionar narração por idioma também é um ganho para a acessibilidade. Visitantes que leem melhor no próprio idioma, mas preferem ouvir, agora têm as duas opções. Se o seu site se enquadra no WCAG 2.2 ou na Lei Europeia de Acessibilidade, veja nosso guia de conformidade de áudio com WCAG para os critérios aplicáveis. Para um passo a passo mais completo sobre como adicionar TTS ao WordPress em 2026, o tutorial principal cobre os fundamentos.

Perguntas frequentes

O Polylang funciona com text to speech?

Sim. O Polylang armazena cada tradução como um post WordPress separado com seu próprio ID, que é a mesma arquitetura que o TTSWP usa para áudio por post. Gere o áudio em cada tradução e você terá um arquivo por idioma com a voz escolhida. A versão gratuita do Polylang é suficiente. Nenhuma configuração especial é necessária além da configuração padrão do TTSWP.

Preciso do Polylang Pro para usar o áudio?

Não. A versão gratuita do Polylang expõe tudo o que o TTSWP precisa: duplicação de posts por idioma, slugs de idioma e as funções da API pública pll_get_post_language() e pll_current_language(). O Polylang Pro adiciona tradução automática com DeepL, suporte à REST API e slugs de URL traduzidos. Nada disso muda como a geração ou a reprodução de áudio funciona.

Cada idioma pode ter sua própria voz?

Sim. Como cada tradução é um post separado, a seleção de voz acontece no nível do post. Escolha uma voz em alemão para a tradução em alemão, uma voz em espanhol para a tradução em espanhol, e assim por diante. O TTSWP salva a escolha por post e a usa toda vez que você regenerar. Veja a documentação de mapeamento de idioma e voz para o comportamento atual.

Por que meu áudio toca no idioma errado?

A causa mais comum é o cache de página combinado com a detecção de idioma pelo navegador do Polylang. O cache armazena o redirecionamento da página inicial ou uma única variante de idioma e serve para todos os visitantes. O arquivo de áudio em si está correto para o ID do post. A página que o carrega é que está errada. Desative a detecção pelo navegador em sites com cache ou configure o plugin de cache para variar com o cookie pll_language. URLs de diretório (/en/, /de/) limitam o problema à página inicial, pois todas as outras páginas têm uma chave de cache distinta.

Como o Polylang se diferencia do WPML para TTS?

Os dois duplicam posts por idioma, então o áudio por post funciona da mesma forma nos dois. As diferenças estão no tratamento do AJAX, no comportamento dos cookies e nos nomes das funções da API do desenvolvedor. O Polylang usa funções com prefixo pll_ e é geralmente mais leve. O WPML tem mais recursos nativos para WooCommerce, mas ocupa mais espaço. Nosso post sobre WPML cobre esse lado.

Posso traduzir os rótulos do player de áudio?

Sim, com um passo extra. O Polylang expõe uma tela de tradução de strings para plugins que registram suas strings de interface usando pll_register_string(). Se você quer que o botão de play, o rótulo do temporizador ou qualquer outro texto do player mude com o idioma, registre essas strings no seu tema filho ou em um pequeno plugin específico do site. Elas vão aparecer em Idiomas, Traduções de strings.

O que fazer agora

Abra um dos seus posts traduzidos no editor do WordPress e veja o painel de áudio. Se ele já mostra o idioma correto por padrão, a configuração está pronta. Se não, defina a voz naquela tradução, gere novamente e verifique no frontend. Quando uma tradução funcionar, as demais seguem o mesmo padrão.

Se você ainda não instalou o Conversão de Texto em Voz - TTSWP, baixe-o no WordPress.org e conecte-o à sua conta TTSWP gratuita. Teste em uma tradução, ouça e decida se quer expandir para as demais.