Как я готовил шпаргалку на экзамен и попутно запилил сервис распознавания текста на фотках

Всем привет! 🖖 Я учусь на 3 курсе, и чтобы подготовить конспект-шпаргалку на экзамен, я за вечер создал лучший сервис для распознавания текста на фото.

Как я готовил шпаргалку на экзамен и попутно запилил сервис распознавания текста на фотках

Зачем нужен конспект, и причем тут программирование

Как и большинство изобретений, мое — продукт лени. Будучи студентом, я экзамены воспринимал как испытание не только моих знаний, но и моей хитрости.

На предстоящем экзамене были разрешены рукописные конспекты, которые кто-то готовил в течение всего полугодия. Но это не про меня, у меня таких не было. Переписывать от руки что-либо объемнее одного листа — совсем не для меня. Но и идти на экзамен без шпоры — опрометчиво и даже немного зазорно. Нужно было что-то придумать и желательно быстро.

Раз уж кто-то пишет с помощью нейросети дипломы, то найти сервис распознавания текста с фото — не проблема. Я так думал, но я ошибался. Я хотел, чтобы оно работало без багов, без ошибок и в два клика, но оно так не работало.

Раз никакой сервис мою задачу нормально не решил, я сказал себе: «Хочешь сделать хорошо — сделай сам».

Во мне проснулся Остап Бендер, который придумал комбинацию:

  1. Берем печатный текст;
  2. Превращаем в рукописный;
  3. Распечатываем;
  4. Используем на экзамене старательно написанный конспект.

Окей, нужно быстренько собрать софт, который преобразует фото распечатанного конспектом в документ, а затем заменит в документе шрифт на рукописный.

Уже тогда я понял, что решая свою задачу, я смогу запилить SaaS, который поможет другим и станет моей небольшой прибавкой к стипендии.

Как я превращал фотки печатных записей в свою тетрадку с рукописным конспектом

Я погуглил в Яндексе на тему каких-нибудь библиотек и готовых решений для распознавания текста на фото, на базе которых можно быстренько за вечер собрать нужный скрипт на Python. Я нашел идеальный вариант среди концептов у Яндекса и, как и думал, за вечер накидал простенький скрипт.

import requests import json import base64 import os # Функция для получения IAM-токена def get_iam_token(iam_url, oauth_token): json_data = { 'yandexPassportOauthToken': oauth_token } headers = { 'Content-Type': 'application/json', 'Accept': 'application/json' } response = requests.post(iam_url, json=json_data, headers=headers) data = response.json() return data['iamToken'] # Функция для отправки запроса на анализ изображения def request_analyze(vision_url, iam_token, folder_id, image_data, mime_type): json_data = { 'folderId': folder_id, 'analyzeSpecs': [{ 'content': image_data, 'mime_type': str(mime_type), 'features': { 'type': 'TEXT_DETECTION', 'textDetectionConfig': { 'languageCodes': ['en', 'ru'] } } }] } headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + iam_token } response = requests.post(vision_url, json=json_data, headers=headers) return response.text oauth_token = 'fd3a7b52-7359-4dd9-ad40-b07098152df5' folder_id = 'c1mbjogp2fv2bt43b5of' iam_url = 'https://iam.api.cloud.yandex.net/iam/v1/tokens' vision_url = 'https://vision.api.cloud.yandex.net/vision/v1/batchAnalyze' # Запрос пути к директории с фотографиями photo_directory = input('Введите путь к директории с фотографиями: ') # Проверка наличия указанной папки if not os.path.isdir(photo_directory): print('Указанная директория не существует.') exit() # Проверка наличия фотографий в указанной директории photo_files = [f for f in os.listdir(photo_directory) if f.endswith('.jpg') or f.endswith('.png')] if not photo_files: print('В указанной директории отсутствуют фотографии.') exit() result_text = '' # Строка для сохранения распознанного текста for filename in photo_files: photo_path = os.path.join(photo_directory, filename) iam_token = get_iam_token(iam_url, oauth_token) with open(photo_path, 'rb') as file: image_data = base64.b64encode(file.read()).decode('utf-8') response_text = request_analyze(vision_url, iam_token, folder_id, image_data, 'image/jpeg') response_data = json.loads(response_text) if 'languages' in response_text: # Проверка наличия распознанного текста в ответе от API # Получение текста из json ответа от API. Сборка этого текста в удобный для чтения вид. text = '' for block in response_data['results'][0]['results'][0]['textDetection']['pages'][0]['blocks']: for line in block['lines']: for word in line['words']: text += word['text'] + ' ' text += '\n' result_text += text + '\n\n' # Запись распознанного текста в файл with open('output.txt', 'w') as output_file: output_file.write(result_text)

