Перейти к основному содержимому
megapromotingДавайте обсудим

Экспертиза · Транскрибация и перевод

Речь в текст, на румынском и русском, с согласием, записанным до первой секунды аудио.

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

Уже построеноDouă implementări proprii, ambele deschise și citate. Prima e o aplicație de transcriere în flux, cu backend Express de 3.378 de linii în 25 de fișiere și 37 de teste pe care le-am rulat azi — toate trec; ea conține partea pe care nimeni nu o construiește din entuziasm: o poartă de consimțământ care refuză captura când nu există acord înregistrat. A doua rulează în producție, la clienți reali: mesajele vocale primite pe canalele de mesagerie sunt transcrise, iar răspunsul scris de un operator în română este rescris în limba clientului înainte de a pleca. Ce NU intră în „delivered” și e scris ca atare în pagină: modelul propriu de recunoaștere și sinteză în română este cercetare — nu are demonstrație publică, nu are interfață de programare, iar pe acuratețe în română pierde față de sistemele comerciale mari. Serviciul se vinde pe ce rulează, nu pe ce studiem.

Транскрибация кажется решенной проблемой, пока вы не примените ее к румынскому языку, к двум говорящим, которые перебивают друг друга, к цифрам, сказанным быстро, и к клиенту, который переходит на русский посреди фразы. Тогда возникают три настоящие проблемы: какую модель выбрать для языка перед вами, как понять, где заканчивается очередной отрезок речи, и кто дал вам право записывать. Мы занимаемся всеми тремя, а последнюю рассматриваем как проблему кода, а не как абзац политики.

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

Шлюз согласия — это часть, к которой мы особенно внимательны. Перед тем как принять фрагмент аудио, сервер запрашивает строку неотозванного согласия для соответствующей сессии. Если ее нет, отвечает 451 и сообщением на румынском. Если база данных не отвечает, он отклоняет все — 503, а не «пропускает». Уже проверенные сессии проходят через кэш на десять минут, чтобы краткий сбой не прервал текущую запись. Это написано так, чтобы это нельзя было обойти из-за ошибки конфигурации.

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

Что входит

Работа, по составляющим

Согласие, проверенное до аудио

Ворота согласия требуют неотозванную строку в реестре согласий для текущей сессии. Без нее: 451, с сообщением на русском языке. При упавшей базе данных: 503, то есть отказ, а не пропуск. Уже проверенные сессии проходят через кэш на 10 минут, чтобы проверка не обращалась к базе для каждого фрагмента аудио.

Одноразовый токен, ключ остается на сервере

Страница запрашивает у backend токен для транскрибации в реальном времени, по умолчанию действительный 900 секунд, и с его помощью открывает соединение с поставщиком. Ключ аккаунта никогда не попадает в браузер. Запрос к поставщику имеет timeout 30 секунд, а его превышение возвращает явную ошибку, а не бесконечное ожидание.

Потоковая транскрибация, с языком, выбранным из контекста

В production, на каналах сообщений, язык голосового сообщения определяется по голосованию по последним восьми сообщениям беседы — русский, если он преобладает, иначе румынский — и только потом вызывается распознавание, с явным указанием языка. Формат файла распознается по первым 12 байтам, а не по расширению, потому что голосовые сообщения на каналах Meta приходят как `ogg`, независимо от того, как они названы.

Перевод оператор → клиент, с границами, записанными в prompt

Когда коллега отвечает на румынском во внутренней ветке, сообщение клиенту переписывается на языке клиента. Правила явно прописаны в коде: не добавляет информацию, не выдумывает детали, цены, сроки или обещания, не противоречит оператору, а текст оператора трактуется строго как данные для передачи, никогда как инструкции для модели — мера против инъекции команд, а не формулировка стиля.

Анализ поверх transcript, с резервными моделями по порядку

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

Экспорт аудио в трех форматах, с явным сбоем

