Архитектура

Внутри четырех конвейеров перевода, обеспечивающих работу InterMIND

В InterMIND нет «единого перевода». Есть четыре конвейера — голос, чат, заметки, документы — у каждого свой механизм, бюджет задержки и коридор качества. Вот что на самом деле происходит между моментом, когда вы говорите, и моментом, когда вас понимает участник на другом языке.

The Mind.com Team

Внутри четырех конвейеров перевода, обеспечивающих работу InterMIND

Внутри четырёх конвейеров перевода, на которых работает InterMIND

Старая страница /product/overview/how-it-works на mind.com устарела на несколько крупных релизов. Она описывает единый «движок перевода» так же, как это делают страницы большинства вендоров — одна большая стрелка от «вы говорите» к «они слышат». Эта картина была упрощением уже два года назад. Сегодня она неверна.

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

Это обновлённый ответ на вопрос «как это работает».

Сопутствующий материал: «Сколько языков вы поддерживаете?» описывает, что охватывает каждый конвейер (24 / 24 / 30 / 17). Этот пост описывает, что каждый конвейер делает — и почему он существует сам по себе.


Почему «один движок для всего» — это ложь

Платформа для встреч в реальном времени должна выполнять как минимум четыре задачи одновременно, и они тянут в несовместимых направлениях:

  1. Голос в реальном времени — аудио на входе, переведённое аудио на выходе, менее чем за секунду, каждый слушатель на своём языке. Жёсткое ограничение — задержка.
  2. Текстовый чат в реальном времени — короткие сообщения, быстро, с сохранением правок, цитат и структуры HTML.
  3. Общие заметки в реальном времени — совместный ввод символ за символом с структурной иерархией (списки, заголовки, чекбоксы), которая должна сохраниться после перевода.
  4. Асинхронные файлы документов — 40-страничный PDF, брошенный в чат. Нет бюджета на задержку. Жёсткое ограничение — точность (форматирование, таблицы, номера страниц, шрифт).

Можно сделать один гигантский вызов LLM, который попытается сделать всё это. Мы пробовали. Он справляется со всем плохо. Бюджет задержки для голоса означает, что модель не может «думать»; бюджет точности для документов означает, что модель должна это делать. Правка в чате требует diff на языке зрителя; 40-страничный PDF требует сохранения форматирования, которое не даёт ни одна модель с потоковой передачей токенов.

Поэтому мы используем четыре. Вот каждый из них.


Конвейер 1: перевод голоса в реальном времени

Задача: Один участник говорит по-французски. Другой присоединился на немецком, третий — на бразильском португальском, четвёртый — на японском. Каждому нужно слышать говорящего на своём языке, в своих наушниках, с задержкой, достаточно короткой, чтобы сохранять зрительный контакт.

Бюджет: Менее секунды от начала до конца. Всё, что превышает ~1,2 секунды, ломает разговор — люди начинают говорить поверх перевода, и встреча сползает к «давайте просто перейдём на английский».

Как на самом деле перемещается аудио

Конвейер перевода голоса: браузер говорящего выполняет ASR локально через Mind SDK, ws-server отправляет транскрипт в движок перевода через один WebSocket на каждый целевой язык, присутствующий в комнате, и каждый зритель получает свою собственную переведённую аудиодорожку.

Несколько вещей, которые стоит назвать прямо:

  • ASR выполняется в браузере говорящего, а не на центральном сервере. Мы используем Mind SDK локально; это экономит один цикл обмена данными и даёт нам транскрипт на исходном языке с наименьшей возможной задержкой ещё до того, как начнётся перевод.
  • Перевод — это не одно разветвление (fan-out). Мы держим пул WebSocket-подключений к нашему движку перевода, по одному на каждый целевой язык, присутствующий в комнате. Если три участника выбрали немецкий, немецкий использует одно соединение. Если никто не выбрал арабский, арабское соединение не открывается. Пул сбрасывает неактивные соединения через пять минут. Именно поэтому встреча на четырёх языках стоит столько же, сколько встреча на сорока языках, с точностью до того, кто на самом деле присутствовал — мы никогда не переводим на языки, которые никто не слушает.
  • Синтезированная речь индивидуальна для каждого зрителя. Каждый участник получает свою собственную переведённую аудиодорожку, смешанную с видео оригинального говорящего. Они не смотрят мастер-«переведённую встречу» — они смотрят ту же встречу, но с их личным аудиоканалом, переведённым на выбранный язык. Именно поэтому два человека в одной физической комнате могут подключить наушники и слышать разные языки.

