Перейти к основному содержимому
Вернуться в категорию

Установка Whisper: Self-Hosted распознавание речи и транскрипция

Установка OpenAI Whisper, быстрая транскрипция с faster-whisper, многоязычная поддержка, API-сервер, Docker-развёртывание и оптимизация распознавания речи.

Время чтения: 13 мин. ИИ и ML на своём сервере
whisperраспознавание речитранскрипцияискусственный интеллектself-hostingdocker

Содержание

Установка Whisper: Self-Hosted распознавание речи и транскрипция

OpenAI Whisper — мощная ИИ-модель, способная распознавать речь и выполнять транскрипцию на 99 языках. Запуская её на собственном сервере, вы можете выполнять неограниченную транскрипцию, защищать конфиденциальность и избавиться от затрат на API. Это руководство охватывает установку Whisper и faster-whisper, создание API-сервера и Docker-развёртывание.

Что такое Whisper?

Whisper — модель автоматического распознавания речи (ASR), разработанная OpenAI. Обучена на 680 000 часах многоязычных данных. Основные возможности:

  • 99 языков: Транскрипция на 99 языках, включая русский
  • Перевод: Автоматический перевод с любого языка на английский
  • Временные метки: Метки на уровне слов и предложений
  • Устойчивость к шуму: Высокая точность при фоновом шуме
  • Множество форматов: MP3, WAV, M4A, FLAC, OGG и другие
  • Открытый исходный код: Бесплатное использование по лицензии MIT

Размеры моделей

МодельПараметрыVRAMСкоростьТочность
tiny39 М~1 ГБОчень быстроНизкая
base74 М~1 ГББыстроСредняя
small244 М~2 ГБСреднеХорошая
medium769 М~5 ГБМедленноОчень хорошая
large-v31,55 Б~10 ГБСамая медленнаяЛучшая

Установка Whisper (Python)

Базовая установка

hljs bash
# Виртуальная среда Python
python3 -m venv whisper-env
source whisper-env/bin/activate

# Установка Whisper
pip install openai-whisper

# Установка FFmpeg (для обработки аудио)
sudo apt-get install -y ffmpeg

Использование командной строки

hljs bash
# Базовая транскрипция
whisper audio.mp3 --model medium --language Russian

# Перевод на английский
whisper audio.mp3 --model medium --task translate

# Формат субтитров SRT
whisper audio.mp3 --model medium --language Russian --output_format srt

# Временные метки на уровне слов
whisper audio.mp3 --model medium --language Russian --word_timestamps True

Использование с Python

hljs python
import whisper

# Загрузка модели
model = whisper.load_model("medium")

# Транскрипция
result = model.transcribe(
    "audio.mp3",
    language="ru",
    task="transcribe",
    word_timestamps=True
)

print(result["text"])

for segment in result["segments"]:
    start = segment["start"]
    end = segment["end"]
    text = segment["text"]
    print(f"[{start:.2f} - {end:.2f}] {text}")

Установка Faster-Whisper

Faster-whisper — реализация Whisper на основе CTranslate2. Работает до 4 раз быстрее оригинала и использует меньше памяти.

hljs bash
pip install faster-whisper

Python с Faster-Whisper

hljs python
from faster_whisper import WhisperModel

# Загрузка модели (GPU)
model = WhisperModel(
    "large-v3",
    device="cuda",
    compute_type="float16"
)

# Для режима CPU
# model = WhisperModel("large-v3", device="cpu", compute_type="int8")

segments, info = model.transcribe(
    "audio.mp3",
    language="ru",
    beam_size=5,
    word_timestamps=True,
    vad_filter=True
)

print(f"Обнаруженный язык: {info.language} (вероятность: {info.language_probability:.2f})")

for segment in segments:
    print(f"[{segment.start:.2f}с -> {segment.end:.2f}с] {segment.text}")

Создание API-сервера

Whisper API с FastAPI

hljs python
from fastapi import FastAPI, UploadFile, File
from faster_whisper import WhisperModel
import tempfile
import os

app = FastAPI(title="Whisper API")
model = WhisperModel("large-v3", device="cuda", compute_type="float16")

@app.post("/v1/audio/transcriptions")
async def transcribe(
    file: UploadFile = File(...),
    language: str = None,
    response_format: str = "json"
):
    with tempfile.NamedTemporaryFile(delete=False, suffix=os.path.splitext(file.filename)[1]) as tmp:
        content = await file.read()
        tmp.write(content)
        tmp_path = tmp.name
    
    try:
        segments, info = model.transcribe(tmp_path, language=language, beam_size=5, vad_filter=True)
        segments_list = list(segments)
        full_text = " ".join([s.text.strip() for s in segments_list])
        
        return {
            "text": full_text,
            "language": info.language,
            "duration": info.duration,
            "segments": [{"start": s.start, "end": s.end, "text": s.text.strip()} for s in segments_list]
        }
    finally:
        os.unlink(tmp_path)

@app.get("/health")
async def health():
    return {"status": "ok", "model": "large-v3"}

Docker-развёртывание

Dockerfile

hljs dockerfile
FROM nvidia/cuda:12.4.0-runtime-ubuntu22.04

RUN apt-get update && apt-get install -y \
    python3 python3-pip ffmpeg \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /app
COPY requirements.txt .
RUN pip3 install --no-cache-dir -r requirements.txt
COPY whisper_api.py .

EXPOSE 9000
CMD ["uvicorn", "whisper_api:app", "--host", "0.0.0.0", "--port", "9000"]

Docker Compose

hljs yaml
version: '3.8'
services:
  whisper:
    build: .
    container_name: whisper-api
    ports:
      - "9000:9000"
    volumes:
      - whisper_cache:/root/.cache
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/health"]
      interval: 30s
      timeout: 10s
      retries: 3

volumes:
  whisper_cache:

Примеры использования API

hljs bash
# Транскрипция с загрузкой файла
curl -X POST http://localhost:9000/v1/audio/transcriptions \
  -F "file=@meeting.mp3" \
  -F "language=ru"

# Автоматическое определение языка
curl -X POST http://localhost:9000/v1/audio/transcriptions \
  -F "file=@audio.wav"

Использование API с Python

hljs python
import requests

def transcribe_audio(file_path, language=None):
    url = "http://localhost:9000/v1/audio/transcriptions"
    with open(file_path, "rb") as f:
        files = {"file": f}
        data = {"language": language} if language else {}
        response = requests.post(url, files=files, data=data)
    return response.json()

result = transcribe_audio("meeting.mp3", language="ru")
print(f"Текст: {result['text']}")
print(f"Длительность: {result['duration']:.1f} секунд")

Пакетная транскрипция

hljs python
import os, glob
from faster_whisper import WhisperModel

model = WhisperModel("large-v3", device="cuda", compute_type="float16")
audio_files = glob.glob("audio_files/*.mp3") + glob.glob("audio_files/*.wav")

for audio_file in audio_files:
    print(f"Обработка: {audio_file}")
    segments, info = model.transcribe(audio_file, language="ru", vad_filter=True)
    output_file = os.path.splitext(audio_file)[0] + ".txt"
    with open(output_file, "w", encoding="utf-8") as f:
        for segment in segments:
            f.write(f"[{segment.start:.2f} - {segment.end:.2f}] {segment.text}\n")
    print(f"  Сохранено: {output_file}")

Выполняйте высокоскоростное распознавание речи и транскрипцию с Whisper на GPU-серверах REXE. Получайте высокоточные результаты на 99 языках с моделью large-v3.