Детектор языка всегда даёт ответ, даже на кашель. Оставляйте определение включённым для чистого или смешанного звука, а язык указывайте, когда на фоне шума или при сильном акценте звучит один язык.
Каждая транскрибация начинается с вопроса, который читатель не видит: на каком языке эта речь? Ошибка здесь означает, что весь остальной конвейер будет старательно выдавать гладкую бессмыслицу. В этой статье объясняется, на что опирается детектор языка, как он работает с живым звуком и с файлами и когда лучше указать язык самостоятельно.
Детектор языка не понимает, что говорят. Он смотрит на сам звук: набор согласных и гласных, ударение в слогах, ритм фраз и короткие частотные слова, на которые опирается каждый язык. У испанского свой набор гласных и ритм; нидерландский и немецкий во многом похожи, но расходятся в нескольких звуках. Нескольких секунд чёткой речи обычно достаточно, чтобы их различить.
Многие распознаватели делают это попутно с распознаванием слов. Они определяют язык по началу записи и выдают вероятность для каждого языка, который знают. Из такой конструкции следуют два вывода. Вероятности всегда в сумме дают единицу, поэтому ответа «никакого языка» не существует: тишина, кашель или музыкальный позывной тоже получат язык, часто с уверенным баллом. И решение принимается по началу, а это худший образец из возможных. Многие записи начинаются с приветствий, имён и названий мест, которые почти не несут языкового сигнала: «Доброе утро, Мария, добро пожаловать в Берлин» почти так же немецко, как и английски. Другие начинаются с тишины или кашля, и детектор, которому велели решить по этому, решит всё равно, уверенно и ни на чём. Так происходит и с настоящим звуком: румынская проповедь, которая начинается с шума в комнате и «Bună dimineața», легко может быть принята за итальянское «Buona domenica» с полной уверенностью.
Цена ошибки тоже выше, чем кажется. Распознаватель, декодирующий не на том языке, не просто пишет с ошибками, а переписывает. «For God so loved the world», декодированное как румынское, превратилось в «Forgot to love the world». Румынское «mândria slujește», декодированное как английское, стало «Pride serves», что является точным переводом предложения, которое никто не просил переводить. Слова звучат гладко, и в расшифровке нет никакого признака, что что-то не так, поэтому ошибка и обходится дорого.
Чаще всего детекторы сбивают пять вещей:
Какой из этих факторов вас касается, зависит от того, поступает ли звук в прямом эфире или уже лежит в файле.
При живой транскрибации целой записи под рукой нет. Звук поступает по мере того, как его произносят, и расшифровка должна поступать вместе с ним. Поэтому язык определяется по ходу речи и отслеживается, если говорящий переключается. Это и значит примечание под переключателем Spoken language при запуске живой транскрибации в панели управления: язык говорящего определяется автоматически, и он может переключиться в любой момент.
Переключение подтверждается до того, как применяется, поэтому один шумный фрагмент не уводит расшифровку на другой язык. Слабое место — начало: если первые слова — шумное приветствие, первая строка может выйти на неверном языке. Указание языка этого избавляет.
Файлы устроены иначе, потому что вся запись уже на месте.
С файлом задача проще: не нужно доверять первым секундам. Для файла язык определяется по записи целиком, поэтому шумное приветствие в начале не может решить вопрос.
Язык файла при этом остаётся рабочим предположением, а не окончательным вердиктом. Запись, которая действительно меняет язык посередине, например интервью, которое во второй половине переходит с английского на румынский, отслеживается, а не насильно приводится к одному языку, и запись, где языки чередуются на протяжении всей записи, тоже обрабатывается.
Детектор, который решает один раз и никогда не оглядывается назад, уверен не там, где нужно.
Детектор мало чем поможет, если вся запись зашумлена. Определение языка включено по умолчанию: оно обычно верно и ничего не стоит. Но для некоторых записей язык стоит указать, и панель управления подсказывает, для каких именно: указание разговорного языка повышает точность на зашумлённых записях и при сильном акценте.
Это как раз те случаи, где у детектора меньше всего материала. Шум убирает признаки, на которые опирается детектор; сильный акцент сдвигает их к другому языку; близкородственная пара даёт мало признаков изначально. Английский говорящий с сильным португальским акцентом в гулком зале трудно определяется по одному лишь звуку, и если детектор ошибётся, расшифровка будет превращать английскую речь в португальскую всё время, пока длится ошибка. Указание языка снимает вопрос, поэтому все усилия уходят на слова.
Краткий список:
Указание языка — это настройка конкретной транскрибации, а не вашего аккаунта, поэтому решать можно для каждой записи отдельно. Всё сказанное выше сводится к одной опции API.
spokenLanguage означает определение; session.update во время потокаВ API spokenLanguage — это код языка, например en; если его не указать, язык определяется автоматически. Опция находится в settings транскрибации файла или ссылки и в параметрах realtime-сессии. Определение и указание охватывают одни и те же 100 языков. Перевод на до 10 из них — отдельный выбор, и он не зависит от того, какой язык определён или указан. О том, как перевод успевает за речью, рассказано в статье Задержка живого перевода: как она устроена.
{ "name": "Board meeting", "settings": { "spokenLanguage": "en", "speakerLabels": "auto" } }
Realtime-сессия принимает ту же опцию при создании, и её можно менять, пока идёт звук. Текстовый кадр session.update с новым spokenLanguage применяется к речи с этого момента; значение "" или "auto" возвращает сессию к определению языка, а неподдерживаемый код игнорируется. Окно субтитров с кнопкой языка может позволить оператору указать язык, как только он увидит неверную первую строку, без переподключения.
{ "type": "session.update", "spokenLanguage": "ro" }
Список кодов с их названиями доступен по адресу GET /v1/languages, ключ для него не нужен. Полный поток realtime, от создания сессии на вашем сервере до чтения черновиков и зафиксированных фрагментов, описан в статье Транскрибация в реальном времени через WebSocket, а интерактивный справочник — по адресу {{api}}/docs. В панели управления тот же выбор — это переключатель Spoken language при запуске новой транскрибации, а ключи API находятся в разделе Developers.