# � Speech-to-Speech Avatar Microservices Architecture Arquitetura de microserviços para testar e medir latência em pipeline completo de conversação com avatar (Speech-to-Text → LLM → Text-to-Speech → Avatar Animation). ## 📋 Visão Geral Este projeto implementa uma arquitetura de microserviços independentes para simular e testar um sistema completo de conversação com avatar digital. Cada serviço pode ser desenvolvido, testado e escalado independentemente. **Pipeline de Conversação:** ``` Audio → Whisper (STT) → LLM → TTS → MuseTalk → Video ``` ## 🏗️ Arquitetura ``` ┌─────────────────────────────────────────────────────────┐ │ Gateway (Port 8080) │ │ Orchestrates all services & metrics │ └───────────┬─────────────────────────────────────────────┘ │ ┌───────┴───────┬────────────┬────────────┐ │ │ │ │ ┌───▼────┐ ┌────▼─────┐ ┌──▼───┐ ┌────▼──────┐ │Whisper │ │ LLM │ │ TTS │ │ MuseTalk │ │ (STT) │ │ │ │ │ │ (Avatar) │ │Port │ │Port 5002 │ │Port │ │Port 5004 │ │5001 │ │ │ │5003 │ │ │ └────────┘ └──────────┘ └──────┘ └───────────┘ ``` ### 📦 Microserviços | Serviço | Porta | Função | Latência Mock | |---------|-------|--------|---------------| | **Gateway** | 8080 | Orquestra pipeline, métricas | - | | **Whisper** | 5001 | Speech-to-Text | ~75ms | | **LLM** | 5002 | Geração de respostas | ~250ms | | **TTS** | 5003 | Text-to-Speech | ~125ms | | **MuseTalk** | 5004 | Avatar Animation | ~125ms | **Latência Total Esperada:** ~575ms ## 🚀 Instalação e Execução ### ⚠️ Importante para VAST.ai, VST.ai e Cloud GPU Se você está usando **VAST.ai, RunPod, VST.ai ou qualquer plataforma cloud GPU**, **use APENAS a Opção 2 (Execução Local)**. **Por quê?** - ❌ Docker-in-Docker NÃO funciona nesses ambientes - ✅ Scripts Python rodam DIRETAMENTE sem Docker - ✅ Mais rápido e com menos overhead ### Opção 1: Docker Compose (Para desenvolvimento local) ```bash # 1. Clonar repositório git clone cd webrtc-latency-test # 2. Iniciar todos os serviços docker-compose up -d # 3. Verificar status docker-compose ps # 4. Ver logs docker-compose logs -f # 5. Parar serviços docker-compose down ``` ### Opção 2: Execução Local (Recomendado para VST.ai / Runpod) ```bash # 1. Clonar repositório (se necessário) cd webrtc-latency-test # 2. Iniciar todos os serviços ./start-all.sh # 3. Verificar serviços curl http://localhost:8080/health # 4. Parar serviços ./stop-all.sh ``` **Vantagens da Execução Local:** - ✅ Funciona em ambientes containerizados (VST.ai, Runpod, etc.) - ✅ Não requer Docker instalado - ✅ Mais leve e rápido para desenvolvimento - ✅ Cada serviço roda em seu próprio processo Python - ✅ Logs individuais em `/tmp/*.log` ## 🧪 Testando o Sistema ### Teste de Conversação Completa ```bash # Enviar audio para o pipeline completo curl -X POST http://localhost:8080/conversation \ -H "Content-Type: application/json" \ -d '{ "audio_data": "base64_encoded_audio_here", "user_id": "test_user_123" }' ``` **Resposta esperada:** ```json { "transcript": "Olá, como você está?", "llm_response": "Estou muito bem, obrigado por perguntar!", "audio_data": "base64_audio_data", "video_data": "base64_video_data", "latency_ms": { "whisper": 75, "llm": 250, "tts": 125, "musetalk": 125, "total": 575 } } ``` ### Teste de Latência Automatizado ```bash # Executar 10 requisições e calcular estatísticas python3 test_latency.py # Resultados salvos em latency_results.json cat latency_results.json ``` **Exemplo de resultado:** ```json { "total_requests": 10, "successful_requests": 10, "failed_requests": 0, "avg_latency_ms": 575.2, "min_latency_ms": 571.8, "max_latency_ms": 580.1, "breakdown": { "whisper_avg": 75.1, "llm_avg": 250.3, "tts_avg": 125.0, "musetalk_avg": 124.8 } } ``` ### Verificar Métricas ```bash # Métricas de todos os serviços curl http://localhost:8080/metrics ``` ### Testar Serviços Individualmente ```bash # Whisper (STT) curl -X POST http://localhost:5001/transcribe \ -H "Content-Type: application/json" \ -d '{"audio_data": "base64_audio"}' # LLM curl -X POST http://localhost:5002/generate \ -H "Content-Type: application/json" \ -d '{"text": "Olá"}' # TTS curl -X POST http://localhost:5003/synthesize \ -H "Content-Type: application/json" \ -d '{"text": "Olá, tudo bem?"}' # MuseTalk curl -X POST http://localhost:5004/generate \ -H "Content-Type: application/json" \ -d '{"audio_data": "base64_audio"}' ``` ## 📁 Estrutura do Projeto ``` webrtc-latency-test/ ├── README.md # Este arquivo ├── docker-compose.yml # Orquestração Docker ├── start-all.sh # Script para iniciar localmente ├── stop-all.sh # Script para parar serviços ├── test_latency.py # Teste automatizado de latência │ ├── gateway/ # Gateway Orchestrator │ ├── main.py # API FastAPI │ ├── requirements.txt # Dependências │ └── Dockerfile # Container │ ├── services/ # Microserviços │ ├── whisper/ # Speech-to-Text │ │ ├── server.py # Mock Whisper │ │ ├── requirements.txt │ │ └── Dockerfile │ │ │ ├── llm/ # Large Language Model │ │ ├── server.py # Mock LLM │ │ ├── requirements.txt │ │ └── Dockerfile │ │ │ ├── tts/ # Text-to-Speech │ │ ├── server.py # Mock TTS │ │ ├── requirements.txt │ │ └── Dockerfile │ │ │ └── musetalk/ # Avatar Animation │ ├── server.py # Mock MuseTalk │ ├── requirements.txt │ └── Dockerfile │ ├── shared/ # Código compartilhado │ └── proto/ # Protocol Buffers (futuro) │ ├── whisper.proto │ ├── llm.proto │ ├── tts.proto │ └── musetalk.proto │ └── docs/ └── ARCHITECTURE.md # Documentação detalhada ``` ## 🔄 Substituindo Mocks por Implementações Reais Cada serviço mock pode ser substituído independentemente: ### 1. Whisper (Speech-to-Text) ```python # services/whisper/server.py import whisper model = whisper.load_model("base") @app.post("/transcribe") async def transcribe(request: TranscribeRequest): # Decodificar audio audio = decode_audio(request.audio_data) # Transcrever com Whisper real result = model.transcribe(audio) return {"transcript": result["text"]} ``` ### 2. LLM (Large Language Model) ```python # services/llm/server.py from transformers import AutoModelForCausalLM, AutoTokenizer model = AutoModelForCausalLM.from_pretrained("gemma-2b") tokenizer = AutoTokenizer.from_pretrained("gemma-2b") @app.post("/generate") async def generate(request: GenerateRequest): inputs = tokenizer(request.text, return_tensors="pt") outputs = model.generate(**inputs) response = tokenizer.decode(outputs[0]) return {"response": response} ``` ### 3. TTS (Text-to-Speech) ```python # services/tts/server.py from fish_audio import FishAudioTTS tts = FishAudioTTS() @app.post("/synthesize") async def synthesize(request: SynthesizeRequest): audio = tts.generate(request.text) audio_b64 = encode_audio(audio) return {"audio_data": audio_b64} ``` ### 4. MuseTalk (Avatar Animation) ```python # services/musetalk/server.py from musetalk import MuseTalkPipeline pipeline = MuseTalkPipeline() @app.post("/generate") async def generate(request: GenerateRequest): audio = decode_audio(request.audio_data) video = pipeline.generate(audio) video_b64 = encode_video(video) return {"video_data": video_b64} ``` ## � Benchmarks de Latência ### Latências Esperadas (Implementação Real) | Serviço | Mock | Real (GPU) | Real (CPU) | |---------|------|------------|------------| | Whisper | 75ms | 50-150ms | 200-500ms | | LLM | 250ms | 100-300ms | 500-2000ms | | TTS | 125ms | 100-200ms | 300-800ms | | MuseTalk | 125ms | 80-150ms | 500-1500ms | | **Total** | **~575ms** | **330-800ms** | **1500-4800ms** | ### Otimizações para Reduzir Latência 1. **Streaming Pipeline**: Processar em chunks ao invés de esperar resposta completa 2. **GPU Acceleration**: Usar CUDA para Whisper, LLM, TTS e MuseTalk 3. **Model Optimization**: Quantização, pruning, distillation 4. **Caching**: Cache de respostas frequentes (LLM, TTS) 5. **Batch Processing**: Processar múltiplas requisições juntas 6. **Edge Deployment**: Deploy próximo ao usuário ## �️ Desenvolvimento ### Adicionar Novo Serviço ```bash # 1. Criar diretório mkdir -p services/novo-servico # 2. Criar server.py cat > services/novo-servico/server.py << 'EOF' from fastapi import FastAPI from pydantic import BaseModel import uvicorn app = FastAPI() class Request(BaseModel): data: str @app.post("/process") async def process(request: Request): # Sua lógica aqui return {"result": "processed"} if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=5005) EOF # 3. Criar requirements.txt echo "fastapi==0.104.1 uvicorn==0.24.0 pydantic==2.5.0" > services/novo-servico/requirements.txt # 4. Criar Dockerfile cat > services/novo-servico/Dockerfile << 'EOF' FROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY server.py . CMD ["python", "server.py"] EOF # 5. Adicionar ao docker-compose.yml ``` ### Logs e Debug ```bash # Logs de serviço específico docker-compose logs -f whisper docker-compose logs -f gateway # Logs locais tail -f /tmp/whisper.log tail -f /tmp/gateway.log # Acessar container docker-compose exec whisper /bin/bash docker-compose exec gateway /bin/bash ``` ## � Segurança e Produção Para deploy em produção, adicionar: - [ ] Autenticação (JWT, API Keys) - [ ] Rate limiting - [ ] HTTPS/TLS - [ ] Input validation robusta - [ ] Logging estruturado - [ ] Monitoring (Prometheus, Grafana) - [ ] Health checks avançados - [ ] Circuit breakers - [ ] Retry policies ## 📈 Monitoramento ```bash # Health check de todos os serviços curl http://localhost:8080/health # Métricas detalhadas curl http://localhost:8080/metrics | jq # Status individual curl http://localhost:5001/health curl http://localhost:5002/health curl http://localhost:5003/health curl http://localhost:5004/health ``` ## � Solução de Problemas ### Serviço não inicia ```bash # Verificar portas em uso lsof -ti:5001 -ti:5002 -ti:5003 -ti:5004 -ti:8080 # Matar processos pkill -f "python.*server.py" # Reiniciar ./stop-all.sh ./start-all.sh ``` ### Docker não conecta serviços ```bash # Verificar rede Docker docker network ls docker network inspect webrtc-latency-test_default # Recriar containers docker-compose down -v docker-compose up -d --build ``` ### Latência muito alta 1. Verificar logs de cada serviço 2. Testar serviços individualmente 3. Verificar recursos (CPU, RAM, GPU) 4. Verificar rede entre containers ## 📚 Documentação Adicional - [Arquitetura Detalhada](docs/ARCHITECTURE.md) - [API Reference](docs/API.md) (em breve) - [Deployment Guide](docs/DEPLOYMENT.md) (em breve) ## 🎯 Próximos Passos - [ ] Implementar streaming pipeline (chunks) - [ ] Adicionar WebSocket para real-time - [ ] Implementar Whisper real - [ ] Integrar LLM (Gemma, LLaMA) - [ ] Integrar Fish Audio TTS - [ ] Integrar MuseTalk completo - [ ] Adicionar frontend web - [ ] Deploy em Kubernetes - [ ] Adicionar monitoramento (Prometheus/Grafana) ## 📝 Licença MIT License ## 🤝 Contribuições Contribuições são bem-vindas! Abra uma issue ou pull request. --- **Desenvolvido para testar arquitetura de microserviços para conversação com avatar digital** 🎯🤖