SSD Nodes Learn 🎉 VPS mula $5.50/buwan
Mga Gabay Matt ConnorNi Matt Connor · Na-update 2026-08-13

Self-hosted Whisper at Piper sa VPS: CPU at gastos

Patakbuhin ang Whisper transcription at Piper TTS sa sariling VPS. Alamin ang CPU time, disk space, at paraan para mag-expose ng OpenAI-compatible endpoint.

Self-hosted speech-to-text at TTS, sa madaling sabi

Ang self-hosted speech-to-text at TTS (text-to-speech) ang pinakamurang uri ng AI na maaari mong patakbuhin sa sarili mong server. Gumagamit ang transcription ng Whisper sa pamamagitan ng faster-whisper runtime. Gumagamit naman ang synthesis ng Piper. Pareho silang gumagana sa ordinaryong CPU VPS kahit walang GPU. Nangangailangan ang maliit na Whisper model ng humigit-kumulang 484 MB na disk space, at ang isang Piper voice ay isang file na mas maliit sa 150 MB.

Kaya audio ang magandang panimulang lugar. Kailangan muna ng self-hosted image generator at self-hosted video generation ng GPU bago talaga magamit. Hindi ito kailangan ng audio.

Sinasaklaw ng guide na ito ang dalawang direksiyon at ang layer na nagdurugtong sa mga ito. Ginagawang text ng Whisper ang audio. Ginagawang audio ng Piper ang text. Kapag may OpenAI-compatible HTTP server sa harap ng pareho, maaaring ituro ng isang existing client ang mga request nito sa server mo sa pamamagitan lamang ng pagpapalit ng base URL.

Ang bawat bersyong binanggit dito ay napapanahon noong August 2026.

Bakit faster-whisper at hindi ang reference Whisper package

Pinapatakbo ng OpenAI whisper package ang model sa PyTorch. Pinapatakbo naman ng faster-whisper ang parehong model weights sa CTranslate2, isang inference engine na partikular na ginawa para sa mga transformer model. Magkapareho ang weights, kaya magkapareho rin ang transcript. Ang pagkakaiba ay nasa runtime lamang.

Kino-quantize ng CTranslate2 ang weights habang nilo-load ang mga ito. Kaya isang argument lang ang compute_type="int8" at hindi hiwalay na conversion step. Wala rin itong PyTorch dependency. Kinukuha ng pip install faster-whisper ang CTranslate2, isang tokenizer, at PyAV para sa audio decoding. Dahil dito, nasa daan-daang megabytes ang virtual environment sa halip na ilang gigabytes. Sa isang VPS na may 40 GB na disk, ang diperensiyang ito ang nagtatakda kung maluwag o masikip ang storage.

Narito ang sariling inilathalang figures ng project para sa small model sa CPU. Nagta-transcribe ang benchmark ng 13 minuto ng audio gamit ang 8 threads sa isang Intel Core i7-12700K. Ang x_realtime column ay 13 minuto na hinati sa nasukat na oras. Ibig sabihin, natapos ang 13 minutong recording sa loob ng kaunti lamang sa 1 minuto 40 kung 7.6 ang value.

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"
  }
]

Basahin nang maingat ang ikalawang row. Sa fp32, mas mabilis ang whisper.cpp kaysa faster-whisper sa CPU na ito: 6.2x kumpara sa 5.0x. Mas mababa rin sa kalahati ng memory ang ginagamit nito. Ito ang parehong ggml family na ginagamit sa bahagi ng llama.cpp para sa local LLM stack. Nauuna ang faster-whisper kapag naka-enable ang int8 at batching. Umaabot ito sa 15.3x at gumagamit ng 3,608 MB ng RAM. Kaya piliin ang faster-whisper para sa Python API at batching. Piliin ang whisper.cpp kapag RAM ang limitasyong hindi mo maaaring dagdagan.

Ang unang row ang pangunahing punto ng seksiyong ito. Ang reference package ay 1.9x real time sa parehong machine. Ibig sabihin, ang isang oras ng audio ay tumatagal ng kalahating oras ng CPU.

