SSD Nodes Learn 🎉 VPS від $5.50/міс
Посібники Matt ConnorВід Matt Connor · Оновлено 2026-08-13

Whisper і Piper на VPS: self-hosted speech-to-text і TTS

Запустіть Whisper і Piper на CPU VPS: дізнайтеся витрати CPU та диска, потрібний обсяг ваг моделі й спосіб відкрити OpenAI-сумісний endpoint.

Коротко про self-hosted speech-to-text і TTS

Self-hosted speech-to-text і TTS (text-to-speech) — найдешевші різновиди AI, які можна запускати на власному сервері. Транскрибування виконує Whisper через runtime faster-whisper. Синтез виконує Piper. Обидва компоненти працюють на звичайному CPU VPS без GPU. Для малої моделі Whisper потрібно близько 484 MB дискового простору, а голос Piper — це один файл розміром значно менше ніж 150 MB.

Тому аудіо — найкращий напрямок для початку. Self-hosted генератор зображень і self-hosted генерація відео потребують GPU ще до того, як ними можна буде нормально користуватися. Для аудіо GPU не потрібен.

У цьому посібнику розглянуто обидва напрямки та шар, який їх об’єднує. Whisper перетворює аудіо на текст. Piper перетворює текст на аудіо. OpenAI-сумісний HTTP-сервер перед ними дає змогу підключити наявний клієнт до вашого сервера, змінивши лише базову URL-адресу.

Усі згадані тут версії були актуальними станом на August 2026.

Чому faster-whisper, а не еталонний пакет Whisper

Пакет OpenAI whisper запускає модель у 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 на цьому CPU працює швидше за faster-whisper: 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 MB незалежно від того, запускаєте ви її у форматі float16 чи int8. Формат int8 заощаджує RAM і прискорює роботу, але не зменшує вимоги до дискового простору.

Моделі завантажуються під час першого використання в ~/.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 означає, що wheels встановлено. Повідомлення ImportError із назвою ctranslate2 означає, що wheel для вашої архітектури не встановився. Таке трапляється на 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 (voice activity detection) і видаляє фрагменти тиші, перш ніж Whisper почне їх обробляти. У записі зустрічі з довгими паузами це найбільше окреме прискорення, оскільки Whisper взагалі не витрачає час на аудіо без мовлення. Це також запобігає циклам із повторенням речень, які Whisper створює, коли отримує тишу й намагається знайти в ній слова.

Установіть cpu_threads відповідно до фактичної кількості доступних ядер. Якщо встановити значення, що перевищує кількість vCPU, транскрибація сповільниться, оскільки додаткові потоки конкуруватимуть за те саме ядро, а планувальник витрачатиме ресурси на кожне перемикання.

Субтитри для бібліотеки Jellyfin

Jellyfin читає зовнішні файли субтитрів, розташовані поруч із відеофайлом і названі так само. Тому Movie (2019).en.srt поруч із Movie (2019).mkv з’являється як англійська доріжка без транскодування та повторного сканування бібліотеки.

Спочатку витягніть аудіо. Whisper внутрішньо передискретизує все до 16 kHz mono, тому передавання йому аудіо у форматі 16 kHz mono зменшує обсяг роботи на обох етапах:

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 хвилин CPU, тому бібліотека з п’ятдесяти фільмів оброблятиметься протягом ночі. На плані зі спільним vCPU це триватиме довше. Для цього потрібен nice: тоді обробка субтитрів поступається ресурсами іншим завданням, які реально виконуються на сервері.

Синтез мовлення за допомогою Piper

Piper — це нейронний рушій синтезу мовлення, який запускає голосову модель ONNX на CPU. Він містить espeak-ng для перетворення тексту на фонеми, тому окремий phonemizer встановлювати не потрібно. Поточний реліз — 1.6.0, опублікований у July 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 можна відтворити, це означає, що все працює. Цей endpoint має власний формат 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 від December 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

Іменований volume часто забувають додати. Без нього кеш моделей зберігається всередині контейнера, тому після кожного перезапуску перед обробкою першого запиту знову завантажуються гігабайти вагових даних.

Для синтезу мовлення потрібно завантажити голос до того, як /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 від December 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-адресі безкоштовно надає процесорний час тому, хто його знайде. Такий сервіс обов’язково знайдуть.

Голосовий фронтенд для self-hosted асистента

Коли обидва напрямки відповідають через OpenAI-сумісні шляхи, ними може керувати чат-фронтенд. Open WebUI та його альтернативи у своїх налаштуваннях приймають сумісну з OpenAI базову URL-адресу для аудіо, тому на одному сервері можна запустити локальну LLM з Ollama і замкнути голосовий цикл в обох напрямках.

