Aplicação simples em Python para ler arquivos PDF utilizando o modelo de voz aberto Kokoro. Tudo roda localmente: você escolhe o PDF, o aplicativo gera o áudio com voz em Português do Brasil e toca diretamente na interface.
Escolha uma das opções abaixo:
O modelo Kokoro é baixado automaticamente na primeira execução, mas você pode antecipar esse passo com python scripts/download_models.py (detalhes abaixo).
python -m venv .venv
source .venv/bin/activate # Linux/macOS
# ou .venv\Scripts\activate no Windows
pip install --upgrade pip
pip install -r requirements.txtpython scripts/download_models.pyO script respeita as variáveis KOKORO_CACHE_DIR ou HF_HOME. Caso queira salvar os arquivos em outro local, informe --cache-dir /caminho/dos/modelos.
python app.pyDica: existe um
Makefilecom alvosmake install,make download-models,make run(Tkinter) emake run-web(Flask) para automatizar os passos acima.
- Clique em Selecionar... e escolha o PDF desejado.
- Selecione uma das vozes em Português do Brasil disponíveis.
- Pressione Ler para iniciar. O texto será convertido em áudio e tocado em tempo real.
- Utilize os botões Pausar, Continuar e Parar para controlar a reprodução.
O áudio é gerado em streaming, bloco a bloco, facilitando a leitura de documentos grandes. A fila de processamento aparece no painel de status.
python web_app.py --host 0.0.0.0 --port 7860Abra http://localhost:7860 no navegador para enviar o PDF, escolher a voz e tocar ou baixar o áudio gerado.
Os arquivos WAV gerados ficam em generated/ (ou no diretório configurado via GENERATED_DIR).
Um Dockerfile está incluído para facilitar a auto-hospedagem. Ele já instala dependências do sistema, Python e baixa o modelo Kokoro para /models. Há também um docker-compose.yml pronto para reproduzir a mesma configuração com um único comando.
docker build -t openpdf2voice .Ou utilize o Docker Compose para construir e executar automaticamente:
docker compose up --buildO container inicia a aplicação Flask por padrão. Após subir, acesse http://localhost:7860 para utilizar a interface web.
docker run \
--rm \
-p 7860:7860 \
-v "$PWD/models:/models" \
openpdf2voicedocker compose upO serviço já expõe a porta 7860 e persiste o cache de modelos em ./models. Use docker compose build para apenas construir a imagem e docker compose down para encerrar/remover containers.
Caso ainda deseje abrir a versão Tkinter dentro do container, sobrescreva o comando e compartilhe o X11/áudio manualmente:
xhost +local:docker || true
docker run \
--rm \
--net=host \
-e DISPLAY=$DISPLAY \
-v /tmp/.X11-unix:/tmp/.X11-unix \
--device /dev/snd \
-v "$PWD/models:/models" \
openpdf2voice python app.pyNo Docker Compose, altere o comando do serviço para python app.py e adicione os mapeamentos equivalentes.
docker run --rm -v "$PWD/models:/models" openpdf2voice python scripts/download_models.py --cache-dir /modelsKOKORO_MODEL: altera qual repositório/modelo será carregado (padrão:hexgrad/Kokoro-82M).KOKORO_CACHE_DIR: diretório onde os arquivos do modelo serão salvos/consultados.KOKORO_OFFLINE=1: força modo offline, falhando se os arquivos não estiverem previamente baixados.HF_HOME: diretório padrão utilizado pelo Hugging Face; é usado como fallback do cache.GENERATED_DIR: caminho onde a interface web salva os arquivos WAV gerados (padrão:./generated).APP_SECRET_KEY: segredo utilizado pelo Flask para sessões/flash; personalize em produção.
As vozes pré-configuradas foram retiradas do arquivo VOICES.md, com ênfase em vozes claras e naturais em Português Brasileiro. Você pode acrescentar novas vozes editando o método _load_voices em tts_engine.py.
Este projeto é distribuído sob licença MIT. Consulte o arquivo LICENSE para detalhes.