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 складається з двох файлів — моделі ONNX і невеликого JSON-конфігураційного файла. Разом вони займають значно менше 150 MB.
Тому аудіо — найкращий напрямок для початку. Self-hosted генератор зображень і self-hosted генерація відео потребують GPU ще до того, як ними можна буде користуватися. Для аудіо GPU не потрібен.
Цей посібник охоплює обидва напрямки та шар, який їх поєднує. Whisper перетворює аудіо на текст. Piper перетворює текст на аудіо. OpenAI-compatible HTTP-сервер перед обома компонентами дає змогу підключити наявний клієнт до вашого сервера, змінивши лише base URL.
Кожну версію, зафіксовану в командах цього посібника, перевірено за сторінкою релізів відповідного проєкту 11 жовтня 2026 року. Версії CTranslate2, зазначені в розділі про типові помилки, є маркерами сумісності, а не актуальними релізами.
Чому 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 секунд.
Дані, на яких побудовано графік
[
{
"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?
Дані, на яких побудовано графік
[
{
"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 означає, що wheel-пакети встановлено. Повідомлення ImportError з назвою ctranslate2 означає, що середовище виконання відсутнє або його скомпільована бібліотека не завантажується. Решта повідомлення вказує причину. Для 32-бітних ARM-образів wheel-пакета 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 (voice activity detection) і видаляє фрагменти тиші, перш ніж Whisper почне їх обробляти. У записі зустрічі з довгими паузами це найбільше окреме прискорення, оскільки Whisper взагалі не витрачає час на аудіо без мовлення. Це також запобігає циклам із повторенням речень, які Whisper створює, коли отримує тишу й намагається знайти в ній слова.
Установіть cpu_threads відповідно до фактичної кількості доступних ядер. Якщо встановити значення, що перевищує кількість vCPU, транскрибація сповільниться, оскільки додаткові потоки конкуруватимуть за те саме ядро, а планувальник витрачатиме ресурси на кожне перемикання.
Субтитри для бібліотеки Jellyfin
Jellyfin читає зовнішні файли субтитрів, розміщені поруч із відео та названі так само. Тому Movie (2019).en.srt поруч із Movie (2019).mkv відображається як англійська доріжка без повторного сканування бібліотеки. Чи відтворює клієнт цей файл безпосередньо, чи сервер виконує remux або вбудовує субтитри у відео, залежить від підтримки конкретного клієнта.
Спочатку витягніть аудіо. 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.8.0, опублікований у September 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 MB, а голос високої якості — приблизно вдвічі більше. Вища якість означає більшу модель і більше CPU на секунду мовлення, а не іншого диктора.
Не запускайте 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 можна відтворити, це означає, що все працює. Цей endpoint використовує власний формат Piper, а не формат OpenAI, тому клієнт, який очікує /v1/audio/speech, не зможе з ним взаємодіяти. Це виправляється в наступному розділі.
Запускайте його через unit file, а не в терміналі, який ви закриєте. 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 від 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Іменований том часто пропускають. Без нього кеш моделей зберігається всередині контейнера, тому після кожного перезапуску перед обробкою першого запиту знову завантажуються гігабайти вагових файлів.
Перед тим як /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 або capability CAP_NET_BIND_SERVICE. На сервері, який виконує інші завдання, краще використовувати порт із великим номером за reverse proxy. vox-box start приймає одну модель, тому для підтримки обох напрямків потрібен другий екземпляр на іншому порту із зазначенням speech repo id.
Запитайте сервер, яку модель він завантажив, а потім використайте цей ідентифікатор у полі 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 та його альтернативи у своїх налаштуваннях приймають сумісну з OpenAI базову URL-адресу для аудіо, тому на одному сервері можна запустити локальну LLM з Ollama і замкнути голосовий цикл в обох напрямках.
Реалістично оцініть затримку, оскільки ці три етапи виконуються один за одним на тих самих ядрах. Запит тривалістю 10 секунд потребує приблизно 1.3 секунди для транскрибування за наведеним вище показником 7.6x. І це ще до того, як модель прочитає хоча б один токен. Додайте генерацію токенів на CPU, і повний цикл стане достатньо повільним, щоб тестувальники вирішили, ніби сервіс завис. Пакетне транскрибування на 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 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 захищений дистрибутивом. Створіть virtual environment, як показано вище.
Невідповідність 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 cudnnCreateTensorDescriptorCTranslate2 4.5.0 переніс збірки для CUDA 12 на cuDNN 9, а на хості встановлено cuDNN 8. Встановіть cuDNN 9 або зафіксуйте старішу версію runtime за допомогою pip install --force-reinstall ctranslate2==4.4.0. Виконайте один із цих варіантів. Якщо виконати обидва, проблема залишиться.
This CTranslate2 package was not compiled with CUDA support — це інша помилка зі схожими симптомами. Встановлено wheel лише для CPU. Створіть virtual environment заново на GPU-хості й дозвольте pip знову вибрати wheel.
Повторювані фрази в транскрипції. Речення, яке повторюється десять разів, майже завжди означає, що тиша або музика декодується як мовлення. Спочатку увімкніть vad_filter=True. Якщо це не допоможе, прослухайте фрагмент: майже беззвучний аудіосигнал не дає Whisper достатньо даних для прив’язки, тому модель повторює останню впевнену здогадку.
Визначено неправильну мову. За замовчуванням faster-whisper визначає мову лише за першим вікном тривалістю 30 секунд. Значення info.language_probability, значно менше за 1.0, означає, що модель не була впевнена. Таке трапляється, якщо запис починається з музики або одночасного мовлення кількох людей. Передайте language="en", якщо мова вже відома, або збільште language_detection_segments, щоб перед визначенням мови проаналізувати більше вікон.
Процес виводить Killed і зупиняється. Це kernel out-of-memory killer. Відповідний рядок про 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.