Convertendo PDF para áudio

Experimentei dois métodos de conversão de arquivos PDF para áudio e comparei a qualidade do resultado.

Code
Python
PDF-to-audio
Autor

Marília Melo Favalesso

Data de Publicação

25 de julho de 2024

Convertendo PDF para áudio!

Transformei um documento PDF sobre o lonomismo na América do Sul (aqui) para áudio.

Primeiramente, o texto foi extraído do PDF utilizando a biblioteca PyPDF2.

Em seguida, realizei a conversão do texto para áudio utilizando duas bibliotecas: pyttsx3 e gTTS (Google Text-to-Speech).

Por fim, avaliei qual dessas bibliotecas produziu o áudio mais natural e de melhor qualidade. Para isso, criei uma função chamada play_first_5_seconds para ouvir os primeiros 5 segundos de cada áudio gerado e realizar a comparação.

Pré-requisitos

Antes de executar o script, certifique-se de que seu sistema possui os seguintes pacotes e bibliotecas instalados:

# Atualização do sistema
sudo apt-get update  

# ferramenta de síntese de fala // utilizada pelo pyttsx3 para converter texto em fala 
sudo apt-get install espeak 

# ferramenta para manipulação de arquivos multimídia, necessária para o processamento de áudio
sudo apt-get install ffmpeg  

# conjunto de ferramentas necessárias para o gerenciamento de áudio no Linux 
sudo apt-get install alsa-utils 

# necessários para garantir que o áudio funcione corretamente no Jupyter Notebook 
sudo apt-get install alsa-base pulseaudio 

Necessário instalar as bibliotecas Python:

# PyPDF2 é uma biblioteca Python puro usada para extração e manipulação de conteúdo PDF.
pip install PyPDF2  

# pyttsx3 é uma biblioteca de conversão de texto em fala (TTS) que funciona offline. É capaz de converter o texto em fala em diferentes vozes disponíveis no sistema.
pip install pyttsx3

# pydub é uma biblioteca simples e fácil de usar que permite manipular áudio com uma interface simples e direta ao Python. Pode ser usado para cortar, dividir ou concatenar arquivos de áudio.
pip install pydub

# gTTS (Google Text-to-Speech) é um módulo Python que interfaceia com o serviço Google Translate para a tradução textual e pode ser usado para converter texto em fala.
pip install gTTs

Extrair as informações do PDF

# Biblioteca 
import os
import PyPDF2

# ---------------------------------------------
# Leitura do PDF
# ---------------------------------------------

# Caminho para o arquivo PDF
diretorio   = os.getcwd() # define o diretório atual 
arquivo_pdf = "texto_teste" # arquivo para leitura 
arquivo     = f'{diretorio}/{arquivo_pdf}.pdf'

# Abrir o arquivo em PDF
file = open(arquivo, 'rb') # abrir arquivo binário 
readpdf = PyPDF2.PdfReader(file) # fazer a leitura do documento
# readpdf.metadata # metadados 

# Percorre cada página do PDF
for pagenumber in range(len(readpdf.pages)):
    # Extrai o texto da página especificada
    page = readpdf.pages[pagenumber]
    text = page.extract_text()

Exemplo de conteúdo em page e text:

page
{'/Type': '/Page',
 '/Parent': {'/Type': '/Pages',
  '/Kids': [IndirectObject(3, 0, 140012445783408),
   IndirectObject(5, 0, 140012445783408)],
  '/Count': 2,
  '/MediaBox': [0, 0, 595.28, 841.89]},
 '/Resources': {'/ProcSet': ['/PDF', '/Text', '/ImageB', '/ImageC', '/ImageI'],
  '/Font': {'/F1': {'/Type': '/Font',
    '/BaseFont': '/Helvetica-Bold',
    '/Subtype': '/Type1',
    '/Encoding': '/WinAnsiEncoding'},
   '/F2': {'/Type': '/Font',
    '/BaseFont': '/Helvetica',
    '/Subtype': '/Type1',
    '/Encoding': '/WinAnsiEncoding'}},
  '/XObject': {}},
 '/Contents': {'/Filter': '/FlateDecode'},
 '/MediaBox': [0, 0, 595.28, 841.89]}
text
'Lonomismo na América do Sul\nterapia intensiva para os casos mais graves.\nPesquisas científicas sobre o veneno de Lonomia têm revelado uma complexa mistura de toxinas\ncom atividades procoagulantes e anticoagulantes. Esses estudos são essenciais para o\ndesenvolvimento de novos tratamentos e para o entendimento dos mecanismos de ação do\nveneno. Além disso, a biologia e ecologia das larvas de Lonomia são áreas de grande interesse\npara os cientistas, visando estratégias de controle e prevenção de acidentes.\nEm resumo, o lonomismo é uma síndrome hemorrágica séria e potencialmente fatal, causada pelo\ncontato com as larvas de Lonomia. A conscientização, prevenção e tratamento adequado são\nfundamentais para a redução dos impactos dessa condição na América do Sul.'