Почему это важно, когда встреча идёт не по плану

В 60-минутном звонке на восьми языках вещи ломаются интересными способами: WebSockets отключаются, ASR временно неправильно транскрибирует имя собственное, сеть одного участника начинает «дрожать». Описанная выше архитектура позволяет нам изолировать сбои: заикание аудио у одного зрителя не влияет на остальных семерых, потому что движок перевода никогда не создавал «тот самый перевод» — он создал восемь параллельных версий, и восстанавливать нужно только ту, на которой произошёл сбой.

Сам движок — наш, размещён на нашей собственной инфраструктуре. Мы не маршрутизируем голос в реальном времени через сторонние LLM общего назначения. Бюджет задержки исключает их; история с резидентностью данных исключает их для регулируемых клиентов, которым это действительно важно.

Что мы публикуем о качестве голоса: /benchmark прогоняет рабочий голосовой конвейер по предложениям FLORES-200 для каждой опубликованной языковой пары ежемесячно. Судья назван (Gemini 2.5 Flash в качестве основного, Claude Sonnet 4 в качестве запасного). Полное распределение — медиана, p10, p90, мин, макс, размер выборки — представлено на странице. См. методологию, чтобы узнать, что эти цифры измеряют, а что нет.


Конвейер 2: перевод чата в реальном времени

Задача: Каждое сообщение в чате на встрече, переведённое для каждого участника на его язык в момент отправки. Плюс правки — и правки должны выглядеть как правки, а не как новые переводы.

Бюджет: Быстро, но не обязательно менее секунды. Сообщение в чате может появиться на другом языке за полсекунды, и никто не обратит внимания. Что волнует людей — правильный ли перевод и имеют ли смысл правки.

Что на самом деле делает конвейер чата

Каждое сообщение проходит через тот же движок перевода, что и голосовой конвейер — но с другой предварительной и постобработкой:

  • Структура HTML сохраняется. Чат поддерживает форматированный текст (абзацы, списки, цитаты, жирный шрифт, курсив). Мы конвертируем его в обычный текст для модели, переводим, а затем оборачиваем результат в исходные теги. Модель никогда не видит HTML — она видит чистый текст.
  • Цитаты переводятся независимо. Если вы отвечаете на сообщение и цитируете его, блок [QUOTE]…[/QUOTE] и новое содержимое переводятся как отдельные единицы, поэтому модель не может их перепутать.
  • Длинные сообщения разбиваются на части. Мы разделяем их по границам абзацев на куски по 1000 символов. Каждый кусок — это отдельный вызов перевода. Мы не загружаем в модель 4000-символьные романы за один раз — режимы сбоев (усечение, потеря абзацев, обрывы на середине предложения) слишком неприятны.
  • Перевод ленивый. Мы используем IntersectionObserver: сообщение переводится только тогда, когда оно попадает в область просмотра зрителя. Переключение языков в долго работающем канале раньше вызывало повторное выполнение каждого вызова API перевода из истории. Теперь этого не происходит.

Самое интересное: правки как diff'ы

В v1.2 мы изменили поведение правок в чате для зрителей на другом языке. Старое поведение было: кто-то редактирует сообщение, мы переводим его заново целиком, вы видите новый абзац и должны сами найти, что изменилось.

Новое поведение:

  1. Исходное сообщение уже было переведено на ваш язык.
  2. Когда отправитель вносит правки, мы переводим новую версию.
  3. Мы вычисляем diff между вашим предыдущим переводом и вашим новым переводом на вашем языке.
  4. Мы показываем этот diff в строке — так же, как Git показывает вам изменения.