WAV создается без внешних инструментов. FLAC и MP3 требуют `ffmpeg`; если его нет, сервер отвечает 501 с причиной, а если процесс зависает, он останавливается через 60 секунд и возвращает 504 с первыми двумя тысячами символов ошибки. Неудачный экспорт сообщает, почему.

Отдельный учет квоты и стоимости

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

Три порога трафика, по пользователю, а не по адресу

Выпуск токенов, анализ и экспорт имеют отдельные лимиты, а ключ счетчика — аутентифицированный пользователь, когда он есть, а не IP-адрес — иначе один агрессивный пользователь за общей сетью исчерпал бы квоту всех своих коллег.

Потоковая транскрибация на каналах сообщений, в существующем потоке

Голосовое сообщение, полученное от клиента, превращается в текст в той же беседе, без открытия другого инструмента кем-либо. Распознавание и синтез проходят через наш gateway, а не напрямую к поставщику, поэтому потребление отображается в том же месте, что и остальное.

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

Путь, шаг за шагом.

01

Мы устанавливаем право на запись до любого кода

Кто говорит, кто информирован, кто даёт согласие, кто хранит запись и сколько. Результат — не документ, который лежит в ящике, а настройка ворот: что именно означает «существующее согласие» в ситуации клиента и что происходит, когда его нет.

02

Выбираем цепочку по языку и по условиям звука

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

03

Собираем поток целиком и намеренно ломаем его

Токен, соединение, транскрипция, анализ, экспорт. Затем проверяем случаи, которые действительно происходят: отсутствие согласия, падение базы данных в середине сессии, истечение токена, отсутствие `ffmpeg`, недоступность поставщика. Каждый должен выдавать сообщение, которое говорит, что именно сломалось.

04

Передаём с включёнными счётчиками и лимитами

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

IntrareVerificareDeciziePublicareNimic nu trece mai departe neverificat.ORDINEA E ARGUMENTUL
Cinci pași, în ordinea în care se execută: acordul verificat în registru (fără el, drumul se oprește aici); jetonul de unică folosință emis de server, cu cheia rămasă pe server; transcrierea în flux la furnizor; analiza peste transcript, cu modele de rezervă în ordine; exportul textului și al audio-ului. Primul pas e singurul care poate opri tot restul, și e desenat ca poartă, nu ca etapă.

Данные

К чему прикасаемся, где оно лежит и сколько остаётся

Вопросы, которые задаёт всякий, у кого есть ответственный за защиту данных, — заданы здесь раньше, чем их задаст он.

Регистр согласий
Одна строка на сессию, с рабочей областью, идентификатором сессии и моментом отзыва, пустая, пока согласие действительно. Проверка ищет именно отсутствие отзыва. Это единственный источник истины для права на захват аудио, и он запрашивается перед каждой сессией, а не только при регистрации.
Аудио, transcript и анализ
Сырое аудио проходит через подключение транскрипции к поставщику; у нас сохраняются transcript, временные метки и результат анализа, а также экспорт, который запрашивает пользователь. Что именно сохраняется и сколько определяется по проекту, до первой записи — для совета, медицинского заседания и коммерческого звонка ответы не одинаковы.
Куда уходит аудио и кому
К поставщикам распознавания речи и к модели анализа, через наш gateway. Их список записывается в договор до запуска, с именем каждого, потому что неуказанный субпроцессор — это юридическая проблема, а не технический недочёт.
Реестр потребления
Потраченные минуты списываются атомарно в базе данных, а стоимость записывается отдельно, по сессии и по поставщику. Это два отдельных регистра именно для того, чтобы ошибка в одном не исказила другой.
Что мы не затрагиваем
Мы не обучаем модели на записях клиента и не используем выходные данные голосового поставщика для построения или тестирования конкурирующей модели — это прямо запрещено в условиях используемого нами поставщика, и это ограничение мы соблюдаем даже там, где это технически удобно.

