Assistente de voz para desktop estilo Jarvis, feito em Tauri 2 + React + Rust + Python.
Você ativa o Jarvis com o wake word "Hey Jarvis" (ou digitando no chat), ele transcreve sua fala, entende o que você quer (comando ou conversa livre) e responde por voz — também pode abrir sites, rodar scripts, monitorar o sistema e lembrar de conversas passadas.
O projeto é um monorepo gerenciado com pnpm workspaces:
apps/
desktop/ App desktop (Tauri 2 + React 19 + Vite)
src/ UI React (chat, orbe de status, aba de comandos)
src-tauri/ Camada Rust: áudio, SQLite, despacho de ações, TTS
packages/
vox-core-python/ Pipeline de voz em Python (STT + wake word + LLM)
vox-plugins-sdk/ (placeholder) SDK futuro de plugins
vox.db Banco SQLite com comandos e memória de longo prazo
Fluxo de uma interação:
React UI ──▶ Rust (Tauri) ──▶ Python (vox-pipeline) ──▶ resposta
▲ │ audio/captura │
│ ▼ ├─ Wake word (openwakeword: "Hey Jarvis")
│ TTS (voz em pt-BR) ├─ Transcrição (faster-whisper)
└──── Rust fala a resposta ◀── LLM └─ Intenção (Trie/regex/fuzzy) ou
Llama 3 via Ollama (com RAG + memória)
- O Rust captura o microfone (via
cpal), detecta fala/silêncio (RMS) e envia os chunks de áudio em base64 para o Python via stdin (JSON por linha). - O Python detecta o wake word, transcreve com Whisper, classifica a intenção e devolve o resultado pelo stdout.
- Comandos e memória de longo prazo vivem no SQLite (
vox.db). Conversas são gravadas com embeddings (nomic-embed-text) e recuperadas por similaridade de cosseno (RAG) quando você fala com o Jarvis.
- macOS (o app usa
pbpaste,osascript,afplaye a TTS nativa do sistema) - mise com as ferramentas do
mise.toml(node LTS, pnpm, rust, python 3.11) — ou instale node/pnpm/rust/python manualmente - uv (gerencia o ambiente Python do pipeline)
- Ollama rodando com os modelos
llama3enomic-embed-text
-
Instale as ferramentas com mise (opcional, se você preferir gerenciar manualmente ignore):
mise install
-
Instale e suba o Ollama com os modelos necessários:
ollama pull llama3 ollama pull nomic-embed-text
Mantenha o Ollama rodando em background (o Jarvis depende dele para conversar).
-
Instale as dependências do workspace:
pnpm install
Na primeira execução, o Python também baixa o modelo de transcrição do Whisper (
small) e os modelos de wake word do openwakeword automaticamente.
cd apps/desktop
pnpm tauri devO app abre sem janela visível — procure o ícone Jarvis AI na barra de menu (tray). Clique nele para mostrar/ocultar a janela.
- Clique no ícone 🎙️ Mic ON (canto superior direito) para ligar o microfone.
- Diga "Hey Jarvis" — o orbe fica verde (ouvindo) e você ouve um Tink.
- Fale o comando, ex.: "abrir chrome", "que horas são" ou qualquer conversa: "qual é a capital do Japão?".
- O Jarvis responde por voz e mostra a conversa no chat.
Você também pode digitar no campo do chat em vez de falar.
A aba ⚙️ Comandos mostra as regras cadastradas (a "Árvore de Intenções") e permite adicionar ou remover comandos:
| Campo | Exemplo |
|---|---|
| ID | abrir_youtube |
| Ação | open:https://youtube.com |
| Frases (separadas por vírgula) | abrir youtube, abre o youtube |
| Ação | O que faz | Exemplo |
|---|---|---|
open:<url> |
Abre URL/site | open:https://youtube.com |
sh:<script> |
Executa comando shell/AppleScript | sh:osascript -e 'tell application "Finder" to empty trash' |
llm_clipboard:<instrução> |
Envia o conteúdo do clipboard ao LLM | llm_clipboard:Explique este código: |
sys_info:<instrução> |
Lê CPU/memória e manda o LLM resumir | sys_info:Relate o uso de CPU e memória: |
net_audit:<instrução> |
Lista portas abertas e manda o LLM auditar | net_audit:Analise se há portas suspeitas: |
play_music |
Abre o Spotify | — |
get_time |
Mostra a hora atual | — |
Frases podem ter slots ({query}) para capturar valores. Ex.: com ação open:https://www.youtube.com/results?search_query={query} e frase pesquisar por {query} no youtube, dizer "pesquisar por gatos no youtube" abre a busca.
- Curto prazo: o Jarvis mantém o contexto da conversa atual.
- Longo prazo: cada conversa é salva como memória no SQLite com embedding; nas próximas interações ele recupera as memórias mais parecidas (similaridade > 60%) e usa como contexto (RAG).
- Somente macOS no momento (depende de
pbpaste,osascript,afplay,lsof,tope TTS nativa). - Requer Ollama rodando com
llama3enomic-embed-textpara conversa livre. - Comandos como
sys_info:enet_audit:usam comandos específicos do macOS.
| Caminho | Responsabilidade |
|---|---|
apps/desktop/src/App.tsx |
UI React (chat, orbe, aba de comandos) |
apps/desktop/src-tauri/src/lib.rs |
Orquestração: pipeline Python, áudio, TTS, tray, despacho de ações |
apps/desktop/src-tauri/src/audio.rs |
Captura do microfone (cpal) |
apps/desktop/src-tauri/src/db.rs |
Banco SQLite de comandos |
packages/vox-core-python/src/vox_core_python/cli.py |
Pipeline de voz: wake word, Whisper, LLM, RAG |
packages/vox-core-python/src/vox_core_python/intent.py |
Classificação de intenção (Trie, regex com slots, fuzzy) |