Skip to content

EvilFreelancer/docker-whisper-server

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

94 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Whisper.cpp API Webserver in Docker

Русский | δΈ­ζ–‡ | English

Whisper.cpp HTTP-сСрвСр для автоматичСского распознавания Ρ€Π΅Ρ‡ΠΈ (ASR), ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ API, совмСстимоС с OpenAI-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌΠΈ, ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ Π³ΠΈΠ±ΠΊΡƒΡŽ настройку распрСдСлённой ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π°ΡƒΠ΄ΠΈΠΎΡ„Π°ΠΉΠ»ΠΎΠ². БистСма ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π° для эффСктивного развСртывания ΠΈ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ запросов ΠΌΠ΅ΠΆΠ΄Ρƒ нСсколькими Docker-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°ΠΌΠΈ, основанными Π½Π° whisper.cpp server.

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

ВрСбования

Docker-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ для Whisper.cpp собираСтся Π² Π΄Π²Π΅ стадии, сначала бСрётся Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π· nvidia/cuda:12.5.1-devel-ubuntu22.04, Π² Π½Ρ‘ΠΌ происходит компиляция Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΊΠΎΠ² server ΠΈ quantize, Π΄Π°Π»Π΅Π΅ Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ стадии ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ nvidia/cuda:12.5.1-runtime-ubuntu22.04, Π² Π½Π΅Π³ΠΎ Π΄ΠΎΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π½ΡƒΠΆΠ½Ρ‹Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ ΠΈ ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ собранныС Π½Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ этапС.

По ΠΈΠ΄Π΅Π΅ Ссли Π²Ρ‹ ΠΏΠΎΠ½ΠΈΠ·ΠΈΡ‚Π΅ Π²Π΅Ρ€ΡΠΈΡŽ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° nvidia/cuda Π²ΠΏΠ»ΠΎΡ‚ΡŒ Π΄ΠΎ 12.1 ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚, Π½ΠΎ я Π½Π΅ провСрял.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π½Π°Ρ‡Π°Ρ‚ΡŒ ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Π² вашСй систСмС установлСна ΠΊΠ°Ρ€Ρ‚ΠΎΡ‡ΠΊΠ° с GPU, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΡΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ CUDA ΠΈ установлСн свСТий CUDA Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€.

И Ρ‚Π°ΠΊ, для Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° понадобится:

  • Π’ΠΈΠ΄Π΅ΠΎΠΊΠ°Ρ€Ρ‚Π° ΠΎΡ‚ Nvidia >= GTX 10xx (ΠΈΠ»ΠΈ Π°Π½Π°Π»ΠΎΠ³)
  • CUDA >= 12.5 (хотя скорСС всСго ΠΈ Π½Π° 12.1 всё Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΊ)
  • Docker
  • Docker Compose
  • Nvidia Docker Runtime

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ ΠΏΠΎ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ΅ Linux-ΠΌΠ°ΡˆΠΈΠ½Ρ‹ ΠΊ запуску нСйросСтСй, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ установку CUDA, Docker ΠΈ Nvidia Docker Runtime Π²Ρ‹ смоТСтС Π½Π°ΠΉΡ‚ΠΈ Π² ΠΌΠΎΠ΅ΠΉ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ "Как ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ Linux ΠΊ запуску ΠΈ ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΡŽ нСйросСтСй? (+ Docker)".

Установка

  1. Π‘ΠΊΠ»ΠΎΠ½ΠΈΡ€ΡƒΠ΅ΠΌ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ, послС Ρ‡Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Ρ‘ΠΌ Π² ΠΊΠΎΡ€Π΅Π½ΡŒ с исходниками:

    git clone https://github.com/EvilFreelancer/docker-whisper-server.git
    cd docker-whisper-server
    
  2. Π‘ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ Docker Compose ΠΈΠ· шаблона:

    cp docker-compose.dist.yml docker-compose.yml

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ для Intel Arc Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°Ρ€Ρ‚:

x-shared-logs: &shared-logs
   logging:
      driver: "json-file"
      options:
         max-size: "10k"

services:
  whisper-intel:
    restart: "unless-stopped"
    build:
      context: ./whisper
      dockerfile: Dockerfile.intel  
      args:
        - WHISPER_VERSION=v1.7.4
    devices:
      - /dev/dri
    volumes:
      - ./models:/app/models
    ports:
      - "127.0.0.1:9000:9000"
    environment:
      WHISPER_MODEL: large-v3-turbo
      WHISPER_MODEL_QUANTIZATION: q4_0
    <<: *shared-logs
  1. Π‘ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ OpenAI-like API сСрвСра:

    cp config.dist.yml config.yml
  2. Π‘ΠΎΠ±Π΅Ρ€Ρ‘ΠΌ Docker-ΠΎΠ±Ρ€Π°Π·Ρ‹:

    docker-compose build
  3. Запустим Docker-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹:

    docker-compose up -d

