Локальные инструменты перевода манги 2026: OCR, LLM и inpainting | AiManual
AiManual Logo Ai / Manual.
13 Фев 2026 Гайд

Перевод манги на стероидах: как заставить машину думать как японский редактор

Полный гайд по автоматизации перевода манги с сохранением типографики. Сравнение инструментов, настройка пайплайна, обработка speech bubbles без облачных сервис

Почему 90% автоматических переводов манги выглядят как детский утренник

Открою секрет: стандартный пайплайн "OCR → Google Translate → вставить текст поверх" не работает. Вообще. Получается то самое убожество, когда английский текст вылезает за пределы пузыря, японские иероглифы торчат из-под латиницы, а курсив внезапно превращается в Comic Sans.

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

  • Японские символы квадратные, английские - прямоугольные
  • Вертикальное vs горизонтальное письмо
  • Отсутствие пробелов в японском против обязательных пробелов в английском
  • Разная плотность текста: иероглифы несут больше информации на символ
  • Speech bubbles проектировались под конкретный язык

Классическая ошибка: просто удалить японский текст и напечатать перевод сверху. Результат - текст либо слишком большой, либо слишком маленький, либо криво расположен. Читать невозможно.

Три кита локального перевода: что должно работать в пайплайне

Правильный инструмент не один. Их три, и они должны работать как швейцарские часы:

1 Детектор и распознаватель текста

Не просто OCR. Умный OCR, который понимает:

  • Где заканчивается speech bubble, а где начинается фон
  • Что такое фуригана (маленькие подсказки чтения)
  • Как отделить текст от артефактов сканирования
  • Как сохранить информацию о шрифте и размере

2 Локальная LLM для перевода с контекстом

Google Translate для манги - это как молоток для нейрохирургии. Нужна модель, которая понимает:

  • Культурные отсылки (аниме, мемы, японский сленг)
  • Контекст всей главы, а не отдельной фразы
  • Разницу между мужской и женской речью
  • Ономатопею (звуковые эффекты в манге)
💡
Для серьезной работы с японским посмотрите наш обзор лучших локальных LLM для японского. Там разобраны модели, которые реально справляются с мангой, а не просто переводят отдельные слова.

3 Image inpainting и рендеринг текста

Самая сложная часть. Нужно:

  1. Удалить оригинальный текст без повреждения фона
  2. Рассчитать оптимальный размер и расположение перевода
  3. Вписать текст в пузырь с учетом его формы
  4. Сохранить стиль (жирный, курсив, размер)

Боевой стек инструментов на 2026 год

После месяцев экспериментов и сожженных видеокарт вот что реально работает:

Задача Инструмент Почему он Подводные камни
Детекция текста PP-OCRv4 (PaddleOCR) Лучшая точность для японского, работает локально, есть Python API Тяжелый, требует GPU для скорости
Перевод Qwen2.5-32B-Instruct Отличное понимание контекста, поддерживает японский на уровне носителя Нужно 32+ GB RAM, медленный на CPU
Удаление текста LaMa (Large Mask Inpainting) Специально обучена на удалении текста, а не generic inpainting Иногда "забывает" мелкие детали фона
Рендеринг текста PIL + custom алгоритм Полный контроль над кернингом, интерлиньяжем, обтеканием Приходится писать свою логику размещения

Внимание: большинство "готовых решений" из GitHub - это Proof of Concept, которые сломаются на реальной манге. Они не учитывают кривые пузыри, сложный фон, артефакты сканирования.

Пайплайн, который не стыдно показать

Вот как выглядит рабочий процесс от скана до готовой страницы:

1 Подготовка и детекция

Сначала очищаем изображение. Не через стандартные фильтры - они убивают детали. Используем Waifu2x для апскейла и удаления JPEG-артефактов, но только если исходное качество плохое.

import paddleocr
from PIL import Image
import cv2

# Инициализируем OCR с японской моделью
ocr = paddleocr.PaddleOCR(use_angle_cls=True, lang='japan', use_gpu=True)

# Загружаем и предобрабатываем
img = cv2.imread('manga_page.jpg')
# Конвертируем в RGB для consistency
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# Запускаем распознавание
result = ocr.ocr(img_rgb, cls=True)

# Результат содержит не только текст, но и bounding boxes
for line in result:
    points, (text, confidence) = line
    print(f"Текст: {text}, Уверенность: {confidence:.2f}")
    print(f"Координаты: {points}")

Ключевой момент: сохраняем не только текст, но и точные координаты bounding box. Они понадобятся для inpainting.

2 Умный перевод с сохранением стиля

Нельзя просто скормить текст LLM. Нужно передать метаданные:

  • Размер шрифта (определяется по высоте bounding box)
  • Ориентация (вертикальный/горизонтальный текст)
  • Тип пузыря (мысли, речь, крик, шепот)
  • Контекст предыдущих панелей

Промпт для Qwen2.5 выглядит так:

prompt = """Ты переводишь мангу с японского на русский.

КОНТЕКСТ ГЛАВЫ:
{context}

ТЕКУЩАЯ ПАНЕЛЬ:
{current_text}

ИНСТРУКЦИИ:
1. Сохрани эмоциональную окраску
2. Учти, что это {bubble_type} (речь/мысли/крик)
3. Адаптируй длину: оригинал занимает {original_length} символов, доступно {available_space}
4. Для звуковых эффектов используй русские аналоги
5. Верни ТОЛЬКО перевод, без пояснений

ПЕРЕВОД:"""
💡
Если нужно обрабатывать сложные документы с разными языками, посмотрите гайд по работе с арабскими документами. Там похожие проблемы с направлением текста и диакритикой.