Если среди читателей есть программисты или просто уверенные пользователи ПК, можете потыкаться в скрипт.

После того, как я натравил скрипт на фотки и получил текстовый документ, я принялся за «написание» конспекта.

Я нашел и скачал шаблон для создания рукописного шрифта. Знаю, что можно было не париться и скачать сразу готовый шрифт, но меня затянула игра в имитацию.

Так я накалякал буквы в шаблоне
Так я накалякал буквы в шаблоне

После того, как шаблон заполнен, я сгенерировал файл шрифта, установил его и применил к документу с распознанным текстом.

На глаз подбираем размер шрифта, подкладываем фон в клеточку и вуаля: можно отправлять документ на печать.

Итоговый документ со шпаргалкой перед печатью
Итоговый документ со шпаргалкой перед печатью

После печати оставалось только продырявить листы и вставить их в тетрадь. Это же конспект, который я вел полгода.

Вот так моя шпаргалка выглядела в тетради
Вот так моя шпаргалка выглядела в тетради

На следующий день я пришел в университет, решив провести на большом перерыве небольшой опрос среди друзей: половина сразу увидела в моей тетради распечатку, а половина ничего не заподозрила.

В час икс интуиция подсказала мне сесть куда-нибудь на галерку и не отсвечивать. Я так и сделал и сдал экзамен. Этим все могло закончиться, но нет.

Как я превратил свой скрипт для создания шпаргалки в онлайн-сервис

Через несколько дней я отошёл от стресса, привел потрёпанные нервы в порядок, после чего приступил к более основательному обдумыванию возникшей идеи.

Главным мотиватором не забить на это всё стала простая мысль: раз такой функционал так понадобился мне, вполне возможно, что он понадобится и еще кому-то. Таким образом было положено начало проекта.

Как это обычно бывает, одного желания «сделать красиво» было недостаточно. Слепленный на коленке Python скрипт понятное дело не очень подходил на роль полноценного сервиса: требовалось придумать и сверстать красивый сайт, написать нормальный код для клиентской и серверной части, прикрутить оплату, а потом ещё и не забыть протестировать работоспособность всего получившегося.

В общей сложности весь процесс от задумки до конечного продукта занял у меня около месяца.

Кому и как будет полезно

Если вы студент, фоткайте все, что на лекции выводится проектором и потом в два клика получайте конспект в виде текстового файла. Так вы сможете сосредоточиться на усвоении материала, а не на его конспектировании. Можно сфоткать страницу учебника или книги, чтобы моментально превратить ее в шпаргалку.

Во время тестирования в полевых условиях был выявлен ещё один крайне полезный кейс применения. Если вам понадобится быстро что-нибудь найти, например в книге (небольшого или среднего размера) , то просто сфотографируйте нужные развороты, загрузите фотографии на сервис и уже через +- 5 секунд у вас будет текст, по которому можно быстро и удобно производить поиск нужной информации.

Лично мне такой подход позволил сэкономить часы чтения скучных нафталиновых методичек.

К сожалению, мой сервис, как и все прочие OCR-сервисы, не умеет с приемлемой точностью распознавать рукописный шрифт. У меня такой задачи не стояло: мне было нужно обратное — я хотел имитировать рукописный шрифт на выходе, имея фото с печатным текстом на входе.

Можно распознавать и фото, и PDF. Нет рекламы и низкие цены. Ну и 5 бесплатных страниц сразу после регистрации — этого вполне хватит, чтобы убедиться, что все распознается точно и без белиберды.

Какие есть аналоги, и почему они мне не нравятся

