MyScribe - приложение для распознавания рукописного русского текста с телефона. Проект состоит из Flutter-клиента и Python FastAPI backend. Телефон отправляет фото на backend, backend распознает текст выбранным OCR-движком, после чего приложение сохраняет документ локально.
myscribe_app- Flutter-приложение для Android, Windows и других платформ.myscribe_backend- OCR API на FastAPI.myscribe_backend/trocr-handwritten-cyrillic- локальная папка модели TrOCR.myscribe_backend/dataset- локальные исправления пользователя и фрагменты изображений для сбора данных. Дообучение в текущем проекте не запускается.
В приложении на экране API и сервер можно выбрать один из двух режимов:
TrOCR- основной режим по умолчанию. EasyOCR ищет строки, TrOCR распознает crop-строки. Обычно лучше подходит для рукописного текста, но тяжелее.PaddleOCR- optional альтернативный локальный режим. Он подключается только при выбореengine=paddleи рассчитан на CPU-first установку.
PaddleOCR не является обязательной зависимостью. Обычный backend с TrOCR должен стартовать и работать без установленного PaddleOCR.
Установить зависимости:
cd C:\Users\pvppv\Desktop\roo\MyScribe\myscribe_backend
python -m pip install -r requirements.txtОпционально установить PaddleOCR:
cd C:\Users\pvppv\Desktop\roo\MyScribe\myscribe_backend
python -m pip install -r requirements-paddle.txt
python .\tools\warmup_paddle.pyЗапустить backend для телефона по USB через adb reverse:
cd C:\Users\pvppv\Desktop\roo\MyScribe\myscribe_backend
python -m uvicorn main:app --host 127.0.0.1 --port 8000Запустить backend для показа через Tailscale или локальную сеть:
cd C:\Users\pvppv\Desktop\roo\MyScribe\myscribe_backend
python -m uvicorn main:app --host 0.0.0.0 --port 8000Проверить состояние backend:
curl http://127.0.0.1:8000/healthОжидаемый ответ содержит status, device, cuda_available,
model_loaded, состояние папки модели и dataset. Новый ответ также содержит
default_engine и engines.trocr / engines.paddle.
Пример OCR-запроса с PaddleOCR:
curl -X POST -F "engine=paddle" -F "file=@sample.jpg" http://127.0.0.1:8000/ocrБез поля engine backend использует trocr.
Установить зависимости Flutter:
cd C:\Users\pvppv\Desktop\roo\MyScribe\myscribe_app
flutter pub getЗапустить на Android-телефоне по USB:
cd C:\Users\pvppv\Desktop\roo\MyScribe\myscribe_app
adb reverse tcp:8000 tcp:8000
flutter run -d 97c3a7ceПри USB-сценарии в приложении выберите preset USB на экране
API и сервер, если активный URL не равен http://127.0.0.1:8000.
Запустить для демонстрации через Tailscale:
cd C:\Users\pvppv\Desktop\roo\MyScribe\myscribe_app
flutter run -d 97c3a7ceAndroid-дефолт приложения - http://100.95.221.105:8000, потому что этот адрес
используется для демонстраций через Tailscale. Его можно изменить внутри
приложения на экране API и сервер.
Приложение выбирает backend URL в таком порядке:
- URL, сохраненный в экране
API и сервер. --dart-define=API_BASE_URL=....- Дефолт платформы.
Дефолты:
- Android:
http://100.95.221.105:8000для Tailscale. - Windows, Linux, macOS, iOS, Web:
http://127.0.0.1:8000.
Быстрые presets в приложении:
Tailscale-http://100.95.221.105:8000.USB-http://127.0.0.1:8000.Сброс- вернуть дефолт платформы илиdart-define.
Backend:
cd C:\Users\pvppv\Desktop\roo\MyScribe\myscribe_backend
python -m uvicorn main:app --host 0.0.0.0 --port 8000Flutter:
cd C:\Users\pvppv\Desktop\roo\MyScribe\myscribe_app
flutter analyze
flutter build apk --debugВ приложении откройте API и сервер, нажмите Проверить сервер и убедитесь,
что сервер доступен, модель загружена, а Device показывает cuda или cpu.
- Выберите один и тот же снимок.
- На экране
API и сервервыберитеTrOCRи распознайте документ. - Переключите engine на
PaddleOCRи распознайте тот же снимок повторно. - Сравните скорость, количество строк и качество текста в созданных документах. В списке и деталях документа сохраняется chip с engine.
- Модель не хранится в git и должна лежать в
myscribe_backend/trocr-handwritten-cyrillic. - PaddleOCR CPU-first нужен для стабильности установки; GPU-ускорение PaddleOCR не входит в этот этап.
- Dataset и пользовательские изображения не нужно коммитить.
- Окно backend должно оставаться открытым, пока приложение распознает текст.
- Если сборка Android снова ругается на NDK, проверьте установленную версию NDK в Android Studio и настройку проекта.