Установка Whisper: Self-Hosted распознавание речи и транскрипция
Установка OpenAI Whisper, быстрая транскрипция с faster-whisper, многоязычная поддержка, API-сервер, Docker-развёртывание и оптимизация распознавания речи.
Содержание
Установка 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 | Скорость | Точность |
|---|---|---|---|---|
| tiny | 39 М | ~1 ГБ | Очень быстро | Низкая |
| base | 74 М | ~1 ГБ | Быстро | Средняя |
| small | 244 М | ~2 ГБ | Средне | Хорошая |
| medium | 769 М | ~5 ГБ | Медленно | Очень хорошая |
| large-v3 | 1,55 Б | ~10 ГБ | Самая медленная | Лучшая |
Установка Whisper (Python)
Базовая установка
# Виртуальная среда Python
python3 -m venv whisper-env
source whisper-env/bin/activate
# Установка Whisper
pip install openai-whisper
# Установка FFmpeg (для обработки аудио)
sudo apt-get install -y ffmpeg
Использование командной строки
# Базовая транскрипция
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
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 раз быстрее оригинала и использует меньше памяти.
pip install faster-whisper
Python с Faster-Whisper
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
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
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
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
# Транскрипция с загрузкой файла
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
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} секунд")
Пакетная транскрипция
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.
Связанные статьи
Установка Ollama: Руководство по локальному запуску LLM
Установка Ollama, запуск локальных LLM моделей (Llama 3, Mistral, Gemma), использование API, управление моделями, GPU-ускорение и развертывание через Docker.
Установка Open WebUI: Локальный ИИ с интерфейсом как у ChatGPT
Установка Open WebUI через Docker, интеграция с Ollama, управление пользователями, RAG (запросы к документам), управление моделями и поддержка нескольких пользователей.
Развёртывание ИИ-моделей на GPU-сервере: Руководство по NVIDIA CUDA
Установка драйверов NVIDIA, CUDA toolkit, nvidia-container-toolkit, обслуживание моделей с vLLM, мониторинг GPU и развёртывание ИИ-моделей с Docker.