Whisper.cpp API-сСрвСр

Π’ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ docker-compose.yml Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния, Π²Π΅Ρ€ΡΠΈΡŽ whisper.cpp, ΠΏΠΎΡ€Ρ‚Ρ‹, ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹ Ρ‚ΠΎΠΌΠ° ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

НапримСр, Π²ΠΎΡ‚ Ρ‚Π°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ сСрвСр ΠΈΠ· Π²Π΅Ρ‚ΠΊΠΈ master ΠΈ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ модСль base, которая Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠ²Π°Π½Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π° Π΄ΠΎ q4_0 ΠΈ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π° Π½Π° 1 ядрС процСссора Π² 4 ΠΏΠΎΡ‚ΠΎΠΊΠ°.

  whisper:
    restart: "unless-stopped"
    build:
      context: ./whisper
      args:
        # Π’ качСствС вСрсии ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ: Ρ‚Π΅Π³, Π²Π΅Ρ‚ΠΊΡƒ ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠΌΠΈΡ‚
        # https://github.com/ggerganov/whisper.cpp
        - WHISPER_VERSION=master
    volumes:
      - ./models:/app/models
    ports:
      - "127.0.0.1:9000:9000"
    environment:
      WHISPER_MODEL: base
      WHISPER_MODEL_QUANTIZATION: q4_0
      WHISPER_PROCESSORS: 1
      WHISPER_THREADS: 4

Swagger докумСнтация Whisper.cpp

БСрвис whisper-swagger прСдоставляСт Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ всСх доступных эндпоинтов.

  whisper-swagger:
    restart: "unless-stopped"
    image: swaggerapi/swagger-ui:v5.17.14
    ports:
      - "127.0.0.1:9010:8080"
    volumes:
      - ./whisper/openapi.yaml:/openapi.yaml
    environment:
      SWAGGER_JSON: /openapi.yaml

ПослС Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΏΠΎ адрСсу http://localhost:9010 Π±ΡƒΠ΄Π΅Ρ‚ доступСн ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π²ΠΈΠ΄Π° интСрфСйс:

Swagger UI

Π­Π½Π΄ΠΏΠΎΠΈΠ½Ρ‚Ρ‹

/inference

ВранскрибируСм Π°ΡƒΠ΄ΠΈΠΎΡ„Π°ΠΉΠ»:

curl http://localhost:9000/inference \
  -H "Content-Type: multipart/form-data" \
  -F file="@./assets/audio.mp3" \
  -F language="auto" \
  -F response_format="json"

ВмСсто language="auto" (Π°Π²Ρ‚ΠΎΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ языка Π°ΡƒΠ΄ΠΈΠΎ) Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ явно ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹ΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ language="ru".

ВмСсто response_format="json" ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ систСму Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ субтитры response_format="srt" ΠΈΠ»ΠΈ просто тСкст response_format="text".

/load

Π‘ΠΌΠ΅Π½ΠΈΡ‚ΡŒ модСль Whisper:

curl http://localhost:9000/load \
  -H "Content-Type: multipart/form-data" \
  -F model="<path-to-model-file-in-docker-container>"

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния

Базовая конфигурация

Name Default Description
WHISPER_MODEL base МодСль Whisper, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ
WHISPER_MODEL_PATH /app/models/ggml-${WHISPER_MODEL}.bin ΠŸΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ ΠΌΠΎΠ΄Π΅Π»ΠΈ Whisper ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ
WHISPER_MODEL_QUANTIZATION Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ квантования (ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Ρ‚ΡƒΡ‚)
Π Π°ΡΡˆΠΈΡ€Π΅Π½Π½Π°Ρ конфигурация
Name Default Description
WHISPER_THREADS 4 ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² для инфСрСнса
WHISPER_PROCESSORS 1 ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ процСссоров для инфСрСнса
WHISPER_HOST 0.0.0.0 IP-адрСс ΠΈΠ»ΠΈ имя хоста для привязки сСрвСра
WHISPER_PORT 9000 НомСр ΠΏΠΎΡ€Ρ‚Π° для ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Π½ΠΈΡ
WHISPER_INFERENCE_PATH /inference ΠŸΡƒΡ‚ΡŒ для всСх запросов инфСрСнса
WHISPER_PUBLIC_PATH ΠŸΡƒΡ‚ΡŒ ΠΊ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠ΅
WHISPER_REQUEST_PATH ΠŸΡƒΡ‚ΡŒ для всСх запросов
WHISPER_OV_E_DEVICE CPU Устройство OpenViBE для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ событий
WHISPER_OFFSET_T 0 Π’Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ смСщСниС Π² миллисСкундах
WHISPER_OFFSET_N 0 ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ сСкунд для смСщСния
WHISPER_DURATION 0 Π”Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π°ΡƒΠ΄ΠΈΠΎΡ„Π°ΠΉΠ»Π° Π² миллисСкундах
WHISPER_MAX_CONTEXT -1 ΠœΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ контСкста для инфСрСнса
WHISPER_MAX_LEN 0 Максимальная Π΄Π»ΠΈΠ½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ тСкста
WHISPER_BEST_OF 2 БтратСгия "Π»ΡƒΡ‡ΡˆΠΈΠΉ ΠΈΠ· N" для инфСрСнса
WHISPER_BEAM_SIZE -1 Π Π°Π·ΠΌΠ΅Ρ€ beam для поиска
WHISPER_AUDIO_CTX 0 АудиоконтСкст для инфСрСнса
WHISPER_WORD_THOLD 0.01 ΠŸΠΎΡ€ΠΎΠ³ слов для сСгмСнтации
WHISPER_ENTROPY_THOLD 2.40 ΠŸΠΎΡ€ΠΎΠ³ энтропии для сСгмСнтации
WHISPER_LOGPROB_THOLD -1.00 ΠŸΠΎΡ€ΠΎΠ³ Π»ΠΎΠ³Π°Ρ€ΠΈΡ„ΠΌΠ° вСроятности для сСгмСнтации
WHISPER_LANGUAGE en Код языка для ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° ΠΈΠ»ΠΈ Π΄ΠΈΠ°Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ
WHISPER_PROMPT ΠΠ°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΎΠΌΡ‚
WHISPER_DTW Π’Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΊΠΈ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ²
WHISPER_CONVERT true ΠšΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π°ΡƒΠ΄ΠΈΠΎ Π² WAV, Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ffmpeg Π½Π° сСрвСрС
WHISPER_SPLIT_ON_WORD false Π Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠΎ слову, Π° Π½Π΅ ΠΏΠΎ Ρ‚ΠΎΠΊΠ΅Π½Ρƒ
WHISPER_DEBUG_MODE false Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Ρ€Π΅ΠΆΠΈΠΌ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ
WHISPER_TRANSLATE false ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ с исходного языка Π½Π° английский
WHISPER_DIARIZE false Диаризация стСрСо Π°ΡƒΠ΄ΠΈΠΎ
WHISPER_TINYDIARIZE false Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ tinydiarize (Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ модСль tdrz)
WHISPER_NO_FALLBACK false НС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ temperature fallback ΠΏΡ€ΠΈ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ
WHISPER_PRINT_SPECIAL false ΠŸΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹
WHISPER_PRINT_COLORS false ΠŸΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ Ρ†Π²Π΅Ρ‚Π°
WHISPER_PRINT_REALTIME false ΠŸΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ
WHISPER_PRINT_PROGRESS false ΠŸΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ прогрСсс
WHISPER_NO_TIMESTAMPS false НС ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΊΠΈ
WHISPER_DETECT_LANGUAGE false Π’Ρ‹ΠΉΡ‚ΠΈ послС автоматичСского опрСдСлСния языка

ΠšΠ²Π°Π½Ρ‚ΠΈΠ·Π°Ρ†ΠΈΡ

ДоступныС ΡƒΡ€ΠΎΠ²Π½ΠΈ квантования ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ WHISPER_MODEL_QUANTIZATION:

q2_k ΠΈΠ»ΠΈ 10
q3_k ΠΈΠ»ΠΈ 11
q4_0 ΠΈΠ»ΠΈ 2
q4_1 ΠΈΠ»ΠΈ 3
q4_k ΠΈΠ»ΠΈ 12
q5_0 ΠΈΠ»ΠΈ 8
q5_1 ΠΈΠ»ΠΈ 9
q5_k ΠΈΠ»ΠΈ 13
q6_k ΠΈΠ»ΠΈ 14
q8_0 ΠΈΠ»ΠΈ 7

Π’ случаС Ссли ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ†Π΅Π»ΠΎΠ΅ число скрипт entrypoint.sh автоматичСски ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ символов Π²ΠΈΠ΄Π° qX_X.

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎ ΠΊΠ²Π°Π½Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° whisper.cpp.

