Whisper на аудио из RTSP
Три прототипа, превращающие RTSP-аудио IP-камеры в живой русский текст с помощью Whisper — облако, whisper.cpp и CTranslate2
Двухдневный эксперимент по распознаванию речи в реальном времени из аудиопотока камеры видеонаблюдения.
Двухдневный эксперимент по распознаванию речи в реальном времени из аудиопотока камеры видеонаблюдения.
Три варианта используют один и тот же прием RTSP через ffmpeg: консольное приложение на .NET 9, отправляющее WAV-фрагменты в API транскрипции OpenAI со скользящим контекстным промптом, офлайн-вариант на .NET, вызывающий локальный CLI whisper.cpp, и многопоточный пайплайн на C++ (кольцевой буфер, VAD по энергии, буферизация фраз, стабилизатор частичных/финальных транскриптов), который общается с постоянно живущим Python-воркером faster-whisper/CTranslate2 через stdin/stdout.
Что умеет
- Подпроцесс ffmpeg принимает RTSP-аудио и нарезает его на 15-секундные моно WAV-фрагменты 16 кГц (или сырой PCM для варианта на C++)
- Облачный путь: POST /v1/audio/transcriptions (whisper-1) с подсказкой языка и скользящим промптом из предыдущих транскриптов для связности
- Офлайн-путь A: запуск whisper-cli.exe из whisper.cpp с локальной ggml-моделью, флагами потоков/GPU
- Офлайн-путь B (C++): RingBuffer + VAD по RMS-энергии + окна фраз, постоянный Python-воркер ASR с однократной загрузкой модели, протокол запрос/ответ в base64 с табуляцией, рукопожатие через ready-файл
- TranscriptStabilizer выдает обновления [PARTIAL] и фиксирует текст [FINAL]; вывод в консоль в отдельном потоке
- Вся конфигурация через аргументы CLI и переменные окружения (RTSP URL, путь к ffmpeg, модель, язык, размер фрагмента)
Сравнение трех стратегий развертывания ASR (облачный API, CLI whisper.cpp, CTranslate2 через faster-whisper) при единой схеме приема. Вариант на C++ демонстрирует правильную потоковую архитектуру: потокобезопасные очереди, буфер фраз с VAD, стабилизацию частичных/финальных результатов и долгоживущий процесс модели вместо запуска на каждый фрагмент. Маленький и неотшлифованный (уровень прототипа, учетные данные зашиты в значения по умолчанию).
Нужно что-то похожее?
Делаю это вживую на звонке в Zoom / Яндекс Телемост, вы смотрите на экран, таймер останавливается по вашему слову. Первые 15 минут бесплатно.