Skip to content

Repository files navigation

orelhIA

Transcrição de áudio local, rápida e privada — para agentes MCP.

orelhIA · Parakeet TDT · Docker · Cache LRU · VAD · Métricas · PT-BR nativo

PythonMCPLicense: MITTestsBackend: Parakeet

🇧🇷 Português · 🇺🇸 English · 📐 Architecture · 🤝 Contributing


⚡ TL;DR

# 1. Install (após o MCP já estar configurado)
pip install -e ".[dev,record]"# 2. Bootstrap do container Parakeet (idempotente — Docker + imagem + container)
python -m parakeet_bootstrap
# 3. Transcrever!
python cli/whisper audio.ogg -l pt
# → "Olá, isto é um teste do orelhIA"

Via MCP (no seu agente):

bootstrap_parakeet() # instala e inicia (idempotente)transcribe_file("/tmp/audio.ogg", language="pt")
# → {"text": "Olá, ...", "language": "pt", "duration": 4.5, "_meta": {...}}

✨ Features

CategoriaO que tem
Transcriçãoarquivo local · URL · microfone · com ou sem VAD
Modelos4 modelos Parakeet TDT (CPU + GPU CUDA)
BackendParakeet TDT 0.6B v3, PT-BR nativo (Alefiury/TAGARELA)
PerformanceGPU 5-10× mais rápido que CPU · cache LRU 18.000× speedup em hits
SegurançaSSRF guard · safe redirect handler · MIME map · size limit · FD-safe temp
Observabilidademétricas in-memory (contadores, latência, cache hit rate)
DevExstdlib-only onde possível · type hints · pytest · ruff + mypy
Idempotênciabootstrap re-detecta Docker, imagem, container, daemon

🏗 Arquitetura

flowchart LR
A[Agente MCP] -->|stdio JSON-RPC| B[orelhIA]
B -->|loopback| C[parakeet-ptbr :8022]
B -->|loopback| D[parakeet-gpu :5092]
B --> E[(~/.orelhIA/cache/)]
B --> F[/Métricas/]
Loading

Veja docs/ARCHITECTURE.md para diagramas completos (sequence, layered, security).


🚀 Quick start

1. Pré-requisitos

  • Python 3.10+
  • Docker Desktop (Windows/macOS) ou Docker Engine (Linux)
  • 4 GB RAM mínimo (8 GB recomendado para modelo grande)
  • GPU NVIDIA opcional (CUDA 12.1+ para 5-10× speedup)

2. Instalação

One-liner (recomendado):

# Linux/macOS
curl -fsSL https://raw.githubusercontent.com/evandrodevbr/orelhIA/main/install.sh | bash
# Windows (PowerShell)
irm https://raw.githubusercontent.com/evandrodevbr/orelhIA/main/install.ps1 | iex

Manual (qualquer plataforma, com uv):

git clone https://github.com/evandrodevbr/orelhIA.git
cd orelhIA
uv sync --extra dev --extra record # instala deps no .venv
uv run python -m parakeet_bootstrap # instala Docker + container

Atalhos (Make / uv direto):

# Make (Unix-like, ou GnuWin32 no Windows)
make dev # install + bootstrap + test
make test# pytest
make lint # ruff check
make health # check backend# uv direto (sem make, funciona em qualquer shell)
uv sync # install
uv run pytest # tests
uv run python -m orelhIA # MCP server (stdio)
uv run python -m orelhIA.cli audio.ogg -l pt # CLI standalone

3. Configure o MCP client

Adicione ao seu ~/.pi/agent/mcp.json (ou equivalente):

{
"mcpServers": {
"whisper": {
"command": "C:/Users/Evandro/AppData/Local/Programs/Python/Python312/python.exe",
"args": ["C:/Users/Evandro/.pi/agent/mcp-servers/whisper/server.py"],
"description": "Parakeet TDT transcription via parakeet-gpu container (RTX 3070, CUDA). v3.0",
"timeout": 180,
"lifecycle": "lazy",
"idleTimeout": 10,
"directTools": true,
"environment": {
"ORELHIA_BASE_URL": "http://localhost:5092",
"ORELHIA_MODEL": "alefiury/parakeet-tdt-0.6b-v3-ptBR-TAGARELA-onnx",
"ORELHIA_TIMEOUT": "120",
"ORELHIA_MAX_BYTES": "26214400",
"ORELHIA_CACHE_DIR": "C:/Users/Evandro/.orelhIA/cache",
"ORELHIA_CACHE_MAX_ENTRIES": "128"
}
}
}
}

4. Inicie o backend (idempotente)

python -m parakeet_bootstrap

Saída esperada:

[ 5%] docker.check: Verificando Docker...
[ 15%] docker.check: Docker já instalado e rodando
[ 25%] image.check: Verificando imagem parakeet-tdt:ptbr-cpu...
[ 50%] image.check: Imagem parakeet-tdt:ptbr-cpu já presente
[ 80%] container.reuse: Container parakeet-ptbr já rodando, reusando
[ 75%] health.wait: Aguardando http://localhost:8022/health ficar healthy...
[ 95%] health.wait: healthy após 1 tentativas
[100%] done: Bootstrap completo
[OK] parakeet rodando em http://localhost:8022