OpenAI-like API-сСрвСр

Π­Ρ‚ΠΎΡ‚ сСрвис прСдставляСт собой ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΡƒ Π²ΠΎΠΊΡ€ΡƒΠ³ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Whisper.cpp сСрвСров, Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Ρ… ΠΏΠΎ сСти. Он ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ запросы Π½Π° сСрвСр ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ.

  server:
    restart: "unless-stopped"
    build:
      context: ./server
    volumes:
      - ./config.yml/app/config.yaml
    ports:
      - "127.0.0.1:5000:5000"

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ config.yml

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ сСрвСра ΠΈ список доступных ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ настраиваСтся Π² Ρ„Π°ΠΉΠ»Π΅ config.yml, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²ΠΈΠ΄:

models:
  base:
    owned_by: organization-owner
    endpoints:
      - base_url: http://whisper:9000/inference
  #tiny:
  #  owned_by: organization-tiny-owner
  #  endpoints:
  #    - base_url: http://whisper01:9000/inference
  #    - base_url: https://user:pass@remote-server:9000/inference

Π’ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ нСсколько ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΠΈ сСрвСров для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ, Π² случаС Ссли модСль доступна Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… адрСса Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ запроса Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ случайный сСрвСр ΠΈ запрос пСрСнавится Π½Π° Π½Π΅Π³ΠΎ.

Балансировщик

Π’ ΠΊΠΎΠ½Ρ„ΠΈΠ³Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ индСкс локальной Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°Ρ€Ρ‚Ρ‹ Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°Ρ€Ρ‚Ρ‹

models:
  base:
    owned_by: organization-owner
    endpoints:
      - base_url: http://whisper1:9000/inference
        gpu: 0
      - base_url: http://whisper2:9001/inference
        gpu: 1

Π’ΠΎΠ³Π΄Π° ΠΏΡ€ΠΈ запросС Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π±Ρ€Π°Π½ сСрвСр whisper1 ΠΈΠ»ΠΈ whisper2 Π² зависимости ΠΎΡ‚ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°Ρ€Ρ‚Ρ‹. Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΊΠ°Ρ€Ρ‚Π°ΠΌΠΈ Nvidia. Если Π½Π°Π΄ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Intel Arc ΠΈΠ»ΠΈ Amd, Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°ΡΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ строчки Π² server/Dockerfile с установкой Π²ΠΈΠ΄Π΅ΠΎΠ΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ².

Π’ случаС Ссли Π½Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ gpu, Ρ‚ΠΎ запрос Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½ Π½Π° случайный сСрвСр. Если ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ сСрвСра с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ модСлями, Ρ‚ΠΎ запрос Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½ Π½Π° случайный сСрвСр с ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ модСлью.

Swagger докумСнтация сСрвСра

БСрвис server-swagger прСдоставляСт Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ всСх доступных эндпоинтов.

  server-swagger:
    restart: "unless-stopped"
    image: swaggerapi/swagger-ui:v5.17.14
    ports:
      - "127.0.0.1:5010:8080"
    volumes:
      - ./server/openapi.yaml:/openapi.yaml
    environment:
      SWAGGER_JSON: /openapi.yaml

ПослС Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΏΠΎ адрСсу http://localhost:5010 Π±ΡƒΠ΄Π΅Ρ‚ доступСн ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π²ΠΈΠ΄Π° интСрфСйс:

Swagger UI

Π­Π½Π΄ΠΏΠΎΠΈΠ½Ρ‚Ρ‹

/audio/transcriptions

Π­Ρ‚ΠΎΡ‚ эндпоинт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для создания транскрипции Π°ΡƒΠ΄ΠΈΠΎΡ„Π°ΠΉΠ»Π° Π² исходном языкС.

