Unverified Commit 0dfac320 authored by dmMaze's avatar dmMaze Committed by GitHub
Browse files

Merge pull request #23 from bropines/master

Add russian locales
parents d55a1a05 4864b712
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
# BallonTranslator
简体中文 | [English](README_EN.md)  
简体中文 | [English](README_EN.md) | [Русский](README_RU.md)

深度学习辅助漫画翻译工具, 支持一键机翻和简单的图像/文本编辑  

README_RU.md

0 → 100644
+141 −0
Original line number Diff line number Diff line
# BallonTranslator
[简体中文](README.md) | English | [Russian/Русский](README_ru.md)

Еще один компьютерный инструмент для перевода комиксов/манги на основе глубокого обучения.

<img src="doc/src/ui0.jpg" div align=center>

<p align=center>
Пример интерфейса
</p>

# Особенности
* Полностью автоматизированный перевод  
  - Поддержка автоматического обнаружения, распознавания, удаления и перевода текста, общая производительность зависит от этих модулей.
  - Начертание букв основано на оценке форматирования оригинального текста.
  - Хорошо работает с мангой и комиксами.
  - Улучшенная верстка манга->английский, английский->китайский (основана на выделении облачков текста).
  
* Редактирование изображений  
  Поддержка редактирования масок и закраски (что-то вроде инструмента точечной лечебной кисти в PS) 
  
* Редактирование текста  
  Поддержка богатого форматирования текста, переведенные тексты можно редактировать в интерактивном режиме.

# Usage