Так, когда «review by Tuesday» превращается в «review by Thursday» на английском, ваш коллега, читающий на испанском, видит выделенное martes → jueves, а не переведённый заново абзац, который нужно перечитывать.

Это потребовало рассматривать конвейер чата как stateful-кэш для каждого зрителя, а не как stateless-эндпоинт перевода по запросу. Документам и голосу это не нужно. Чату — нужно.


Конвейер 3: перевод общих заметок в реальном времени

Задача: Хост открывает панель общих заметок и начинает печатать. Каждый участник видит заметки на своём языке, символ за символом, со структурой документа — заголовками, вложенными списками, чек-листами, блоками кода — нетронутой.

Бюджет: Такой же, как в чате (~полсекунды), но с двумя дополнительными ограничениями:

  • Переводимый объект меняется прямо во время перевода. Хост всё ещё печатает. Наивная система, переводящая «весь документ» при каждом нажатии клавиши, производит мерцание и сжигает бюджет API. Мы переводим с гранулярностью изменённой единицы, а не всего документа.
  • Структура должна сохраниться. Если попросить модель перевода перевести блок markdown с тремя вложенными списками, вы получите что-то, что выглядит как оригинал, но с незаметно уплощённой иерархией, перенумерованными элементами или смещёнными отступами. Мы не позволяем модели видеть весь блок целиком.

Чем конвейер заметок отличается от чата

Сохранение структуры — это главное. Мы переводим каждый элемент списка независимо, а не как единый документ. Модель видит:

«Compliance review — Q2 deliverables»

— а не:

"# Project plan\n## Quarter\n- Compliance review — Q2 deliverables\n- Vendor scoring\n - Tier 1 vendors..."

Оборачивающий документ — <ul>, заголовки, отступы — перестраивается на стороне клиента с использованием той же структуры, что была у исходного документа, причём каждый листовой узел заменяется его переводом. Модель никогда не получает возможности «улучшить» иерархию.

Заметки также используют ту же модель diff для каждого зрителя, что и правки в чате: если хост меняет строку, зрители на других языках видят изменённые слова выделенными, а не новый абзац.


Конвейер 4: Асинхронный перевод документов

Задача: Кто-то бросает в чат 40-страничный PDF, документ Word, презентацию PowerPoint или таблицу Excel. Каждый участник может запросить копию на своём языке. Переведённый файл должен выглядеть как оригинал — те же шрифты, те же таблицы, те же номера страниц, те же колонтитулы, те же диаграммы на своих местах.

Бюджет: Нет ограничений реального времени. Минута — нормально. Две минуты — нормально. Ограничением является точность — если переведённый PDF не выглядит как оригинал, получатель не будет ему доверять.

Почему этот конвейер не использует общий движок с голосом

Общий LLM, даже очень хороший, вернёт вам переведённый текст документа. Он не вернёт вам переведённый PDF с тем же макетом. Модель не имеет понятия о «разрыве страницы, который должен совпадать с исходным» или «ячейке таблицы, которая должна сохранить ширину столбца».

Для этой задачи мы напрямую используем DeepL Document API. Он создан специально для перевода файлов как файлов, а не текста, извлечённого из файлов. DeepL обрабатывает:

  • PDF (с сохранением макета)
  • DOCX, DOC
  • PPTX
  • XLSX

Документ загружается в конвейер DeepL, переводится на стороне сервера с сохранением форматирования и возвращается в том же формате. Затем мы загружаем результат в наше объектное хранилище и возвращаем его в чат в виде вложения, доступного для скачивания.

Сколько это стоит и почему мы это не скрываем

DeepL выставляет счёт минимум за 50 000 символов за документ — примерно один доллар США за файл на тарифе Pro, независимо от того, составляет документ одну страницу или тридцать. Мы покрываем эти расходы, а не берём плату за каждый файл; они отражаются в статистике использования перевода для встречи как billed characters, конвертируемые в единицы слов, которые соответствуют тому, как остальная часть продукта отчитывается об активности перевода.

