Voltar ao Portfolio
Optimus PlatformMedia Processing

Audio Processor

MicrosserviΓ§o de processamento de Γ‘udio com multi-provider STT/TTS, processamento assΓ­ncrono via Celery, storage MinIO e fallback inteligente entre providers.

Multi-ProviderGroq WhisperElevenLabsCeleryMinIO8 Formatos

O Desafio: Áudio em Chatbots Enterprise

🎀 Voice Notes no WhatsApp

UsuΓ‘rios de WhatsApp adoram enviar Γ‘udios. Em alguns segmentos (clΓ­nicas, mais de 40% das mensagens sΓ£o Γ‘udio.

  • ‒Áudios longos (1-3 minutos) com mΓΊltiplas informaΓ§Γ΅es
  • β€’Sotaques regionais, ruΓ­do de fundo, gΓ­rias
  • β€’Expectativa de resposta em Γ‘udio tambΓ©m

⚠️ Problemas Comuns

  • ❌Single provider- se cair, sistema para
  • ❌Processamento sΓ­ncrono- bloqueia a thread
  • ❌Sem fallback- erro = mensagem perdida
  • ❌Custo fixo- mesmo provider pra tudo
  • ❌Formatos limitados- sΓ³ MP3/WAV

Arquitetura Multi-Provider

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                      Audio Processor Architecture                        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

   WhatsApp Voice Note          Web/Mobile Audio           Text Response
           β”‚                          β”‚                         β”‚
           β–Ό                          β–Ό                         β–Ό
   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
   β”‚                      Audio Processor (Port 8002)                  β”‚
   β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
   β”‚  β”‚                    FastAPI + Celery                         β”‚  β”‚
   β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                    β”‚                               β”‚
         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
         β–Ό                     β–Ό         β–Ό                   β–Ό
   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
   β”‚    STT    β”‚         β”‚    STT    β”‚ β”‚    TTS    β”‚   β”‚    TTS    β”‚
   β”‚  Primary  β”‚         β”‚  Fallback β”‚ β”‚  Primary  β”‚   β”‚  Fallback β”‚
   β”‚   Groq    β”‚         β”‚  OpenAI   β”‚ β”‚ElevenLabs β”‚   β”‚  Edge TTS β”‚
   β”‚ Whisper   β”‚         β”‚  Whisper  β”‚ β”‚           β”‚   β”‚           β”‚
   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜         β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         β”‚                     β”‚             β”‚               β”‚
         β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜             β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
                    β”‚                                β”‚
                    β–Ό                                β–Ό
            β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
            β”‚   MinIO     β”‚                  β”‚    Redis    β”‚
            β”‚   Storage   β”‚                  β”‚   + Celery  β”‚
            β”‚ audio-files β”‚                  β”‚   Workers   β”‚
            β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

🎀 STT (Speech-to-Text)

Groq WhisperPrimary

Whisper Large v3 via Groq API. Extremamente rΓ‘pido (hardware dedicado), excelente para portuguΓͺs brasileiro.

OpenAI WhisperFallback

API oficial da OpenAI. Mais lento que Groq, mas extremamente confiΓ‘vel como backup.

Google / Azure / AWSDisponΓ­vel

Providers adicionais configurΓ‘veis para casos especΓ­ficos ou requisitos de compliance.

πŸ”Š TTS (Text-to-Speech)

ElevenLabsPrimary

Model: eleven_multilingual_v2. Vozes ultra-realistas, excelente entonaΓ§Γ£o em portuguΓͺs.

OpenAI TTSFallback

Model: tts-1-hd, Voice: shimmer. Qualidade alta, bom backup quando ElevenLabs indisponΓ­vel.

Edge TTSFree Tier

Voice: pt-BR-FranciscaNeural. Gratuito (Microsoft Edge), usado para desenvolvimento/testes ou fallback de emergΓͺncia.

⚑ Processamento Assíncrono com Celery

Áudio é pesado. Um voice note de 2 minutos pode levar 5-10 segundos para transcrever. Processar sincronamente bloquearia o servidor. A solução:Celery workers dedicados.

πŸ“₯

1. Recebe Áudio

API recebe o arquivo de Γ‘udio (qualquer formato), valida e salva no MinIO. Retorna job_id imediatamente.

βš™οΈ

2. Celery Processa

Worker pega da fila, baixa do MinIO, converte formato se necessΓ‘rio, envia pro provider STT, salva resultado.

πŸ“€

3. Callback/Poll

Resultado disponΓ­vel via polling (GET /status/job_id) ou webhook callback quando configurado.

Fluxo de TranscriΓ§Γ£o

# 1. Cliente envia Γ‘udio
POST /api/v1/transcribe
Content-Type: multipart/form-data
file: voice_note.ogg

# Response imediata (~50ms)
{
  "job_id": "abc123",
  "status": "queued",
  "estimated_seconds": 8
}

# 2. Celery worker processa em background
[Worker] Downloading from MinIO: voice_note.ogg
[Worker] Converting OGG β†’ WAV (ffmpeg)
[Worker] Sending to Groq Whisper...
[Worker] Transcription complete: "Oi, quero marcar uma consulta..." "Hi, I want to schedule an appointment..."
[Worker] Saving result to Redis

# 3. Cliente verifica status
GET /api/v1/status/abc123

{
  "job_id": "abc123",
  "status": "completed",
  "transcription": "Hi, I want to schedule an appointment for tomorrow at 10am",
  "duration_seconds": 12.5,
  "provider": "groq",
  "confidence": 0.97
}

🎡 8 Formatos de Áudio Suportados

WhatsApp usa OGG/OPUS. Navegadores usam WebM. iPhones usam M4A. O Audio Processor aceita qualquer um e converte internamente via FFmpeg.

🎡
MP3
Mais comum
🎡
WAV
Sem compressΓ£o
🎡
OGG
WhatsApp Android
🎡
OPUS
WhatsApp codec
🎡
M4A
iPhone/AAC
🎡
FLAC
Lossless
🎡
AAC
Alta qualidade
🎡
WMA
Windows legacy

ConversΓ£o AutomΓ‘tica

O sistema detecta o formato automaticamente (magic bytes, nΓ£o extensΓ£o). Se o provider STT nΓ£o suporta o formato, converte para WAV via FFmpeg antes de enviar. Tudo transparente para o chamador.

πŸ“¦ Storage com MinIO

Por que MinIO?

  • βœ“S3-compatible- mesma API do AWS S3, sem vendor lock
  • βœ“Self-hosted- dados ficam no seu controle
  • βœ“High performance- otimizado para arquivos mΓ©dios
  • βœ“Web console- UI para debug e gestΓ£o

ConfiguraΓ§Γ£o

MINIO_ENDPOINT=minio:9000
MINIO_ACCESS_KEY=minioadmin
MINIO_SECRET_KEY=*****
MINIO_BUCKET=audio-files
MINIO_USE_SSL=false

# Console de gestΓ£o
# http://localhost:9003

Lifecycle do Arquivo

πŸ“₯
Upload
Cliente envia
πŸ’Ύ
Store
MinIO salva
βš™οΈ
Process
Worker baixa, processa
πŸ—‘οΈ
Cleanup
TTL expira, deleta

πŸ”„ Fallback Inteligente

Providers de IA falham. Groq pode ter pico de latΓͺncia, ElevenLabs pode estar em manutenΓ§Γ£o. O sistema tenta automaticamente o prΓ³ximo provider na cadeia de fallback.

# Cadeia de fallback STT
TRANSCRIPTION_SERVICE=groq  # Primary

try:
    result = groq_whisper.transcribe(audio)
except (Timeout, RateLimitError, ServiceUnavailable):
    logger.warning("Groq failed, falling back to OpenAI")
    result = openai_whisper.transcribe(audio)
except Exception:
    logger.error("All STT providers failed")
    raise AudioProcessingError("Transcription unavailable")

# Cadeia de fallback TTS
TTS_SERVICE=elevenlabs  # Primary

try:
    audio = elevenlabs.synthesize(text)
except (Timeout, QuotaExceeded):
    logger.warning("ElevenLabs failed, falling back to OpenAI")
    audio = openai_tts.synthesize(text)
except Exception:
    logger.warning("Paid TTS failed, using free Edge TTS")
    audio = edge_tts.synthesize(text)  # Always available
⏱️

Timeout Detection

Se provider nΓ£o responde em 30s, assume falha e tenta prΓ³ximo.

πŸ’°

Quota Handling

Rate limit ou quota excedida? Fallback automΓ‘tico sem perder a mensagem.

πŸ†“

Free Tier Backup

Edge TTS Γ© gratuito e sempre disponΓ­vel como ΓΊltimo recurso.

🏒 Configuração por Tenant

Cada tenant pode ter configuraΓ§Γ΅es de TTS personalizadas: voz diferente, provider preferido, velocidade de fala. Armazenado no Memory Engine e carregado em runtime.

Exemplo: ClΓ­nica Dental

{
  "tenant_id": "clinica_sp",
  "tts_config": {
    "provider": "elevenlabs",
    "voice_id": "mPDAoQyGzxBSkE0OAOKw",
    "model": "eleven_multilingual_v2",
    "speed": 1.0,
    "stability": 0.5,
    "similarity_boost": 0.75
  }
}

Exemplo: E-commerce

{
  "tenant_id": "loja_xyz",
  "tts_config": {
    "provider": "openai",
    "voice": "shimmer",
    "model": "tts-1-hd",
    "speed": 1.1,
    "response_format": "opus"
  }
}

πŸ“± IntegraΓ§Γ£o com WhatsApp

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    WhatsApp Voice Note Flow                              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

  Cliente envia Γ‘udio          Audio Processor           AI Engine
         β”‚                           β”‚                       β”‚
         β–Ό                           β”‚                       β”‚
   Evolution API                     β”‚                       β”‚
         β”‚                           β”‚                       β”‚
         β–Ό                           β”‚                       β”‚
   WhatsApp Integration              β”‚                       β”‚
         β”‚                           β”‚                       β”‚
         β”‚  POST /transcribe         β”‚                       β”‚
         │──────────────────────────▢│                       β”‚
         β”‚                           β”‚                       β”‚
         β”‚  { job_id: "abc" }        β”‚                       β”‚
         │◀──────────────────────────│                       β”‚
         β”‚                           β”‚                       β”‚
         β”‚       [Celery processa]   β”‚                       β”‚
         β”‚                           β”‚                       β”‚
         β”‚  GET /status/abc          β”‚                       β”‚
         │──────────────────────────▢│                       β”‚
         β”‚                           β”‚                       β”‚
         β”‚  { text: "I want..." }    β”‚                       β”‚
         │◀──────────────────────────│                       β”‚
         β”‚                           β”‚                       β”‚
         β”‚  POST /chat (text)        β”‚                       β”‚
         │───────────────────────────────────────────────────▢
         β”‚                           β”‚                       β”‚
         β”‚                           β”‚  { response: "..." }  β”‚
         │◀───────────────────────────────────────────────────
         β”‚                           β”‚                       β”‚
         β”‚  POST /synthesize         β”‚                       β”‚
         │──────────────────────────▢│                       β”‚
         β”‚                           β”‚                       β”‚
         β”‚  { audio_url: "..." }     β”‚                       β”‚
         │◀──────────────────────────│                       β”‚
         β”‚                           β”‚                       β”‚
         β–Ό                           β”‚                       β”‚
   Evolution API                     β”‚                       β”‚
         β”‚                           β”‚                       β”‚
         β–Ό                           β”‚                       β”‚
   Cliente recebe Γ‘udio              β”‚                       β”‚

Modo de Resposta ConfigurΓ‘vel

audio

Sempre responde em Γ‘udio. Ideal para usuΓ‘rios que preferem ouvir.

text

Sempre responde em texto. Economia de custo de TTS.

match

Responde no mesmo formato que recebeu (Γ‘udio β†’ Γ‘udio, texto β†’ texto).

Resultados

99.5%
Uptime TranscriΓ§Γ£o
Com fallback multi-provider
<3s
TranscriΓ§Γ£o (1min Γ‘udio)
Groq Whisper P95
8
Formatos Suportados
ConversΓ£o automΓ‘tica
5
Providers TTS
Incluindo free tier

Stack TΓ©cnico

Framework

FastAPI + Uvicorn

Task Queue

Celery + Redis

Storage

MinIO (S3-compatible)

Audio Processing

FFmpeg

STT Primary

Groq Whisper Large v3

TTS Primary

ElevenLabs Multilingual v2

TTS Backup

OpenAI TTS-1-HD

TTS Free

Edge TTS (Microsoft)

Precisa de processamento de Γ‘udio?

STT, TTS, conversΓ£o de formatos, integraΓ§Γ£o com chatbots - tenho experiΓͺncia com os desafios de produΓ§Γ£o.