Оформление
transcript
Сервис расшифровки аудио и видео: два режима работы, какие модели используются, как устроена фоновая задача и почему разметка говорящих может не сработать.
Назначение
Принимает запись разговора, интервью, лекции, голосовое сообщение или видео и превращает её в текст. Работа идёт в фоне: сервис сразу возвращает номер задачи и сообщает о ходе работы понятными шагами. Готовый результат появляется в чате файлом Markdown.
В платформе источник называется Transcript. Репозиторий называется scriber.
Инструменты
Три инструмента, модель видит два.
| Инструмент | Кто вызывает | Назначение |
|---|---|---|
init_eva_session | Только Runtime | Привязка сессии |
transcribe_audio | Модель | Запуск расшифровки, возвращает номер задачи |
get_transcription_status | Модель | Опрос состояния задачи |
transcribe_audio
| Параметр | Тип | По умолчанию |
|---|---|---|
source_key | строка | обязателен |
diarization | да или нет | нет |
engine | перечисление | gigaam, других значений нет |
Модели предписано опрашивать состояние раз в 20 до 30 секунд и не запускать повторную расшифровку того же файла.
Ход работы
Состояния, которые видит пользователь: в очереди, скачивание, скачано, ожидание обработчика, преобразование звука, загрузка модели распознавания, модель готова, распознавание речи, обработка частей записи с процентами, выгрузка, готово. Отдельное состояние сообщает, что разметка говорящих была пропущена.
Модели
| Назначение | Что используется |
|---|---|
| Распознавание речи | GigaAM, модель v3_e2e_rnnt |
| Разметка говорящих | pyannote, модель speaker-diarization-community-1 |
| Определение речи внутри длинной записи | pyannote, модель segmentation-3.0 |
Контрольная точка модели распознавания весит около 428 МБ и скачивается с сети доставки Sber при первом запуске, затем хранится в локальном кэше и проверяется по контрольной сумме.
Версия библиотеки не закреплена
Библиотека GigaAM подключена ссылкой на репозиторий без указания версии или ревизии. Название модели закреплено, а сама библиотека берётся в том состоянии, в котором она была на момент сборки. Какая ревизия стоит на стенде, нужно уточнять у команды.
Два режима работы
Это самая важная особенность сервиса.
| Режим | Как работает |
|---|---|
| Облегчённый (по умолчанию) | Запись режется на части фиксированной длины и обрабатывается пачками. Модель разметки говорящих не загружается вообще |
| Полный | Используется обработка длинной записи с определением речи и, при запросе, разметка говорящих с временами по словам |
В облегчённом режиме запрос разметки говорящих молча игнорируется
Пользователь может попросить разметить, кто что сказал, получить обычный текст без разметки и не понять, почему. Единственный признак это отдельное состояние в ходе работы. Нужно уточнить, какой режим включён на стенде, и если облегчённый, то в пользовательской документации прямо написать, что разметка говорящих недоступна.
В полном режиме нужен доступ к закрытым моделям pyannote, причём модель определения речи требуется всегда, даже когда разметка говорящих не запрошена.
Что за ним стоит
| Составляющая | Обязателен |
|---|---|
| Доступ к файлам чата | Да |
| ffmpeg | Фактически да. Облегчённый режим всегда режет запись через него |
| Видеокарта | Нет, но на процессоре медленно |
| Доступ к закрытым моделям pyannote | Только для полного режима |
| Базы данных, брокеры, очереди | Не нужны |
| Python | Строго 3.11 |
Ограничения
| Ограничение | Подробности |
|---|---|
| Возврат текста в переписку | Никогда. Только ссылка на файл. В указаниях сервиса это запрещено прямо |
| Перезапуск сервиса | Все выполняющиеся задачи теряются |
| Размер файла | Не больше 500 МиБ, проверка после полного скачивания в память |
| Одновременная работа | Строгая очередь. Второй пользователь ждёт первого |
| Таймаут расшифровки | Отсутствует. Зависшая обработка блокирует очередь |
| Времена по словам и разметка говорящих в облегчённом режиме | Отсутствуют |
| Склейка частей записи в облегчённом режиме | Через пробел, без восстановления знаков на стыках. Слово, разрезанное на границе, может пострадать |
| Видео | Преобразование в звук делается только в полном режиме и только для webm и mp4. Другие контейнеры идут в модель как есть |
| Имя файла результата | Всегда имя исходного файла с добавлением _transcribe.md, поэтому файлы затирают друг друга |
Повторный запрос той же расшифровки не создаёт вторую задачу: сервис отдаёт уже идущую и помечает ответ признаком повторного использования. Неудавшаяся задача повторно не используется.
Развёртывание
| Параметр | Значение |
|---|---|
| Транспорт | Streamable HTTP, поддерживается и stdio |
| Порт | 8016 |
| Образ | python:3.11 с ffmpeg |
| Файл для docker compose | Отсутствует |
Машинное обучение не входит в образ по умолчанию
Образ собирает зависимости, но описание сервиса отдельно отмечает, что стек машинного обучения в образ по умолчанию не включается.