Skip to content

maxxborer/cenz-hyenz

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

16 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

cenz-hyenz

Автоматическая цензура мата в видео и аудиофайлах с 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. Комментарии начинаются с #.

Поиск файла словаря происходит в следующем порядке:

  1. swears.txt в папке скрипта
  2. ~/.config/censor/swears.txt

Словарь можно редактировать — добавлять или убирать слова по необходимости.

Как это работает

  1. Определение типа — ffprobe анализирует потоки файла (видео/аудио)
  2. Выбор дорожек — если дорожек >1 и -t не указан — интерактивный выбор в терминале
  3. Извлечение аудио — ffmpeg извлекает аудиодорожку в WAV (16 кГц, моно) для Whisper
  4. Проверка на тишину — тихие дорожки (< -50 дБ) пропускаются
  5. Транскрипция — faster-whisper распознаёт речь с пословными таймстемпами (VAD-фильтр ускоряет процесс)
  6. Поиск мата — каждое слово проверяется по словарю с учётом словоформ
  7. Цензура — извлекается полнокачественный WAV, мат заменяется тишиной/бипом (edge-preserve по умолчанию)
  8. Кодирование — обработанный WAV кодируется обратно в оригинальный кодек с оригинальным битрейтом
  9. Сборка — для видео: видеопоток и субтитры копируются без изменений, аудио подставляется обработанное
  10. Экспорт — обработанные аудиодорожки экспортируются отдельными файлами (ремукс без перекодирования)

Кеширование

Кеш хранится в папке 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

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors