Перейти к содержанию

Анализ дипфейка по фразам

Параметр deepfakeAnalysis=true добавляет к обычному результату распознавания оценки модели wav2vec2_deepfake для целых фраз. Он поддерживается файловыми POST /api/stt/v1 и POST /api/stt/v1:recognizeAsync, включая асинхронные источники recordingId и videoUrl. Отдельного HTTP endpoint проверки дипфейков нет.

По умолчанию анализ выключен. Параметр принимается в query или multipart-форме; поддерживается также имя deepfake_analysis. Если параметр передан и в query, и в форме, приоритет имеет значение из формы, в том числе явное false.

Модель работает локально в Triton на GPU. Сам анализ дипфейка не отправляет аудио внешнему провайдеру и не требует externalAiConsent; он доступен при privacyMode=true. Правила выбранной модели распознавания и других внешних этапов применяются независимо. Потоковая загрузка длинного файла и живые субтитры этот анализ не выполняют.

Запрос

Через query:

curl -X POST "https://api.speech.example.com/api/stt/v1?model=SpeechExpert-STT-RU&deepfakeAnalysis=true" \
  -H "Authorization: Api-Key $API_KEY" \
  -F "audio=@recording.wav" \
  -F "lang=ru-RU" \
  -F "channelMode=mono"

Через форму, с фоновым распознаванием:

curl -X POST "https://api.speech.example.com/api/stt/v1:recognizeAsync?model=SpeechExpert-STT-RU" \
  -H "Authorization: Api-Key $API_KEY" \
  -F "audio=@recording.wav" \
  -F "lang=ru-RU" \
  -F "deepfakeAnalysis=true"

Во втором случае обычная STT-операция возвращает готовый транскрипт и анализ в своём response. Повторная загрузка того же аудио для детектора не нужна.

Целая фраза и её таймкоды

Анализ выполняется после подготовки окончательного транскрипта. Границы совпадают с карточками фраз веб-интерфейса: сначала используются utterances, затем segments. Существующая разбивка по спикерам, провайдеру или VAD сохраняется. Единственный общий сегмент native ASR или Parakeet может разбиваться по полному совпадающему выравниванию слов: по паузе более 500 мс, границе предложения после как минимум трёх слов, пределу 15 секунд или 30 слов. Если слова пропущены, исправлены или их временная разметка невалидна, новые границы по ним не угадываются.

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

Строка с timing_source=synthetic, созданная из цельного текста на всю длительность записи, не получает оценку. Смешанные оценочные таймкоды mixed + timing_estimated=true без более определённого происхождения конкретной строки также пропускаются. Настоящие интервалы VAD могут анализироваться и при timing_estimated=true.

Ответ

В STTResponse добавляются deepfake_analysis и deepfake_analysis_status. Пример части результата:

{
  "deepfake_analysis_status": "partial",
  "deepfake_analysis": {
    "model": "wav2vec2_deepfake",
    "model_version": "1",
    "protocol": "one_complete_phrase_per_forward",
    "phrases": [
      {
        "index": 0,
        "start_ms": 1200,
        "end_ms": 4100,
        "score_synth": 0.82,
        "score_orig": 0.18,
        "status": "ready",
        "reason": null
      },
      {
        "index": 1,
        "start_ms": 4500,
        "end_ms": 40000,
        "score_synth": null,
        "score_orig": null,
        "status": "skipped",
        "reason": "too_long"
      }
    ],
    "analyzed_phrases": 1,
    "skipped_phrases": 1,
    "failed_phrases": 0
  }
}
Поле фразы Значение
index Нулевой индекс отображаемой карточки фразы. Отличается от индекса исходного сегмента, если тот разделён по словам
start_ms, end_ms Границы целой фразы на временной шкале исходной записи; могут быть null, если корректных таймкодов нет
score_synth Softmax-оценка класса synth, от 0 до 1
score_orig Softmax-оценка класса orig, от 0 до 1; сумма двух оценок равна 1 с учётом погрешности
status ready, skipped или failed
reason Причина отсутствия оценки; у успешно проверенной фразы null

phrases сохраняет индексы пропущенных и ошибочных строк. Для них обе оценки равны null: отсутствие результата не превращается в вероятность 0%. Текст фразы и аудио в этом объекте не дублируются. Счётчики analyzed_phrases, skipped_phrases, failed_phrases соответствуют статусам элементов phrases.

Статус всего анализа Условие
ready Есть успешные оценки, нет пропущенных или ошибочных фраз
partial Есть успешные оценки и хотя бы одна пропущенная или ошибочная фраза
unavailable Успешных оценок и ошибок нет: нет фраз или все они пропущены
failed Нет успешных оценок и есть ошибки; либо слой анализа целиком не удалось подготовить

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

Ограничения и причины пропуска

После пересэмплирования фраза должна содержать от 400 до 480 000 отсчётов при 16 кГц: технически от 25 мс до 30 секунд. Минимум 25 мс означает только возможность инференса; он не гарантирует достаточно речи для полезной оценки. Слишком длинная фраза целиком остаётся без оценки. По умолчанию выполняется не более 2000 forward на один STT-запрос (DEEPFAKE_MAX_PHRASES), остальные пригодные фразы получают phrase_limit.

reason Причина
synthetic_timing, synthetic_timestamps Синтетические или неоднозначные таймкоды
missing_timestamps Границы фразы отсутствуют
invalid_timing, invalid_timestamps Некорректный временной диапазон
outside_audio Интервал выходит за пределы доступного аудио
too_long, phrase_too_long Целая фраза превышает предел длины
phrase_too_short Фраза короче технического минимума
empty_text В строке нет текста
invalid_channel Нельзя выбрать указанный аудиоканал
phrase_limit Исчерпан предел forward данного запроса
invalid_audio Не удалось подготовить PCM для анализа
inference_failed Ошибка inference или связи с Triton

Транспортный timeout и ошибка связи ограничены настройками клиента. После первой транспортной ошибки остальные пригодные фразы этого анализа получают failed / inference_failed без новых RPC к недоступному серверу. Уже полученные оценки и явные пропуски сохраняются.

Интерфейс и сохранённые записи

Флажок Анализ дипфейка и график включает график по времени записи и оценку в каждой карточке. Переход с графика выделяет именно эту фразу; прослушивание использует те же start_ms и end_ms. График оставляет паузы и фразы без оценки пустыми. В архиве анализ хранится в response.deepfake_analysis, поэтому повторный inference для просмотра не нужен. Для старой записи без анализа его можно включить при повторном распознавании, если исходное аудио ещё доступно. Подробнее — работа с транскриптом.

score_synth — оценка модели, а не бинарный вывод о подделке или калиброванная вероятность мошенничества. Точность, калибровка и порог для целых фраз переменной длины пока не измерены; повышение точности относительно прежнего оконного протокола не подтверждено.