3 Магическое удаление текста

Вот где большинство падает. Стандартный подход - создать маску по bounding box и отправить в inpainting модель. Проблема: границы получаются резкими, фон "поплывет".

Решение: расширяем маску на 2-3 пикселя и используем модель, обученную именно на удалении текста:

import torch
from lama_inpainting import load_model, inpaint

# Загружаем предобученную LaMa
model = load_model('big-lama')
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)

# Создаем маску (белое = удалить, черное = оставить)
mask = np.zeros_like(image)
for bbox in text_bboxes:
    # Расширяем bbox на 3 пикселя для плавных границ
    expanded_bbox = expand_bbox(bbox, pixels=3)
    cv2.rectangle(mask, expanded_bbox[0], expanded_bbox[1], (255, 255, 255), -1)

# Запускаем inpainting
result = inpaint(
    image=image,
    mask=mask,
    model=model,
    device=device,
    config={'ldm_steps': 50, 'ldm_sampler': 'ddim'}
)

4 Типографика, которая не позорит

Самый сложный алгоритм. Нужно рассчитать:

  1. Максимальный размер шрифта, который вместится в пузырь
  2. Оптимальный межстрочный интервал
  3. Кернинг для конкретного шрифта
  4. Выравнивание (центр, левый край, правый край)
  5. Обтекание по форме пузыря

Мой алгоритм выглядит так:

def fit_text_to_bubble(text, bubble_mask, font_path, initial_size=40):
    """Подбираем шрифт, который идеально впишется в маску пузыря"""
    
    # Конвертируем маску в контур
    contours, _ = cv2.findContours(bubble_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    if not contours:
        return None
    
    # Берем самый большой контур (основной пузырь)
    main_contour = max(contours, key=cv2.contourArea)
    
    # Находим bounding rectangle и rotated rectangle
    rect = cv2.minAreaRect(main_contour)
    box = cv2.boxPoints(rect)
    box = np.int0(box)
    
    # Определяем ориентацию (вертикальная/горизонтальная)
    width, height = rect[1]
    is_vertical = height > width * 1.5
    
    # Бинарный поиск по размеру шрифта
    low, high = 10, 100
    best_font_size = initial_size
    best_layout = None
    
    for _ in range(10):  # 10 итераций достаточно
        font_size = (low + high) // 2
        font = ImageFont.truetype(font_path, font_size)
        
        # Пробуем разместить текст
        layout = calculate_text_layout(text, font, box, is_vertical)
        
        if layout_fits(layout, bubble_mask):
            best_font_size = font_size
            best_layout = layout
            low = font_size + 1  # Пробуем больше
        else:
            high = font_size - 1  # Пробуем меньше
    
    return best_font_size, best_layout

Ошибки, которые сломают ваш пайплайн

Из личного опыта (и сожженных нервных клеток):

Ошибка Что происходит Как исправить
Игнорирование фуриганы OCR воспринимает ее как отдельный текст, получается мусор Фильтровать по размеру (фуригана всегда меньше) и позиции
Прямоугольные маски для круглых пузырей В углах остаются артефакты оригинального текста Использовать маски, повторяющие форму контура
Одинаковый шрифт для всего Мысли, речь и крик выглядят одинаково Определять тип пузыря по форме и использовать разные шрифты
Перевод панелей по отдельности Потеря контекста, непонятные отсылки Собирать контекст всей страницы перед переводом

А что насчет готовых решений?

Они есть. И все плохие. Почему?

  • Manga Translator (GitHub): устаревший код, не поддерживает современные модели
  • Kitsunekko: облачный, медленный, ограниченные языки
  • Various Python scripts: либо слишком простые, либо сломанные зависимости

Единственный рабочий вариант - собрать свой пайплайн из описанных выше компонентов. Это больно, долго, но результат того стоит.

💡
Если нужен локальный LLM не только для перевода, но и для обработки документов, посмотрите интеграцию Obsidian с локальной LLM. Там похожие принципы работы с контекстом.

Сколько это стоит (кроме нервов)

Честная калькуляция на февраль 2026:

  • Железо: RTX 4070 или лучше (12+ GB VRAM для моделей). Без GPU будет больно
  • Время настройки: 2-3 дня, если знаете Python. Неделя, если нет
  • Память: 32+ GB RAM для комфортной работы с 32B моделями
  • Диск: 100+ GB под модели и временные файлы
  • Электричество: готовьтесь к счетам, если переводите много

Но когда видите первую идеально переведенную страницу, где текст сидит как влитой, а фон не поврежден - понимаете, что оно того стоило.

Что будет дальше?

Через год-два появятся специализированные модели, обученные именно на переводе комиксов. Они будут понимать не только язык, но и визуальный контекст: кто говорит, какие эмоции, как расположены персонажи.

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

Совет напоследок: начните с простого. Возьмите одну страницу, попробуйте настроить OCR. Потом добавьте перевод. Потом inpainting. Не пытайтесь сделать все сразу - сойдете с ума. И обязательно сохраняйте промежуточные результаты на каждом шаге, чтобы видеть, где именно ломается пайплайн.

Удачи. И помните: идеального автоматического перевода не существует. Но можно сделать на 90% лучше, чем то, что предлагает большинство "решений" на рынке.