5. Use!

# CLI
python cli/whisper audio.ogg -l pt
# MCP (via agente)
transcribe_file("audio.ogg", language="pt")

🛠 Tools (MCP)

ToolO que fazParâmetros
health()Status do backend + features
transcribe_file(path, language?, model?, format?, preprocess?)Arquivo local → textopath (obrigatório), demais opcionais
transcribe_url(url, language?, model?)URL HTTP(S) → textourl (obrigatório)
record_audio(seconds, output_path?, language?, model?, sample_rate?)Microfone → textoseconds (1-600)
get_metrics()Contadores, latência, cache hit rate
clear_cache()Limpa cache LRU
bootstrap_parakeet(port?, image?, container?)Instala Docker + container (idempotente)todos opcionais

Exemplo: transcrição com VAD

transcribe_file(
path="audio_com_silencio.wav",
language="pt",
preprocess="vad", # remove silêncio antes de transcrever
)

Exemplo: resposta de get_metrics()

{
"uptime_seconds": 3600.5,
"requests": {
"total": 150, "success": 147, "error": 3,
"by_tool": {"transcribe_file": 120, "transcribe_url": 25, "record_audio": 3, "health": 2}
},
"cache": {"hits": 35, "misses": 85, "hit_rate": 0.29},
"latency": {"total_ms": 180000.0, "avg_ms": 1200.0},
"bytes_processed": 52428800
}

🐳 Bootstrap (instalar Parakeet)

O script parakeet_bootstrap.py é idempotente — pode rodar várias vezes sem efeito colateral.

SOSuporteComo instala Docker
Windows 10/11winget (ou choco como fallback)
Linux (qualquer)script oficial get.docker.com (com download + sanity cap)
macOSnão suportado por design

Como MCP tool:bootstrap_parakeet()
Como CLI:python -m parakeet_bootstrap

Detecta automaticamente: Docker instalado, daemon rodando, imagem presente, container saudável.


⚙️ Configuração (env vars)

VarDefaultDescrição
ORELHIA_BASE_URLhttp://localhost:5092URL do backend (GPU)
ORELHIA_MODELalefiury/parakeet-tdt-0.6b-v3-ptBR-TAGARELA-onnxModelo padrão
ORELHIA_TIMEOUT120Timeout (segundos)
ORELHIA_MAX_BYTES26214400 (25 MB)Limite de tamanho
ORELHIA_ALLOW_PRIVATE_URLSfalseLibera SSRF guard (apenas dev)
ORELHIA_CACHE_DIR~/.orelhIA/cacheDiretório do cache LRU
ORELHIA_CACHE_MAX_ENTRIES128Máximo de entries no cache
ORELHIA_VAD_RMS_THRESHOLD0.01Limiar RMS do VAD
ORELHIA_RECORD_SAMPLE_RATE16000Sample rate do microfone
ORELHIA_LOG_LEVELINFODEBUG / INFO / WARNING / ERROR

🧪 Testes

pytest # 26 testes
pytest tests/test_parakeet_bootstrap.py # só o bootstrap
pytest --cov=. # com coverage

Stack: pytest + unittest.mock (sem rede, sem Docker).


🐛 Troubleshooting

SintomaCausaFix
health() retorna ok: falseBackend offlinepython -m parakeet_bootstrap
connection_error em transcribe_urlURL inacessível ou SSRF bloqueadaVerifique ORELHIA_BASE_URL; para dev: ORELHIA_ALLOW_PRIVATE_URLS=true
file_too_largeÁudio > 25 MBComprima: ffmpeg -i in.mp3 -b:a 64k out.mp3
private_url_blockedURL em rede localORELHIA_ALLOW_PRIVATE_URLS=true
http_error 503Modelo carregandoAguarde ~30s; retry automático
pyaudio_unavailablePyAudio não instaladopip install pyaudio
GPU travouWSL/Docker adapter caiuwsl --shutdown (admin) + docker start parakeet-gpu

📊 Performance

OperaçãoCPU (TAGARELA)GPU (istupakov)
Transcrição 30s4.8s2.4s (1.4×)
Cache hit<1ms<1ms
Cold start (download modelo)~3min~3min

🤝 Contributing

Veja CONTRIBUTING.md. Resumo:

  1. Fork + branch
  2. Mudanças com testes
  3. pytest + ruff check passam
  4. Atualizar CHANGELOG.md
  5. PR com descrição clara

📜 Licença

MIT — use, modifique, distribua à vontade.


🇨🇳 Créditos


English

🇧🇷 Português · 🇺🇸 English

See README.en.md for the full English version.

About

MCP server for local audio transcription via Parakeet TDT (Portuguese-BR native). Cache LRU + VAD + Docker bootstrap.

Topics

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages