mirror of
https://github.com/empenoso/offline-audio-transcriber.git
synced 2026-04-19 08:30:30 +05:00
Ubuntu 24 и 25 setup files
This commit is contained in:
@@ -28,8 +28,8 @@
|
|||||||
# конфликтов доступа у Docker-контейнера.
|
# конфликтов доступа у Docker-контейнера.
|
||||||
#
|
#
|
||||||
# Порядок использования:
|
# Порядок использования:
|
||||||
# 1. Сделайте скрипт исполняемым: chmod +x whisperx_diarization_setup.sh
|
# 1. Сделайте скрипт исполняемым: chmod +x whisperx_diarization_setup_ubuntu24.sh
|
||||||
# 2. Запустите его: ./whisperx_diarization_setup.sh
|
# 2. Запустите его: ./whisperx_diarization_setup_ubuntu24.sh
|
||||||
# 3. После завершения может потребоваться перезагрузка системы.
|
# 3. После завершения может потребоваться перезагрузка системы.
|
||||||
|
|
||||||
# Следить за состоянием GPU: $ watch -n 5 nvidia-smi
|
# Следить за состоянием GPU: $ watch -n 5 nvidia-smi
|
||||||
@@ -118,7 +118,7 @@ install_docker() {
|
|||||||
# Добавление пользователя в группу docker, если еще не там
|
# Добавление пользователя в группу docker, если еще не там
|
||||||
if ! groups "$USER" | grep -q '\bdocker\b'; then
|
if ! groups "$USER" | grep -q '\bdocker\b'; then
|
||||||
log "Добавление пользователя $USER в группу docker..."
|
log "Добавление пользователя $USER в группу docker..."
|
||||||
sudo usermod -aG docker "$USER"
|
sudo usmod -aG docker "$USER"
|
||||||
warning "Для применения изменений группы docker требуется перезагрузка или перелогин."
|
warning "Для применения изменений группы docker требуется перезагрузка или перелогин."
|
||||||
log "Вы можете выполнить 'sudo reboot' после завершения установки."
|
log "Вы можете выполнить 'sudo reboot' после завершения установки."
|
||||||
fi
|
fi
|
||||||
347
whisperx_diarization_setup_ubuntu25.sh
Normal file
347
whisperx_diarization_setup_ubuntu25.sh
Normal file
@@ -0,0 +1,347 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# 🛠️ Скрипт установки WhisperX с диаризацией (Docker + NVIDIA) 🛠️
|
||||||
|
#
|
||||||
|
# Этот Shell-скрипт полностью автоматизирует подготовку системы Ubuntu
|
||||||
|
# 25 для работы с 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_ubuntu25.sh
|
||||||
|
# 2. Запустите его: ./whisperx_diarization_setup_ubuntu25.sh
|
||||||
|
# 3. После завершения может потребоваться перезагрузка системы.
|
||||||
|
|
||||||
|
# Следить за состоянием GPU: $ watch -n 5 nvidia-smi
|
||||||
|
#
|
||||||
|
# Автор: Михаил Шардин https://shardin.name/
|
||||||
|
# Дата создания: 14.04.2026
|
||||||
|
# Версия: 2.3
|
||||||
|
#
|
||||||
|
# Актуальная версия скрипта всегда здесь: 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 usermod -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..."
|
||||||
|
# Добавлен флаг --yes для gpg, чтобы избежать вопроса о перезаписи
|
||||||
|
|
||||||
|
# Ключ
|
||||||
|
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | \
|
||||||
|
sudo gpg --dearmor --yes -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
|
||||||
|
|
||||||
|
# Архитектура
|
||||||
|
ARCH=$(dpkg --print-architecture)
|
||||||
|
|
||||||
|
# Репозиторий (без sed)
|
||||||
|
echo "deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://nvidia.github.io/libnvidia-container/stable/deb/${ARCH} /" | \
|
||||||
|
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
|
||||||
|
|
||||||
|
# === Генерация CDI профиля для Docker 29+ (Ubuntu 25+) ===
|
||||||
|
log "Генерация CDI профиля для GPU..."
|
||||||
|
sudo mkdir -p /etc/cdi
|
||||||
|
sudo nvidia-ctk cdi generate --output=/etc/cdi/nvidia.yaml
|
||||||
|
# ==========================================================
|
||||||
|
|
||||||
|
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
|
||||||
Reference in New Issue
Block a user