ΠœΠ΅Ρ‚ΠΎΠ΄: POST

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ запроса:

  • file (ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ): Аудиофайл для транскрипции. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹: flac, mp3, mp4, mpeg, mpga, m4a, ogg, wav, ΠΈΠ»ΠΈ webm.
  • model (ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ): ID ΠΌΠΎΠ΄Π΅Π»ΠΈ, которая Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для транскрипции.
  • language (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ): Π―Π·Ρ‹ΠΊ Π°ΡƒΠ΄ΠΈΠΎΡ„Π°ΠΉΠ»Π° Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ ISO-639-1. ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° этого ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ ΠΈ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ распознавания.
  • prompt (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ): Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ тСкст, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π² транскрипции ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ сСгмСнт Π°ΡƒΠ΄ΠΈΠΎ.
  • response_format (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ): Π€ΠΎΡ€ΠΌΠ°Ρ‚ Π²Ρ‹Π²ΠΎΠ΄Π° транскрипции. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ значСния: json, text, srt, verbose_json ΠΈ vtt. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: json.
  • temperature (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ): Π’Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Π° Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΡ‚ 0 Π΄ΠΎ 1. Π‘ΠΎΠ»Π΅Π΅ высокиС значСния, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ 0.8, ΡΠ΄Π΅Π»Π°ΡŽΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΠΎΠ»Π΅Π΅ случайным, Π° Π±ΠΎΠ»Π΅Π΅ Π½ΠΈΠ·ΠΊΠΈΠ΅ значСния, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ 0.2, ΡΠ΄Π΅Π»Π°ΡŽΡ‚ Π΅Π³ΠΎ Π±ΠΎΠ»Π΅Π΅ фокусированным ΠΈ Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ. Если установлСно Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0, модСль Π±ΡƒΠ΄Π΅Ρ‚ автоматичСски ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρƒ Π΄ΠΎ достиТСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… ΠΏΠΎΡ€ΠΎΠ³ΠΎΠ².

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ запроса:

curl http://localhost:5000/audio/transcriptions \
  -H "Content-Type: multipart/form-data" \
  -F file="@./assets/audio.mp3" \
  -F model="base" \
  -F language="auto" \
  -F response_format="json"

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΡ‚Π²Π΅Ρ‚Π°:

{
  "text": "This is the transcription of the audio."
}

/audio/translations

Π­Ρ‚ΠΎΡ‚ эндпоинт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° Π°ΡƒΠ΄ΠΈΠΎΡ„Π°ΠΉΠ»Π° Π½Π° английский язык.

Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ Π² ΠΎΠ΄ΠΈΠ½ ΠΊΠ°ΠΊ /audio/transcriptions Ρ‚ΠΎΠ»ΡŒΠΊΠΎ language=en ΠΈ Π΅Π³ΠΎ нСльзя ΠΌΠ΅Π½ΡΡ‚ΡŒ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ запроса:

curl http://localhost:5000/audio/transcriptions \
  -H "Content-Type: multipart/form-data" \
  -F file="@./assets/audio.mp3" \
  -F model="base" \
  -F response_format="json"

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΡ‚Π²Π΅Ρ‚Π°:

{
  "text": "This is the translated transcription of the audio."
}

/models

Π­Ρ‚ΠΎΡ‚ эндпоинт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для получСния списка всСх доступных ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ.

ΠœΠ΅Ρ‚ΠΎΠ΄: GET

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ запроса:

curl http://localhost:5000/models

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΡ‚Π²Π΅Ρ‚Π°:

{
  "object": "list",
  "data": [
    {
      "id": "base",
      "object": "model",
      "created": 1686935002,
      "owned_by": "organization-owner"
    }
  ]
}

/models/{model}

Π­Ρ‚ΠΎΡ‚ эндпоинт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для получСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ.

ΠœΠ΅Ρ‚ΠΎΠ΄: GET

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΡƒΡ‚ΠΈ:

  • model (ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ): ID ΠΌΠΎΠ΄Π΅Π»ΠΈ, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ запроса:

curl http://localhost:5000/models/base

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΡ‚Π²Π΅Ρ‚Π°:

{
  "id": "base",
  "object": "model",
  "created": 1686935002,
  "owned_by": "organization-owner"
}

Бсылки

Whisper.cpp

OpenAI-like API

ЛицСнзия

Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π»ΠΈΡ†Π΅Π½Π·ΠΈΡ€ΠΎΠ²Π°Π½ Π½Π° условиях Π»ΠΈΡ†Π΅Π½Π·ΠΈΠΈ MIT. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΡΡ‚ΠΈ Π² Ρ„Π°ΠΉΠ»Π΅ LICENSE.

Π¦ΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ этот ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π² своих исслСдованиях ΠΈΠ»ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅, поТалуйста, ΡƒΠΊΠ°ΠΆΠΈΡ‚Π΅ ссылку Π½Π° Π½Π΅Π³ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

[Pavel Rykov]. (2024). Whisper.cpp API Webserver in Docker. GitHub. https://github.com/EvilFreelancer/docker-whisper-server

ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ BibTeX:

@misc{pavelrykov2024whisperapi,
  author = {Pavel Rykov},
  title  = {Whisper.cpp API Webserver in Docker},
  year   = {2024},
  url    = {https://github.com/EvilFreelancer/docker-whisper-server}
}