Как я Yakuza перевести решил. ScreTran - перевод текста с экрана в реальном времени

С первого дня как я увидел игру Yakuza я влюбился в эту серию игр. И каждый любитель этой серии сталкивается с проблемой отсутствия русских субтитров. Да существуют любительские переводы, но есть два нюанса:

1. Переведены не все части.

2. В основном такие переводы платные (и по моему мнению их цена не соответствует качеству).

суцк
суцк

Кстати не стоит забывать, что Yakuza японская игра и английские субтитры пестрят косноязычными выражениями и словосочетаниями, часто незнакомыми. Мне стало лень постоянно ставить игру на паузу и гуглить незнакомое слово. Надо что то с этим делать.

Настоящий якудза пишет экранный переводчик

В свободное время я пишу приложения на C# (WPF, WinUI 3) для решения своих задач, например, бомже-streamdeck для воспроизведения звуков на стриме. А почему бы не решить проблему Yakuza и написать свой экранный переводчик?

В смысле он уже существует? Чего я так много воды развёл когда есть Translumo? На этом можно было и закончить, сказать, "что поделать, всё уже сделали до меня, ну и к чёрту это всё".

Но изучив всю информацию, мне показалось, что я могу решить эту же задачу намного проще и с меньшими трудозатратами. О! А вот и мой двухнедельный отпуск подошёл! Итак задача на отпуск - написать и выпустить свой экранный переводчик (ну и про отдых не забыть).

Глаза боятся, а руки кодят

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

WordArt - рулит (сарказм)
WordArt - рулит (сарказм)

Исходя из концепции, мне нужно было выбрать технологии по распознаванию и переводу текста. С распознаванием текста (или OCR) всё просто самый простой, доступный и бесплатный на C# оказался движок Tesseract OCR. Я не дошёл до сравнения с другими технологиями, так как меня сразу устроило, что может Tesseract и не забываем про сроки. А вот с сервисом для перевода текста пришлось попотеть.

Lingua latina non verpa canina

Сервисов для перевода с доступным API огромное множество, аж голова начинает кружится. Поэтому я искал переводчик который будет соответствовать моим критериям:
1. Более менее сносно переводить текст. Можно терять контекст, главное, что бы уж не совсем "надмозги" и "углепластики".
2. Не иметь ограничений по количеству запросов, либо иметь большой бесплатный лимит.
3. Пользователь ничего не должен настраивать, указывать ключи API, устанавливать VPN.
4. Иметь примеры реализации на C#.

Silent hill 1
Silent hill 1

Для проверки качества перевода я взял кусок описания самой лучшей хостес серии Yakuza Гороми:

Goromi wears a pink snakeskin bodycon dress and matching hotpants, along with a pair of fishnet stockings and hot pink pumps. She wears a large bow made of the same material to tie up her blonde hair. She also has an assortment of bangles and other gaudy jewelery, including a necklace and hoop earrings. Her nails are painted pink with a glittery floral pattern.

DeepL

Как я Yakuza перевести решил. ScreTran - перевод текста с экрана в реальном времени

Самый известный и хорошо обученный переводчик, есть примеры для C#. Но имеет ограничения при бесплатном использовании.

LibreTranslate

Платье из туловища
Платье из туловища

Заявляет, что он хорош почти как DeepL! Его можно развернуть у себя на сервере! Посмотрев на качество перевода, которое меня отрицательно порадовало, я сразу от него отказался.

Яндекс.Переводчик

Как я Yakuza перевести решил. ScreTran - перевод текста с экрана в реальном времени

Неплохо переводит текст, производитель указывает, что для перевода использует свою нейронку Yandex GPT. Я даже случайно вставил картинку в этот переводчик и внезапно, я узнал, что у Яндекса есть свой OCR. Но опять таки я утыкаюсь в маленький лимит запросов. Оффтоп: Теоретически Яндексу не составит труда написать свой более крутой экранный переводчик.

