Зачем вам свой переводчик, когда есть 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 | Да | Да | Полная |
| LibreTranslate | open-source | Нет (только batch) | Да | Полная |
| Google Translate API | облачный | Нет | Нет | Низкая |
| Ollama + Open WebUI | open-source | Да | Да | Полная |
Главный конкурент из мира open-source — TranslateGemma UI. Он даёт красивый веб-интерфейс для модели Gemma, но стриминг там не заложен архитектурно. Наше решение — более гибкое: вы сами выбираете модель и способ вывода.
Как это выглядит в жизни
Представьте: вы смотрите лекцию на английском, запустили скрипт, который режет аудио на фрагменты, отправляет в наш переводчик, и на экране всплывают субтитры на русском с задержкой в полторы секунды. Или переводите документацию на лету — копируете кусок текста, и перевод появляется по словам.
Да, качество зависит от модели. Для specialised задач (медицина, юриспруденция) лучше дообучить модель, но базовый NLLB-200 справляется с общими текстами на 9 из 10.
Собираем решение: пошагово
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 — это нечистый, но удобный путь. Однако для настоящей приватности — только локальный зоопарк.