Пользователи Windows могут загрузить Ballonstranslator-x.x.x-core.7z с сайта [腾讯云](https://share.weiyun.com/xoRhz9i4) или [Google Drive](https://drive.google.com/drive/folders/1uElIYRLNakJj-YS0Kd3r3HE-wzeEvrWd?usp=sharing) и извлеките его в папку с именем BallonTranslator, также скачайте Ballonstranslator-x.x.x-patch.7z, если он есть, и извлеките его в ту же папку.

## Запуск из исходного кода (работает слегка с ошибками)

```bash
# Во-первых, в вашей системе должен быть установлен Python(<=3.9 ).
$ python --version

# Клонируйте этот репозиторий
$ git clone https://github.com/dmMaze/BallonsTranslator.git

# Установка зависимостей
$ pip install -r requirements.txt
```

Установите pytorch-cuda, чтобы включить ускорение GPU, если у вас есть GPU NVIDIA.

```bash
pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu116
```

Скачайте папку **data** с сайта https://drive.google.com/drive/folders/1uElIYRLNakJj-YS0Kd3r3HE-wzeEvrWd?usp=sharing и переместите ее в BallonsTranslator/ballontranslator, наконец, выполните команду

```bash
python ballontranslator/__main__.py
```

## Полностью автоматизированный перевод
**Рекомендуется запускать программу в терминале на случай, если она аварийно завершила работу и не оставила никакой информации, см. следующий gif**.

Пожалуйста, выберите нужный переводчик и установите исходный и целевой языки при первом запуске приложения. Откройте папку с изображениями, которые необходимо перевести, нажмите кнопку "Run" и дождитесь завершения процесса.  
<img src="doc/src/run.gif">  

Форматы шрифтов, такие как размер шрифта, цвет, определяются программой автоматически в этом процессе, вы можете предопределить эти форматы, изменив соответствующие опции с "определять программой" на "использовать глобальные настройки" в панели конфигурации-> Работа с текстом. (глобальные настройки - это те форматы, которые отображаются на правой панели формата шрифта, когда вы не редактируете какой-либо текстовый блок в сцене).

## Редактирование изображений

### inpaint tool
<img src="doc/src/imgedit_inpaint.gif">
<p align = "center">
Режим редактирования изображений, инструмент закраски
</p>

### Инструмент "прямоугольник"
<img src="doc/src/rect_tool.gif">
<p align = "center">
Инструмент "прямоугольник"
</p>

Перетащите прямоугольник с нажатой левой кнопкой, чтобы стереть текст внутри поля, нажмите правую кнопку и перетащите, чтобы очистить закрашенный результат.  
Результат зависит от того, насколько точно алгоритм ("метод 1" и "метод 2" на рисунке) извлекает маску текста. Он может работать хуже на сложном тексте и фоне.  

## Text editing
<img src="doc/src/textedit.gif">
<p align = "center">
Режим редактирования текста
</p>

<img src="doc/src/multisel_autolayout.gif" div align=center>
<p align=center>
Пакетное форматирование текста и авторазметка
</p>

## Shortcuts
* A/D сменить страницу
* Ctrl+Z, Ctrl+Y для отмены/повторения большинства операций, обратите внимание, что стек отмены будет очищен после того, как вы перевернете страницу.
* T в режиме редактирования текста (или кнопка "T" на нижней панели инструментов) нажмите W, чтобы активировать режим создания текстового блока, затем перетащите мышь по холсту с нажатой правой кнопкой, чтобы добавить новый текстовый блок. (см. GIF редактирования текста)
* P в режим редактирования изображений.
* В режиме редактирования изображения используйте ползунок справа внизу для управления прозрачностью исходного изображения.
* Кнопки "OCR" и "A" в нижней панели инструментов управляют включением OCR и перевода, если вы отключите их, программа будет выполнять только обнаружение и удаление текста.  
* Установите параметры автоматических модулей в настройках
* Ctrl+ +/- или колесо прокрутки для масштабирования холста
* Ctrl+A для выделения всех текстовых блоков в интерфейсе
* 
<img src="doc/src/configpanel.png">  


# Модули автоматизации
Этот проект в значительной степени зависит от [manga-image-translator](https://github.com/zyddnys/manga-image-translator), онлайн-сервис и обучение моделей стоит недешево, пожалуйста, рассмотрите возможность пожертвовать проект:  
- Ko-fi: <https://ko-fi.com/voilelabs>
- Patreon: <https://www.patreon.com/voilelabs>
- 爱发电: <https://afdian.net/@voilelabs>
  
## Обнаружение текста
Поддержка распознавания английского и японского текста, обучающий код и более подробную информацию можно найти на сайте [comic-text-detector](https://github.com/dmMaze/comic-text-detector)

## OCR
 * mit_32px модель распознавания текста из manga-image-translator, поддержка распознавания английского и японского языков и выделения цвета текста.
 * mit_48px модель распознавания текста от manga-image-translator, поддерживает распознавание на английском, японском и корейском языках и выделение цвета текста.
 * [manga_ocr](https://github.com/kha-white/manga-ocr) от [kha-white](https://github.com/kha-white), 

## Закрасчик
  * AOT взято с сайта manga-image-translator
  * patchmatch это не алгоритм глубокого обучения [PyPatchMatch](https://github.com/vacancy/PyPatchMatch), эту программу использовал [modified version](https://github.com/dmMaze/PyPatchMatchInpaint) для себя.
  

## Переводчики

 * Пожалуйста, измените url переводчика goolge с *.cn на *.com, если вы находитесь за пределами китая.    
 * Переводчику Caiyun требуется [token](https://dashboard.caiyunapp.com/)
 * Papago

 Чтобы добавить новый переводчик, пожалуйста, обратитесь к [Добавление других переводчиков](doc/add_translator_ru.md), это просто как подкласс BaseClass и реализация двух интерфейсов, затем вы можете использовать его в приложении. Вы можете внести свой вклад в проект.  


## Misc
* Если ваш компьютер оснащен графическим процессором Nvidia, программа по умолчанию включает ускорение cuda для всех моделей, что требует около 6G памяти GPU, вы можете уменьшить размер inpaint_size в панели конфигурации, чтобы избежать перегрузки памяти. 

## Предварительный просмотр результатов полностью автоматизированного перевода
|            Original            |         Translated (CHS)         |         Translated (ENG)         |
| :-----------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------: |
|![Original](ballontranslator/data/testpacks/manga/original2.jpg 'https://twitter.com/mmd_96yuki/status/1320122899005460481')| ![Translated (CHS)](doc/src/result2.png) | ![Translated (ENG)](doc/src/original2_eng.png) |
|![Original](ballontranslator/data/testpacks/manga/original3.jpg 'https://twitter.com/_taroshin_/status/1231099378779082754')| ![Translated (CHS)](doc/src/original3.png) | ![Translated (ENG)](doc/src/original3_eng.png) |
| ![Original](ballontranslator/data//testpacks/manga/AisazuNihaIrarenai-003.jpg) | ![Translated (CHS)](doc/src/AisazuNihaIrarenai-003.png) | ![Translated (ENG)](doc/src/AisazuNihaIrarenai-003_eng.png) |
|           ![Original](ballontranslator/data//testpacks/comics/006049.jpg)           | ![Translated (CHS)](doc/src/006049.png) | |
+7.73 KiB

File added.

No diff preview for this file type.

+480 −0

File added.

Preview size limit exceeded, changes collapsed.

+106 −0
Original line number Diff line number Diff line
Если у вас есть базовые знания программирования на python, вы будете знать, как использовать python для вызова необходимого api переводчика или модели перевода, Напишите класс в dl/translators.__init__.py следующим образом, чтобы использовать его непосредственно в программе.      
Следующий пример DummyTranslator закомментирован в dl/translator/__init__.py, и его можно не комментировать, чтобы увидеть результат в программе.  

``` python
@register_translator('dummy translator')
class DummyTranslator(TranslatorBase):
    concate_text = True

    # parameters showed in the config panel. 
    # keys are parameter names, if value type is str, it will be a text editor(required key)
    # if value type is dict, you need to spicify the 'type' of the parameter, 
    # following 'device' is a selector, options a cpu and cuda, default is cpu
    setup_params: Dict = {
        'required_key': '', 
        'device': {
            'type': 'selector',
            'options': ['cpu', 'cuda'],
            'select': 'cpu'
        }
    }

    def _setup_translator(self):
        '''
        do the setup here.  
        keys of lang_map are those languages options showed in the app, 
        assign corresponding language keys accepted by API to supported languages.  
        This translator only supports Chinese, Japanese, and English.
        '''
        self.lang_map['简体中文'] = 'zh'
        self.lang_map['日本語'] = 'ja'
        self.lang_map['English'] = 'en'  
        
    def _translate(self, text: Union[str, List]) -> Union[str, List]:
        '''
        do the translation here.  
        This translator do nothing but return the original text.
        '''
        source = self.lang_map[self.lang_source]
        target = self.lang_map[self.lang_target]
        return 'translate ' + text + f'from {source} to target'

    def updateParam(self, param_key: str, param_content):
        '''
        required only if some state need to be updated immediately after user change the translator params,
        for example, if this translator is a pytorch model, you can convert it to cpu/gpu here.
        '''
        super().updateParam(param_key, param_content)
        if param_key == 'device':
            # self.model.to(self.setup_params['device']['select'])
            pass
```

Во-первых, переводчик должен быть декорирован с помощью register_translator и наследоваться от базового класса TranslatorBase, параметр 'dummy translator' внутри декоратора - это имя переводчика, которое будет отображаться в интерфейсе, будьте осторожны, чтобы не дублировать имя существующего переводчика.  
Сохраните concate_text на потом.  
``` python
@register_translator('dummy translator')
class DummyTranslator(TranslatorBase):  
    concate_text = True
```

Если новый переводчик требует настраиваемых пользователем параметров, создайте словарь setup_params, как показано ниже, в противном случае оставьте его в покое или присвойте значение None.  
Ключом в setup_params является соответствующее имя параметра, отображаемое в интерфейсе, значение может быть str, api_key ниже будет текстовый редактор с пустым значением по умолчанию в интерфейсе.  
Значение параметра также может быть словарем, но должно быть указано как тип 'type', который будет показан как селектор в интерфейсе, следующее устройство является селектором, либо cpu, либо cuda, по умолчанию cpu.  

``` python
    setup_params: Dict = {
        'api_key': '', 
        'device': {
            'type': 'selector',
            'options': ['cpu', 'cuda'],
            'select': 'cpu'
        }
    }
```  

<p align = "center">
<img src="./src/new_translator.png">
</p>
<p align = "center">
Результат вышеуказанного словаря параметров в панели настроек интерфейса
</p>  

Переводчик должен реализовать _setup_translator, который выполняет инициализацию здесь. Ключ словаря lang_map - это языковая опция, отображаемая в интерфейсе, и присваивается языковому ключевому слову, принятому API, например, 'zh' для упрощенного китайского языка Google Translate. Здесь указаны только языки, поддерживаемые переводчиком, полный список языков см. в LANGMAP_GLOBAL в translator.__init__. 

``` python
    def _setup_translator(self):
        self.lang_map['简体中文'] = 'zh'
        self.lang_map['日本語'] = 'ja'
        self.lang_map['English'] = 'en'  
```

Переводчику также необходимо реализовать _translate, где lang_source и lang_target - это языки, выбранные в интерфейсе на данном этапе, а соответствующие ключевые слова api можно получить из предыдущей lang_map, чтобы сшить вместе параметры api и отправить запрос.  
Обратите внимание, что если предыдущий параметр concate_text имеет значение False, то переданный сюда текст будет представлять собой таблицу строк, соответствующую оригинальному содержимому каждого текстового блока на текущей странице перевода, и переведенный результат также должен представлять собой таблицу переведенного текста один к одному. Если установлено значение True, входящий текст будет представлять собой обычную строку всех текстовых блоков, а выходной текст должен быть переведенной строкой.  
Слишком медленно посылать запрос для каждого текстового блока, поэтому вся страница сшивается и переводится. concate_text настроен на автоматическое сшивание/разделение, и по умолчанию сшивает весь блок вместе с '\n###\n' в качестве разделителя, а затем разделяет переведенный текст обратно в текстовую таблицу с помощью '####'. Это работает для большинства проверенных мной переводчиков, но некоторые из них избавляются от #, поэтому вы можете отключить перевод concate_text блок за блоком или реализовать свой собственный метод сшивания.  
Некоторые апи, такие как Caiyun, поддерживают прямые текстовые таблицы в сообщениях, поэтому можно установить значение False.  
``` python
    def _translate(self, text: Union[str, List]) -> Union[str, List]:
        api_key = self.setup_params['api_key']  # 如此获取用户修改过的api_key
        source = self.lang_map[self.lang_source]
        target = self.lang_map[self.lang_target]
        return text
```
Фиктивный переводчик не делает ничего, кроме возвращения оригинального текста.  
После внедрения переводчика рекомендуется написать собственный тест переводчика для проверки правильности вывода, следуя примеру в tests/test_translators.py. Как только тест пройден, вы можете использовать его в своем приложении.   

Наконец, updateParam выше будет вызываться автоматически, когда пользователь изменит параметр, по умолчанию он будет изменять только значение в setup_params, такое как api_key выше. Обычно это можно игнорировать, но если вам нужно изменить состояние транслятора, например, если это локальная модель трансляции, которая может переключаться между cuda и cpu, вы можете сделать это здесь.  
 No newline at end of file