Запуск Whisper и Piper на VPS: локальный STT и TTS
Разверните Whisper и Piper на собственном VPS без GPU. Узнайте требования к CPU и диску, а также как настроить OpenAI-совместимый API для интеграции с вашими приложениями.
Локальный синтез и распознавание речи: кратко
Локальный синтез (TTS) и распознавание речи (STT) — это самый доступный вид ИИ, который можно запустить на собственном сервере. Для транскрипции используется Whisper через среду выполнения faster-whisper. Для синтеза используется Piper. Оба решения работают на обычном CPU VPS без использования GPU. Малая модель Whisper требует около 484 МБ на диске, а голос для Piper состоит из двух файлов: модели ONNX и небольшого JSON-конфига, которые вместе занимают значительно меньше 150 МБ.
Именно поэтому стоит начать с обработки аудио. Локальная генерация изображений и локальная генерация видео требуют наличия GPU для сколько-нибудь приемлемой работы. Для аудио это не требуется.
В этом руководстве рассматриваются оба направления и связующий их слой. Whisper преобразует аудио в текст. Piper преобразует текст в аудио. HTTP-сервер, совместимый с API OpenAI, перед обоими компонентами позволяет использовать существующие клиенты, просто указав базовый URL вашего сервера.
Все версии, указанные в командах, были проверены на страницах релизов соответствующих проектов 11 октября 2026 года. Версии CTranslate2, упомянутые в разделах об ошибках, являются маркерами совместимости, а не актуальными релизами.
Почему faster-whisper, а не эталонный пакет Whisper
Пакет whisper от OpenAI запускает модель в PyTorch. faster-whisper выполняет те же веса модели на CTranslate2 — движке инференса, написанном специально для трансформерных моделей. Веса идентичны, поэтому транскрипция получается такой же. Разница заключается исключительно в среде выполнения.
CTranslate2 квантует веса при их загрузке, поэтому compute_type="int8" — это один аргумент, а не отдельный этап конвертации. У него также нет зависимости от PyTorch. pip install faster-whisper подтягивает CTranslate2, токенизатор и PyAV для декодирования аудио, поэтому виртуальное окружение занимает сотни мегабайт, а не несколько гигабайт. На VPS с диском 40 GB эта разница определяет, будет ли вам комфортно или тесно.
Ниже приведены опубликованные проектом показатели для модели small на CPU. Бенчмарк транскрибирует 13 минут аудио с использованием 8 потоков на процессоре Intel Core i7-12700K. Столбец x_realtime — это 13 минут, деленные на измеренное время: 7.6 означает, что 13-минутная запись была обработана чуть более чем за 1 минуту 40 секунд.
Данные, на которых построен график
[
{
"label": "openai/whisper, fp32",
"x_realtime": 1.9,
"seconds": 418,
"memory_mb": "2,335"
},
{
"label": "whisper.cpp, fp32",
"x_realtime": 6.2,
"seconds": 125,
"memory_mb": "1,049"
},
{
"label": "faster-whisper, fp32",
"x_realtime": 5.0,
"seconds": 157,
"memory_mb": "2,257"
},
{
"label": "faster-whisper, int8",
"x_realtime": 7.6,
"seconds": 102,
"memory_mb": "1,477"
},
{
"label": "faster-whisper, int8, batch 8",
"x_realtime": 15.3,
"seconds": 51,
"memory_mb": "3,608"
}
]Внимательно посмотрите на вторую строку. В формате fp32 пакет whisper.cpp работает быстрее, чем faster-whisper на этом CPU: 6.2x против 5.0x, при этом потребляя менее половины объема памяти. Это то же семейство ggml, которое лежит в основе стека локальных LLM на базе llama.cpp. faster-whisper вырывается вперед при включении int8 и пакетной обработки, достигая 15.3x, потребляя при этом 3,608 MB оперативной памяти. Итог: выбирайте faster-whisper ради Python API и пакетной обработки, выбирайте whisper.cpp, если объем RAM — это ограничение, которое вы не можете обойти.
Первая строка — суть этого раздела. Эталонный пакет работает со скоростью 1.9x от реального времени на той же машине, что означает: на обработку часа аудио уходит полчаса работы CPU.
Сколько дискового пространства требуют веса модели Whisper?
Данные, на которых построен график
[
{
"label": "tiny",
"weights_mb": 75.5
},
{
"label": "base",
"weights_mb": 145
},
{
"label": "small",
"weights_mb": 484
},
{
"label": "medium",
"weights_mb": "1,530"
},
{
"label": "large-v3",
"weights_mb": "3,090"
}
]Это опубликованные конвертации CTranslate2 в формате float16. Обратите внимание на то, чего compute_type="int8" не делает: он не уменьшает размер загружаемого файла. Веса поступают в формате float16, а CTranslate2 квантует их в оперативной памяти во время загрузки. Поэтому модель large-v3 занимает 3,090 МБ на диске независимо от того, запускаете ли вы её в float16 или int8. Формат int8 экономит оперативную память и повышает скорость, но не место на диске.
Модели загружаются при первом использовании в ~/.cache/huggingface/hub. Если на VPS небольшой корневой раздел, укажите путь к месту с достаточным объёмом свободного пространства с помощью аргумента download_root или переменной окружения HF_HOME. В противном случае первый запуск заполнит диск, и процесс прервётся во время загрузки.
Установка faster-whisper без нарушения целостности системного Python
В Ubuntu 24.04 и Debian 13 системный Python помечен как управляемый извне. Запуск pip install faster-whisper вне виртуального окружения немедленно прерывается ошибкой:
error: externally-managed-environmentЭто механизм системы пакетов, защищающий файлы, которыми управляет apt. Используйте виртуальное окружение.
sudo apt update
sudo apt install -y python3-venv ffmpeg
python3 -m venv ~/stt
~/stt/bin/pip install --upgrade pip
~/stt/bin/pip install faster-whisper==1.2.1Версия 1.2.1 является текущим релизом, выпущенным в октябре 2025 года. Библиотека faster-whisper декодирует аудио через PyAV, которая включает собственные библиотеки ffmpeg, поэтому она считывает файлы mp3 или m4a без отдельного бинарного файла ffmpeg. Пакет ffmpeg, указанный выше, потребуется для работы с видео в следующих разделах этого руководства.
Проверьте установку перед загрузкой весов объемом три гигабайта:
~/stt/bin/python -c "from faster_whisper import WhisperModel; print('ok')"Строка с текстом ok означает, что пакеты успешно установлены. Ошибка ImportError с упоминанием ctranslate2 означает, что среда выполнения отсутствует или скомпилированная библиотека не может быть загружена; остальная часть сообщения указывает на причину. Для 32-битных образов ARM пакет CTranslate2 отсутствует, поэтому pip завершается ошибкой еще на этапе установки.
Транскрибация записи встречи или голосовой заметки
Сохраните это как transcribe.py:
from faster_whisper import WhisperModel
model = WhisperModel("small", device="cpu", compute_type="int8", cpu_threads=4)
segments, info = model.transcribe("meeting.m4a", beam_size=5, vad_filter=True)
print("language: %s (%.2f)" % (info.language, info.language_probability))
for segment in segments:
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))Запустите его с помощью ~/stt/bin/python transcribe.py. При первом запуске загружаются веса, поэтому некоторое время вывод отсутствует. После этого модель загружается из кэша за несколько секунд.
segments является генератором, поэтому транскрибация не начнется, пока вы не начнете итерацию по нему. Пользователи замеряют время вызова transcribe(), видят, что он возвращает управление мгновенно, и думают, что что-то сломалось. Ничего не сломалось. Работа выполняется внутри цикла.
vad_filter=True сначала запускает Silero VAD (детектор речевой активности) и отбрасывает фрагменты тишины до того, как их увидит Whisper. На записи встречи с длинными паузами это дает самый значительный прирост скорости, так как Whisper не тратит время на аудио, в котором нет речи. Это также подавляет циклы повторения предложений, которые Whisper генерирует, когда ему подается тишина и он пытается найти в ней слова.
Установите cpu_threads равным количеству ядер, которые у вас есть на самом деле. Установка значения выше количества vCPU замедляет транскрибацию, так как дополнительные потоки конкурируют за одно и то же ядро, а планировщик тратит ресурсы на каждое переключение.
Субтитры для библиотеки Jellyfin
Jellyfin считывает внешние файлы субтитров, которые находятся рядом с видеофайлом и имеют то же имя. Таким образом, Movie (2019).en.srt рядом с Movie (2019).mkv отображается как английская дорожка без необходимости пересканирования библиотеки. Будет ли конкретный клиент воспроизводить их напрямую, или сервер выполнит ремуксинг, или «вшиет» их в видео, зависит от возможностей этого клиента.
Сначала извлеките аудио. Whisper внутри себя передискретизирует всё в 16 кГц моно, поэтому подача аудио в формате 16 кГц моно снижает нагрузку на обоих этапах:
ffmpeg -i "Movie (2019).mkv" -vn -ac 1 -ar 16000 -c:a pcm_s16le "Movie (2019).wav"В faster-whisper нет встроенного модуля записи SRT, поэтому отформатируйте сегменты самостоятельно. Сохраните это как srt.py:
import sys
from faster_whisper import WhisperModel
def ts(seconds):
ms = int(round(seconds * 1000))
hours, ms = divmod(ms, 3600000)
minutes, ms = divmod(ms, 60000)
secs, ms = divmod(ms, 1000)
return "%02d:%02d:%02d,%03d" % (hours, minutes, secs, ms)
model = WhisperModel("small", device="cpu", compute_type="int8")
segments, info = model.transcribe(sys.argv[1], vad_filter=True)
with open(sys.argv[2], "w", encoding="utf-8") as out:
for index, segment in enumerate(segments, start=1):
out.write("%d\n" % index)
out.write("%s --> %s\n" % (ts(segment.start), ts(segment.end)))
out.write("%s\n\n" % segment.text.strip())Затем выполните обход библиотеки:
for f in /srv/media/films/*.mkv; do
ffmpeg -nostdin -y -i "$f" -vn -ac 1 -ar 16000 -c:a pcm_s16le "${f%.mkv}.wav"
nice -n 15 ~/stt/bin/python srt.py "${f%.mkv}.wav" "${f%.mkv}.en.srt"
rm -f "${f%.mkv}.wav"
done-nostdin — это не декоративный элемент. Без него ffmpeg считывает данные из стандартного потока ввода цикла, «поглощает» остальной список файлов, и цикл завершается после первого фильма без сообщения об ошибке.
Рассчитайте время перед началом работы. При показателе 7.6x, указанном выше, 100-минутный фильм требует примерно 13 минут работы процессора, поэтому обработка библиотеки из пятидесяти фильмов займёт всю ночь. На тарифах с общими vCPU это происходит медленнее, для чего и предназначен nice: процесс создания субтитров будет уступать ресурсы любым другим задачам, выполняемым на сервере.
Синтез речи с помощью Piper
Piper — это нейронный движок синтеза речи, который запускает ONNX-модели голосов на центральном процессоре. Он включает в себя espeak-ng для преобразования текста в фонемы, поэтому устанавливать отдельный фонемизатор не требуется. Текущий релиз — 1.8.0, опубликован в сентябре 2026 года.
python3 -m venv ~/tts
~/tts/bin/pip install piper-tts==1.8.0
~/tts/bin/python -m piper.download_voices en_US-lessac-medium
~/tts/bin/python -m piper -m en_US-lessac-medium -f test.wav -- 'This is a test.'download_voices записывает два файла в рабочую директорию: веса .onnx и конфигурацию .onnx.json, содержащую частоту дискретизации и список дикторов. Они должны находиться вместе. Если вы храните голоса в фиксированном месте, передавайте --data-dir обеим командам, иначе проигрыватель будет искать их в рабочей директории и не сможет найти голос, если его там нет.
-- перед текстом также имеет значение. Без него любое предложение, начинающееся с дефиса, будет интерпретироваться как опция командной строки.
Голоса поставляются в нескольких уровнях качества. Английский голос среднего качества занимает около 60 МБ, высокого — примерно в два раза больше. Более высокое качество означает использование более крупной модели и большее потребление ресурсов процессора на секунду речи, а не другого диктора.
Не вызывайте CLI в цикле. Он загружает модель при каждом запуске, и загрузка модели занимает основную часть времени при синтезе коротких предложений. Вместо этого запустите HTTP-сервер:
~/tts/bin/pip install 'piper-tts[http]==1.8.0'
~/tts/bin/python -m piper.http_server -m en_US-lessac-medium --host 127.0.0.1 --port 5000curl -X POST -H 'Content-Type: application/json' \
-d '{ "text": "This is a test." }' \
-o test.wav localhost:5000/synthesizeЕсли test.wav воспроизводится, значит, всё работает. Этот эндпоинт имеет собственный формат Piper, а не OpenAI, поэтому клиент, ожидающий /v1/audio/speech, не сможет с ним взаимодействовать. Следующий раздел исправляет это.
Поддерживайте работу сервера с помощью unit-файла, а не терминала, который вы закроете. Unit запускает Piper от имени пользователя piper без возможности входа в систему, из домашней директории этого пользователя, поэтому сервис не зависит от вашей учетной записи. Создайте пользователя и установите Piper и голос в его директорию:
sudo useradd --system --create-home --home-dir /home/piper --shell /usr/sbin/nologin piper
sudo -u piper python3 -m venv /home/piper/tts
sudo -u piper /home/piper/tts/bin/pip install 'piper-tts[http]==1.8.0'
sudo -u piper /home/piper/tts/bin/python -m piper.download_voices --data-dir /home/piper/voices en_US-lessac-mediumОстановите сервер, запущенный в терминале, затем создайте unit-файл:
[Unit]
Description=Piper text to speech HTTP server
After=network-online.target
[Service]
User=piper
ExecStart=/home/piper/tts/bin/python -m piper.http_server -m en_US-lessac-medium --data-dir /home/piper/voices --host 127.0.0.1 --port 5000
Restart=on-failure
[Install]
WantedBy=multi-user.targetsudo systemctl enable --now piper запускает сервис и обеспечивает его автозапуск после перезагрузки. Если команда curl выше ничего не возвращает, journalctl -u piper -n 50 содержит причину ошибки; чаще всего это отсутствие файла голоса.
Формат сервера, совместимого с OpenAI
Большинство программ для обработки аудио уже поддерживают API OpenAI: multipart POST на /v1/audio/transcriptions для файла и JSON POST на /v1/audio/speech для предложения. Реализуйте эти два пути самостоятельно, и клиенту потребуется изменить только один параметр — базовый URL.
Speaches — это сервер, который поддерживает оба направления. Он использует faster-whisper для транскрипции и Piper или Kokoro для синтеза речи, скрывая их за путями OpenAI. Текущий релиз — v0.9.0-rc.3 от декабря 2025 года. Это версия до 1.0, поэтому фиксируйте тег образа и читайте примечания к релизу перед обновлением.
curl --silent --remote-name https://raw.githubusercontent.com/speaches-ai/speaches/master/compose.yaml
curl --silent --remote-name https://raw.githubusercontent.com/speaches-ai/speaches/master/compose.cpu.yaml
export COMPOSE_FILE=compose.cpu.yaml
docker compose up --detachВариант с одним контейнером, если вы не хотите использовать compose-файлы:
docker run --rm --detach --publish 8000:8000 --name speaches \
--volume hf-hub-cache:/home/ubuntu/.cache/huggingface/hub \
ghcr.io/speaches-ai/speaches:latest-cpuИменованный том — это то, что часто забывают настроить. Без него кэш моделей находится внутри контейнера, поэтому при каждом перезапуске гигабайты весов скачиваются заново, прежде чем будет обработан первый запрос.
Для работы речи необходимо скачать голос, прежде чем /v1/audio/speech начнет отвечать:
uvx speaches-cli model download speaches-ai/Kokoro-82M-v1.0-ONNXПосле этого любой клиент OpenAI будет работать при условии изменения базового URL:
from pathlib import Path
from openai import OpenAI
openai = OpenAI(base_url="http://localhost:8000/v1", api_key="cant-be-empty")
res = openai.audio.speech.create(
model="speaches-ai/Kokoro-82M-v1.0-ONNX",
voice="af_heart",
input="Hello, world!",
response_format="mp3",
speed=1,
)
with Path("output.mp3").open("wb") as f:
f.write(res.response.read())Заполнитель api_key обязателен, так как клиентская библиотека OpenAI отказывается отправлять запрос без него. Сервер игнорирует это значение, пока вы не настроите реальный ключ.
vox-box — еще один проект, который стоит упомянуть. Это Python-пакет, а не контейнер, и он предоставляет те же пути, используя Whisper, FunASR, Bark, Dia или CosyVoice. Текущая версия 0.0.21 от декабря 2025 года, требует Python 3.10 или выше.
python3 -m venv ~/voice
~/voice/bin/pip install vox-box==0.0.21
~/voice/bin/vox-box start --huggingface-repo-id Systran/faster-whisper-small \
--data-dir ~/voice/data --host 127.0.0.1 --port 8010Пример из документации проекта привязывается к 80 порту, что требует прав root или возможности CAP_NET_BIND_SERVICE. Использование высокого порта за reverse proxy — более правильное решение для сервера, выполняющего другие задачи. vox-box start принимает одну модель, поэтому для работы в обоих направлениях потребуется второй экземпляр на другом порту с идентификатором репозитория для речи.
Запросите у сервера список загруженных моделей, а затем используйте этот идентификатор в поле model:
curl http://127.0.0.1:8010/v1/modelscurl http://127.0.0.1:8010/v1/audio/transcriptions \
-H "Content-Type: multipart/form-data" \
-F file="@voice-note.m4a" \
-F model="faster-whisper-small"JSON-ответ в формате {"text": "..."} означает, что путь работает корректно. Ошибка 404 при указании имени модели означает, что вы угадали имя вместо того, чтобы прочитать вывод /v1/models.
Ни один из этих серверов не включает аутентификацию по умолчанию. Привязывайте их к 127.0.0.1 и обращайтесь к ним через VPN или reverse proxy, который запрашивает учетные данные. Открытый /v1/audio/transcriptions на публичном IP-адресе — это бесплатные ресурсы CPU для любого, кто его обнаружит, а их обязательно обнаружат.
Голосовой интерфейс для self-hosted ассистента
Когда оба направления отвечают по путям OpenAI, ими можно управлять через чат-интерфейс. Open WebUI и его аналоги позволяют указать в настройках базовый URL, совместимый с OpenAI, для работы с аудио. Таким образом, один сервер может запустить локальную LLM через Ollama и замкнуть голосовой цикл с обеих сторон.
Реалистично оценивайте задержки, так как эти три этапа выполняются последовательно на одних и тех же ядрах процессора. Обработка 10-секундного вопроса занимает около 1.3 секунды на транскрибацию при показателе 7.6x, указанном выше, и это происходит еще до того, как модель прочитает хотя бы один токен. Добавьте к этому время генерации токенов процессором, и общая задержка станет настолько большой, что тестировщики решат, будто система зависла. Пакетная транскрибация на CPU работает приемлемо. Живой диалог — нет, и именно в этот момент VPS с GPU начинает оправдывать свою стоимость.
Когда GPU действительно оправдан?
Данные, на которых построен график
[
{
"label": "openai/whisper, fp16",
"x_realtime": 5.5,
"seconds": 143,
"memory_mb": "4,708"
},
{
"label": "faster-whisper, fp16",
"x_realtime": 12.4,
"seconds": 63,
"memory_mb": "4,525"
},
{
"label": "faster-whisper, int8",
"x_realtime": 13.2,
"seconds": 59,
"memory_mb": "2,926"
},
{
"label": "faster-whisper, int8, batch 8",
"x_realtime": 48.8,
"seconds": 16,
"memory_mb": "4,500"
}
]На GPU большая модель в формате int8 работает со скоростью 13.2x от реального времени, потребляя 2,926 МБ VRAM, а пакетная обработка увеличивает этот показатель до 48.8x. Обратите внимание на то, о чем умалчивают эти две таблицы. В них используются разные модели: для строк с GPU — large-v2, для строк с CPU — small. GPU не ускоряет маленькую модель в шесть раз. Он делает точную модель пригодной для использования.
Откуда взяты эти цифры
Обе таблицы воспроизводят результаты тестирования, опубликованные в README проекта faster-whisper. В качестве аудио использовался один 13-минутный файл. Для строк с CPU использовалось 8 потоков на процессоре Intel Core i7-12700K, для строк с GPU — CUDA 12.4 на видеокарте NVIDIA RTX 3070 Ti с 8 ГБ VRAM. Столбцы с секундами и объемом памяти содержат опубликованные данные. Столбец x_realtime рассчитан арифметически: 780 секунд аудио делятся на измеренное время с округлением до одного десятичного знака. В столбце памяти для таблицы с CPU указана системная RAM, а для таблицы с GPU — VRAM.
Тариф с общими vCPU не достигнет показателей CPU из теста. В том бенчмарке использовалось 8 потоков мощного десктопного процессора. Рассматривайте 7.6x как верхний предел, а затем протестируйте свою систему с помощью time на реальной записи, прежде чем планировать на этом какую-либо нагрузку.
Четыре практических правила:
- Эпизодическая транскрибация собственных записей: CPU, модель small, int8. Достаточно двух выделенных vCPU.
- Пакетная обработка в ночное время, например, создание субтитров: CPU, модель small или medium, int8, запущено через
nice. - Любые интерактивные задачи или обработка всей библиотеки за один вечер: GPU.
- Piper: всегда CPU. Голосовая модель такого размера практически не получает преимуществ от GPU.
Если вы оцениваете, какую еще нагрузку может выдержать ваше оборудование, более широкий вопрос о том, какие AI-модели можно разместить самостоятельно содержит информацию о размерах моделей, которые помещаются или не помещаются в память.
Режимы сбоев и соответствующие им сообщения
error: externally-managed-environment при установке. Системный Python защищен дистрибутивом. Создайте виртуальное окружение, как показано выше.
Несоответствие cuDNN на сервере с GPU. Ошибка выглядит следующим образом:
Unable to load any of {libcudnn_ops.so.9.1.0, libcudnn_ops.so.9.1, libcudnn_ops.so.9, libcudnn_ops.so}
Invalid handle. Cannot load symbol cudnnCreateTensorDescriptorВ CTranslate2 4.5.0 сборки для CUDA 12 переведены на cuDNN 9, а в системе установлен cuDNN 8. Либо установите cuDNN 9, либо зафиксируйте более старую версию среды выполнения с помощью pip install --force-reinstall ctranslate2==4.4.0. Выполните что-то одно. Если сделать и то, и другое, проблема останется.
This CTranslate2 package was not compiled with CUDA support — это другая ошибка с похожими симптомами. Установленный пакет (wheel) предназначен только для CPU. Пересоздайте виртуальное окружение на хосте с GPU, чтобы pip снова выбрал подходящий пакет.
Повторяющиеся фразы в транскрипции. Фраза, зацикленная десять раз, почти всегда означает, что тишина или музыка были ошибочно распознаны как речь. Сначала включите vad_filter=True. Если проблема сохраняется, прослушайте этот фрагмент: при почти полном отсутствии звука Whisper не находит опорных точек и повторяет последнее уверенное предположение.
Неверно определен язык. По умолчанию faster-whisper делает предположение только на основе первых 30 секунд записи. Значение info.language_probability значительно ниже 1.0 означает неуверенность модели, что случается, если запись начинается с музыки или наложения голосов. Передайте language="en", если язык вам заранее известен, или увеличьте language_detection_segments, чтобы модель проанализировала больше фрагментов перед принятием решения.
Процесс выводит Killed и завершается. Это срабатывает механизм OOM-killer (Out-of-Memory) ядра, а dmesg покажет соответствующую строку о принудительном завершении процесса. Модели large-v3 требуется более 3 GB только для весов, не считая рабочей памяти. На VPS с 2 GB памяти максимальная модель, которая поместится — это small в формате int8.
Piper не может найти голос. Плеер ищет файлы в рабочей директории, если не передан аргумент --data-dir. Выполните ls в нужной директории и убедитесь, что файлы .onnx и .onnx.json присутствуют, так как отсутствие одного из них приводит к сбою так же гарантированно, как и отсутствие обоих.
FAQ
Можно ли запускать распознавание речи на VPS только с CPU?
Да, и для пакетной обработки это разумный выбор. Согласно опубликованным тестам проекта, при использовании faster-whisper с моделью small в формате int8 транскрибирование 13 минут аудио занимает 102 секунд на 8 потоках процессора i7, что составляет примерно 7.6x от скорости реального времени при потреблении 1,477 МБ оперативной памяти. Тарифы с общими vCPU работают медленнее, поэтому проведите замеры на своем оборудовании. Синтез речи с помощью Piper еще проще и ни при каких обстоятельствах не требует GPU.
Какой размер модели Whisper выбрать?
Начните с small в формате int8. Она занимает 484 МБ на диске и хорошо справляется с четкой записанной речью. Переходите на medium, если акценты или фоновый шум вызывают критические ошибки, и на large-v3 только в том случае, если точность важнее всего остального, так как она требует 3,090 МБ на диске и более 3 ГБ оперативной памяти. В обратную сторону: модель tiny размером 75.5 МБ полезна для определения языка и тестирования конвейера, но не для транскриптов, предназначенных для чтения людьми.
Почему faster-whisper работает быстрее, чем оригинальный пакет Whisper?
Модель та же самая, но среда выполнения отличается. Референсный пакет запускает Whisper через PyTorch, тогда как faster-whisper выполняет те же веса на CTranslate2 — движке, созданном для инференса трансформеров, который квантует веса при загрузке и не требует установки PyTorch. Согласно опубликованным тестам на CPU, скорость референсного пакета составляет 1.9x от реального времени против 7.6x у faster-whisper в формате int8 при меньшем потреблении памяти.
Почему в транскрипте одно и то же предложение повторяется многократно?
Whisper распознает тишину или музыку как речь и возвращается к своему последнему уверенному предположению. Установите vad_filter=True в вызове transcribe(): это позволит сначала запустить детектор активности голоса Silero и удалить участки тишины до того, как их увидит модель. Если повторы продолжаются, проверьте уровень громкости аудио, так как запись, в которой почти везде тишина, не дает модели данных для работы.
Как получить аудио-эндпоинт, совместимый с OpenAI, на собственном сервере?
Запустите сервер, реализующий POST /v1/audio/transcriptions и POST /v1/audio/speech, а затем укажите клиенту новый базовый URL. Speaches — один из вариантов, поставляется как образ контейнера с CPU-сборкой, использует faster-whisper для транскрибирования и Piper или Kokoro для синтеза речи. vox-box — другой вариант, устанавливается через pip install vox-box и запускается командой vox-box start --huggingface-repo-id, обслуживая одну модель на процесс. По умолчанию аутентификация не включена, поэтому привязывайте сервис к localhost и ставьте перед ним прокси или VPN.