Gaano kalaking disk space ang kailangan ng Whisper model weights?

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"
  }
]

Ito ang mga inilabas na CTranslate2 conversion, gamit ang float16. Tandaan ang hindi ginagawa ng compute_type="int8": hindi nito pinapaliit ang download. Dumarating ang weights bilang float16 at kino-convert ng CTranslate2 sa ibang quantization habang nilo-load sa memory, kaya 3,090 MB sa disk ang kailangan ng large-v3, tumakbo man ito sa float16 o int8. RAM at bilis ang napapabuti ng int8, hindi ang disk space.

Sa unang paggamit, dina-download ang mga model sa ~/.cache/huggingface/hub. Kung maliit ang root volume ng VPS, ituro ang mga download sa lokasyong may sapat na espasyo gamit ang download_root argument o HF_HOME environment variable. Kung hindi, mapupuno ang disk sa unang pag-run at mamamatay ang process habang dina-download ang file.

Mag-install ng faster-whisper nang hindi sinisira ang system Python

Itinuturing ng Ubuntu 24.04 at Debian 13 na externally managed ang system Python. Kapag pinatakbo ang pip install faster-whisper sa labas ng virtual environment, agad itong humihinto at ipinapakita ang:

error: externally-managed-environment

Pinoprotektahan ng packaging system ang mga file na pagmamay-ari ng apt. Gumamit ng virtual environment.

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

Ang bersyon 1.2.1 ang kasalukuyang release, na inilabas noong October 2025. Nagde-decode ang faster-whisper ng audio sa pamamagitan ng PyAV, na may sarili nitong ffmpeg libraries. Dahil dito, nakakabasa ito ng mp3 o m4a nang walang hiwalay na ffmpeg binary. Ang ffmpeg package sa itaas ay para sa video processing na gagamitin sa bandang huli ng gabay na ito.

Suriin ang installation bago mag-download ng tatlong gigabytes na weights:

~/stt/bin/python -c "from faster_whisper import WhisperModel; print('ok')"

Ibig sabihin ng linyang may ok na na-install nang maayos ang mga wheel. Ibig sabihin ng ImportError na may ctranslate2 na pangalan na hindi na-install ang wheel para sa architecture mo. Nangyayari ito sa mga 32-bit ARM image.

I-transcribe ang meeting recording o voice note

I-save ito bilang 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))

Patakbuhin ito gamit ang ~/stt/bin/python transcribe.py. Sa unang pag-run, ida-download ang weights, kaya walang lalabas na output sa loob ng ilang sandali. Pagkatapos nito, maglo-load ang model mula sa cache sa loob ng ilang segundo.

Ang segments ay isang generator, kaya hindi magsisimula ang transcription hangga’t hindi mo ito ini-iterate. Tina-timing ng ilang tao ang tawag sa transcribe(), nakikita nilang agad itong nagre-return, at iniisip nilang may sira. Walang sira. Sa loop ginagawa ang aktuwal na trabaho.

Pinapatakbo muna ng vad_filter=True ang Silero VAD (voice activity detection) at inaalis ang mahahabang silent stretch bago ito makita ng Whisper. Sa meeting recording na maraming mahahabang pagitan, ito ang pinakamalaking single speed improvement na available, dahil hindi kailanman nag-aaksaya ng oras ang Whisper sa audio na walang speech. Pinipigilan din nito ang paulit-ulit na sentence loop na ginagawa ng Whisper kapag pinapakain ito ng silence at sinusubukan nitong maghanap ng mga salita roon.

Itakda ang cpu_threads sa aktuwal na bilang ng mga core na mayroon ka. Kapag itinakda mo ito nang mas mataas kaysa sa bilang ng iyong vCPU, babagal ang transcription dahil nagko-contend ang mga dagdag na thread para sa iisang core at kailangang magbayad ang scheduler sa bawat context switch.

Mga Subtitle para sa Jellyfin Library

