Arquitetura Refatorada para STT e TTS
Sprint 4 – Melhorias e Evolução dos serviços de Voz e Linguagem
Objetivo da Sprint
O objetivo desta sprint foi reorganizar a arquitetura do backend para melhorar:
- a forma como os serviços de STT e TTS são executados,
- a organização interna do código,
- a forma como os modelos são carregados e utilizados pelos endpoints.
- a clareza e separação entre endpoints WebSocket e HTTP.
A principal motivação foi reduzir o delay causado pelo carregamento repetido dos modelos e criar uma estrutura mais profissional e escalável.
Problema Identificado na Sprint Anterior
Na sprint anterior, tanto o STT quanto o TTS sofriam de um gargalo crítico:
Carregamento repetido dos modelos a cada requisição
A arquitetura anterior carregava o modelo (STT ou TTS) toda vez que um endpoint era chamado. Esse carregamento dos modelos era a parte mais lenta, causando:
- altos tempos de resposta;
- lentidão perceptível;
- um fluxo ineficiente onde:
- o modelo era carregado,
- só depois executava a inferência,
- só então enviava o resultado.
Esse problema impactava diretamente:
- STT (transcrição de áudio para texto)
- TTS (geração de áudio a partir de texto)
Esse comportamento tornava o uso dos serviços lento e inviável em situações de uso contínuo.
Melhorias Implementadas
Nesta sprint fizemos uma refatoração da arquitetura dos serviços.
Carregamento dos modelos apenas uma vez
Ao iniciar o servidor (main.py), os modelos são carregados apenas uma vez:
stt = STTService()
stt.setup_model()
tts = TTSService()
tts.setup_model()
chat = ChatService()Com isso:
- o delay provocado pelo carregamento do modelo é reduzido,
- as chamadas agora executam apenas a inferência,
- o backend se torna mais rápido, leve e preparado para uso contínuo.
Reorganização dos serviços em Classes (POO)
Os serviços STT, TTS e Chat foram reorganizados em classes específicas:
STT_serviceTTS_serviceChatservice
Cada classe contém:
- o setup do modelo
- métodos de inferência
- utilitários específicos (ex.: text breaker do TTS)
Isso cria uma estrutura modular, reutilizável e fácil de expandir.
Separação correta entre WebSocket e HTTP
Após a refatoração, cada serviço usa o protocolo ideal para sua natureza.
WebSocket – Comunicação Contínua (Streaming)
Utilizado em:
- /tts (Text-to-Speech)
- /stt (Speech-to-Text)
Motivos:
- O TTS envia chunks de áudio conforme gerados.
- O STT recebe partes de áudio progressivamente.
- WebSocket permite comunicação bidirecional e contínua.
HTTP – Comunicação Pontual
Utilizado em:
- POST /chat
Motivo:
- A comunicação com a LLM não exige streaming; é uma operação simples de requisição e resposta.
Funcionamento dos Endpoints
POST /chat (HTTP)
Fluxo:
- Recebe mensagem do usuário
- Encaminha para a LLM via
ChatService - Retorna o texto gerado
Simples e eficiente por não exigir streaming.
TTS → WebSocket
Fluxo:
- Recebe texto via WebSocket
- Divide o texto em frases
- Converte cada frase em áudio
- Envia cada chunk imediatamente
- Finaliza o streaming com a mensagem
"END"
Esse formato permite resposta contínua e mais rápida.
STT → WebSocket
Fluxo:
- Recebe segmentos de áudio do cliente
- Transcreve cada segmento
- Devolve texto progressivamente
Permite transcrição em tempo quase real.
Benefícios na nova arquitetura
-
Redução significativa da latência Ao carregar os modelos apenas uma vez, o backend evita o tempo de inicialização a cada requisição.
-
Streaming otimizado para TTS e STT
- TTS envia áudio por partes conforme gerado.
- STT recebe áudio incrementalmente para transcrição contínua.
-
Arquitetura modular, clara e escalável A separação em classes melhora manutenção, testes e evolução do sistema.
-
Uso correto de protocolos
- WebSocket para fluxos contínuos
- HTTP para operações pontuais
Conclusão
A mudança desta sprint representou uma melhoria estrutural importante no backend. Os modelos agora operam de forma eficiente, a arquitetura está mais organizada e os serviços de STT, TTS e LLM contam com uma base sólida para evolução.
As melhorias implementadas:
- reduziram gargalos estruturais,
- estabeleceu uma forma correta de expor serviços via API,
- padronizou o código interno com POO,
- habilitou streaming eficiente para TTS e STT,
- deixou o sistema mais rápido e escalável.