OCR multilíngue, local e offline: selecione uma região da tela e o texto vai para a área de transferência.
Português (Brasil) · English
ocr é uma ferramenta de reconhecimento óptico de caracteres para uso diário no
desktop Linux/Wayland. Um daemon residente (ocrd) mantém os modelos
carregados na memória e um cliente minúsculo (ocrd-client) envia uma imagem
por um socket Unix e imprime o texto reconhecido. O caso de uso central é um
atalho de teclado: recorte uma parte da tela, o texto aparece na área de
transferência.
Por baixo:
- Rust puro em runtime — nenhum Python, nenhuma chamada de rede. É um
workspace Cargo com quatro crates:
ocr-proto(tipos do protocolo),ocr-core(única fronteira que toca emoar-ocr/ort),ocrd(daemon) eocrd-client(cliente). - Modelos PP-OCRv5 servidos via
oar-ocrsobre o ONNX Runtime, que é linkado estaticamente — os binários instalados rodam de qualquer lugar sem.sovizinho. - Um detector + três reconhecedores residentes (~41 MiB): CJK (japonês, chinês, inglês), coreano e latino (português, espanhol, francês, alemão).
- Idioma automático com fallback por confiança — em
--lang auto, o reconhecedor CJK roda em todas as caixas; as caixas de baixa confiança (< 0.6) são repassadas aos reconhecedores coreano e latino, e o melhor resultado vence. - CPU por padrão. Aceleração por GPU é opção explícita via
--accel auto|cpu|cuda|openvino|webgpu|directml, sempre sondada antes de ser usada e fatal se indisponível (sem fallback silencioso). - Integração com Wayland:
grim+slurp+wl-clipboard, binds de Hyprland e uma unitsystemd --userprontas emcontrib/.
O racional de projeto e as alternativas descartadas estão em
docs/reports/OCR-MULTILINGUE-ANALISE-DE-VIABILIDADE.md.
Criei este projeto para remover um bloqueio pessoal: não conseguir ter — nem fazer — um OCR local que realmente prestasse. E, junto disso, para reconstruir uma função de que eu gostava e usava bastante no PowerToys, agora no meu próprio ambiente Linux/Wayland.
- Rust 1.95+ (edição 2021; a máquina de referência usa 1.97).
- Conexão à internet na primeira compilação (o
ortbaixa o ONNX Runtime) e no primeiroocrd --warm(~41 MiB de modelos PP-OCRv5, gravados em~/.oar). - Para o fluxo "print → OCR → área de transferência" no Wayland: grim, slurp, wl-clipboard.
- Opcional — GPU: NVIDIA com cuDNN 9 para
--features cuda. Intel (openvino) e Windows (directml) exigem um ONNX Runtime de sistema — ver a tabela de aceleração no fim desta seção.
- Clone o repositório do projeto:
git clone https://github.com/bgluis/ocr.git- Navegue até o diretório do projeto:
cd ocr- Escolha um dos métodos abaixo.
Instala os dois binários em ~/.cargo/bin e baixa os modelos uma vez:
cargo install --path crates/ocrd # -> ~/.cargo/bin/ocrd (~29 MiB)
cargo install --path crates/ocrd-client # -> ~/.cargo/bin/ocrd-client (~1 MiB)
ocrd --warm # baixa os modelos para ~/.oar
# opcional: wrapper que sobe o ocrd sob demanda, sem systemd
install -Dm755 contrib/ocr ~/.local/bin/ocrcargo build --release # LTO, binários em ./target/release
cargo run -p ocrd -- --warm # baixa os modelos
./target/release/ocrd --accel auto # sobe o daemonPara GPU, adicione a feature correspondente ao construir o ocrd:
cargo build --release -p ocrd --features cuda (ou openvino / directml).
# 1. Deixe o daemon rodando (terminal ou systemd)
ocrd --accel auto
# 2. Em qualquer lugar: recorte a tela, reconheça, copie
grim -g "$(slurp)" - | ocrd-client --lang auto | wl-copy
# Ou a partir de um arquivo, com a resposta JSON completa
ocrd-client --file shot.png --lang latin --jsonInstalar o serviço e os atalhos do Hyprland:
cp contrib/ocrd.service ~/.config/systemd/user/ && systemctl --user enable --now ocrd
cat contrib/hyprland.conf.example >> ~/.config/hypr/hyprland.confOpções principais do ocrd-client:
| Flag | Significado |
|---|---|
--lang |
auto (padrão), cjk / ja / zh / en, korean / ko, latin / pt / es / fr / de |
--file PATH |
lê a imagem de um arquivo em vez do stdin |
--json |
resposta completa (linhas, confiança por linha, bboxes, tempo) |
--verbose |
confiança por linha no stderr, texto no stdout |
--ping |
sai com 0 se o ocrd está acessível; não lê imagem |
O projeto não usa .env; o comportamento é ajustado por estas variáveis:
| Variável | Padrão | Função |
|---|---|---|
OCRD_SOCKET |
$XDG_RUNTIME_DIR/ocrd.sock |
Caminho do socket Unix |
OCRD_ACCEL |
auto |
auto|cpu|cuda|openvino|webgpu|directml |
OAR_HOME |
~/.oar |
Cache dos modelos ONNX |
OCRD_BIN / OCRD_CLIENT |
achados no PATH |
Binários usados pelo wrapper contrib/ocr |
OCRD_OPENVINO_DEVICE |
GPU |
Dispositivo alvo do OpenVINO |
RUST_LOG |
ocrd=info,ocr_core=info |
Verbosidade de log |
OCR_REQUIRE_MODELS |
— | Se definida, os testes de reconhecimento falham (em vez de pular) quando os modelos faltam |
cargo test # unitários + lógica, sem modelos
cargo run -p ocrd -- --warm # baixa os modelos
OCR_REQUIRE_MODELS=1 cargo test -p ocr-core --test recognition| Fornecedor | Flag | Build | Situação com o ONNX Runtime pré-compilado |
|---|---|---|---|
| NVIDIA | --accel cuda |
--features cuda |
Funciona, dado cuDNN 9 + libcudart.so.12 no host. |
| Intel (iGPU / Arc / NPU) | --accel openvino |
--features openvino |
Não linka com o ORT baixado; precisa de um ONNX Runtime de sistema com OpenVINO (ORT_STRATEGY=system). |
| AMD no Linux | --accel webgpu |
(sem flag) | Precisa de um ONNX Runtime compilado do zero com WebGPU/Dawn; até lá, erro limpo e fatal. |
| Windows, qualquer GPU | --accel directml |
--features directml |
Como o OpenVINO: exige um ORT de sistema com o EP DirectML. Só Windows. |
--accel auto só tenta CUDA e cai para CPU (com o motivo registrado no log);
nunca escolhe um backend de fornecedor silenciosamente.