Binabasa ng Jellyfin ang mga external subtitle file na nasa tabi ng video at kapareho ang pangalan nito, kaya ang Movie (2019).en.srt na nasa tabi ng Movie (2019).mkv ay lumalabas bilang English track nang walang transcoding at walang pagbuo muli ng library.

I-extract muna ang audio. Awtomatikong nire-resample ng Whisper ang lahat sa 16 kHz mono, kaya kapag 16 kHz mono na ang ibinigay dito, nababawasan ang trabaho sa magkabilang panig:

ffmpeg -i "Movie (2019).mkv" -vn -ac 1 -ar 16000 -c:a pcm_s16le "Movie (2019).wav"

Walang SRT writer ang faster-whisper, kaya ikaw mismo ang mag-format ng mga segment. I-save ito bilang 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())

Pagkatapos, i-scan ang library:

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

Hindi palamuti ang -nostdin. Kung wala ito, babasahin ng ffmpeg ang standard input ng loop, makokonsumo ang natitirang file list, at hihinto ang loop pagkatapos ng isang pelikula nang walang error message.

I-budget muna ang oras bago magsimula. Batay sa 7.6x na figure sa itaas, mangangailangan ang 100 minutong pelikula ng humigit-kumulang 13 minuto ng CPU, kaya ang library na may limampung pelikula ay aabutin ng magdamag. Sa isang shared vCPU plan, mas mabagal pa ito. Para rito ang nice: magbibigay-daan ang subtitle run sa iba pang aktuwal na gawain ng server.

Text to speech gamit ang Piper

Ang Piper ay isang neural text-to-speech engine na nagpapatakbo ng ONNX voice model sa CPU. May kasama itong espeak-ng para i-convert ang text sa mga phoneme, kaya hindi na kailangang mag-install ng hiwalay na phonemizer. Ang kasalukuyang release ay 1.6.0, na inilabas noong 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.'

Sumusulat ang download_voices ng dalawang file sa working directory: ang .onnx weights at ang .onnx.json config na naglalaman ng sample rate at listahan ng speaker. Dapat magkasama ang mga ito. Kung may nakatakda kang permanenteng lokasyon para sa mga voice, ipasa ang --data-dir sa parehong command, dahil sa working directory naghahanap ang player kapag hindi ito itinakda at hindi nito mahahanap ang voice na wala roon.

Mahalaga rin ang -- bago ang text. Kung wala ito, ipoproseso bilang command-line option ang anumang sentence na nagsisimula sa hyphen.

May ilang quality level ang mga voice. Humigit-kumulang 60 MB ang isang medium English voice, at halos doble nito ang high voice. Ang mas mataas na quality ay nangangahulugan ng mas malaking model at mas maraming CPU bawat segundo ng speech, hindi ibang speaker.

Huwag tawagin ang CLI sa loob ng loop. Nilo-load nito ang model sa bawat invocation, at ang model loading ang kumokonsumo ng malaking bahagi ng oras para sa maikling sentence. Sa halip, patakbuhin ang HTTP server:

~/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

Kapag na-play mo ang test.wav, gumagana ito. Sariling format ng Piper ang endpoint na iyon, hindi format ng OpenAI, kaya hindi ito makakausap ng client na umaasa sa /v1/audio/speech. Inaayos ito ng susunod na section.

Panatilihing tumatakbo ito gamit ang unit file sa halip na terminal na isasara mo:

