Опции
Опции задаются для проекта во вкладке «Настройки» кабинета и действуют на все записи. Для одной записи их можно изменить: в кабинете в блоке «Опции распознавания», в API полем settings при загрузке. Ключи одни и те же.
| Ключ | Опция | Тариф |
|---|---|---|
formatting | Пунктуация и заглавные буквы | ×1 |
itn | Числа, даты и суммы цифрами | ×1 |
stereo_channels_as_speakers | Стерео-каналы это собеседники | ×1 |
diarization, max_speakers | Разделение по спикерам | ×1 |
gender | Пол голоса | ×1 |
language_detection | Язык речи | ×1 |
call_outcome | Дозвон | ×1 |
speaker_roles, call_direction | Клиент и менеджер | ×1 |
speaker_identification | Узнавать по голосу | ×1 |
voice_events | Эмоции: смех, недовольство и энергия (бета) | ×1.2 |
summary | Краткое резюме звонка | ×1.3 |
word_timestamps | Время каждого слова | ×1 |
webhook_url | Адрес для уведомления о готовности | ×1 |
pii | Персональные данные | ×1.2 |
emotion | Убрана: принимается, возвращает заглушку | ×1 |
У нового проекта включено всё, включая платное. Пока вы не выключили «Персональные данные», каждая запись идёт по тарифу ×1.2. Выключить можно в кабинете во вкладке «Настройки» или передать "pii": false в настройках проекта либо в отдельном запросе.
Три первые опции кабинет не показывает: formatting, itn и stereo_channels_as_speakers включены всегда, потому что выключать их почти никогда не нужно — они не стоят денег и не портят текст. Если всё-таки нужно, это делается только через API, полем settings.
Пунктуация и заглавные буквы
Отдельная модель расставляет точки, запятые и вопросительные знаки и поднимает первую букву предложений и имён. Распознанные слова не меняются.
В ответе: segments[].formatted_text и общий text. Без опции текст идёт строчными буквами без знаков.
Числа, даты и суммы цифрами
«ikki ming yigirma olti» становится «2026», «besh yuz ming so'm» становится «500 000 so'm». Работает по правилам, в строгом режиме: если правило не уверено, слово остаётся словами. Применяется после пунктуации.
Стерео-каналы это собеседники
Для двухканальных записей, где стороны уже разделены по каналам — чаще всего это телефония: левый канал одна сторона, правый другая. Каждый канал распознаётся отдельно и получает номер спикера 0 или 1. Это точнее любого разделения по голосу, потому что стороны уже разделены телефонией.
Для моно-записей ничего не меняет. В ответе stereo_parties: true.
Разделение по спикерам
Для моно-записей с несколькими голосами. Модель слушает запись целиком, делит речь между голосами по тембру, и каждая реплика получает номер спикера: 0, 1, 2, 3. До четырёх голосов.
max_speakers говорит модели, сколько голосов искать. Если известно, что разговор двоих, укажите 2: модель не будет находить лишних. По умолчанию 0, модель решает сама.
Двухканальным записям это не нужно: каналы и есть собеседники. stereo_channels_as_speakers включён всегда и в кабинете не показывается; выключить его можно только через API, для одного запроса.
Пол голоса
По тембру, окнами по 8 секунд речи каждого спикера. Если речи мало или голос на границе, ответ «неизвестно», а не догадка.
В ответе: speaker_info[].gender = {"label": "female" | "male" | "unknown", "confidence": 0.93}.
Язык речи
Аудио-модель слушает речь, не текст, и определяет язык каждой реплики. Основной язык записи тот, на котором сказано больше всего времени; доля остальных языков лежит рядом. Звонок, где треть разговора на русском, остаётся узбекским, а в share видно "ru": 0.33. По каждому спикеру язык определяется по всей его речи. Реплики короче секунды не оцениваются, а записи, где оценённой речи меньше двух секунд, язык не получают.
Коды языков ISO 639-1: uz, ru, en, kk, ky, tg, tk и так далее. Модель различает больше ста языков; язык, которого она не знает, получит ближайший знакомый.
Два кода говорят о речи, которую распознавание берёт заметно хуже обычного узбекского: kaa — каракалпакский, uz-khorezm — хорезмский говор узбекского. Такие записи стоит перепроверить. Хорезмский уверенно определяется в бизнесах, на звонках которых модель училась; на незнакомых пока узнаётся редко. uz-khorezm записан в форме BCP 47: если смотреть только на основной код, это uz.
В ответе: language = {"code", "confidence", "speech_seconds", "share", "posterior"}, speaker_info[].language = {"code", "confidence", "seconds"} и segments[].language = {"code", "confidence"}. В кабинете язык записи показан в сводке результата, а у реплики появляется метка, только если её язык отличается от основного.
Дозвон
Телефония и CRM нередко пишут «пропущен» о звонке, где ответили, или «отвечен» о звонке, где трубку взял голосовой автоответчик или IVR, а многие записи начинаются ещё до ответа. Эта опция решает по самой записи:
outcome | Что было в записи |
|---|---|
conversation | На той стороне трубку взял живой человек, даже если сказал только «алло» или «сейчас некогда, перезвоните» |
no_answer | Гудки, сигнал «занято», тишина или файл слишком короткий, чтобы в нём был звонок |
operator_message | Сообщение оператора связи («абонент недоступен», «аппарат выключен») или автоответчик |
ivr | Голосовое меню или очередь, где так никто и не ответил |
reached равно true только для conversation. Звонок с reached: false можно не отправлять на дальнейший анализ, а звонок с reached: true стоит анализировать, даже если телефония считает его пропущенным. answer_at — секунда, когда ответила другая сторона: в исходящих звонках запись часто начинается с гудков. Если никто не ответил, там null.
Аудио-модель слушает начало звонка (гудки, музыку, записанный и живой голос), а транскрипт добавляет то, что видно по словам: записанная фраза повторяется слово в слово и звучит как меню, разговор идёт в обе стороны, а гудки, которые продолжаются под голосами, значат, что в офисе разговаривают, пока линия ещё звонит, и никто не ответил. В сомнительных случаях опция склоняется к «дозвонились», чтобы настоящий разговор не пропал. На 961 звонке 12 бизнесов, которых модель не видела, она не назвала недозвоном ни один из 485 разговоров и узнала 440 из 476 звонков без разговора; эталон — автоматический разбор каждой записи, сверенный с человеком, прослушавшим 20 трудных звонков. Без спикеров (моно-запись с выключенным разделением по спикерам) она назвала недозвоном 4 из 485 разговоров и узнала 436 из 476.
В результате: call_outcome = {"outcome", "reached", "confidence", "probabilities", "answer_at", "seconds"}, где seconds — сколько записи прослушано (её начало, до десяти минут).
Клиент и менеджер
По тексту разговора: кто здоровается первым, кто представляется компанией, кто спрашивает и кто отвечает. Нужны спикеры: стерео-каналы или разделение по спикерам. Если max_speakers не задан, при включённых ролях разделение ищет до трёх голосов: двух собеседников и, часто, голосовое меню.
Речь до того, как ответил живой человек, не учитывается: голосовое меню, сообщение оператора связи. Этот момент берётся из модели дозвона, которая для ролей работает даже при выключенном call_outcome (тогда её ответа нет в результате и она ничего не стоит). Голос, звучавший в основном до этого момента, — machine. Из остальных голосов клиентом и менеджером становятся двое, у кого больше всего речи, а каждый следующий голос — other. Если слышен только один живой голос, сначала по его словам решается, один ли это человек: короткий звонок без обмена репликами — один, а более длинный, с приветствиями и паузами, — обычно два человека, которых разделение по спикерам услышало как одного. Голос, который скорее всего принадлежит одному человеку, получает роль по своим словам и направлению звонка, а статус говорит, что роль выведена; иначе статус diarization_failed, и голос роли не получает: это лучше, чем отдать роль одного человека обоим. Если никто не ответил, ролей нет, а голос меню или сообщения — machine.
call_direction передаётся на каждый запрос и повышает точность: "inbound" входящий звонок, "outbound" исходящий, пусто если это не звонок или неизвестно. В кабинете это выбор «Что это за запись» при загрузке.
В ответе: speaker_info[].role — "client", "manager", "machine", "other" или "unknown", а options_report.roles объясняет, как роли решены:
| Поле | Что это |
|---|---|
status | ok: роли получили два живых голоса. inferred_single_speaker: живой голос один, его роль выведена по словам и направлению. diarization_failed: живой голос один, но скорее всего это два человека, которых разделение по спикерам не различило; роли у него нет (reason: voices_not_separated). ambiguous: модель не смогла выбрать, оба unknown. not_applicable: ролей нет, а reason говорит почему: no_live_conversation (никто не ответил), no_speech_after_answer или no_speakers_with_text |
score | Вероятность, от 0.5 до 1, что клиент и менеджер не перепутаны; для inferred_single_speaker — что голос принадлежит одному человеку и его роль верна, она может быть ниже 0.5. При diarization_failed score нет |
roles | Роль по номеру спикера, как в speaker_info |
parties | Спикеры, получившие роли клиента и менеджера |
one_voice | При одном живом голосе: вероятность, что это один человек, а не двое, услышанные как один |
first_speaker | Собеседник, заговоривший первым после ответа |
answer_at, outcome | Результат дозвона, которым пользовались роли; null, если его не удалось посчитать |
direction | Направление звонка, с которым работала модель |
margin, margin_speaker | Сырой отступ модели и спикер, к которому он относится. Диагностика: шкала меняется вместе с моделью |
source, voice, text | Только с known_speakers: что решило роли (voice, text или none); мнение голоса (decided с external_id линии, её voice и обеими близостями, или abstained и почему); собственные roles и status текстовой модели и agrees — согласна ли она с голосом |
Насколько можно доверять score. Он откалиброван на 1 294 звонках двух собеседников из 90 бизнесов по разбору каждого звонка языковой моделью, а не человеком; звонки каждого бизнеса не участвовали в подгонке, которая их оценивала. Из 749 звонков со score 0.95 и выше клиент и менеджер не перепутаны в 731; из 80 звонков со score от 0.5 до 0.7 — в 47. В моно-записи единственный голос часто оказывается двумя людьми, которых разделение по спикерам не различило. На 1 508 звонках двух собеседников, записанных в стерео и сведённых в моно, где известно, кто сказал каждое слово, один живой голос получился в 211, и в 94 из них были оба человека; теперь роль сохраняют 15 из этих 94, остальные получают diarization_failed, как и 49 звонков, где речь почти вся одного человека. У одиночных голосов, сохранивших роль, score в среднем 0.67, и в 70 % из них верную роль получили не меньше четырёх пятых слов. На тех же звонках записей без ролей стало 26 из 1 200 вместо 116, а среди 390 входящих звонков, начинающихся с голосового меню, меню занимало роль менеджера или клиента в 9 вместо 41.
До версии раннера 1.12.0 в score лежал номер спикера ("0" или "1"), а не оценка.
Узнавать по голосу
Из речи каждого спикера считается голосовой отпечаток и сравнивается с голосами проекта. Знакомый голос получает свой постоянный номер и имя, если его дали. Новый голос, у которого в записи есть 10 секунд речи и больше, регистрируется сам и с этого момента узнаётся в следующих записях.
В ответе: voices[] со связью «спикер этой записи → номер голоса проекта» и speaker_info[].identity. Как давать имена, объединять голоса и отмечать реплики как одного человека: Голоса и спикеры.
Интегратор, который обслуживает несколько бизнесов из одного проекта, передаёт с каждой записью tenant, чтобы голоса каждого бизнеса сравнивались только между собой, и known_speakers, чтобы узнавать только сотрудников бизнеса и никогда не хранить голос клиента: Несколько бизнесов в одном проекте. known_speakers сами включают узнавание по голосу и роли.
Эмоции (убраны)
Опция «Эмоции» убрана 10 октября 2026 года: спрос на неё был невелик, а надёжно определять эмоции в звонках оказалось трудно.
Ключ emotion по-прежнему принимается, чтобы интеграции, которые его присылают, не сломались. Он ничего не стоит, а в результате остаются прежние поля с заглушкой: segments[].emotion = {"label": null, "reason": "removed"}, speaker_info[].emotion с теми же ключами и значениями null (mood_share пустой) и options_report.emotion = {"status": "removed"}. Позже ключ будет удалён: уберите его из запросов.
Эмоции: смех, недовольство и энергия (бета)
Аудио-модель слушает речь каждого спикера окнами от 2 до 12 секунд и отмечает окна, где этот человек смеётся. Каждое окно она сравнивает с другими окнами того же спикера, поэтому ей нужны спикеры — стерео-звонок (по собеседнику в канале) или «Разделение по спикерам» на моно-записи — и не меньше трёх окон по 2–12 секунд у спикера. Спикер, который сказал меньше, не проверяется.
Что мы измерили на 970 звонках колл-центра MetaSell, которых модель раньше не слышала: из 70 окон, которые она отметила, слушатель услышал смех в 54 — 77 % (95 % интервал 66–85 %). Находит она только примерно каждый третий смех: два смеха из трёх остаются без отметки. Значит, отмеченное окно обычно действительно смех, а в звонке без событий смех всё равно мог быть. Используйте опцию, чтобы находить звонки со смехом, а не чтобы считать смех или доказывать, что его не было.
start и end — окно, в котором есть смех, а не сам смех. score — насколько модель склоняется к смеху против нейтральной речи: события начинаются с 3.5, чем больше, тем увереннее; это не вероятность. Сообщается только смех. В стерео-звонке каждый канал проверяется отдельно; измерение выше сделано на звонках, сведённых в один канал.
Недовольство. Модель читает весь разговор — расшифровку с ролями менеджера и клиента — и отмечает реплики, где спикер недоволен; самые подозрительные из них она дополнительно слушает голосом. Уровни: dissatisfied (недоволен) и very_dissatisfied (очень недоволен). В слепой проверке на 400 новых звонках MetaSell слушатель назвал недовольством 27 из 30 отмеченных реплик (90 %, 95 % интервал 74–97 %), а среди 30 реплик, которые модель сочла спокойными, — 2. Отмечаются самые явные моменты, около 0,4 % реплик: лёгкое недовольство часто остаётся без отметки, а уровень «очень недоволен» пока предварительный. Здесь score — уверенность модели: недовольство начинается с 1.5, «очень» — с 2.4; это не вероятность. Событие недовольства называет свою реплику (segment).
Энергия голоса. Для каждой реплики длиннее двух секунд мы измеряем громкость, высоту и живость интонации и темп (слоги в секунду) и сравниваем их с обычным уровнем того же человека в этом звонке, поэтому громкость линии или от природы громкий или высокий голос не считаются. Реплика заметно живее этого уровня — energy_high, заметно вялее — energy_low; большинство реплик не отмечается никак. Более короткие реплики не учитываются: на нескольких слогах измерение — в основном шум, а для реплик в две-три секунды планка чуть выше, чем для длинных. Чтобы у человека был свой обычный уровень, нужно не меньше восьми таких реплик. В слепой проверке из 30 пар (самая энергичная и самая вялая реплика одного человека) слушатель выбрал сторону в 24 и согласился с отметкой в 23. Отметка показывает, где человек оживился или сник, а не насколько один спикер энергичнее другого. Здесь score — отклонение от обычного уровня спикера (отметки начинаются с ±1.0); это не вероятность. Событие энергии называет свою реплику (segment). Это анализ сигнала, а не модель: время GPU не добавляется.
В ответе: voice_events = [{"type": "laughter" | "dissatisfied" | "very_dissatisfied" | "energy_high" | "energy_low", "start", "end", "speaker", "score", "segment"}] (у смеха нет segment) и options_report.voice_events = {"status", "windows", "speakers", "dissatisfaction": {"status", "read_lines", "candidates", "scored"}, "energy": {"status", "speakers", "turns", "high", "low"}}. status — ok, no_speakers (окно не с чем сравнить: моно-запись без «Разделения по спикерам») или too_little_speech (ни у одного спикера нет трёх окон).
Цена: +20 % (×1.2).
Краткое резюме звонка
Наша языковая модель читает расшифровку целиком — с ролями менеджера и клиента, если их удалось определить, — и пишет короткое резюме на узбекском: 2–3 предложения о том, о чём был разговор и чем он закончился. Модель обучена на резюме более чем ста тысяч звонков, но может упустить деталь или ошибиться в факте: для важных решений сверяйтесь с расшифровкой. Читаются первые 150 реплик звонка.
В ответе: summary = {"text", "lines", "read_lines"} — текст резюме, сколько реплик в звонке и сколько из них модель прочитала.
Цена: +30 % (×1.3). По умолчанию выключено во всех проектах: передайте "summary": true в запросе или включите в настройках проекта.
Персональные данные
Модель помечает в тексте имена, телефоны, адреса, номера документов и карт, даты. Для каждой реплики есть список найденного с позициями в тексте и вариант текста, где данные заменены на [NAME], [PHONE] и так далее. В кабинете есть переключатель «скрыть персональные данные».
В ответе: segments[].pii = {"entities": [{"label": "PHONE", "start": 12, "end": 24}], "redacted_text": "…"}.
Цена: секунды аудио умножаются на 1.2.
Как считается цена
Тариф это множитель к длительности записи: 1 без платных опций, 1.2 с «Персональными данными». Считается только длина записи, не число опций: три бесплатных опции стоят столько же, сколько ни одной. Кабинет показывает тариф рядом с опциями, а остаток отдаёт GET /v1/usage. Единица учёта — g: Баланс и оплата.