Bing Microsoft Translator

Как я Yakuza перевести решил. ScreTran - перевод текста с экрана в реальном времени

Мне понравился результат этого переводчика. Но не нашёл нормальных примеров как им пользоваться, А ещесовсем недавно наелся багов от новых технологий мелкомягких (да WinUI?).

Google Translate

Как я Yakuza перевести решил. ScreTran - перевод текста с экрана в реальном времени

ФУ! Гугл транслейт! Его нельзя использовать! Wait what? Не понял, а почему такой сносный перевод? Да есть мелкие косяки по сравнению с другими переводами, но это вполне меня устраивает. Я нашёл множество примеров как обращаться к этому сервису перевода, при этом БЕЗ ЛИМИТОВ!

Выбор сделал в пользу Google Translate, а приложение написал так, что бы в будущем было легко подключить другой сервис. Если вы можете предложить переводчик лучше и без лимитов - welcome в комментарии.

Я тебя слепила из того что было

Неделю спустя ненапряжного кодинга и перерывы на рекреационные мероприятия. Я запустил свой первый тест:

Счастью моему не было предела, в диалогах эта штука работала просто великолепно. Я ожидал, что в катсценах будут проблемы, ведь OCR в основном рассчитаны для распознавания текста с бумажных документов - черный текст на белом фоне, а белый текст на пёстром всё время меняющемся фоне это проблема для OCR. Как решить эту проблему? В Translumo это решалось подключением еще двух движков для распознавания текста и целая модель машинного обучения. Это уже звучит очень требовательно к ресурсам компьютера. У меня и опыта работы нет с Machine Learning.

Например, вот этот текст Tesseract OCR не может распознать:

Как я Yakuza перевести решил. ScreTran - перевод текста с экрана в реальном времени

Я пошёл другим путём, движок OCR должен быть один, но я должен подготовить картинку для распознавания так, что бы движку было проще распознать текст.

Я экспериментировал с картинкой, меняя её контрастность, повышая яркость, даже передавая негатив изображения, всё тщетно (вот тут наверное модель обучения бы помогла). И внезапно, если достаточно СНИЗИТЬ яркость, текст на изображении становится распознаваемым:

Tesseract'у вкусно
Tesseract'у вкусно

PROFIT!

Настройки

У всех разные мониторы и разная настройка яркости внутри игры, поэтому параметр яркости для OCR нужно было сделать настраиваемым. С этого момента появляется еще одно окно.

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

Движок Tesseract при распознавании может сказать, насколько точно он распознал текст, передавая это значение в диапазоне от 0 до 1. Во время тестов, я примерно понял, что значения от 0.9 до 1 это 100% распознавание текста на экране. И сначала жестко выставил, всё что ниже 0.9 не переводить и не выводить пользователю, но часть диалогов в катсценах начала теряться. А если немного снизить этот порог, распознаваемый текст может обретать какие то артефакты (символы которых нет в оригинальном тексте) при этом этот текст всё еще можно понять. Поэтому я решил сделать этот параметр настраиваемым, что бы пользователь сам смог это настроить. И вывел фактическую уверенность в переводе движка в уголок окна перевода.

Как я Yakuza перевести решил. ScreTran - перевод текста с экрана в реальном времени

Это всё звучит сложно! Я вообще не хочу разбираться! У меня лапки!

Пользователь, я уже погонял переводчик и примерно нашёл настройки по умолчанию. Если всё работает - тебе туда заходить не придётся. В идеальной картине мира ваша задача настроить положение окон и нажать кнопку "Поехали!".

Кроме этих важных параметров, я добавил еще пару полезностей:

1. Это возможность изменения размера шрифта перевода.
2. Возможность скрывать интерфейс по нажатию горячей клавиши.
3. Положение окон перевода и захвата сохраняются, что бы не наводить их каждый раз на нужные области.

Окно настроек
Окно настроек

Время релиза