[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

Sinisimulan ito ng sudo systemctl enable --now piper at ibinabalik itong tumakbo pagkatapos ng reboot. Kung walang ibinalik ang curl command sa itaas, nasa journalctl -u piper -n 50 ang dahilan, at ang karaniwang sanhi ay nawawalang voice file.

Ang anyo ng OpenAI-compatible server

Karamihan ng software na humahawak ng audio ay gumagamit na ng OpenAI audio API: isang multipart POST sa /v1/audio/transcriptions para sa file, at isang JSON POST sa /v1/audio/speech para sa sentence. I-serve mo mismo ang dalawang path na ito, at isang pagbabago lang ang kailangan sa client: ang base URL nito.

Ang Speaches ay isang server na sumusuporta sa parehong direksiyon. Ginagamit nito ang faster-whisper para sa transcription at ang Piper o Kokoro para sa speech, sa likod ng mga OpenAI path. Ang kasalukuyang release ay v0.9.0-rc.3 mula December 2025. Hindi pa ito umaabot sa 1.0, kaya i-pin ang image tag at basahin ang release notes bago mag-upgrade.

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

Ito ang single-container na anyo kung ayaw mong magpanatili ng compose files:

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

Ang named volume ang madalas nakakaligtaan. Kung wala ito, nasa loob ng container ang model cache. Kaya sa bawat restart, muling nagda-download ng gigabytes ng weights bago sumagot sa unang request.

Kailangang ma-download muna ang voice bago sumagot ang /v1/audio/speech:

uvx speaches-cli model download speaches-ai/Kokoro-82M-v1.0-ONNX

Pagkatapos nito, gagana ang anumang OpenAI client kapag binago ang base 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())

Kailangan ang placeholder na api_key dahil tumatanggi ang OpenAI client library na magpadala ng request kung wala nito. Hindi pinapansin ng server ang value nito hanggang mag-configure ka ng totoong key.

Ang vox-box ang isa pang project na dapat banggitin dito. Python package ito sa halip na container, at sinusuportahan nito ang parehong path gamit ang Whisper, FunASR, Bark, Dia, o CosyVoice. Ang kasalukuyang version ay 0.0.21 mula December 2025, at kailangan nito ng Python 3.10 o mas bago.

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

Ang sariling example ng project ay nagbi-bind sa port 80, na nangangailangan ng root. Mas angkop ang high port sa likod ng reverse proxy sa server na may iba pang ginagawa. Isang model lang ang tinatanggap ng vox-box start, kaya para masuportahan ang parehong direksiyon, kailangan ng pangalawang instance sa ibang port na may speech repo id.

Tanungin ang server kung ano ang na-load nito, pagkatapos ay gamitin ang id na iyon sa model field:

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"

Ibig sabihin ng JSON body na nasa anyong {"text": "..."} ay gumagana ang buong path. Kapag 404 ang ibinalik para sa model name, nanghula ka sa halip na basahin ang output ng /v1/models.

Wala sa mga server na ito ang may authentication na naka-enable bilang default. I-bind ang mga ito sa 127.0.0.1 at i-access ang mga ito sa pamamagitan ng VPN o reverse proxy na humihingi ng credentials. Ang bukas na /v1/audio/transcriptions sa public IP ay libreng CPU para sa sinumang makakita nito, at makikita talaga nila ito.

Isang voice front end para sa self-hosted assistant

Kapag parehong sumagot ang dalawang direksyon sa OpenAI paths, maaaring gamitin ang isang chat front end para patakbuhin ang mga ito. Tumatanggap ang Open WebUI at mga alternatibo nito ng OpenAI-compatible base URL para sa audio sa kanilang settings. Dahil dito, maaaring magpatakbo ng lokal na LLM gamit ang Ollama sa isang box at makumpleto ang voice loop sa magkabilang dulo.

Tantiyahin nang maayos ang latency dahil sunod-sunod na tumatakbo ang tatlong hakbang sa iisang cores. Ang isang 10 second na tanong ay tumatagal ng humigit-kumulang 1.3 segundo para ma-transcribe sa 7.6x na figure sa itaas. Nangyayari ito bago pa mabasa ng model ang kahit isang token. Idagdag ang CPU token generation at magiging sapat na kabagal ang round trip para isipin ng testers na nag-crash ito. Komportable sa CPU ang batch transcription. Hindi ganoon ang conversation. Sa puntong ito, nagsisimulang sulit ang presyo ng VPS na may GPU.

Kailan talaga sulit ang 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"
  }
]

Sa GPU, tumatakbo ang malaking model sa int8 nang 13.2x ng real time at gumagamit ng 2,926 MB ng VRAM. Kapag naka-batch, umaabot ito sa 48.8x. Pansinin kung ano ang hindi sinasabi ng dalawang chart. Magkaibang model ang ginagamit nila: large-v2 ang nasa mga row ng GPU, habang small ang nasa mga row ng CPU. Hindi ginagawang anim na beses na mas mabilis ng GPU ang small model. Ginagawa nitong praktikal gamitin ang mas tumpak na model.

