Files
offline-audio-transcriber/whisperx_diarization_setup.sh
2025-09-14 07:26:48 +05:00

332 lines
16 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
# 🛠️ Скрипт установки WhisperX с диаризацией (Docker + NVIDIA) 🛠️
#
# Этот Shell-скрипт полностью автоматизирует подготовку системы Ubuntu
# (20.04/22.04/24.04) для работы с WhisperX через Docker с ускорением на GPU
# от NVIDIA. Он устанавливает все компоненты, настраивает их и создает
# готовое к работе окружение.
#
# Напоминание: скрипт следует официальным инструкциям NVIDIA и Docker
# для обеспечения максимальной надежности и совместимости.
#
# Основные задачи:
# - Проверка системы: Определяет дистрибутив и наличие драйверов NVIDIA.
# - Установка Docker: Устанавливает Docker Engine и добавляет пользователя
# в нужную группу для работы без `sudo`.
# - Установка NVIDIA Container Toolkit: Позволяет Docker-контейнерам
# напрямую использовать ресурсы GPU.
# - Тестирование GPU в Docker: Запускает тестовый контейнер для проверки
# корректности настройки.
# - Загрузка образа WhisperX: Скачивает готовый Docker-образ со всеми
# зависимостями.
# - Создание рабочего пространства:
# - Локальные папки `audio/` и `results/`.
# - Глобальный кеш для моделей в `~/whisperx/` для экономии места.
# - Файл конфигурации `config.env` с настройками по умолчанию.
# - Управление правами: Назначает корректные права на папки, чтобы избежать
# конфликтов доступа у Docker-контейнера.
#
# Порядок использования:
# 1. Сделайте скрипт исполняемым: chmod +x whisperx_diarization_setup.sh
# 2. Запустите его: ./whisperx_diarization_setup.sh
# 3. После завершения может потребоваться перезагрузка системы.
# Следить за состоянием GPU: $ watch -n 5 nvidia-smi
#
# Автор: Михаил Шардин https://shardin.name/
# Дата создания: 14.09.2025
# Версия: 2.2
#
# Актуальная версия скрипта всегда здесь: https://github.com/empenoso/offline-audio-transcriber
#
# ===================================================================
## Строгий режим для bash. Прерывает выполнение при любой ошибке.
set -euo pipefail
# Цвета для вывода
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Функции логирования (используем printf для большей надежности)
log() { printf "${BLUE}[INFO]${NC} %s\n" "$1"; }
success() { printf "${GREEN}[SUCCESS]${NC} %s\n" "$1"; }
warning() { printf "${YELLOW}[WARNING]${NC} %s\n" "$1"; }
error() { printf "${RED}[ERROR]${NC} %s\n" "$1" >&2; } # Ошибки выводим в stderr
# --- Функции проверки системы ---
check_distro() {
if ! [ -f /etc/os-release ]; then
error "Не удалось определить операционную систему."
exit 1
fi
. /etc/os-release
if [[ "$ID" != "ubuntu" && "$ID" != "debian" ]]; then
error "Этот скрипт предназначен для Ubuntu/Debian. Обнаружено: $PRETTY_NAME"
exit 1
fi
success "Обнаружена совместимая система: $PRETTY_NAME"
}
check_gpu() {
log "Проверка наличия NVIDIA GPU и драйверов..."
if ! command -v nvidia-smi &> /dev/null; then
error "Команда 'nvidia-smi' не найдена. Установите драйверы NVIDIA."
printf "Рекомендуемые команды:\n"
printf " sudo ubuntu-drivers autoinstall\n"
printf " sudo reboot\n"
exit 1
fi
if ! nvidia-smi &> /dev/null; then
error "'nvidia-smi' не отвечает. Возможно, требуется перезагрузка после установки драйверов."
exit 1
fi
GPU_INFO=$(nvidia-smi --query-gpu=name,memory.total --format=csv,noheader,nounits)
DRIVER_VERSION=$(nvidia-smi --query-gpu=driver_version --format=csv,noheader,nounits)
success "Найден GPU: $GPU_INFO"
log "Версия драйвера: $DRIVER_VERSION"
}
# --- Функции установки компонентов ---
install_docker() {
if command -v docker &> /dev/null && docker --version &> /dev/null; then
success "Docker уже установлен: $(docker --version)"
else
log "Установка Docker Engine..."
sudo apt-get update
sudo apt-get install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
success "Docker успешно установлен."
fi
# Добавление пользователя в группу docker, если еще не там
if ! groups "$USER" | grep -q '\bdocker\b'; then
log "Добавление пользователя $USER в группу docker..."
sudo usmod -aG docker "$USER"
warning "Для применения изменений группы docker требуется перезагрузка или перелогин."
log "Вы можете выполнить 'sudo reboot' после завершения установки."
fi
}
install_nvidia_toolkit() {
log "Установка NVIDIA Container Toolkit..."
if command -v nvidia-ctk &> /dev/null; then
success "NVIDIA Container Toolkit уже установлен."
else
log "Настройка репозитория NVIDIA..."
# Этот метод автоматически определяет версию дистрибутива (ubuntu22.04, ubuntu24.04 и т.д.)
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list > /dev/null
log "Обновление списка пакетов и установка..."
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
success "NVIDIA Container Toolkit успешно установлен."
fi
log "Конфигурирование Docker для работы с NVIDIA GPU..."
sudo nvidia-ctk runtime configure --runtime=docker
log "Перезапуск Docker daemon для применения конфигурации..."
sudo systemctl restart docker
sleep 3 # Даем демону время на перезапуск
success "Docker настроен для работы с NVIDIA GPU."
}
test_docker_gpu() {
log "Тестирование Docker с поддержкой GPU..."
if ! sudo docker run --rm hello-world > /dev/null 2>&1; then
error "Базовый Docker не работает. Проверьте 'systemctl status docker'"
exit 1
fi
success "Базовый тест Docker пройден."
log "Проверка доступа к GPU из контейнера..."
local cuda_image="nvidia/cuda:12.4.1-base-ubuntu22.04" # Используем актуальный образ
log "Используем тестовый образ: $cuda_image"
if ! sudo docker pull "$cuda_image" > /dev/null; then
warning "Не удалось загрузить тестовый образ $cuda_image. Пропускаем тест GPU."
return 1
fi
# Пытаемся выполнить nvidia-smi внутри контейнера
local gpu_name_in_container
gpu_name_in_container=$(sudo docker run --rm --gpus all "$cuda_image" nvidia-smi --query-gpu=name --format=csv,noheader)
if [[ -n "$gpu_name_in_container" ]]; then
success "🎉 GPU успешно обнаружен в Docker контейнере: $gpu_name_in_container"
return 0 # Успех
else
error "Не удалось получить доступ к GPU из Docker контейнера."
warning "WhisperX будет работать на CPU (значительно медленнее)."
log "Возможные причины:"
log " - Конфликт версий драйвера, toolkit или docker."
log " - Необходимо перезагрузить систему: 'sudo reboot'"
return 1 # Неудача
fi
}
pull_whisperx_image() {
log "Загрузка Docker образа WhisperX..."
local whisperx_image="ghcr.io/jim60105/whisperx:latest"
if sudo docker pull "$whisperx_image"; then
success "Образ $whisperx_image загружен успешно."
local image_size_bytes
image_size_bytes=$(sudo docker image inspect "$whisperx_image" --format='{{.Size}}')
local image_size_gb
image_size_gb=$(awk "BEGIN {printf \"%.2f\", $image_size_bytes/1024/1024/1024}")
log "Размер образа: ~${image_size_gb} GB"
else
error "Не удалось загрузить образ WhisperX: $whisperx_image"
exit 1
fi
}
setup_workspace() {
log "Создание рабочих директорий и конфигурации..."
local base_dir="."
local cache_dir="$HOME/whisperx"
mkdir -p "$base_dir"/{audio,results}
mkdir -p "$cache_dir"
log "Установка прав 777 на папки..."
chmod -R 777 "$base_dir"/audio "$base_dir"/results "$cache_dir"
success "Созданы директории:"
printf " 📂 %s/audio - для входных аудиофайлов\n" "$(pwd)"
printf " 📂 %s/results - для результатов\n" "$(pwd)"
printf " 🧠 %s - для кеширования моделей\n" "$cache_dir"
local config_file="$base_dir/config.env"
if [ -f "$config_file" ]; then
# ИЗМЕНЕНИЕ: Исправлена переменная $config.env на $config_file
success "Конфигурационный файл $config_file уже существует. Пропускаем создание."
else
log "Создание конфигурационного файла: $config_file"
cat > "$config_file" << 'EOF'
# Конфигурация WhisperX
# HuggingFace токен для диаризации (получите на https://huggingface.co/settings/tokens)
# ВАЖНО: Примите лицензии на:
# https://huggingface.co/pyannote/speaker-diarization-3.1
# https://huggingface.co/pyannote/segmentation-3.0
HF_TOKEN=your_token_here
# Модель Whisper (tiny, base, small, medium, large-v1, large-v2, large-v3)
WHISPER_MODEL=large-v3
# Язык аудио (ru, en, auto для автоопределения)
LANGUAGE=ru
# Размер батча (чем больше - тем быстрее, но больше памяти GPU)
BATCH_SIZE=16
# Устройство для вычислений (cuda или cpu)
DEVICE=cuda
# Включить диаризацию (разделение по спикерам)
ENABLE_DIARIZATION=true
# Минимальное количество спикеров (оставить пустым для автоопределения)
MIN_SPEAKERS=
# Максимальное количество спикеров (оставить пустым для автоопределения)
MAX_SPEAKERS=
# Тип вычислений (float16, float32, int8)
COMPUTE_TYPE=float16
# Метод VAD для обнаружения речи (pyannote, silero)
VAD_METHOD=pyannote
# Размер чанков в секундах
CHUNK_SIZE=30
EOF
success "Конфигурационный файл создан: $config_file"
fi
}
final_check() {
log "Выполнение финальной проверки установки..."
if ! command -v docker &>/dev/null; then error "Docker не найден!"; exit 1; fi
if ! sudo docker image inspect "ghcr.io/jim60105/whisperx:latest" &>/dev/null; then error "Образ WhisperX не найден!"; exit 1; fi
if ! [ -d "./audio" ]; then error "Рабочая директория не найдена!"; exit 1; fi
if ! [ -d "$HOME/whisperx" ]; then error "Директория кеша моделей не найдена!"; exit 1; fi
success "Все компоненты установлены и готовы к работе!"
}
show_usage() {
printf "\n=====================================================================\n"
printf "🎉 УСТАНОВКА ЗАВЕРШЕНА УСПЕШНО!\n"
printf "=====================================================================\n\n"
printf "🔥 ВАЖНЫЕ СЛЕДУЮЩИЕ ШАГИ:\n\n"
printf "1. 🔑 ${YELLOW}Отредактируйте токен Hugging Face${NC} для диаризации:\n"
printf " - Откройте файл: nano ./config.env\n"
printf " - Замените 'your_token_here' на ваш токен с https://huggingface.co/settings/tokens\n\n"
printf "2. 🔄 ${YELLOW}Перезагрузите систему${NC}, если вы не были в группе docker:\n"
printf " sudo reboot\n\n"
printf "После перезагрузки:\n"
printf "3. 📁 Скопируйте ваши аудиофайлы в ./audio/\n"
printf "4. 🚀 Запустите обработку: python3 whisperx_diarization.py\n\n"
printf "Рабочие директории:\n"
printf " 📂 ./audio - Входные файлы (*.wav, *.mp3, *.m4a)\n"
printf " 📂 ./results - Результаты распознавания\n"
printf " 🧠 ~/whisperx/ - Кеш моделей (общий для всех проектов)\n"
printf " ⚙️ ./config.env - Настройки\n\n"
printf "=====================================================================\n"
}
# --- Основная функция ---
main() {
printf "=====================================================================\n"
printf "🎙️ УСТАНОВКА WHISPERX ДЛЯ ДИАРИЗАЦИИ РЕЧИ (DOCKER + NVIDIA)\n"
printf "=====================================================================\n\n"
check_distro
check_gpu
install_docker
install_nvidia_toolkit
if test_docker_gpu; then
log "Тест GPU пройден. WhisperX будет использовать видеокарту."
else
warning "Тест GPU не пройден. Проверьте настройки в './config.env' и установите DEVICE=cpu, если GPU не заработает."
fi
pull_whisperx_image
setup_workspace
final_check
show_usage
}
# Запуск основной функции
main