Вот он последний день отпуска, я долго гонял переводчик в прохождениях на ютубе, снял нагрузку моего приложения на ПК:

Нагрузка приложения в диспетчере задач (ЦП AMD Ryzen 2600)
Нагрузка приложения в диспетчере задач (ЦП AMD Ryzen 2600)

Хмм, а мой переводчик даже не перевалил по потреблению оперативы за 100МБ! А GPU не грузит вообще. Это были действительно хорошие новости. Я готов релизить своё приложение! И чёрт меня дернул проверить приложение в Yakuza 4 (я как раз её прохожу). Запускаю игру, а окна перевода и захвата не отображаются поверх игры. Это фиаско! Не спя ночью гугля, что же всё таки не так, нахожу решение - нужно учить DirectX 9 и писать всё заново! На работе подождут!

Как я Yakuza перевести решил. ScreTran - перевод текста с экрана в реальном времени

Всё таки выспавшись, я понял в чем была проблема (спасибо поиску по проектам на GitHub) немного модифицировал код, а потом и даже прочитал о таком же поведении в статье о Translumo.

ВАЖНО! Игра должны быть запущена либо в оконном режиме, либо в borderless-режиме:

Как я Yakuza перевести решил. ScreTran - перевод текста с экрана в реальном времени

После этих мучений на ровном месте, я всё таки зарелизил своё приложение на GitHub.

ВАЖНЫЙ ДИСКЛЕЙМЕР! Я позиционирую своё приложение как вспомогательное, а не полноценную замену переводам или другим более качественным приложениям. ScreTran необходим для упрощения жизни тем кто всё таки немного знает английский и просто не хочет доставать переводчик, ставить игру на паузу, что бы найти перевод нужного слова.

Демо работы приложения в играх:

Тест перевода в диалогах
Тест перевода в катсценах

Видео о том как быстро начать пользоваться ScreTran:

Информация о настройке переводчика

Ложка дёгтя

Или что еще можно сделать?

1. Всё еще есть проблемы с распознаванием белого текста, на светлом фоне - есть идеи как можно это исправить, но до отпуска еще далеко :D. Из-за этого иногда в катсценах всё же наблюдается пропуск реплик.
2. Потестить в чем то кроме Yakuza.
3. Надо попробовать подключить сторонние переводчики.
4. Перевод только с русского на английский. Надо рассмотреть возможность добавить другие языки.

Теги: Перевод, Локализация, Экранный переводчик, Screen Translator, Translumo

1414
18 комментариев

Опробовал на Yakuza 6, всё работает в оконном режиме и в borderless. Белые субтитры на светлом фоне ожидаемо не переводятся. В целом играть весьма комфортно. Так что моё вам уважение

1

Выпустил новую версию, теперь на светлом фоне должно переводить

1

Как же я хочу поиграть в Judgment с русским текстом, если это реально сработает, я буду визжать

1

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

Автор, прекрасная работа!
Можете подсказать, на свое мнение, какие отличие имеет ваше по от MORT?
Я с ней проходил старфилд, пытался в якудзу 3, но столкнулся с проблемой как у вас, что игра становится окном выше. Борется горячими клавишами, но переводчик умирает в катсценах. Кажется это проклятие всех переводчиков в якудзе

1

Я MORT не пользовался, могу сделать выводы только по описанию из статьи про Translumo. У MORT больше OCR движков и переводчиков, поддержка других языков. Оно и понятно я писал приложение за две недели.
По поводу того что игра становится окном выше, это как я понял проблема 3, 4, 5 частей якудзы. Эту проблему я победил, у меня на компе стоит 4 и 5ая часть, в обоих мои окна всегда поверх. Внезапно на GitHub'е я нашел какую то тулзу для League Of Legends и там было решение моей проблемы.
В катсценах переводчик работает, но как я писал в статье, всё еще бывают проблемы с белым текстом на светлом фоне (из-за чего очень редко пропускаются реплики).