Экспертиза · Транскрибация и перевод
Речь в текст, на румынском и русском, с согласием, записанным до первой секунды аудио.
Мы транскрибируем аудио в реальном времени или из файла, переводим между румынским и русским в разговорах с клиентами и выдаём текст с временными метками, аудиоэкспортом и следом согласия. Распознавание речи мы запускаем через поставщиков, через наш gateway; собственная модель румынского языка — это исследование, а не продукт.
Уже построеноДве собственные реализации, обе открытые и цитируемые. Первая — приложение для потоковой транскрипции, с backend Express из 3.378 строк в 25 файлах и 37 тестами, которые мы запустили сегодня — все проходят; оно содержит ту часть, которую никто не строит из энтузиазма: квалификационные ворота согласия, которые отказывают в захвате, когда нет записанного согласия. Вторая работает в production, у реальных клиентов: входящие голосовые сообщения в каналах сообщений транскрибируются, а письменный ответ оператора на румынском языке переписывается на язык клиента перед отправкой. То, что НЕ входит в «delivered» и написано именно так на странице: собственная модель распознавания и синтеза на румынском — это research; у неё нет публичной демонстрации, нет интерфейса программирования, а по точности на румынском она проигрывает большим коммерческим системам. Сервис продаётся по тому, что работает, а не по тому, что мы изучаем.
Транскрибация кажется решенной проблемой, пока вы не примените ее к румынскому языку, к двум говорящим, которые перебивают друг друга, к цифрам, сказанным быстро, и к клиенту, который переходит на русский посреди фразы. Тогда возникают три настоящие проблемы: какую модель выбрать для языка перед вами, как понять, где заканчивается очередной отрезок речи, и кто дал вам право записывать. Мы занимаемся всеми тремя, а последнюю рассматриваем как проблему кода, а не как абзац политики.
В нашем приложении для потоковой транскрибации браузер никогда не получает ключ поставщика. Он запрашивает у backend одноразовый токен, по умолчанию действительный четверть часа, с которым открывает соединение для транскрибации; маршрут, который выдает токен, закрыт по умолчанию и может быть открыт только явной настройкой вне production, именно потому что это маршрут, на который расходуются деньги. Поверх сырой транскрибации работает анализ на модели языка, со списком резервных моделей в порядке, чтобы недоступность одной не остановила сессию.
Шлюз согласия — это часть, к которой мы особенно внимательны. Перед тем как принять фрагмент аудио, сервер запрашивает строку неотозванного согласия для соответствующей сессии. Если ее нет, отвечает 451 и сообщением на румынском. Если база данных не отвечает, он отклоняет все — 503, а не «пропускает». Уже проверенные сессии проходят через кэш на десять минут, чтобы краткий сбой не прервал текущую запись. Это написано так, чтобы это нельзя было обойти из-за ошибки конфигурации.
Часть, которая уже у клиентов, другая и менее зрелищная: на каналах обмена сообщениями полученное голосовое сообщение становится текстом, а язык выбирается по голосованию на основе последних восьми сообщений разговора, а не путем угадывания по аудио. В обратном направлении, когда коллега отвечает на румынском, его текст переписывается на язык клиента со строгими инструкциями — он не добавляет информации, не выдумывает цены или сроки, не противоречит оператору и рассматривает текст оператора строго как данные для передачи, никогда как инструкции для модели.