Реалістично оцініть затримку, оскільки ці три етапи виконуються один за одним на тих самих ядрах. Запит тривалістю 10 секунд потребує приблизно 1.3 секунди для транскрибування за наведеним вище показником 7.6x. І це ще до того, як модель прочитає хоча б один токен. Додайте генерацію токенів на CPU, і повний цикл стане достатньо повільним, щоб тестувальники вирішили, ніби сервіс завис. Пакетне транскрибування на 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 MB VRAM, а пакетна обробка підвищує швидкість до 48.8x. Зверніть увагу на те, чого немає на цих двох діаграмах. На них порівнюються різні моделі: у рядках для GPU використовується large-v2, а в рядках для CPU — small. GPU не робить модель small у шість разів швидшою. Він робить точнішу модель придатною для використання.

Походження цих чисел

Обидві діаграми відтворюють результати бенчмарку, опубліковані у README faster-whisper. Для тесту використано один аудіофайл тривалістю 13 хвилин. У тестах CPU використовувалися 8 потоків процесора Intel Core i7-12700K, а в тестах GPU — CUDA 12.4 на NVIDIA RTX 3070 Ti з 8 GB 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 або зафіксуйте старішу версію runtime за допомогою pip install --force-reinstall ctranslate2==4.4.0. Виконайте лише одну з цих дій. Якщо виконати обидві, проблема залишиться.

This CTranslate2 package was not compiled with CUDA support — це інша помилка з подібними ознаками. Встановлено wheel лише для CPU. Створіть віртуальне середовище повторно на GPU-хості та дозвольте pip знову вибрати wheel.

Повторення фраз у транскрипції. Речення, яке повторюється десять разів, майже завжди означає, що тиша або музика декодується як мовлення. Спочатку увімкніть vad_filter=True. Якщо це не допоможе, прослухайте фрагмент: майже беззвучне аудіо не дає Whisper достатньо даних для прив’язки, тому модель повторює свій останній упевнений варіант.

Визначено неправильну мову. Whisper робить припущення лише за першими 30 секундами. Значення info.language_probability, суттєво менше за 1.0, означає, що модель не була впевнена. Таке трапляється, коли запис починається з музики або одночасного мовлення кількох людей. Якщо ви вже знаєте мову, передайте language="en".

Процес виводить Killed і зупиняється. Це означає, що kernel завершив процес через нестачу пам’яті. Відповідний рядок про oom-kill покаже 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.6 раза швидше за реальний час, використовуючи 1,477 MB оперативної пам’яті. Спільний vCPU працює повільніше, тому виміряйте показники на власному сервері. Перетворення тексту на мовлення за допомогою Piper ще простіше й за жодних умов не потребує GPU.

Який розмір моделі Whisper вибрати?

Почніть із small у режимі int8. На диску вона займає 484 MB і добре обробляє чітко записане мовлення. Перейдіть на medium, якщо акцент або фоновий шум спричиняє помилки, з якими ви не можете змиритися. large-v3 використовуйте лише тоді, коли точність важливіша за все інше, оскільки їй потрібно 3,090 MB дискового простору та понад 3 GB пам’яті. Натомість tiny розміром 75.5 MB підходить для визначення мови й тестування конвеєра, але не для транскриптів, які читатиме людина.

Чому faster-whisper працює швидше за оригінальний пакет Whisper?

Модель однакова. Середовище виконання — ні. Еталонний пакет запускає Whisper у PyTorch, а faster-whisper використовує ті самі ваги в CTranslate2 — рушії, розробленому для інференсу transformer-моделей. Він квантує ваги під час завантаження й не потребує встановлення PyTorch. В опублікованому тесті для CPU еталонний пакет показує 1.9x реального часу, тоді як faster-whisper у режимі int8 — 7.6x, використовуючи менше пам’яті.

Чому мій транскрипт знову й знову повторює те саме речення?

Whisper розпізнає тишу або музику як мовлення та повертається до свого останнього впевненого припущення. Укажіть vad_filter=True у виклику transcribe(). Спочатку він запустить voice activity detection від Silero і вилучить тихі фрагменти, перш ніж модель їх обробить. Якщо повторення не припиняться, перевірте рівень аудіосигналу. Запис, який майже повністю складається з тиші, не дає моделі достатньо даних для роботи.

Як отримати сумісний з OpenAI endpoint для роботи з аудіо на власному сервері?

Запустіть сервер, який реалізує POST /v1/audio/transcriptions і POST /v1/audio/speech, а потім укажіть його клієнту через нову базову URL-адресу. Speaches — один із варіантів. Він доступний як container image зі збіркою для 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