Uma aplicação backend leve e flexível para conversão de fala em texto (speech-to-text) e texto em fala (text-to-speech), criada com FastAPI e containerizada com Docker.
- ✅ API moderna e de alto desempenho com FastAPI
- ✅ Camada de abstração para fácil troca de implementações
- ✅ Suporte a processamento em tempo real via WebSockets
- ✅ Funciona offline (não requer serviços cloud)
- ✅ Facilmente containerizada com Docker
- ✅ Leve e eficiente em recursos
- FastAPI: Framework Python moderno, assíncrono e de alto desempenho
- Vosk (padrão): Leve, funciona offline, boa precisão
- Whisper (alternativa): Alta precisão, suporte para 99 idiomas
- pyttsx3 (padrão): Funciona offline, multiplataforma, simples
- gTTS (alternativa): Baseado no Google TTS, alta qualidade
- Docker com multi-stage build para minimizar tamanho da imagem
A aplicação utiliza uma camada de abstração baseada em interfaces, permitindo fácil intercâmbio entre diferentes implementações de serviços STT e TTS.
┌─────────────────┐ ┌──────────────────┐
│ Cliente │◄────┤ FastAPI (API) │
└────────┬────────┘ └────────┬─────────┘
│ │
│ ▼
│ ┌──────────────────┐
│ │ Interfaces │
│ │ (Abstração) │
│ └────────┬─────────┘
│ │
│ ▼
│ ┌──────────────────┐
│ │Service Factory │
│ └────┬───────┬─────┘
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────┐ ┌─────────┐
│ WebSockets │ │ STT │ │ TTS │
│ (Streaming) │ │Services │ │Services │
└─────────────────┘ └─────────┘ └─────────┘
speech-app/
├── app/
│ ├── main.py # Ponto de entrada FastAPI
│ ├── config.py # Configurações da aplicação
│ ├── dependencies.py # Injeção de dependências
│ ├── interfaces/
│ │ ├── stt_service.py # Interface STT
│ │ └── tts_service.py # Interface TTS
│ ├── factories/
│ │ └── service_factory.py # Factory para criar serviços
│ ├── services/
│ │ ├── stt/ # Implementações de STT
│ │ │ ├── vosk_service.py
│ │ │ └── whisper_service.py
│ │ └── tts/ # Implementações de TTS
│ │ ├── pyttsx3_service.py
│ │ └── gtts_service.py
│ ├── routes/
│ │ ├── stt.py # Endpoints de STT
│ │ └── tts.py # Endpoints de TTS
│ └── models/ # Modelos para Vosk
├── static/ # Frontend demo (opcional)
├── Dockerfile
├── docker-compose.yml
└── requirements.txt
- Criar estrutura de diretórios
- Configurar ambiente virtual Python
- Definir dependências iniciais (requirements.txt)
- Criar estrutura básica do FastAPI
- Definir interfaces para STT e TTS
- Implementar service factory
- Configurar injeção de dependências
- Implementar serviço STT baseado em Vosk
- Implementar serviço TTS baseado em pyttsx3
- Adicionar implementações alternativas (Whisper, gTTS)
- Implementar endpoints REST para processamento de arquivos
- Implementar endpoints WebSocket para streaming
- Adicionar documentação com Swagger/OpenAPI
- Criar Dockerfile otimizado
- Configurar docker-compose para desenvolvimento
- Otimizar para ambiente de produção
- Python 3.10+ (desenvolvimento local)
- Docker e Docker Compose (para containerização)
# Clone o repositório
git clone https://github.com/seu-usuario/speech-app.git
cd speech-app
# Crie um ambiente virtual
python -m venv venv
source venv/bin/activate # No Windows: venv\Scripts\activate
# Instale as dependências
pip install -r requirements.txt
# Baixe os modelos necessários para o Vosk
mkdir -p app/models
# Baixe do site oficial e extraia para app/models/vosk-model-small
# Execute a aplicação
uvicorn app.main:app --reload# Construa a imagem
docker-compose build
# Execute a aplicação
docker-compose up
# A API estará disponível em http://localhost:8000curl -X POST "http://localhost:8000/stt/transcribe" \
-H "accept: application/json" \
-H "Content-Type: multipart/form-data" \
-F "audio=@seu-arquivo-audio.wav"// Exemplo em JavaScript
const socket = new WebSocket('ws://localhost:8000/stt/stream');
// Enviar chunks de áudio
socket.send(audioChunk);
// Receber transcrições
socket.onmessage = (event) => {
console.log('Transcrição:', event.data);
};curl -X POST "http://localhost:8000/tts/synthesize" \
-H "Content-Type: application/json" \
-d '{"text": "Olá, como vai você?", "voice": "pt-BR-AntonioNeural", "speed": 1.2}'- text (obrigatório): O texto a ser convertido em áudio
- voice (opcional): ID ou nome da voz a ser utilizada (por exemplo: "pt-BR-FranciscaNeural", "pt-BR-AntonioNeural", etc)
- speed (opcional): Velocidade da fala, onde 1.0 é velocidade normal, 0.5 é metade da velocidade e 2.0 é o dobro da velocidade
Para adicionar uma nova implementação de serviço:
- Crie uma nova classe que implemente a interface apropriada:
# app/services/tts/nova_implementacao.py
from app.interfaces.tts_service import TextToSpeechService
class NovaImplementacaoTTS(TextToSpeechService):
# Implementar todos os métodos da interface
...- Adicione a nova implementação ao service factory:
# app/factories/service_factory.py
# ...
elif service_type == "nova_implementacao":
return NovaImplementacaoTTS()
# ...- Atualize a configuração para usar o novo serviço:
# Em .env ou diretamente em config.py
TTS_SERVICE_TYPE="nova_implementacao"Este projeto está sob a licença MIT.