Локальный AI-переводчик со стримингом: open-source гайд | AiManual
AiManual Logo Ai / Manual.
22 Июн 2026 Инструмент

Локальный AI-переводчик с потоковым выводом: собираем open-source решение, которое не сливает данные

Подробный обзор и пошаговая инструкция по созданию локального переводчика с потоковым выводом на базе open-source моделей. Защита данных, работа офлайн, сравнен

Реклама
cliv2

Зачем вам свой переводчик, когда есть Google?

В 2026 году отдавать конфиденциальные документы, переписку или код облачным переводчикам — примерно как отправлять интимные фото по факсу. Вроде работает, но осадочек остаётся. DeepL, Google Translate — монстры, но они видят всё, что вы им скормили. А если нет интернета? А если нужно перевести потоковое видео с субтитрами в реальном времени?

Есть решение: open-source переводчик, который живёт на вашем железе, не просит денег и выводит перевод потоком, как в чат-интерфейсе. Сегодня соберём такой инструмент — от выбора модели до веб-интерфейса с Server-Sent Events.

Если вам не хочется возиться с локальным запуском, но хочется легального доступа к мощным моделям через API — посмотрите на AITunnel. Это шлюз, который даёт стабильный доступ к нейросетям без блокировок. Но статья — про локальный подход.

Что вы получите на выходе

Полностью локальный HTTP-сервер (на FastAPI), который принимает текст на одном языке и возвращает перевод потоком (chunk-by-chunk). Никаких утечек, никаких ограничений по объёму, никаких счетов за API. Задержка — от 200 мс до 2 секунд в зависимости от модели и железа.

Возможности:

  • Поддержка 200+ языков (если взять NLLB-200 от Meta).
  • Потоковый вывод: перевод появляется по мере генерации, не нужно ждать всё предложение.
  • Работа на CPU (медленно, но офлайн) или GPU (шустро).
  • Легко встраивается в любой интерфейс — от Python-скрипта до веба.

Сравнение с альтернативами

ИнструментТипСтримингОфлайнПриватность
Наше решениеopen-sourceДаДаПолная
LibreTranslateopen-sourceНет (только batch)ДаПолная
Google Translate APIоблачныйНетНетНизкая
Ollama + Open WebUIopen-sourceДаДаПолная

Главный конкурент из мира open-source — TranslateGemma UI. Он даёт красивый веб-интерфейс для модели Gemma, но стриминг там не заложен архитектурно. Наше решение — более гибкое: вы сами выбираете модель и способ вывода.

Как это выглядит в жизни

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

Да, качество зависит от модели. Для specialised задач (медицина, юриспруденция) лучше дообучить модель, но базовый NLLB-200 справляется с общими текстами на 9 из 10.

💡
Если вам нужно переводить код с Python на Node.js — не спешите использовать переводчик; лучше посмотрите на наш опыт перевода проектов. Там другие грабли.

Собираем решение: пошагово

1 Выбираем модель

Для перевода с парой сотен языков NLLB-200 от Meta — король. Берите дистиллированную версию на 600M параметров: она даёт хорошее качество и помещается на 4 ГБ VRAM. Для русско-английского можно взять M2M100 (418M).

Загружаем через transformers:

from transformers import M2M100ForConditionalGeneration, M2M100Tokenizer

model_name = "facebook/m2m100_418M"
tokenizer = M2M100Tokenizer.from_pretrained(model_name, src_lang="en", tgt_lang="ru")
model = M2M100ForConditionalGeneration.from_pretrained(model_name)

2 Реализуем потоковый вывод

Секрет в генераторе. Мы подаём текст, получаем токены инкрементально и отдаём их клиенту через Server-Sent Events. Вот каркас FastAPI-эндпоинта:

from fastapi import FastAPI
from fastapi.responses import StreamingResponse

app = FastAPI()

@app.get("/translate-stream")
async def translate_stream(text: str, src: str = "en", tgt: str = "ru"):
    tokenizer.src_lang = src
    inputs = tokenizer(text, return_tensors="pt")
    
    async def generate():
        for token_id in model.generate(**inputs, max_new_tokens=256, num_beams=1, do_sample=False):
            decoded = tokenizer.decode(token_id.sequence, skip_special_tokens=True)
            yield f"data: {decoded}\n\n"
    
    return StreamingResponse(generate(), media_type="text/event-stream")

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

past_tokens = []
for new_token in model.generate(**inputs, max_new_tokens=256, ...):
    past_tokens.append(new_token)
    decoded = tokenizer.decode(past_tokens, skip_special_tokens=True)
    yield f"data: {decoded}\n\n"

Зачем здесь стриминг? Чтобы пользователь не ждал. Визуально перевод появляется по мере размышлений модели — как в ChatGPT.

3 Запускаем и тестим

pip install fastapi uvicorn transformers torch
uvicorn main:app --host 0.0.0.0 --port 8000

Теперь вызываем:

curl -N "http://localhost:8000/translate-stream?text=Hello+world&src=en&tgt=ru"

Вывод: строчки появятся одна за другой, а не всё сразу.

Ускоряем и оптимизируем

Квантование 8-бит через bitsandbytes сокращает размер модели и ускоряет инференс. Для NLLB-200-distilled-600M добавьте:

model = M2M100ForConditionalGeneration.from_pretrained(
    model_name, 
    load_in_8bit=True, 
    device_map="auto"
)

Если GPU нет — только CPU. Скорость упадёт, но для коротких предложений терпимо. В обзоре фреймворков для локального запуска LLM есть детали про llama.cpp — для CPU он эффективнее, чем transformers.

Ещё вариант: использовать Ollama с моделью qwen2.5:7b и системным промптом-переводчиком. Стриминг уже встроен, качество — на уровне, но модель не специализирована, может галлюцинировать при длинных текстах.

Потоковый перевод на стероидах

Собранный нами сервер можно встроить в любое приложение. Хотите переводить веб-страницы — подключите translate-stream к скрипту на Tampermonkey. Хотите субтитры к видео — скормите аудио через Vosk / Whisper, а текст отправьте нашему переводчику. Даже для живого общения в чате — задержка меньше секунды.

Если не хочется писать с нуля, обратите внимание на каталог open-source инструментов — там много готовых решений для дообучения и инференса.

А что с безопасностью?

Локальный запуск — единственный способ гарантировать, что ваши тексты не утекут. Никаких логов на стороне провайдера. Это критично для юристов, врачей и всех, кто работает с NDA.

Если вам нужно анализировать документы без облаков, посмотрите статью про корпоративный AI-стек — там описана архитектура для полноценной офисной работы.

Неочевидный совет

Гоняться за самой большой моделью — ошибка новичка. Для перевода выигрывает не размер, а специализация. NLLB-200-distilled-600M на 8-битном кванте даёт скорость почти как у 200-миллионной модели, но качество — на уровне полной. А потоковый вывод делает задержку незаметной. Лучше потратить время на настройку аугментации данных (разбиение длинных текстов, восстановление контекста), чем на гигабайты лишних параметров.

И ещё: если у вас нет GPU, но есть интернет, локальный запуск превращается в фарс. Тогда дешевле и быстрее купить доступ через AITunnel — это нечистый, но удобный путь. Однако для настоящей приватности — только локальный зоопарк.

Подписаться на канал