Случай

Сессия, которая не запускается, и почему это правильное поведение

Ситуация

Сценарий многопользовательского заседания, в котором транскрипция должна была стартовать из браузера, а запись должна была сохраняться. Ситуация, в которой ломается большинство инструментов транскрипции: кто-то нажимает «записать» до того, как согласие участников будет зафиксировано где-либо.

Что мы построили

Я поместил проверку согласия на путь запроса, а не на экран предупреждения. Сервер ищет строку невозвращенного согласия для текущей сессии, прежде чем принять первый фрагмент аудио. Я сознательно описал и поведение при сбое: если база данных, которая хранит согласия, не отвечает, запрос отклоняется с 503, а не пропускается. Уже проверенные сессии остаются в кэше десять минут, чтобы короткий сбой не прервал текущую запись. Маршрут, который выдает токены поставщику, по умолчанию закрыт и может быть открыт только явной настройкой вне производства.

Что получилось

Без зафиксированного согласия захват возвращает 451 с сообщением на румынском, а событие журналируется с сессией и рабочим пространством. Поведение покрыто тестами, которые запускаются без базы данных, путем внедрения проверки. Набор backend-а содержит 37 тестов; при сегодняшнем запуске все проходят.

Чего этот случай не говорит

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

Вопросы

О чём нас спрашивают перед тем, как позвонить

На каких языках вы транскрибируете?

Мы работаем с румынским и русским, потому что это языки, в которых возникают наши реальные проблемы и которые мы можем проверить на собственном материале. Другие языки технически возможны через тех же поставщиков, но прежде чем что-то обещать, мы делаем пробу на ваших записях — язык либо работает, либо не работает в зависимости от аудио, а не от списка на странице поставщика.

У вас есть собственная модель распознавания речи на румынском?

В исследовании, а не в продукте, и важно не путать эти две вещи. У собственного направления нет публичной демонстрации, нет интерфейса программирования и нет телефонии, а по точности распознавания на румынском наши измерения показывают, что мы уступаем крупным коммерческим системам. Мы публикуем это, потому что это наш вывод, полученный на нашем собственном тестовом стенде. Сервис, который мы продаем сегодня, работает на поставщиках через наш gateway.

Кто имеет право записывать разговор и что вы делаете, если такого права нет?

Право определяется по ситуации вместе с клиентом до установки — это не то, что мы можем передать сами. Что мы делаем — это обеспечиваем его в коде: без зарегистрированного согласия для текущей сессии сервер отклоняет захват с 451 и сообщением на румынском. Если база данных, которая хранит согласия, не отвечает, он отказывает и тогда, с 503. Нет настройки, которая превратила бы отсутствие согласия в тихий проход.

Мой ключ у поставщика попадает в браузер?

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

Насколько точна транскрибация?

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

Вы переводите разговоры в реальном времени между оператором и клиентом?

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

Какие аудиоформаты вы принимаете и что я получаю в ответ?

Формат определяется по содержимому файла, а не по расширению — WAV, OGG, MP3 и M4A обрабатываются явно, а голосовые сообщения из мессенджер-каналов обычно приходят как OGG. Вы получаете transcript, анализ, если он запрошен, и экспортированное audio: WAV без зависимостей, FLAC и MP3, если на сервере есть `ffmpeg`. Если его нет, сервер сообщает об этом специальным кодом, а не падает с общей ошибкой.

Вы используете наши записи, чтобы обучать ваши модели?

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

Что происходит, когда поставщик транскрипции падает посреди заседания?

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

На чём основаны утверждения выше (14 источников)
  1. Termenii furnizorului de voce interzic antrenarea sau testarea unui model concurent pe ieșirea lorhttps://elevenlabs.io/use-policy · 2026-09-06

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

Что вы хотели бы наладить?

Расскажите о своём процессе. Вместе определим, что стоит построить, что можно подключить и как проверим результат.

Давайте обсудим