SSD Nodes Learn 🎉 VPS от $5.50/мес
Руководства Matt ConnorАвтор: Matt Connor · Обновлено 2026-08-13

Запуск Whisper и Piper на VPS: локальный STT и TTS

Разверните Whisper и Piper на собственном VPS без GPU. Узнайте требования к CPU и диску, а также как настроить OpenAI-совместимый API для интеграции с вашими приложениями.

Локальный синтез и распознавание речи: краткий обзор

Локальный синтез (TTS) и распознавание речи (STT) — это наиболее доступные виды ИИ, которые можно запустить на собственном сервере. Для транскрипции используется Whisper через среду выполнения faster-whisper. Для синтеза применяется Piper. Оба решения работают на обычном CPU VPS без использования GPU. Малая модель Whisper требует около 484 МБ дискового пространства, а голос для Piper представляет собой один файл размером значительно меньше 150 МБ.

Именно поэтому стоит начинать с аудио. Локальная генерация изображений и локальная генерация видео требуют наличия GPU для приемлемой работы. Аудио — нет.

В этом руководстве рассматриваются оба направления и связующий их уровень. Whisper преобразует аудио в текст. Piper преобразует текст в аудио. HTTP-сервер, совместимый с OpenAI, перед обоими компонентами позволяет существующему клиенту обращаться к вашему серверу, изменив только базовый URL.

Все указанные здесь версии были актуальны на август 2026 года.

Почему 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 секунд.

ChartWhisper small on CPU, 13 minutes of audio (published project figures)
The data behind this chart
[
  {
    "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?

Chartfaster-whisper model weights on disk (Systran CTranslate2 conversions, float16)
The data behind this chart
[
  {
    "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.

Транскрибация записи встречи или голосовой заметки

Сохраните это как 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 kHz моно, поэтому подача аудио в формате 16 kHz моно снижает нагрузку на обоих этапах:

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-модели голосов на CPU. Он включает в себя espeak-ng для преобразования текста в фонемы, поэтому устанавливать отдельный фонемизатор не требуется. Текущий релиз — 1.6.0, опубликован в июле 2026 года.

python3 -m venv ~/tts
~/tts/bin/pip install piper-tts==1.6.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 MB, высокого — примерно в два раза больше. Более высокое качество означает использование более крупной модели и большее потребление ресурсов CPU на секунду речи, а не другого диктора.

Не вызывайте CLI в цикле. Он загружает модель при каждом запуске, и загрузка модели занимает основную часть времени при синтезе коротких предложений. Вместо этого запустите HTTP-сервер:

~/tts/bin/pip install 'piper-tts[http]==1.6.0'
~/tts/bin/python -m piper.http_server -m en_US-lessac-medium --host 127.0.0.1 --port 5000
curl -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]
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.target

sudo systemctl enable --now piper запускает сервис и обеспечивает его автозапуск после перезагрузки. Если команда curl выше ничего не возвращает, причина указана в journalctl -u piper -n 50; чаще всего это отсутствие файла голоса.

Структура сервера, совместимого с OpenAI

Большинство программ для обработки аудио уже поддерживают OpenAI audio API: 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

Именованный том — это то, что часто забывают настроить. Без него кэш моделей находится внутри контейнера, поэтому при каждом перезапуске гигабайты весов будут скачиваться заново, прежде чем будет обработан первый запрос.

Для работы Speaches необходимо скачать голос, прежде чем /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. Использование высокопортового диапазона за reverse proxy — более правильное решение для сервера, выполняющего другие задачи. vox-box start принимает одну модель, поэтому для работы в обоих направлениях потребуется второй экземпляр на другом порту с идентификатором репозитория для синтеза речи.

Запросите у сервера список загруженных моделей, затем используйте этот идентификатор в поле model:

curl http://127.0.0.1:8010/v1/models
curl 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 действительно оправдан?

ChartWhisper large-v2 on an RTX 3070 Ti, 13 minutes of audio (published project figures)
The data behind this chart
[
  {
    "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 и новее требуют cuDNN 9 для работы с CUDA 12, а в системе установлена 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 не находит опорных точек и повторяет последнее уверенное предположение.

Неверно определен язык. Whisper делает предположение только на основе первых 30 секунд записи. Значение info.language_probability значительно ниже 1.0 означает неуверенность модели, что случается, если запись начинается с музыки или посторонних разговоров. Используйте language="en", если язык вам заранее известен.

Процесс выводит Killed и завершается. Это срабатывает механизм OOM-killer (Out-of-Memory) ядра, и dmesg покажет соответствующую строку о принудительном завершении процесса. Модели large-v3 требуется более 3 ГБ только для весов, без учета рабочей памяти. На VPS с 2 ГБ ОЗУ максимальная модель, которая поместится в память — это 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.

#whisper#tts#piper#speech-to-text#self-hosted-ai