Criar o áudio para leitura

Método 1: pyttsx3

A biblioteca pyttsx3 é uma biblioteca Text-to-Speech (Texto para Fala) multiplataforma para Python, que funciona tanto offline quanto online. Ela suporta vários motores de fala, incluindo SAPI5, nsss e espeak, cada um com suas próprias vantagens, como controle sobre a voz, volume, velocidade da fala e tom. Uma de suas características mais notáveis é o suporte para alteração da voz e propriedades da fala no meio do discurso. Além disso, a pyttsx3 também permite que os usuários salvem o resultado da conversão de texto em voz como um arquivo .wav ou .mp3, fornecendo flexibilidade para várias aplicações. A biblioteca é fácil de usar e fornece um alto grau de personalização, tornando-a uma escolha popular entre os desenvolvedores que precisam de funcionalidades de texto para fala em seus projetos.

# ---------------------------------------------
# Configurar o áudio 
# ---------------------------------------------

import pyttsx3 # Biblioteca para áudiobook

# Iniciar o motor de fala pyttsx3 e armazenar na variável 'speaker'
speaker = pyttsx3.init() 

# Obter a propriedade 'rate' (velocidade da fala) do 'speaker'   
rate = speaker.getProperty('rate')   

# Ajustar a velocidade da fala do 'speaker' para 200
speaker.setProperty('rate', 150)

# Obter a propriedade 'volume' do 'speaker'
volume = speaker.getProperty('volume')

# Ajustar o volume da fala do 'speaker' para 1 (o máximo)
speaker.setProperty('volume', 1)
# Criação de um objeto speaker/falante com pyttsx3.init(), que inicializa o motor de fala.
speaker = pyttsx3.init()

# Obtenção de todas as vozes disponíveis. O método speaker.getProperty('voices') retorna uma lista de vozes disponíveis.
voices = speaker.getProperty('voices')

# Percorre a lista de vozes obtidas anteriormente.
for voice in voices:
    # Verifica se contém "brazil" ou "portuguese" no nome da voz. 
    # Se for verdadeiro, seleciona a voz correspondente.
    if "brazil" in voice.name.lower() or "portuguese" in voice.name.lower():
        # Define essa voz como a voz padrão do falante.
        speaker.setProperty('voice', voice.id)
        break  # Sai do loop uma vez que a voz correta é encontrada.
# Salvar o texto em um arquivo de áudio
speaker.save_to_file(text, 'teste_pyttsx3.mp3')
speaker.runAndWait()

# Stop the speaker
speaker.stop()

Método 2: gTTS

A biblioteca gTTS (Google Text-to-Speech), é uma interface para o serviço de Texto para Fala do Google Translate. Ela permite que os desenvolvedores convertam texto em fala em mais de 100 idiomas e variantes. Com a capacidade de ajustar a velocidade de leitura, a preempção e a ênfase do discurso, a biblioteca gTTS é uma poderosa ferramenta para tornar aplicativos e sites mais acessíveis. Além disso, a biblioteca gTTS suporta a criação de arquivos de áudio mp3 ou wav a partir da saída de texto para voz, tornando-a versátil para vários tipos de projetos que requerem conversão de texto em voz.

from gtts import gTTS

# Crie um objeto gTTS
tts = gTTS(text=text, lang='pt-br')

# Salve o arquivo de saída
tts.save("teste_gtts.mp3")

Comparar os áudios

from pydub import AudioSegment
from IPython.display import Audio

def play_first_5_seconds(file):
    """
    Carrega um arquivo de áudio, corta os primeiros 5 segundos e reproduz o segmento de áudio resultante.

    Args:
        file (str): O caminho para o arquivo de áudio que será carregado. O arquivo deve estar em um formato compatível
                    com a biblioteca pyDub (wav, mp3, ogg, flv, aac, m4a, webm, etc.).

    Returns:
        IPython.lib.display.Audio: Um objeto de áudio que pode ser reproduzido em um Jupyter Notebook. O objeto de áudio contém
                                   os primeiros 5 segundos do arquivo de entrada.
    """
    # Carregar o audio
    audio = AudioSegment.from_file(file)

    # Cortar os primeiros 5 segundos
    cut_audio = audio[:5000]  # PyDub trabalha em milissegundos

    # Exportar o audio cortado
    cut_file = "cut_" + file
    cut_audio.export(cut_file, format="mp3")

    # Tocar o audio cortado
    return Audio(cut_file)
play_first_5_seconds("teste_pyttsx3.mp3")
play_first_5_seconds("teste_gtts.mp3")

Citação

BibTeX
@online{melo_favalesso2024,
  author = {Melo Favalesso, Marília},
  title = {Convertendo PDF para áudio},
  version = {1},
  date = {2024-07-25},
  url = {http://www.mariliafavalesso.com},
  langid = {pt-br}
}
Por favor, cite este trabalho como:
Melo Favalesso, Marília. 2024. “Convertendo PDF para áudio.” July 25, 2024. http://www.mariliafavalesso.com.