:::detailsSaan nagmula ang mga numerong ito
Parehong kinuha ng dalawang chart ang mga resulta mula sa benchmark na inilathala sa faster-whisper README. Isang 13 minutong audio file ang ginamit. Gumamit ang mga row ng CPU ng 8 thread sa isang Intel Core i7-12700K, at gumamit ang mga row ng GPU ng CUDA 12.4 sa isang NVIDIA RTX 3070 Ti na may 8 GB na VRAM. Ang mga column para sa segundo at memory ay mga inilathalang figure. Ang x_realtime column ay kinuwenta mula sa mga ito: hinati ang 780 segundo ng audio sa nasukat na oras, pagkatapos ay ni-round sa isang decimal. System RAM ang nasa memory column ng CPU chart, at VRAM naman ang nasa GPU chart.
:::

Hindi maaabot ng shared vCPU plan ang mga resulta ng CPU. May 8 thread ng mabilis na desktop processor na eksklusibong inilaan sa benchmark na iyon. Ituring ang 7.6x bilang ceiling, pagkatapos ay sukatin ang sarili mong machine gamit ang time sa isang aktuwal na recording bago ka magplano batay rito.

Apat na gabay na karaniwang gumagana sa aktuwal na paggamit:

  • Paminsan-minsang transcription ng sarili mong mga recording: CPU, small, int8. Sapat na ang 2 dedicated vCPU.
  • Overnight batch work gaya ng pagbuo ng subtitle: CPU, small o medium, int8, na pinapatakbo sa nice.
  • Anumang interactive na gawain, o isang buong library sa loob ng isang gabi: GPU.
  • Piper: CPU, palagi. Halos walang pakinabang sa GPU ang voice model na ganito ang laki.

Kung sinusuri mo kung ano pa ang kayang patakbuhin ng parehong hardware, tinatalakay sa mas malawak na tanong kung aling AI model ang maaari mong i-self-host ang mga laki na kasya at hindi kasya.

Mga failure mode at mga string na makikita mo

error: externally-managed-environment sa pag-install. Pinoprotektahan ng distribution ang system Python. Gumawa ng virtual environment gaya ng ipinakita sa itaas.

Hindi tugma ang cuDNN sa GPU box. Ganito ang hitsura ng failure:

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

Ang CTranslate2 4.5.0 at mga mas bagong bersyon ay nangangailangan ng cuDNN 9 para sa CUDA 12, pero cuDNN 8 ang nasa host. Mag-install ng cuDNN 9, o i-pin ang mas lumang runtime gamit ang pip install --force-reinstall ctranslate2==4.4.0. Pumili ng isa sa dalawang ito. Kapag ginawa mo pareho, babalik ka sa dati mong problema.

This CTranslate2 package was not compiled with CUDA support ay ibang fault na kahawig ang sintomas. CPU-only build ang wheel na na-install. Buuin muli ang virtual environment sa GPU host at hayaang piliin muli ng pip ang wheel.

Paulit-ulit na mga parirala sa transcript. Halos palaging silence o music na na-decode bilang speech ang dahilan kapag inuulit ang isang pangungusap nang sampung beses. I-on muna ang vad_filter=True. Kung magpapatuloy ito, pakinggan ang segment: walang sapat na maririnig sa halos tahimik na audio para maging batayan ng Whisper, kaya inuulit nito ang huli nitong confident na hula.

Maling language ang na-detect. Sa unang 30 segundo lamang nanghuhula ang Whisper. Kapag mas mababa sa 1.0 ang info.language_probability, hindi ito nakatiyak. Nangyayari ito kapag music o cross-talk ang pambungad ng recording. Gamitin ang language="en" kapag alam mo na ang tamang sagot.

