Prototyp aplikacji do pracy ze skanami manuskryptów (HTR) oraz tłumaczeniem dokumentów.
- dodawanie i edycja definicji skanów,
- upload obrazu skanu, także serii skanów
- dodawanie tekstów typu
ground_truthimodel_output, - porównanie dwóch wariantów tekstu dla skanu + obliczanie CER i WER,
- dodawanie i edycja dokumentów,
- wiązanie dokumentu ze skanami,
- przechowywanie tekstu źródłowego
- dodawanie wariantów tłumaczenia, w tym tłumaczenia referencyjnego i tłumaczeń wykonanych automatycznie narzędziem np. modelem językowym,
- porównanie dwóch wariantów tłumaczenia + obliczanie metryk BLEU i chrF.
- Python 3.11+
- SQLite
Projekt przygotowywany z użyciem AI (Codex 5.4)
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txtflask --app run.py shellUtworzenie bazy:
flask --app run.py db init
flask --app run.py db migrate -m "init"
flask --app run.py db upgradeStart aplikacji:
python run.pyPraca produkcyjna (nginx + gunicorn):
export SECRET_KEY="zmien-to-na-losowy-sekret"
gunicorn -w 2 -b 127.0.0.1:8000 "run:app"Uwagi wdrożeniowe:
- dla SQLite aplikacja ustawia
WALibusy_timeout, co pomaga przy małej liczbie równoczesnych zapisów, - przy równoczesnej edycji tego samego rekordu druga osoba dostanie komunikat o konflikcie zamiast cichego nadpisania,
- przy pracy w sieci należy ustawić własny
SECRET_KEY.
Logowanie użytkowników:
flask --app run.py create-userJednorazowe wygenerowanie miniaturek dla już istniejących skanów:
flask --app run.py generate-scan-thumbnailsGenerowanie wszystkie od nowa:
flask --app run.py generate-scan-thumbnails --forcePo utworzeniu pierwszego użytkownika logowanie jest dostępne pod /auth/login, a pozostałe widoki wymagają zalogowania.
Automatyczne dopasowanie linii w workspace HTR wymaga klucza API do modelu Gemini (domyślnie używany jest Gemini Pro 3.1 Preview):
GEMINI_API_KEY=twoj-klucz-apiOpcjonalnie można też ustawić inny model (inny wariant Gemini):
GEMINI_ALIGNMENT_MODEL=gemini-3-flash-previewPo ustawieniu klucza w widoku HTR dla wariantu tekstu pojawia się przycisk Dopasuj linie przez AI, który pobiera obraz skanu i bieżący tekst z edytora, wysyła je do modelu Gemini i wstawia wynik z podziałem na wiersze z powrotem do pola edycji.
Automatyczne tłumaczenie dokumentów może korzystać także z modeli OpenAI. W tym przypadku trzeba ustawić klucz API:
OPENAI_API_KEY=twoj-klucz-apiW słowniku parametrów tłumaczeń należy wtedy dodać model z Definicja API = OpenAI API oraz wpisać kod modelu, np. wybrany wariant GPT. Po tej konfiguracji przycisk Przetłumacz automatycznie w formularzu wariantu tłumaczenia wyśle tekst źródłowy dokumentu do OpenAI i wstawi wynik do pola Treść.
Przykładowe pliki wdrożeniowe:
deploy/manuscript-lab.service- usługasystemddlagunicorn,deploy/manuscript-lab.nginx.conf- przykładowy vhostnginx.deploy/backup.sh- prosty backup SQLite, uploadów i.env.
Aplikacja może działać pod prefiksem reverse proxy, np. /manuscriptlab/. W takim wariancie nginx powinien przekazywać:
proxy_set_header X-Forwarded-Prefix /manuscriptlab;Przykładowe wdrożenie na serwerze:
sudo cp deploy/manuscript-lab.service /etc/systemd/system/manuscript-lab.service
sudo cp deploy/manuscript-lab.nginx.conf /etc/nginx/sites-available/manuscript-lab
sudo ln -s /etc/nginx/sites-available/manuscript-lab /etc/nginx/sites-enabled/manuscript-lab
sudo systemctl daemon-reload
sudo systemctl enable --now manuscript-lab
sudo nginx -t
sudo systemctl reload nginxPrzed użyciem należy dostosować:
User,Group,WorkingDirectory,PATHiExecStartwdeploy/manuscript-lab.service,- prefiks URL,
server_nameoraz ścieżkialiaswdeploy/manuscript-lab.nginx.conf, - wartość
SECRET_KEYw usłudzesystemd.
Najprostszy backup dla tej aplikacji obejmuje:
- bazę SQLite
instance/app.db.
Domyślnie skrypt robi kopię tylko bazy danych. To zalecane ustawienie, jeśli pliki skanów są duże i rzadko się zmieniają.
Gotowy skrypt dostępny jest w folderze deploy:
chmod +x deploy/backup.sh
./deploy/backup.shDomyślnie kopie zapasowe trafiają do katalogu backups/ w katalogu projektu i starsze niż 14 dni są usuwane. Można to modyfikować przez zmienne środowiskowe:
BACKUP_DIR=/srv/manuscript-lab-backups RETENTION_DAYS=30 ./deploy/backup.shmożna także jednorazowo dołączyć folder ze skanami lub .env, również poprzez zmienne środowiskowe:
INCLUDE_UPLOADS=1 INCLUDE_ENV=1 ./deploy/backup.shPrzykład wpisu do crontab, uruchamiany codziennie o 02:15:
15 2 * * * cd /sciezka/do/manuscript-lab && /bin/bash ./deploy/backup.sh >> /var/log/manuscript-lab-backup.log 2>&1Podgląd i edycja cron:
crontab -eapp/
blueprints/
models/
services/
templates/
static/
instance/
uploads/scans/
run.py
requirements.txt
README.md
- obrazy skanów są zapisywane na dysku w
instance/uploads/scans/, w podkataloguthumbsgenerowane są miniatury skanów do wyświetlania w widoku skanu - baza SQLite - jest wystarczająca dla prototypu i małego zespołu, dla dużego projektu można pomyśleć o zmianie na np. PostgreSQL.
- konwersja podręcznika użytkownika z formatu md na pdf:
pandoc manual.md -o manual.pdf --pdf-engine=xelatex --toc -V colorlinks=true -V geometry:margin=2cm


















