# EPUB Corrector RKNN Correttore e revisore di EPUB italiani per Orange Pi 5 Plus / RK3588. La pipeline combina: - LanguageTool locale per generare i candidati; - Hunspell italiano per il controllo lessicale; - modello BERT in formato RKNN FP16 sulla NPU RK3588; - memoria incrementale di approvazioni, rifiuti e parole da preservare; - interfaccia Web per revisione, riscrittura e creazione di una copia EPUB corretta. ## Requisiti verificati - Orange Pi 5 Plus o altro dispositivo RK3588 / RKNPU v2 - Linux aarch64 - Python 3.11 - RKNNLite 2.3.2 - RKNN Runtime 2.3.2 - driver NPU 0.9.8 - Docker per LanguageTool - Git LFS per scaricare il modello RKNN ## Installazione in una nuova directory L'esempio installa il progetto in: ```text /home/nvme/epub-corrector-new ``` ### 1. Installa i pacchetti di sistema ```bash sudo apt update sudo apt install -y \ git \ git-lfs \ python3-venv \ hunspell \ hunspell-it \ unzip git lfs install ``` ### 2. Clona il repository ```bash cd /home/nvme git clone \ 'https://forgit.patachina.it/Fabio/epub_corrector.git' \ epub-corrector-new cd /home/nvme/epub-corrector-new git lfs pull git lfs checkout ``` Per l'autenticazione HTTPS usare: ```text Username: Fabio Password: Personal Access Token di Forgit ``` ### 3. Verifica il modello RKNN Il modello deve misurare circa 214 MB, non pochi byte. ```bash ls -lh \ rknn/bert-pair-v2-eager-fp16.rknn sha256sum -c \ rknn/bert-pair-v2-eager-fp16.sha256 ``` Risultato richiesto: ```text rknn/bert-pair-v2-eager-fp16.rknn: OK ``` Se il modello non è stato scaricato: ```bash git lfs pull git lfs checkout ``` ### 4. Crea l'ambiente Python ```bash cd /home/nvme/epub-corrector-new python3 -m venv .venv-rknn source .venv-rknn/bin/activate python -m pip install --upgrade \ pip \ setuptools \ wheel python -m pip install \ -r requirements-rknn.txt ``` ### 5. Installa RKNNLite 2.3.2 RKNNLite può richiedere la wheel ufficiale Rockchip compatibile con: ```text Python 3.11 Linux aarch64 RK3588 ``` Verifica prima se è già disponibile: ```bash python - <<'PY' from rknnlite.api import RKNNLite print("RKNNLite disponibile") PY ``` Se non è disponibile, trova la wheel usata nella vecchia installazione: ```bash find \ /home/nvme \ /home/orangepi \ -type f \ -iname '*rknn*lite*.whl' \ 2>/dev/null ``` Installala indicando il percorso reale: ```bash python -m pip install \ /percorso/rknn_toolkit_lite2-2.3.2-*.whl ``` Verifica nuovamente l'importazione. ### 6. Crea le directory locali Queste directory non vengono memorizzate nel repository perché possono contenere EPUB o testo protetto da copyright. ```bash mkdir -p \ output \ reports \ runs/ui \ review_memory ``` Inizializza la memoria automatica: ```bash printf '%s\n' \ '{' \ ' "approved": [],' \ ' "sentence_rewrites": [],' \ ' "preserved": [],' \ ' "rejected": []' \ '}' \ > review_memory/auto_memory.json ``` Per importare la memoria da una precedente installazione: ```bash cp \ /vecchia/installazione/review_memory/auto_memory.json \ review_memory/auto_memory.json ``` La memoria precedente è facoltativa e può contenere decisioni specifiche di altri libri. ### 7. Aggiorna i percorsi della nuova installazione Cerca eventuali percorsi assoluti rimasti dalla vecchia directory: ```bash grep -RIn \ '/home/nvme/epub-gec-experiment' \ --include='*.py' \ --include='*.service' \ --include='*.sh' \ --include='*.json' \ . ``` Sostituiscili con il nuovo percorso: ```bash grep -Rl \ '/home/nvme/epub-gec-experiment' \ --include='*.py' \ --include='*.service' \ --include='*.sh' \ --include='*.json' \ . | \ xargs -r sed -i \ 's|/home/nvme/epub-gec-experiment|/home/nvme/epub-corrector-new|g' ``` Verifica: ```bash grep -RIn \ '/home/nvme/epub-gec-experiment' \ --include='*.py' \ --include='*.service' \ --include='*.sh' \ --include='*.json' \ . || echo "Nessun vecchio percorso rimasto" ``` ### 8. Verifica il percorso del tokenizer Il tokenizer incluso nel repository si trova in: ```text assets/tokenizer/tokenizer.json ``` Cerca eventuali riferimenti al vecchio percorso: ```bash grep -RIn \ 'onnx/bert-pair-v2/tokenizer' \ --include='*.py' \ . ``` Se necessario, sostituiscili: ```bash grep -Rl \ 'onnx/bert-pair-v2/tokenizer/tokenizer.json' \ --include='*.py' \ . | \ xargs -r sed -i \ 's|onnx/bert-pair-v2/tokenizer/tokenizer.json|assets/tokenizer/tokenizer.json|g' ``` ### 9. Prepara la cartella degli EPUB Puoi riutilizzare la cartella esistente: ```text /home/orangepi/epub-corrector/input ``` Oppure crearne una nuova: ```bash mkdir -p \ /home/orangepi/epub-corrector-new/input ``` Se usi una nuova cartella, aggiorna `INPUT` in `epub-corrector-ui-app/app.py`: ```bash sed -i \ "s|INPUT=Path('/home/orangepi/epub-corrector/input')|INPUT=Path('/home/orangepi/epub-corrector-new/input')|" \ epub-corrector-ui-app/app.py ``` ### 10. Avvia LanguageTool Se il container esiste già: ```bash sudo docker start languagetool-epub ``` Controlla: ```bash sudo docker ps \ --filter name=languagetool-epub \ --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}' ``` Testa l'endpoint locale: ```bash LT_URL="$( printf 'http:%s127.0.0.1:8010/v2/check' '//' )" curl -sS \ -X POST \ -d 'language=it-IT' \ --data-urlencode 'text=Questa frase contiene un erore.' \ "$LT_URL" \ -o /tmp/languagetool-test.json python -m json.tool \ /tmp/languagetool-test.json | \ head -n 30 ``` La risposta deve contenere `matches`. Se il container non esiste, crealo: ```bash sudo docker run -d \ --name languagetool-epub \ --restart unless-stopped \ -p 127.0.0.1:8010:8010 \ --memory=1200m \ -e Java_Xms=128m \ -e Java_Xmx=768m \ silviof/docker-languagetool ``` ### 11. Verifica la NPU ```bash source /home/nvme/epub-corrector-new/.venv-rknn/bin/activate python - <<'PY' from pathlib import Path from rknnlite.api import RKNNLite model = Path( "rknn/bert-pair-v2-eager-fp16.rknn" ) if not model.exists(): raise SystemExit(f"Modello assente: {model}") rknn = RKNNLite(verbose=False) try: result = rknn.load_rknn(str(model)) print("load_rknn:", result) if result != 0: raise SystemExit(result) result = rknn.init_runtime( core_mask=RKNNLite.NPU_CORE_AUTO ) print("init_runtime:", result) if result != 0: raise SystemExit(result) print("MODELLO NPU PRONTO") finally: rknn.release() PY ``` Il warning relativo a `RKNN_QUERY_INPUT_DYNAMIC_RANGE` può essere ignorato: il modello usa forma statica a 128 token. ## Installazione della Web UI ### 12. Crea il servizio systemd Se la precedente installazione usa ancora la porta 8090, fermala o scegli la porta 8091 per la nuova. Per disabilitare il vecchio servizio: ```bash sudo systemctl disable --now \ epub-corrector-ui ``` Crea un servizio per la nuova directory: ```bash SERVICE_FILE="/etc/systemd/system/epub-corrector-new.service" sudo sh -c "printf '%s\n' \ '[Unit]' \ 'Description=EPUB Corrector New Web UI' \ 'After=network.target docker.service' \ 'Wants=docker.service' \ '' \ '[Service]' \ 'Type=simple' \ 'User=orangepi' \ 'WorkingDirectory=/home/nvme/epub-corrector-new' \ 'ExecStart=/home/nvme/epub-corrector-new/.venv-rknn/bin/python /home/nvme/epub-corrector-new/epub-corrector-ui-app/app.py' \ 'Restart=on-failure' \ 'RestartSec=5' \ 'Environment=PYTHONUNBUFFERED=1' \ '' \ '[Install]' \ 'WantedBy=multi-user.target' \ > '$SERVICE_FILE'" ``` Se vuoi mantenere due installazioni attive, modifica la porta della nuova UI: ```bash sed -i \ 's/port=8090/port=8091/' \ epub-corrector-ui-app/app.py ``` Avvia il servizio: ```bash sudo systemctl daemon-reload sudo systemctl enable --now \ epub-corrector-new sudo systemctl status \ epub-corrector-new \ --no-pager -l ``` Controlla la porta: ```bash sudo ss -ltnp | \ grep -E ':8090|:8091' ``` ### 13. Apri l'interfaccia Trova l'indirizzo dell'Orange Pi: ```bash hostname -I ``` Apri dal browser: ```text http://IP_ORANGE_PI:8090 ``` oppure, se hai scelto la porta alternativa: ```text http://IP_ORANGE_PI:8091 ``` ## Uso 1. Copia gli EPUB italiani senza DRM nella cartella `input`. 2. Apri la Web UI. 3. Avvia LanguageTool, se non è già attivo. 4. Seleziona il libro. 5. Premi **Analizza**. 6. Revisiona i candidati: - **Approva proposta**; - **Salva riscrittura**; - **Mantieni e ricorda**; - **Rifiuta**. 7. Premi **Crea EPUB corretto**. 8. Verifica il file prodotto nella cartella `output`. La memoria viene salvata in: ```text review_memory/auto_memory.json ``` La scansione successiva la carica automaticamente. ## Validazione dell'EPUB prodotto ```bash unzip -t \ output/NOME_LIBRO_ui_reviewed.epub ``` Controlla che `mimetype` sia il primo file e non sia compresso: ```bash unzip -lv \ output/NOME_LIBRO_ui_reviewed.epub | \ head -n 10 ``` Apri infine il file con Calibre, Thorium Reader o KOReader e controlla: - indice e capitoli; - corsivi, link e note; - dialoghi; - riscritture complete; - campioni delle sostituzioni applicate. ## Backup della memoria ```bash cp -p \ review_memory/auto_memory.json \ "review_memory/auto_memory_$(date +%Y%m%d_%H%M%S).json" ``` ## Aggiornamento da Git ```bash cd /home/nvme/epub-corrector-new git pull git lfs pull sha256sum -c \ rknn/bert-pair-v2-eager-fp16.sha256 sudo systemctl restart \ epub-corrector-new ``` ## Comandi del servizio ```bash sudo systemctl start epub-corrector-new sudo systemctl stop epub-corrector-new sudo systemctl restart epub-corrector-new sudo systemctl status epub-corrector-new --no-pager -l sudo journalctl -u epub-corrector-new -f ``` ## File non inclusi nel repository Per ragioni di privacy, copyright e dimensione, il repository non contiene: - EPUB originali o corretti; - report con testo dei libri; - memoria personale; - dataset di addestramento; - ambienti virtuali; - ONNX intermedi; - log. Il modello RKNN pronto è invece incluso tramite Git LFS, insieme al tokenizer necessario.