Мы выбрали DeepL для этой задачи, потому что перевод файлов как файлов — это именно то, для чего он был создан; мы не пытались сделать лучше. Обратное неверно — DeepL не запускает голосовой конвейер в реальном времени того типа, который мы создали для встреч. Разные проблемы — разные инструменты. Честная версия того, «что обеспечивает перевод InterMIND» — это «правильный движок для каждого конвейера», а не «наш движок везде».

Языки, которые охватывает этот конвейер, а голосовой — нет

Документальный конвейер охватывает 30 языков, против 24 для голоса. Дополнительные включают: болгарский, греческий, эстонский, индонезийский, литовский, латышский, словацкий, словенский. (Арабский раньше находился в этом списке, пока качество его голосового перевода не дотягивало до нашего уровня; теперь он в селекторе реального времени, с его оценками для каждой пары, опубликованными на /benchmark, как и для любого другого языка. Теперь асимметрия наблюдается в обратную сторону для хинди — он доступен на голосе, но пока недоступен для файлов.)

Эта асимметрия реальна. Это означает, что французский участник встречи может запросить PDF-копию контракта на эстонском языке, даже если он не может слушать встречу на эстонском. Мы указываем на это в селекторе, а не сглаживаем одним числом. Обоснование приведено в посте о количестве языков.


Где конвейеры пересекаются

Четыре конвейера не работают изолированно. Комната встречи — это место, где они соприкасаются, и стыки имеют значение:

  • Сообщение в чате с вложенным документом запускает конвейер чата для текста и конвейер документов для файла. Участник на другом языке видит немедленно переведённое сообщение и асинхронно приходящий перевод вложения, доступный для скачивания.
  • Общая заметка, цитирующая строку транскрипта пересекает заметки ↔ голос. Транскрипт — это то, что голосовой конвейер создал для языка отправителя; перевод заметки создаёт индивидуальную копию этой цитаты на языке каждого зрителя с сохранением указания авторства источника.
  • Транскрипт, экспортированный после встречи проходит через текстовый конвейер в стиле чата по всему разговору, создавая файл для каждого языка, который могут скачать участники. Это тот же путь кода, что и перевод в чате, просто пакетный.

Селектор языка — это один элемент UI. Инфраструктура под ним — это четыре конвейера, общающихся друг с другом.


Что мы сознательно не пытаемся делать

  • Никаких «единых моделей перевода». Мы не строим одну модель, которая делает голос, чат, заметки и документы. Компромисс между задержкой и точностью не имеет победителя. Мы используем правильный движок для каждой задачи.
  • Никакого тихого перенаправления. Если сегодня конвейер файлов не может перевести на хинди, мы тихо не откатываемся к голосовому движку и не делаем вид, что всё сработало — селектор файлов отмечает пробел вместо того, чтобы скрывать его.
  • Никакого «мы переводим на 200 языков». Наш движок выдаёт 24. Поверхности в реальном времени поставляют все 24, документы — 30 — и вместо одного маркетингового числа, качество для каждой пары, которое должно выдержать проверку аудитора, публикуется на /benchmark, включая более слабые пары.

Попробуйте сами

  • Попробуйте живую демо-версию — запускает голосовой конвейер в реальном времени с вашим аудио на любом из 24 языков продукта. Тот же конвейер, который набирает баллы на /benchmark.
  • Посмотрите бенчмарк — качество для каждой пары, каждый месяц на реальном трафике. Каждая пара в селекторе, сильная или слабая, с прямой ссылкой.
  • Прочитайте методологию — что это за цифры, чем они не являются, кто выступает судьёй.

Четыре конвейера, четыре движка, одна комната встречи. Это честная замена старой странице how-it-works.

— Команда Mind.com


Источники: DeepL — поддерживаемые языки, DeepL — подсчёт использования и биллинг (минимум 50 000 символов на файл), FLORES-200; внутренние факты о конвейерах сверены с поставляемым кодом, проверено август 2026 г.

Получать новые публикации по email

Мы пришлём письмо, когда выйдет новая публикация. Отписаться можно в любой момент.