Melissa: Agente de Voz com Memória Cognitiva
Como construí um agente de voz pessoal em Go que implementa extração semântica assíncrona, validação epistêmica de memórias e verificação de identidade vocal.
O que é a Melissa
A Melissa é um agente de voz pessoal escrito em Go. Ela roda como um processo local no meu computador e opera em dois modos: voz (captura de microfone em tempo real) e texto (CLI). O core fica no pacote internal/agent, que orquestra todos os componentes — áudio, LLM, memória, ferramentas e percepção do sistema.
Não é um wrapper de API. A Melissa tem memória persistente, extração semântica autônoma, verificação de identidade vocal e acesso a ferramentas do sistema operacional.
Arquitetura real
O projeto segue a estrutura cmd/ + internal/ de Go. Os pacotes principais:
| Pacote | Responsabilidade |
|---|---|
internal/agent | Orquestrador principal (Melissa struct). Coordena áudio, LLM, ferramentas e sessão |
internal/brain | Sistema cognitivo: Working Memory, Memory Store, Event Bus, Monitores, CommitGate |
internal/cognitive | Shadow Listener (extração semântica assíncrona) e Reflection Engine |
internal/core/memory | Interfaces e tipos de memória (Working, Long-term, Vector Store) |
internal/core/events | Event Bus in-memory com subscribers |
internal/core/perception | Monitores de sistema e janela ativa |
internal/llm | Cliente LLM (OpenRouter) com hook global de telemetria |
internal/session | Sessão de conversa (Deepgram STT + Cartesia TTS + LLM) |
internal/tools | Registry de ferramentas executáveis pelo agente |
internal/stt | Speech-to-Text via Deepgram (streaming WebSocket) |
internal/tts | Text-to-Speech via Cartesia (streaming WebSocket) |
internal/wakeword | Detecção de wake word offline via Vosk |
internal/audio/vad | Voice Activity Detection via Silero (sherpa-onnx) |
internal/audio/speaker | Verificação de identidade vocal via CAM++ (sherpa-onnx) |
Brain: o sistema cognitivo
O Brain é o coração da Melissa. Ele inicializa e conecta:
- Working Memory: Ring buffer de 1000 itens com TTL de 30 minutos. Recebe eventos de mudança de janela, clipboard e comandos executados.
- Memory Store: SQLite para memórias persistentes com metadata estruturada (source, tags, importance, people, projects, topics).
- Vector Store: chromem-go para busca por similaridade. Embeddings gerados via Gemini (768 dimensões).
- Event Bus: In-memory com 1000 de buffer e 4 workers. Conecta monitores à Working Memory.
- Monitores: SystemMonitor (CPU, RAM, a cada 30s), WindowMonitor (janela ativa, a cada 2s), DeepWorkDetector.
- Obsidian Watcher: Monitora o vault local e ingere notas automaticamente no Memory Store.
Shadow Listener — extração semântica em background
O Shadow Listener implementa a ideia do Warp-Cortex: uma goroutine assíncrona que processa transcrições da conversa sem bloquear o pipeline de voz.
O fluxo funcional:
- A cada turno de conversa (
Feed(role, content)), o buffer de sessão é alimentado. - Quando há ≥ 3 turnos acumulados e ≥ 90 segundos desde a última extração, dispara uma goroutine.
- A goroutine envia o diálogo para o LLM com um prompt de extração. O LLM retorna 1–3 insights concisos.
- Cada insight passa por um Validation Gate: verifica se o insight tem overlap léxico real com o diálogo (evita alucinações do LLM).
- Se passar, o insight vai para o CommitGate (ER-MIA) antes de ser persistido.
Além disso, a cada transcrição do usuário, o AnalyzeShadowSentiment roda em paralelo — extrai traços psicológicos estruturados (core_traits, current_anxieties, active_projects, people) e persiste como memória de alta importância.
CommitGate — imunidade epistêmica
Nenhuma memória extraída de forma assíncrona entra no banco sem passar pelo CommitGate. O pipeline tem 3 estágios:
Estágio 1 — Substância: Rejeita conteúdo com menos de 10 caracteres e verifica limite diário (máximo 50 insights shadow_extracted por dia).
Estágio 2 — Redundância (θ_dup = 0.92): Gera embedding do candidato e busca os top-5 vizinhos no vector store. Se algum vizinho tem score de similaridade ≥ 0.92, a memória é considerada duplicata. Em vez de rejeitar, o sistema reforça a memória existente (strength += 0.15).
Estágio 3 — Conflito (θ_conf = 0.75): Para vizinhos com score entre 0.75 e 0.92, compara substância semântica via heurística de negação (pares de opostos em português: “gosta/odeia”, “terminou/não terminou”) e Jaccard similarity sobre tokens limpos. Se detecta contradição, rejeita.
Pipeline de voz
O pipeline de áudio é otimizado para latência:
- Captura: miniaudio (Go bindings), chunks de 64ms (~15.6x/s). Ring buffer de 256KB (~8s de áudio 16kHz mono 16-bit).
- VAD: Silero via sherpa-onnx. Atua como gatekeeper — só deixa áudio com fala passar para o LLM.
- Wake Word: Vosk offline para interceptação local de comandos (“Melissa pare”, “Melissa ativar”, “Melissa encerrar”).
- Speaker Verification: CAM++ via sherpa-onnx. Verifica se a voz atual pertence ao dono cadastrado antes de processar.
- STT: Deepgram via WebSocket streaming.
- LLM: OpenRouter com function calling.
- TTS: Cartesia via WebSocket streaming.
Ferramentas
O agente tem acesso a um registry extensível de ferramentas. As ferramentas implementadas no código:
- filesystem: Leitura, escrita, busca e operações em arquivos
- browser: Controle de navegador via Playwright
- system: Informações do sistema (CPU, RAM, processos, janela ativa)
- media: Captura de tela, OCR, controle de mídia
- obsidian: CRUD de notas no vault
- memory: Busca e salvamento de memórias
- awareness: Contexto atual (Working Memory + monitores)
- vision: Análise de imagens via LLM
- appscanner: Detecção de aplicativos em execução
- mcp: Conexão com servidores MCP externos (incluindo o Ilusion)
Entidades de domínio
O pacote internal/domain define as entidades puras (DDD, sem dependências externas):
- Note — com source (Obsidian, Melissa, user, import), links, backlinks e frontmatter
- Reminder — com regras de repetição (daily, weekly, monthly, yearly), prioridade e snooze
- Project — com tasks, membros e notas relacionadas
- Person — com aliases, contatos, contexto e relações
- Event — com timezone, participantes e vínculo a projetos
- Automation — com triggers (schedule, event, state, manual), ações (tool, speak, notify) e condições
Stack
| Componente | Tecnologia |
|---|---|
| Linguagem | Go 1.25 |
| LLM | OpenRouter (multi-model) |
| STT | Deepgram (WebSocket) |
| TTS | Cartesia (WebSocket) |
| VAD | Silero (sherpa-onnx) |
| Speaker Verification | CAM++ (sherpa-onnx) |
| Wake Word | Vosk (offline) |
| Áudio | miniaudio (malgo) |
| Memória persistente | SQLite (modernc.org/sqlite) |
| Busca vetorial | chromem-go |
| Embeddings | Gemini |
| Automação de browser | Playwright |
| MCP Client | JSON-RPC 2.0 via Stdio |