diff --git a/.env.example b/.env.example index 2da884f..c012278 100644 --- a/.env.example +++ b/.env.example @@ -1,25 +1,25 @@ -# Device settings -ASR_DEVICE=rocm -ASR_MODELS_ROOT=/app/models +# Simple ASR Server Configuration +# Этот файл содержит переменные окружения для сервера ASR -# Server settings -PORT=9854 +# Сервер HOST=0.0.0.0 +PORT=9854 + +# Модель Whisper +DEFAULT_MODEL=turbo +MODEL_DEVICE=cuda +MODEL_DOWNLOAD_ROOT=./models + +# Файлы и директории +KEYS_FILE=./data/keys.txt LOG_LEVEL=info -# Model settings -DEFAULT_MODEL=turbo -DEFAULT_LANGUAGE=ru +# AMD GPU настройки (для ROCm) +HSA_OVERRIDE_GFX_VERSION=10.3.0 -# Processing settings +# Дополнительные настройки AUDIO_SPEEDUP=1.25 -MAX_UPLOAD_SIZE_MB=50 # 50MB in bytes - -# Cache settings -CACHE_DIR=/app/cache -ENABLE_CACHE=true - -# Security settings -CORS_ORIGINS=* -MAX_REQUESTS_PER_MINUTE=60 +# Настройки для GPU (по умолчанию CUDA) +# Для использования CPU установите MODEL_DEVICE=cpu +# Для AMD GPU убедитесь что установлен ROCm и используется подходящая версия PyTorch diff --git a/.idea/dictionaries/project.xml b/.idea/dictionaries/project.xml new file mode 100644 index 0000000..dcd2d28 --- /dev/null +++ b/.idea/dictionaries/project.xml @@ -0,0 +1,7 @@ + + + + конфигурироемость + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index b79d30e..5872f1b 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,5 +3,5 @@ - + \ No newline at end of file diff --git a/.idea/whisper.iml b/.idea/whisper.iml new file mode 100644 index 0000000..ec63674 --- /dev/null +++ b/.idea/whisper.iml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/README.MD b/README.MD index 8046386..21c4cf0 100644 --- a/README.MD +++ b/README.MD @@ -6,11 +6,13 @@ - 🎯 Эндпоинт `/transcribe` для распознавания речи - 🔑 Управление API-ключами без перезапуска сервиса -- 📊 Три формата ответа: `json`, `simple`, `text` +- 📊 Три формата ответа: `json`, `simple`, `text/plain` - ⚙️ Поддержка всех параметров `whisper.transcribe()` - 🐳 Docker и native запуск - 🏥 Health check эндпоинт - 🔄 Горячая перезагрузка API-ключей +- 🚀 GPU ускорение по умолчанию (NVIDIA/AMD) +- ⚙️ Централизованная конфигурация через .env файл ## Требования @@ -18,10 +20,12 @@ - FFmpeg (для обработки аудио) - Минимум 4GB RAM - Свободное место для моделей (turbo ~1GB, large ~3GB) +- **GPU с поддержкой CUDA или ROCm (рекомендуется)** Для Docker дополнительно: - Docker + Docker Compose -- GPU AMD с поддержкой ROCm (опционально) +- NVIDIA Docker runtime (для NVIDIA GPU) +- ROCm (для AMD GPU) ## Быстрый старт @@ -30,6 +34,10 @@ ```bash git clone https://github.com/SlavaVlad/simple-asr-server.git ./asr cd asr + +# Для AMD GPU оставьте как есть +# Для NVIDIA GPU раскомментируйте соответствующую секцию в docker-compose.yml + docker compose up -d ``` @@ -38,41 +46,54 @@ docker compose up -d ```bash git clone https://github.com/SlavaVlad/simple-asr-server.git ./asr cd asr + chmod +x start_server.sh ./start_server.sh ``` -## Конфигурация +### Переменные окружения -Создайте файл `.env` для настройки переменных окружения: +| Переменная | По умолчанию | Описание | +|------------|--------------|----------| +| `HOST` | `0.0.0.0` | IP адрес для привязки | +| `PORT` | `9854` | Порт сервера | +| `DEFAULT_MODEL` | `turbo` | Модель Whisper для загрузки | +| `MODEL_DEVICE` | `cuda` | Устройство: `cuda`, `cpu`, или `auto` | +| `MODEL_DOWNLOAD_ROOT` | `./models` | Директория для моделей | +| `KEYS_FILE` | `./data/keys.txt` | Файл с API ключами | +| `LOG_LEVEL` | `info` | Уровень логирования | +| `HSA_OVERRIDE_GFX_VERSION` | `10.3.0` | Версия GPU для AMD ROCm | +| `AUDIO_SPEEDUP` | `1.25` | Ускорение обработки аудио | +### Настройка GPU + +**По умолчанию сервис настроен для работы с NVIDIA GPU.** + +**Для использования CPU:** ```env -HOST=0.0.0.0 -PORT=9854 -DEFAULT_MODEL=turbo -MODEL_DOWNLOAD_ROOT=./models -KEYS_FILE=./data/keys.txt -LOG_LEVEL=info +MODEL_DEVICE=cpu ``` ### Доступные модели Whisper -- `tiny` - самая быстрая, наименее точная -- `base` - баланс скорости и качества -- `small` - хорошее качество -- `medium` - лучшее качество -- `large` - максимальное качество -- `turbo` - оптимизированная версия (рекомендуется) +- `tiny` - самая быстрая, наименее точная (~40MB) +- `base` - баланс скорости и качества (~150MB) +- `small` - хорошее качество (~500MB) +- `medium` - лучшее качество (~1.5GB) +- `large` - максимальное качество (~3GB) +- `turbo` - оптимизированная версия (~800MB, рекомендуется) ## Управление API-ключами -### Создание ключей +### Автоматическое создание ключей -При первом запуске автоматически создается файл `data/keys.txt` с демонстрационным ключом. +При первом запуске: +1. Если установлен `openssl` - генерируется безопасный 64-символьный ключ +2. Если `openssl` отсутствует - создается пустой файл ключей ### Добавление/удаление ключей -1. Отредактируйте файл `data/keys.txt` (один ключ на строку) +1. Отредактируйте файл `data/keys.txt` (один ключ на строку, 64 hex символа) 2. Вызовите эндпоинт перезагрузки: ```bash @@ -86,6 +107,16 @@ key1 key2 ``` +### Генерация новых ключей + +```bash +# Генерация нового ключа +openssl rand -hex 32 + +# Добавление в файл ключей +echo "$(openssl rand -hex 32)" >> data/keys.txt +``` + ## API Документация ### POST /transcribe @@ -107,14 +138,14 @@ key2 - `best_of` - количество кандидатов для выбора лучшего - `compression_ratio_threshold` - порог сжатия для фильтрации - `logprob_threshold` - порог логарифмической вероятности - - `no_speech_threshold` - порог детекции отсутствия речи + - `no_speech_threshold` - порог отсутствия речи - `condition_on_previous_text` - использовать предыдущий текст как контекст - `initial_prompt` - начальная подсказка для модели - `word_timestamps` - временные метки слов (true/false) - `prepend_punctuations` - знаки препинания для добавления в начало - `append_punctuations` - знаки препинания для добавления в конец - `clip_timestamps` - временные метки для обрезки аудио - - `hallucination_silence_threshold` - порог тишины для детекции галлюцинаций + - `hallucination_silence_threshold` - порог тишины для отрезания галлюцинаций #### Примеры запросов @@ -214,24 +245,6 @@ curl "http://localhost:9854/health" } ``` -### POST /keys/reload - -Перезагрузка API-ключей без перезапуска: - -```bash -curl -X POST "http://localhost:9854/keys/reload" \ - -H "X-API-Key: your-api-key" -``` - -### GET /keys/count - -Количество активных ключей: - -```bash -curl "http://localhost:9854/keys/count" \ - -H "X-API-Key: your-api-key" -``` - ## Коды ошибок - `401` - API ключ не предоставлен diff --git a/docker-compose.yml b/docker-compose.yml index 5393700..18538c7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,25 +2,38 @@ services: asr-server: build: . ports: - - "${PORT:-9854}:9854" + - "${PORT:-9854}:${PORT:-9854}" + env_file: + - .env environment: - - HOST=${HOST:-0.0.0.0} - - PORT=${PORT:-9854} - - DEFAULT_MODEL=${DEFAULT_MODEL:-turbo} - - MODEL_DOWNLOAD_ROOT=${MODEL_DOWNLOAD_ROOT:-/app/models} - - KEYS_FILE=${KEYS_FILE:-/app/data/keys.txt} - - HSA_OVERRIDE_GFX_VERSION=${HSA_OVERRIDE_GFX_VERSION:-10.3.0} - - LOG_LEVEL=${LOG_LEVEL:-info} - - AUDIO_SPEEDUP=${AUDIO_SPEEDUP:-1.25} + - HOST=${HOST} + - PORT=${PORT} + - DEFAULT_MODEL=${DEFAULT_MODEL} + - MODEL_DEVICE=${MODEL_DEVICE} + - MODEL_DOWNLOAD_ROOT=/app/models + - KEYS_FILE=/app/data/keys.txt + - HSA_OVERRIDE_GFX_VERSION=${HSA_OVERRIDE_GFX_VERSION} + - LOG_LEVEL=${LOG_LEVEL} + - AUDIO_SPEEDUP=${AUDIO_SPEEDUP} volumes: - ./models:/app/models - ./data:/app/data - devices: - - /dev/kfd:/dev/kfd - - /dev/dri:/dev/dri + # GPU support - раскомментируйте нужную секцию + # Для NVIDIA GPU: +# deploy: +# resources: +# reservations: +# devices: +# - driver: nvidia +# count: all +# capabilities: [gpu] +# Для AMD GPU (ROCm): + devices: + - /dev/kfd:/dev/kfd + - /dev/dri:/dev/dri restart: unless-stopped healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:9854/health"] + test: ["CMD", "curl", "-f", "http://localhost:${PORT:-9854}/health"] interval: 30s timeout: 10s retries: 3 diff --git a/start_server.sh b/start_server.sh index 2884ff6..1bcfa99 100755 --- a/start_server.sh +++ b/start_server.sh @@ -33,6 +33,7 @@ fi export HOST=${HOST:-"0.0.0.0"} export PORT=${PORT:-9854} export DEFAULT_MODEL=${DEFAULT_MODEL:-"turbo"} +export MODEL_DEVICE=${MODEL_DEVICE:-"cuda"} export MODEL_DOWNLOAD_ROOT=${MODEL_DOWNLOAD_ROOT:-"${APP_DIR}/models"} export KEYS_FILE=${KEYS_FILE:-"${APP_DIR}/data/keys.txt"} export LOG_LEVEL=${LOG_LEVEL:-"info"} @@ -86,6 +87,7 @@ echo "Starting Simple ASR Server..." echo "Host: ${HOST}" echo "Port: ${PORT}" echo "Default Model: ${DEFAULT_MODEL}" +echo "Model Device: ${MODEL_DEVICE}" echo "Model Download Root: ${MODEL_DOWNLOAD_ROOT}" echo "Keys File: ${KEYS_FILE}" echo "Log Level: ${LOG_LEVEL}"