Nagpi-print ang proseso ng Killed at humihinto. Ito ang kernel out-of-memory killer, at ipapakita ng dmesg ang kaukulang oom-kill line. Nangangailangan ang large-v3 ng mahigit 3 GB para sa weights lamang, bago pa ang working memory. Sa 2 GB VPS, ang small sa int8 ang pinakamalaking model na kasya.

Hindi mahanap ni Piper ang voice. Hinahanap ng player ang voice sa working directory maliban kung ipapasa mo ang --data-dir. Patakbuhin ang ls sa directory na inaasahan mo at tiyaking parehong naroon ang .onnx at .onnx.json, dahil magfa-fail kapag isa lamang sa mga ito ang naroon, gaya rin kapag pareho silang wala.

FAQ

Maaari ba akong magpatakbo ng speech to text sa CPU-only VPS?

Oo, at para sa batch work, ito ang praktikal na pagpipilian. Gamit ang faster-whisper sa small model at int8, ipinapakita sa published benchmark ng proyekto na kayang i-transcribe ang 13 minuto ng audio sa loob ng 102 segundo gamit ang 8 threads ng desktop i7, o humigit-kumulang 7.6x ng real time, sa 1,477 MB ng RAM. Mas mabagal dito ang shared vCPU plan, kaya sukatin ang sarili mong server. Mas madali pa ang text to speech gamit ang Piper at hindi ito nangangailangan ng GPU sa anumang sitwasyon.

Aling Whisper model size ang dapat kong gamitin?

Magsimula sa small sa int8. Gumagamit ito ng 484 MB na disk space at mahusay itong humawak ng malinaw na recorded speech. Lumipat sa medium kapag nagdudulot ng mga error ang accent o background noise na hindi mo kayang tiisin. Gamitin lamang ang large-v3 kapag mas mahalaga ang accuracy kaysa sa lahat ng iba pa, dahil nangangailangan ito ng 3,090 MB na disk space at mahigit 3 GB ng memory. Sa kabilang banda, kapaki-pakinabang ang tiny na 75.5 MB para sa language detection at pag-test ng pipeline, ngunit hindi para sa mga transcript na babasahin ng tao.

Bakit mas mabilis ang faster-whisper kaysa sa orihinal na Whisper package?

Pareho ang model. Magkaiba ang runtime. Pinapatakbo ng reference package ang Whisper sa PyTorch, samantalang pinapatakbo ng faster-whisper ang parehong weights sa CTranslate2, isang engine na ginawa para sa transformer inference. Nilo-load nito ang weights bilang quantized weights at hindi nito kailangan ng PyTorch installation. Sa published CPU benchmark, 1.9x ng real time ang reference package kumpara sa 7.6x ng faster-whisper sa int8, habang mas kaunti ang memory na ginagamit.

Bakit paulit-ulit na inuulit ng transcript ko ang parehong pangungusap?

Dine-decode ng Whisper ang silence o music bilang speech at bumabalik ito sa huli nitong confident na hula. Itakda ang vad_filter=True sa transcribe() call. Patatakbuhin nito muna ang Silero voice activity detection at aalisin ang mga silent stretch bago makita ng model ang mga ito. Kung paulit-ulit pa rin ang resulta, tingnan ang audio level. Kapag halos tahimik ang recording sa buong panahon, walang sapat na signal ang model para gumana.

Paano ako magkakaroon ng OpenAI-compatible audio endpoint sa sarili kong server?

Magpatakbo ng server na nag-i-implement ng POST /v1/audio/transcriptions at POST /v1/audio/speech, pagkatapos ay ituro rito ang client gamit ang bagong base URL. Isang option ang Speaches. Ipinapamahagi ito bilang container image na may CPU build, at gumagamit ito ng faster-whisper para sa transcription at Piper o Kokoro para sa speech. Isa pang option ang vox-box. I-install ito gamit ang pip install vox-box at simulan gamit ang vox-box start --huggingface-repo-id. Nagsu-serve ito ng isang model bawat process. Hindi naka-enable ang authentication sa alinman sa mga ito bilang default. Kaya i-bind ang mga ito sa localhost at maglagay ng proxy o VPN sa unahan.

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