Búsqueda de capturas de pantalla locales en Wayland sin IA
Los scripts de Bash permiten capturar pantallas con extracción automática de texto mediante OCR y búsqueda basada en contenido, sin necesidad de redes neuronales ni servicios en la nube. Diseñado para entornos Wayland usando grim, slurp, tesseract y tofi. Cada captura se guarda junto a un archivo .txt complementario con el texto extraído, ideal para indexación y recuperación rápida.
Herramientas requeridas:
- grim: captura de pantalla
- slurp: selección de región
- tesseract: motor OCR
- tofi: interfaz de búsqueda
- wl-clipboard y cliphist: gestión del portapapeles
- notify-send: notificaciones de escritorio
screen.sh: Script de captura y OCR
Este script captura una región seleccionada de la pantalla, la guarda como PNG y ejecuta tesseract en segundo plano para generar un archivo de texto auxiliar. Soporta reconocimiento de idiomas ruso e inglés.
#!/bin/bash
set -euo pipefail
SCREENSHOT_DIR="${SCREENSHOT_DIR:-$HOME/Pictures/screens}"
OCR_LANG="${OCR_LANG:-rus+eng}"
SLURP_ARGS=(-d -b 1B1F2866 -c 89b4faff -w 1)
GRIM_ARGS=(-t png -l 3)
die() { notify-send "screen.sh" "$1" -i dialog-error -t 4000; exit 1; }
need() { for cmd in " $@"; do command -v "$cmd" &>/dev/null || die "missing: $cmd"; done; }
Función OCR con limpieza de resultados:
run_ocr() {
tesseract "$1" - -l "$OCR_LANG" --psm 3 2>/dev/null \
| grep -v '^[[:space:]]*$' \
| sed 's/[[:space:]]\+/ /g; s/^ //; s/ $//'
}
save_sidecar() {
run_ocr "$1" > "${1%.png}.txt" 2>/dev/null || true
}
El OCR se ejecuta en segundo plano: command -v tesseract &>/dev/null && { save_sidecar "$FILEPATH" & disown; }. Las notificaciones son interactivas y ofrecen opciones para abrir la carpeta, editar con swappy o copiar el texto al portapapeles.
El modo --ocr copia directamente el texto extraído sin guardar archivo.
ssearch.sh: Script de indexación y búsqueda
Soporta tres modos:
--index: procesar archivos PNG existentes sin archivos .txt auxiliares--list: generar salida TSV con ruta, marca de tiempo y fragmento de texto- Modo principal: búsqueda difusa mediante tofi
Lógica de indexación:
if [[ "${1:-}" == "--index" ]]; then
while IFS= read -r png; do
txt="${png%.png}.txt"
[[ -f "$txt" ]] && continue
run_ocr "$png" > "$txt" 2>/dev/null || true
done < <(find "$SCREENSHOT_DIR" -name "screenshot-*.png" -type f | sort)
fi
Generación de lista:
if [[ "${1:-}" == "--list" ]]; then
while IFS= read -r txt; do
png="${txt%.txt}.png"
[[ -f "$png" ]] || continue
base=$(basename "$txt" .txt)
dt="${base#screenshot-}"
stamp="${dt:0:10} ${dt:11:2}:${dt:13:2}:${dt:15:2}"
snippet=$(head -3 "$txt" | tr '\n' ' ' | cut -c1-120)
printf '%s\t%s\t%s\n' "$png" "$stamp" "$snippet"
done < <(find "$SCREENSHOT_DIR" -name "screenshot-*.txt" -type f | sort -r)
fi
La búsqueda se envía a tofi con coincidencia difusa y ancho de 1100px. Los resultados seleccionados copian el texto al wl-clipboard y abren la imagen con xdg-open.
Instalación e integración
Instalar en Arch:
sudo pacman -S grim slurp tesseract tesseract-data-rus wl-clipboard libnotify swappy
Hacer los scripts ejecutables y asignar atajos en Hyprland:
bind = , Print, exec, ~/wayland/scripts/screen.sh
bind = SHIFT, Print, exec, ~/wayland/scripts/screen.sh --ocr
bind = SUPER, F, exec, ~/wayland/scripts/ssearch.sh
Para capturas antiguas: ./ssearch.sh --index.
Puntos clave
- El OCR se ejecuta de forma asíncrona, nunca bloquea la interfaz; el PSM 3 es ideal para pantallas con contenido mixto.
- tofi maneja con elegancia las imprecisiones del OCR gracias a su coincidencia difusa.
- Siempre se crean archivos auxiliares, incluso vacíos, para garantizar un índice confiable.
- Sin dependencias de IA ni nube; solo herramientas Unix puras.
- Adaptado específicamente para Wayland + tofi; adaptar a GNOME/KDE requiere reemplazar el lanzador.
Limitaciones y mejoras
Tesseract tiene dificultades con fuentes pequeñas en temas oscuros—prueba ajustes PSM/OEM. La búsqueda es puramente basada en cadenas, sin comprensión semántica. Para capturas rotadas, configura un cron o systemd-timer para eliminar archivos mayores de N días.
— Editorial Team
Aún no hay comentarios.