Como Transformar Artigos em Áudio Automaticamente [2026]

9 min de leitura
Como transformar artigos em áudio automaticamente com TTS

Transformar artigos em áudio manualmente — gravar a voz, editar o áudio, fazer upload, incorporar o player — leva horas. Fazer isso automaticamente leva segundos. Com as ferramentas certas, cada artigo publicado pode ter sua versão em áudio gerada e incorporada no momento da publicação, sem nenhum trabalho manual.

O Fluxo Automático: Do Texto ao Áudio em Segundos

O processo de automação tem quatro etapas:

  1. Extração de texto — o sistema pega o conteúdo do artigo, remove HTML, anúncios e elementos desnecessários
  2. Processamento pela API de TTS — o texto é enviado para uma API de Text-to-Speech que retorna um arquivo MP3/WAV
  3. Armazenamento — o arquivo é salvo em disco ou em cloud storage (S3, Google Cloud Storage) e a URL é registrada
  4. Exibição — o player HTML5 carrega o arquivo e é exibido no artigo automaticamente

Nos próximos tópicos, veja como implementar cada uma dessas etapas.

Opção A: WordPress (Mais Fácil)

Se você usa WordPress, um plugin especializado resolve tudo em alguns cliques. O VoiceXpress, por exemplo, hooks no evento save_post e gera o áudio automaticamente quando você publica ou atualiza um artigo.

Com um plugin de TTS para WordPress você tem:

  • Geração automática na publicação
  • Cache do arquivo para evitar regerar desnecessariamente
  • Player customizável que aparece automaticamente nos posts
  • Regeneração automática quando o texto é editado
  • Geração em lote para posts antigos

Opção B: PHP Manual (Para Qualquer CMS)

Se você não usa WordPress ou quer controle total, aqui está um exemplo de implementação em PHP usando a Google Cloud Text-to-Speech API:

<?php
class ArticleAudioGenerator {
    private string $apiKey;
    private string $audioDir;

    public function __construct(string $apiKey, string $audioDir) {
        $this->apiKey   = $apiKey;
        $this->audioDir = rtrim($audioDir, '/');
    }

    public function generate(int $postId, string $text): string {
        $cacheFile = "{$this->audioDir}/post-{$postId}.mp3";

        // Retorna do cache se já existe
        if (file_exists($cacheFile)) {
            return "/audio/post-{$postId}.mp3";
        }

        // Limpa o texto (remove HTML, múltiplos espaços, etc.)
        $cleanText = $this->sanitizeText($text);

        // Chama a API do Google TTS
        $payload = [
            'input'       => ['text' => $cleanText],
            'voice'       => ['languageCode' => 'pt-BR', 'name' => 'pt-BR-Neural2-A'],
            'audioConfig' => ['audioEncoding' => 'MP3', 'speakingRate' => 0.95],
        ];

        $ch = curl_init('https://texttospeech.googleapis.com/v1/text:synthesize?key=' . $this->apiKey);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
        curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
        $response = curl_exec($ch);
        curl_close($ch);

        $data = json_decode($response, true);
        if (empty($data['audioContent'])) {
            throw new \RuntimeException('TTS API error: ' . $response);
        }

        file_put_contents($cacheFile, base64_decode($data['audioContent']));

        return "/audio/post-{$postId}.mp3";
    }

    private function sanitizeText(string $html): string {
        $text = strip_tags($html);
        $text = html_entity_decode($text, ENT_QUOTES, 'UTF-8');
        $text = preg_replace('/\s+/', ' ', $text);
        return mb_substr(trim($text), 0, 5000); // limite de caracteres
    }
}

// Uso:
$generator = new ArticleAudioGenerator($_ENV['GOOGLE_TTS_KEY'], '/var/www/audio');
$audioUrl   = $generator->generate($post->id, $post->content);
?>

Opção C: Node.js / Next.js (Para Sites Modernos)

// api/generate-audio.js (Next.js API Route ou Express)
import { TextToSpeechClient } from '@google-cloud/text-to-speech';
import fs from 'fs/promises';
import path from 'path';

const client = new TextToSpeechClient();

export default async function handler(req, res) {
  const { postId, text } = req.body;

  const cacheFile = path.join(process.cwd(), 'public', 'audio', `${postId}.mp3`);

  // Verifica cache
  try {
    await fs.access(cacheFile);
    return res.json({ audioUrl: `/audio/${postId}.mp3` });
  } catch {}

  // Gera o áudio
  const [response] = await client.synthesizeSpeech({
    input: { text: text.substring(0, 5000) },
    voice: { languageCode: 'pt-BR', name: 'pt-BR-Neural2-C' },
    audioConfig: { audioEncoding: 'MP3', speakingRate: 0.95 },
  });

  await fs.writeFile(cacheFile, response.audioContent, 'binary');

  return res.json({ audioUrl: `/audio/${postId}.mp3` });
}

Boas Práticas de Automação

1. Filtre o Texto Antes de Enviar

Remova: HTML tags, anúncios, CTAs internos, tabelas de dados densas, URLs brutas e código de programação. O usuário não precisa ouvir "abre tag div fecha barra div". O texto enviado para a API deve ser o que o usuário leria em voz alta.

2. Respeite os Limites de Caracteres

A maioria das APIs tem limite de 5.000 a 10.000 caracteres por requisição. Para artigos longos, divida em partes, gere múltiplos arquivos MP3 e concatene-os com ffmpeg.

3. Regenere Apenas Quando o Texto Mudar

Use um hash do texto (MD5 ou SHA-256) como parte do nome do arquivo de cache. Se o hash não mudou desde a última geração, não regere o áudio — economize créditos de API.

4. Geração Assíncrona para Artigos Longos

A geração de áudio pode levar de 1 a 15 segundos dependendo do tamanho. Use uma fila de jobs (Queue, BullMQ, Laravel Jobs) para não bloquear a publicação do artigo. O player pode mostrar "Áudio sendo gerado..." enquanto o processamento ocorre em background.

Comparativo de APIs de TTS para Automação

API Qualidade (pt-BR) Preço/1M chars Latência
Google Neural2★★★★★~$16~1s
OpenAI TTS-HD★★★★★~$30~2s
Amazon Polly Neural★★★★☆~$16~1s
ElevenLabs★★★★★~$330~3s
Microsoft Azure TTS★★★★☆~$16~1.5s

Conclusão

A automação de áudio é o caminho obrigatório para portais que publicam volume alto de conteúdo. Fazer isso manualmente é inviável — mas fazer automaticamente é simples com as ferramentas certas. O investimento em infraestrutura de TTS se paga rapidamente com o aumento de engajamento e a redução de bounce rate.

Para a implementação em Next.js e React especificamente, veja Como implementar TTS em Next.js, React e PHP. Para o plugin WordPress, explore o VoiceXpress abaixo.

Automatize Seus Artigos com Áudio

VoiceXpress gera áudio automaticamente em cada publicação. Setup em 5 minutos, sem código.

Ver Como Funciona →