Вспоминаете классические игры? Вот руководство для вас

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

Теперь это история благодаря сервисам Google Cloud AI!

Используя API Google Cloud Vision и Google Translate, я собрал небольшое приложение Go под названием интерпретатор, которое переводит все, что отображается на экране, на предпочитаемый вами язык.

Как это работает?

Процесс на самом деле очень простой:

  • Сделайте скриншот окна, которое мы хотим перевести
  • Используйте Google Vision, чтобы извлечь из него любой текст
  • Используйте Google Translate для перевода
  • Отобразите его обратно в виде субтитров на экране

Снимок экрана

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

// Capture window
screenshot, err := captured.CaptureWindowByTitle(a.windowTitle, captured.CropTitle)
if err != nil {
   log.Fatal().Err(err).Send()
}

Извлечение текста из снимка экрана

Когда у вас есть изображение, вы можете просто отправить его в Google Cloud vision, чтобы извлечь из него любой текст:

// Extract text from image
annotations, err := vision.DetectTexts(context.Background(), screenshot, nil, 1)
if err != nil {
   log.Fatal().Err(err).Send()
}

Похоже, все идет… эй, минуточку?

Что это за бред? Это точно не то, что на экране! Получается, что нейросеть пытается интерпретировать все, что напоминает текст.

Беглый взгляд на документ говорит нам, что каждый результат сопровождается оценкой достоверности вместе с текстом извлечения. После некоторых тестов кажется, что все, что является реальным текстом, имеет показатель достоверности 99% или более, но эти тарабарские результаты имеют показатель достоверности намного ниже 50%. Поэтому нам просто нужно отфильтровать результаты и оставить те, у которых показатель достоверности выше 90%.

Перевод извлеченного текста

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

// Translate text
resp, err := a.translationClient.Translate(context.Background(), []string{detectedText}, "en", nil)
if err != nil {
   log.Fatal().Err(err).Send()
}

Отображение субтитров

Эта часть немного сложнее, так как для рисования на экране требуется графическая библиотека. Для этого я использовал фантастическую библиотеку Go Ebitengine. Я не упомянул подробности, но, по сути, переведенный текст отображается в прозрачном, всегда поверх окна.

Попробовать

Перейдите на https://github.com/bquenin/interpreter и следуйте инструкциям в README, и через несколько минут вы будете готовы к работе!