feat: обновление конфигурации ASR сервера и поддержка GPU NVIDIA/AMD

This commit is contained in:
2025-09-07 12:01:57 +03:00
parent fcae47cad1
commit 1f13bc4f86
7 changed files with 113 additions and 71 deletions

View File

@@ -1,25 +1,25 @@
# Device settings # Simple ASR Server Configuration
ASR_DEVICE=rocm # Этот файл содержит переменные окружения для сервера ASR
ASR_MODELS_ROOT=/app/models
# Server settings # Сервер
PORT=9854
HOST=0.0.0.0 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 LOG_LEVEL=info
# Model settings # AMD GPU настройки (для ROCm)
DEFAULT_MODEL=turbo HSA_OVERRIDE_GFX_VERSION=10.3.0
DEFAULT_LANGUAGE=ru
# Processing settings # Дополнительные настройки
AUDIO_SPEEDUP=1.25 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

7
.idea/dictionaries/project.xml generated Normal file
View File

@@ -0,0 +1,7 @@
<component name="ProjectDictionaryState">
<dictionary name="project">
<words>
<w>конфигурироемость</w>
</words>
</dictionary>
</component>

2
.idea/misc.xml generated
View File

@@ -3,5 +3,5 @@
<component name="Black"> <component name="Black">
<option name="sdkName" value="Python 3.13 (simple-asr-server)" /> <option name="sdkName" value="Python 3.13 (simple-asr-server)" />
</component> </component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.13 (simple-asr-server)" project-jdk-type="Python SDK" /> <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.13 (whisper)" project-jdk-type="Python SDK" />
</project> </project>

7
.idea/whisper.iml generated Normal file
View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<module version="4">
<component name="PyDocumentationSettings">
<option name="format" value="PLAIN" />
<option name="myDocStringFormat" value="Plain" />
</component>
</module>

View File

@@ -6,11 +6,13 @@
- 🎯 Эндпоинт `/transcribe` для распознавания речи - 🎯 Эндпоинт `/transcribe` для распознавания речи
- 🔑 Управление API-ключами без перезапуска сервиса - 🔑 Управление API-ключами без перезапуска сервиса
- 📊 Три формата ответа: `json`, `simple`, `text` - 📊 Три формата ответа: `json`, `simple`, `text/plain`
- ⚙️ Поддержка всех параметров `whisper.transcribe()` - ⚙️ Поддержка всех параметров `whisper.transcribe()`
- 🐳 Docker и native запуск - 🐳 Docker и native запуск
- 🏥 Health check эндпоинт - 🏥 Health check эндпоинт
- 🔄 Горячая перезагрузка API-ключей - 🔄 Горячая перезагрузка API-ключей
- 🚀 GPU ускорение по умолчанию (NVIDIA/AMD)
- ⚙️ Централизованная конфигурация через .env файл
## Требования ## Требования
@@ -18,10 +20,12 @@
- FFmpeg (для обработки аудио) - FFmpeg (для обработки аудио)
- Минимум 4GB RAM - Минимум 4GB RAM
- Свободное место для моделей (turbo ~1GB, large ~3GB) - Свободное место для моделей (turbo ~1GB, large ~3GB)
- **GPU с поддержкой CUDA или ROCm (рекомендуется)**
Для Docker дополнительно: Для Docker дополнительно:
- Docker + Docker Compose - Docker + Docker Compose
- GPU AMD с поддержкой ROCm (опционально) - NVIDIA Docker runtime (для NVIDIA GPU)
- ROCm (для AMD GPU)
## Быстрый старт ## Быстрый старт
@@ -30,6 +34,10 @@
```bash ```bash
git clone https://github.com/SlavaVlad/simple-asr-server.git ./asr git clone https://github.com/SlavaVlad/simple-asr-server.git ./asr
cd asr cd asr
# Для AMD GPU оставьте как есть
# Для NVIDIA GPU раскомментируйте соответствующую секцию в docker-compose.yml
docker compose up -d docker compose up -d
``` ```
@@ -38,41 +46,54 @@ docker compose up -d
```bash ```bash
git clone https://github.com/SlavaVlad/simple-asr-server.git ./asr git clone https://github.com/SlavaVlad/simple-asr-server.git ./asr
cd asr cd asr
chmod +x start_server.sh chmod +x start_server.sh
./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 ```env
HOST=0.0.0.0 MODEL_DEVICE=cpu
PORT=9854
DEFAULT_MODEL=turbo
MODEL_DOWNLOAD_ROOT=./models
KEYS_FILE=./data/keys.txt
LOG_LEVEL=info
``` ```
### Доступные модели Whisper ### Доступные модели Whisper
- `tiny` - самая быстрая, наименее точная - `tiny` - самая быстрая, наименее точная (~40MB)
- `base` - баланс скорости и качества - `base` - баланс скорости и качества (~150MB)
- `small` - хорошее качество - `small` - хорошее качество (~500MB)
- `medium` - лучшее качество - `medium` - лучшее качество (~1.5GB)
- `large` - максимальное качество - `large` - максимальное качество (~3GB)
- `turbo` - оптимизированная версия (рекомендуется) - `turbo` - оптимизированная версия (~800MB, рекомендуется)
## Управление API-ключами ## Управление API-ключами
### Создание ключей ### Автоматическое создание ключей
При первом запуске автоматически создается файл `data/keys.txt` с демонстрационным ключом. При первом запуске:
1. Если установлен `openssl` - генерируется безопасный 64-символьный ключ
2. Если `openssl` отсутствует - создается пустой файл ключей
### Добавление/удаление ключей ### Добавление/удаление ключей
1. Отредактируйте файл `data/keys.txt` (один ключ на строку) 1. Отредактируйте файл `data/keys.txt` (один ключ на строку, 64 hex символа)
2. Вызовите эндпоинт перезагрузки: 2. Вызовите эндпоинт перезагрузки:
```bash ```bash
@@ -86,6 +107,16 @@ key1
key2 key2
``` ```
### Генерация новых ключей
```bash
# Генерация нового ключа
openssl rand -hex 32
# Добавление в файл ключей
echo "$(openssl rand -hex 32)" >> data/keys.txt
```
## API Документация ## API Документация
### POST /transcribe ### POST /transcribe
@@ -107,14 +138,14 @@ key2
- `best_of` - количество кандидатов для выбора лучшего - `best_of` - количество кандидатов для выбора лучшего
- `compression_ratio_threshold` - порог сжатия для фильтрации - `compression_ratio_threshold` - порог сжатия для фильтрации
- `logprob_threshold` - порог логарифмической вероятности - `logprob_threshold` - порог логарифмической вероятности
- `no_speech_threshold` - порог детекции отсутствия речи - `no_speech_threshold` - порог отсутствия речи
- `condition_on_previous_text` - использовать предыдущий текст как контекст - `condition_on_previous_text` - использовать предыдущий текст как контекст
- `initial_prompt` - начальная подсказка для модели - `initial_prompt` - начальная подсказка для модели
- `word_timestamps` - временные метки слов (true/false) - `word_timestamps` - временные метки слов (true/false)
- `prepend_punctuations` - знаки препинания для добавления в начало - `prepend_punctuations` - знаки препинания для добавления в начало
- `append_punctuations` - знаки препинания для добавления в конец - `append_punctuations` - знаки препинания для добавления в конец
- `clip_timestamps` - временные метки для обрезки аудио - `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 ключ не предоставлен - `401` - API ключ не предоставлен

View File

