Распознавание речи со спикерами (WhisperX)#

Для выполнения инструкции нужны доступ к каталогу установки, настройкам сервера и Docker. Необходимо сохранить прежние значения параметров Whisper для отката. В Чате назначенная Аккаунту Модель транскрибации имеет приоритет. Если используется ее активный Экземпляр, он должен обращаться к локальному Whisper и запрашивать large-v2. Изменение .env не перенаправляет внешний Экземпляр на локальный сервис автоматически.

Эта инструкция описывает включение в Sherpa AI Server локальной транскрибации аудио и видео с разделением по спикерам (диаризация). Метод работает полностью на вашем сервере, без обращения к внешним сервисам и без доступа в интернет во время работы.

В результате фрагменты распознанной речи, для которых определен спикер, получают метку спикера (speaker_1, speaker_2 и так далее) и временные метки. Метки нумеруются с 1 в порядке первого появления спикера в записи. Метки попадают в результат API и в контекст LLM в виде строк [0:00:05] speaker_1: Привет. Отдельного экрана со спикерами в интерфейсе Чата нет.

Требования#

Перед включением необходимо убедиться, что:

  • Sherpa AI Server установлен, сервис aiserver-whisper запускается с профилем whisper или full;
  • сервис Whisper работает на NVIDIA GPU (см. Перевод Whisper с CPU на GPU). На CPU метод работает очень медленно;
  • у вас есть архив весов model-whisperx-large-v2.tar.gz (около 3 ГБ) и на диске достаточно места;
  • образ aiserver-whisper версии, в которой доступен метод whisperx.

Файл large-v2.pt, который использует обычный метод base, для WhisperX не подходит: WhisperX работает с другим форматом весов. Старые файлы Модели удалять не нужно.

Шаг 1. Распаковка весов#

Из каталога установки необходимо выполнить следующие команды:

tar -xzvf model-whisperx-large-v2.tar.gz -C ./whisper/models
ls ./whisper/models/whisperx

Каталог ./whisper/models/whisperx должен появиться рядом с прежними файлами Моделей.

Шаг 2. Настройка метода#

Можно открыть .env и в блоке # !whisper необходимо задать:

WHISPER_METHOD=whisperx
WHISPER_MODEL=large-v2
WHISPER_DEFAULT_MODEL=large-v2
WHISPERX_DIARIZE=true

Дополнительные параметры:

Параметр Назначение
WHISPERX_DIARIZE true — разделять по спикерам (по умолчанию), false — только транскрибация с таймкодами
WHISPERX_NUM_SPEAKERS Точное число спикеров, если оно известно. Пусто — определять автоматически
WHISPERX_BATCH_SIZE Необходимо уменьшить значение, если возникает ошибка CUDA out of memory

Шаг 3. Применение настроек сервера и Whisper#

Необходимо пересоздать контейнеры сервера и Whisper, чтобы применить новые параметры .env, включая WHISPER_DEFAULT_MODEL на стороне сервера. Команда использует уже загруженные образы без сборки и загрузки из реестра. Перезапуск сервера следует запланировать на подходящее время:

docker compose --profile whisper up -d --no-build --pull never --force-recreate aiserver aiserver-whisper

Шаг 4. Проверка результата#

curl -sS http://127.0.0.1:3005/health

В ответе должны быть "method":"whisperx" и "diarization_enabled":true.

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

Затем в Чате можно прикрепить аудио или видео с разговором двух людей и можно отправить сообщение. В тексте транскрипции, который получает LLM, реплики с определенным спикером будут помечены speaker_1 и speaker_2 с временными метками.

Для технической проверки результата можно отправить короткую запись непосредственно в локальный API Whisper. В терминале переменная WHISPER_API_KEY должна содержать действующий ключ этого сервиса, если проверка ключа включена. Если сервис работает без ключа, заголовок Authorization в примере не требуется.

curl -fsS http://127.0.0.1:3005/v1/audio/transcriptions \
  -H "Authorization: Bearer $WHISPER_API_KEY" \
  -F "file=@./meeting.wav" \
  -F "model=large-v2" \
  -F "response_format=verbose_json"

В ответе необходимо проверить массив segments: распознанный text, временные метки start и end и поле speaker у сегментов, для которых спикер определен. Отсутствие speaker у отдельных сегментов не означает, что система определила их автора. Ошибка этого запроса требует проверки весов, доступности GPU и сообщения сервиса. Успешный /health сам по себе такой результат не подтверждает.

Ограничения#

При использовании метода действуют следующие ограничения:

  • Обработка занимает больше времени, чем обычная транскрибация. Для длинных записей необходимо проверить таймауты запросов.
  • При сильном наложении голосов возможны ошибки в определении спикера.
  • Реальные имена спикеров метод не определяет: он присваивает только метки speaker_N.
  • Параметры prompt и temperature этим методом не используются.

Откат#

Для отката необходимо восстановить сохраненные прежние значения параметров Whisper в .env и повторить шаг 3 для обоих контейнеров. Должны быть доступны веса прежней Модели.