Вероятно, вы думаете:

Ну придумал ты, как из текстового документа сделать имитацию конспекта, используя подмену на рукописный шрифт, но зачем тебе собственный сервис распознавания? Их же полно.

Да, таких сервисов полно, но мне они решительно не нравятся.

Там везде рекламы столько, что ощущение, как от растяжек на московских улицах во времена Лужкова. Мне хочется зайти на сайт, заплатить небольшую копеечку, получить услугу и не портить глаза баннерами и сниппетами.

Тут даже блок подписки выглядит, как рекламный баннер, а сами рекламные баннеры не грузятся
Тут даже блок подписки выглядит, как рекламный баннер, а сами рекламные баннеры не грузятся

Вот так выглядит форма на моем сайте:

Не надо ничего нажимать, выбирать или читать — перетащил файл и все
Не надо ничего нажимать, выбирать или читать — перетащил файл и все

Кажется, что мой сайт решит задачу быстрее, чем пользователь сможет найти нужную кнопку у конкурента.

Низкое качество распознавания

Хвалиться на словах не буду, просто покажу, как с распознаванием справляется мой сервис.

Вот так выглядит текст на фото:

Фото с одной из лекций
Фото с одной из лекций

Никаких подтасовок. Это изображение я прогнал через распознавание на своем сайте и на сайтах конкурентов. Можете сами проверить разницу в качестве.

Вот так этот же текст распознается сервисом:

Скриншот распознавания с моего сайта
Скриншот распознавания с моего сайта

Высокие цены

Конечно, мой сервис немного дороже бесплатных аналогов, но у конкурентов просто грабительские тарифы.

Тарифы конкурентов:

Как я готовил шпаргалку на экзамен и попутно запилил сервис распознавания текста на фотках
Как я готовил шпаргалку на экзамен и попутно запилил сервис распознавания текста на фотках
Как я готовил шпаргалку на экзамен и попутно запилил сервис распознавания текста на фотках

Мои тарифы:

Как я готовил шпаргалку на экзамен и попутно запилил сервис распознавания текста на фотках

За распознавание 100 страниц я беру 1,8₽ за страницу, а они — почти 8₽.

Я считаю, что у меня получилась гибкая и одновременно понятная тарифная сетка: если ты студент и тебе нужно фоткать лекции, бери пакет на 75 распознаваний, а если много работаешь с текстом, бери пакет на 100 или больше и цена будет ниже.

Если считаете, что цены не оптимальны, я открыт к критике и предложениям.

Спасибо, что дочитали!

Зарегистрируйтесь на Kurion. app и распознавайте 5 первых файлов бесплатно.

Если есть вопросы или предложения по улучшению — пишите в комменты, буду безмерно рад и с радостью отвечу на любые вопросы. И буду рад, если расскажете, какие изобретательные способы списывания и сдачи экзамена использовали вы или ваши знакомые.

2323
57 комментариев

Занимательная статья! Классный и полезный продукт получился. Даже не верится (в хорошем смысле), что получилось за вечер создать такое решение проблемы, респект 🤝

4
Ответить

Когда до экзамена на 50 вопросов остаётся всего два дня и не такое придумаешь. Лишь бы со стипендии не слететь)

2
Ответить

есть бесплатная альтернатива которую ты немного натянул на свой сервис "яндекс переводчик по фото", нужно просто найти кнопку "открыть как текст" тут тебе и перевод и форматирование текста с изображений и самое главное беспалтно останется только в вордик скопировать и шрифт накинуть, минус только каждую фотку отдельно но кто хочет бесплатно идеальный вариант

2
Ответить

так же гугл относительно недавно вернул всетаки в свой переводчик распознование текста с фото и его тоже можно конвертировать в редактируемый формат (но не так харош на русском как яндекс)

1
Ответить

Не знал, спасибо. Такая же фича есть у Майкрософта. А если уж рассматривать платные, то есть Адобе..

Ответить

Какой у вас потрясающий слог написания текста, читать одно удовольствие 🫶🏼

2
Ответить

Типа таких фраз "софт, который преобразует фото распечатанного конспектом в документ"?

Ответить