@@ -2,25 +2,38 @@ services:
asr-server: asr-server:
build: . build: .
ports: ports:
- "${PORT:-9854}:9854" - "${PORT:-9854}:${PORT:-9854}"
env_file:
- .env
environment: environment:
- HOST=${HOST:-0.0.0.0} - HOST=${HOST}
- PORT=${PORT:-9854} - PORT=${PORT}
- DEFAULT_MODEL=${DEFAULT_MODEL:-turbo} - DEFAULT_MODEL=${DEFAULT_MODEL}
- MODEL_DOWNLOAD_ROOT=${MODEL_DOWNLOAD_ROOT:-/app/models} - MODEL_DEVICE=${MODEL_DEVICE}
- KEYS_FILE=${KEYS_FILE:-/app/data/keys.txt} - MODEL_DOWNLOAD_ROOT=/app/models
- HSA_OVERRIDE_GFX_VERSION=${HSA_OVERRIDE_GFX_VERSION:-10.3.0} - KEYS_FILE=/app/data/keys.txt
- LOG_LEVEL=${LOG_LEVEL:-info} - HSA_OVERRIDE_GFX_VERSION=${HSA_OVERRIDE_GFX_VERSION}
- AUDIO_SPEEDUP=${AUDIO_SPEEDUP:-1.25} - LOG_LEVEL=${LOG_LEVEL}
- AUDIO_SPEEDUP=${AUDIO_SPEEDUP}
volumes: volumes:
- ./models:/app/models - ./models:/app/models
- ./data:/app/data - ./data:/app/data
# GPU support - раскомментируйте нужную секцию
# Для NVIDIA GPU:
# deploy:
# resources:
# reservations:
# devices:
# - driver: nvidia
# count: all
# capabilities: [gpu]
# Для AMD GPU (ROCm):
devices: devices:
- /dev/kfd:/dev/kfd - /dev/kfd:/dev/kfd
- /dev/dri:/dev/dri - /dev/dri:/dev/dri
restart: unless-stopped restart: unless-stopped
healthcheck: healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9854/health"] test: ["CMD", "curl", "-f", "http://localhost:${PORT:-9854}/health"]
interval: 30s interval: 30s
timeout: 10s timeout: 10s
retries: 3 retries: 3

View File

@@ -33,6 +33,7 @@ fi
export HOST=${HOST:-"0.0.0.0"} export HOST=${HOST:-"0.0.0.0"}
export PORT=${PORT:-9854} export PORT=${PORT:-9854}
export DEFAULT_MODEL=${DEFAULT_MODEL:-"turbo"} export DEFAULT_MODEL=${DEFAULT_MODEL:-"turbo"}
export MODEL_DEVICE=${MODEL_DEVICE:-"cuda"}
export MODEL_DOWNLOAD_ROOT=${MODEL_DOWNLOAD_ROOT:-"${APP_DIR}/models"} export MODEL_DOWNLOAD_ROOT=${MODEL_DOWNLOAD_ROOT:-"${APP_DIR}/models"}
export KEYS_FILE=${KEYS_FILE:-"${APP_DIR}/data/keys.txt"} export KEYS_FILE=${KEYS_FILE:-"${APP_DIR}/data/keys.txt"}
export LOG_LEVEL=${LOG_LEVEL:-"info"} export LOG_LEVEL=${LOG_LEVEL:-"info"}
@@ -86,6 +87,7 @@ echo "Starting Simple ASR Server..."
echo "Host: ${HOST}" echo "Host: ${HOST}"
echo "Port: ${PORT}" echo "Port: ${PORT}"
echo "Default Model: ${DEFAULT_MODEL}" echo "Default Model: ${DEFAULT_MODEL}"
echo "Model Device: ${MODEL_DEVICE}"
echo "Model Download Root: ${MODEL_DOWNLOAD_ROOT}" echo "Model Download Root: ${MODEL_DOWNLOAD_ROOT}"
echo "Keys File: ${KEYS_FILE}" echo "Keys File: ${KEYS_FILE}"
echo "Log Level: ${LOG_LEVEL}" echo "Log Level: ${LOG_LEVEL}"