Анализ дипфейка по фразам¶
Параметр 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 — оценка модели, а не бинарный вывод о подделке или калиброванная
вероятность мошенничества. Точность, калибровка и порог для целых фраз
переменной длины пока не измерены; повышение точности относительно прежнего
оконного протокола не подтверждено.