Автоматическая цензура мата в видео и аудиофайлах с GPU-ускорением.
Использует faster-whisper (CTranslate2) для транскрипции речи с пословными таймстемпами, затем находит матерные слова по словарю и заменяет их тишиной или бипом. Работает в 4–6 раз быстрее стандартного Whisper.
- Любой формат — принимает любое видео/аудио, поддерживаемое FFmpeg (определение типа через ffprobe, не по расширению)
- Сохранение качества — автодетект оригинального битрейта, перекодирование без потери качества
- Интерактивный выбор дорожек — при нескольких аудиодорожках показывает меню в терминале
- Экспорт отдельных дорожек — помимо видео выводит обработанные аудиодорожки отдельными файлами
- Edge-preserve цензура — по умолчанию глушится центр слова, края остаются для естественного звучания
- Два режима цензуры — тишина (по умолчанию) или бип
- Кеширование — транскрипты и промежуточные файлы кешируются, повторный запуск мгновенный
- Пакетная обработка — несколько файлов за раз
- VAD-фильтр — пропуск тишины при транскрипции для ускорения
- Автопропуск тихих дорожек — комментарии режиссёра и т.п.
- GPU + CPU fallback — CUDA float16 для GPU, автоматический переход на CPU (int8) если GPU недоступен
- JSON-отчёт — опциональный машиночитаемый отчёт о запуске
- Python 3.10+
- FFmpeg в PATH (ffmpeg + ffprobe)
- NVIDIA GPU с поддержкой CUDA (рекомендуется; без GPU работает на CPU, но медленнее)
- CUDA Toolkit и cuDNN (для GPU-ускорения)
git clone https://github.com/maxxborer/cenz-hyenz.git
cd cenz-hyenz
python -m venv venv
# Windows
.\venv\Scripts\activate
# Linux/macOS
source venv/bin/activate
pip install faster-whisper numpy soundfileНа Windows можно запускать через
censor.bat— он автоматически активирует venv.
# Видео — автодетект формата, все дорожки
python censor.py video.mkv
# Аудиофайл
python censor.py podcast.mp3
# Несколько файлов
python censor.py *.mkv *.mp3# Если дорожек несколько и -t не указан — интерактивный выбор:
python censor.py movie.mkv
# 📊 Доступные аудиодорожки:
# [0] Russian (aac, 6ch, 48000Hz, 384 kbps)
# [1] English (ac3, 6ch, 48000Hz, 640 kbps)
# [2] Commentary (aac, 2ch, 48000Hz, 128 kbps)
# Введите номера дорожек через запятую (например: 0,2)
# 'all' или Enter — обработать все
# > 0,1
# Неинтерактивный режим через CLI-аргумент
python censor.py movie.mkv -t 0,1# Модель large-v3 (точнее, но медленнее)
python censor.py video.mkv -m large-v3
# Бип вместо тишины
python censor.py video.mkv --beep
# Жёсткий режим (без сохранения краёв слов, паддинг 50 мс)
python censor.py video.mkv --hard
# Тонкая настройка параметров цензуры
python censor.py video.mkv --pad-ms 30 --edge-keep-ms 10 --min-censor-ms 100# Указать выходной файл
python censor.py video.mkv -o output.mkv
# Показать информацию о дорожках
python censor.py video.mkv --info
# JSON-отчёт
python censor.py video.mkv --report-json report.json
# Очистить кеш (без моделей)
python censor.py --clear-cache
# Очистить скачанные модели
python censor.py --clear-modelsПри обработке видео выводятся:
══════════════════════════════════════════════════════
Было: movie.mkv
Стало: movie_censored.mkv (1520.3 MB)
Стало 2: Отдельные дорожки:
movie_censored_track0.m4a (48.2 MB)
movie_censored_track1.ac3 (85.1 MB)
══════════════════════════════════════════════════════
- Было — путь к оригинальному файлу
- Стало — зацензурированное видео (все дорожки, видео и субтитры без перекодирования)
- Стало 2 — отдельные обработанные аудиодорожки в оригинальном кодеке
| Параметр | Описание |
|---|---|
input |
Входные файлы (любое видео или аудио), поддерживает glob-паттерны |
-o, --output |
Выходной файл (только для одного входного) |
-m, --model |
Модель Whisper: tiny, base, small, medium (по умолчанию), large-v2, large-v3, large-v3-turbo |
-t, --tracks |
Номера аудиодорожек через запятую, например 0,2,4. Если не указано и дорожек >1 — интерактивный выбор |
--beep |
Бип (1000 Гц) вместо тишины |
--hard |
Жёсткий режим: отключает сохранение краёв + паддинг 50 мс |
--pad-ms |
Расширение зоны цензуры с каждой стороны (мс). По умолчанию: 25 (обычный), 50 (--hard) |
--edge-keep-ms |
Сохранять края слова (мс). По умолчанию: 15 |
--min-censor-ms |
Минимальная длина mute-интервала (мс). По умолчанию: 80 |
--no-edge-keep |
Отключить сохранение краёв слова |
--language |
Язык транскрипции. По умолчанию: ru |
--info |
Показать аудиодорожки без обработки |
--report-json |
Сохранить JSON-отчёт в указанный файл |
-v, --verbose |
Подробный вывод |
--clear-cache |
Удалить кешированные данные (без моделей) |
--clear-models |
Удалить скачанные модели Whisper |
Файл swears.txt содержит корни и основы матерных слов (один на строку). Скрипт ищет эти основы с учётом возможных окончаний через regex. Комментарии начинаются с #.
Поиск файла словаря происходит в следующем порядке:
swears.txtв папке скрипта~/.config/censor/swears.txt
Словарь можно редактировать — добавлять или убирать слова по необходимости.
- Определение типа — ffprobe анализирует потоки файла (видео/аудио)
- Выбор дорожек — если дорожек >1 и
-tне указан — интерактивный выбор в терминале - Извлечение аудио — ffmpeg извлекает аудиодорожку в WAV (16 кГц, моно) для Whisper
- Проверка на тишину — тихие дорожки (< -50 дБ) пропускаются
- Транскрипция — faster-whisper распознаёт речь с пословными таймстемпами (VAD-фильтр ускоряет процесс)
- Поиск мата — каждое слово проверяется по словарю с учётом словоформ
- Цензура — извлекается полнокачественный WAV, мат заменяется тишиной/бипом (edge-preserve по умолчанию)
- Кодирование — обработанный WAV кодируется обратно в оригинальный кодек с оригинальным битрейтом
- Сборка — для видео: видеопоток и субтитры копируются без изменений, аудио подставляется обработанное
- Экспорт — обработанные аудиодорожки экспортируются отдельными файлами (ремукс без перекодирования)
Кеш хранится в папке cache/ рядом со скриптом. Для каждого файла создаётся подпапка на основе имени, размера и даты модификации. Кешируются:
- Извлечённые WAV-файлы (16 кГц и полнокачественные)
- JSON-транскрипты
- Готовые обработанные аудиодорожки
- Маркеры тихих дорожек
При повторном запуске скрипт пропустит все уже обработанные этапы. Очистить кеш: python censor.py --clear-cache.
Принимается любой медиафайл, который может прочитать FFmpeg. Тип определяется через ffprobe (наличие видео/аудио потоков), а не по расширению.
Аудиокодеки (кодирование обратно): AAC, MP3, Opus, Vorbis, FLAC, AC3, EAC3, DTS
Константы в начале censor.py:
| Константа | По умолчанию | Описание |
|---|---|---|
DEFAULT_MODEL |
"medium" |
Модель Whisper по умолчанию |
SILENCE_THRESHOLD_DB |
-50 |
Порог тишины (дБ) для пропуска дорожки |
BEEP_FREQ |
1000 |
Частота бипа (Гц) |
DEFAULT_PAD_MS |
25 |
Расширение цензуры с каждой стороны (мс) |
HARD_PAD_MS |
50 |
Паддинг в режиме --hard (мс) |
DEFAULT_EDGE_KEEP_MS |
15 |
Сохранение краёв слова (мс) |
DEFAULT_MIN_CENSOR_MS |
80 |
Минимальная длина mute-интервала (мс) |
MERGE_GAP_MS |
40 |
Объединение близких интервалов (мс) |
| Модель | VRAM | Скорость | Качество |
|---|---|---|---|
tiny |
~1 ГБ | ★★★★★ | ★★ |
base |
~1 ГБ | ★★★★ | ★★★ |
small |
~2 ГБ | ★★★★ | ★★★ |
medium |
~5 ГБ | ★★★ | ★★★★ |
large-v2 |
~6 ГБ | ★★ | ★★★★★ |
large-v3 |
~6 ГБ | ★★ | ★★★★★ |
large-v3-turbo |
~6 ГБ | ★★★ | ★★★★★ |
medium — оптимальный баланс скорости и качества для русского языка. Без GPU работают все модели через CPU fallback (int8), но значительно медленнее.
MIT