SSD Nodes Learn 🎉 VPS dari $5.50/bln
Panduan Matt ConnorOleh Matt Connor · Dikemas kini 2026-08-13

Cara Bina Whisper dan Piper TTS Sendiri di VPS

Jalankan Whisper untuk transkripsi dan Piper untuk teks-ke-pertuturan pada VPS CPU biasa. Ketahui penggunaan sumber sistem serta cara menyediakan endpoint serasi OpenAI.

Ringkasan pertuturan-ke-teks dan TTS yang dihoskan sendiri

Pertuturan-ke-teks dan TTS (teks-ke-pertuturan) yang dihoskan sendiri merupakan jenis AI paling murah yang boleh anda jalankan pada pelayan milik anda. Transkripsi dijalankan menggunakan Whisper melalui runtime faster-whisper. Sintesis dijalankan menggunakan Piper. Kedua-duanya berfungsi pada VPS CPU biasa tanpa memerlukan GPU. Model Whisper kecil memerlukan kira-kira 484 MB ruang cakera, dan suara Piper hanyalah satu fail yang saiznya jauh di bawah 150 MB.

Itulah sebabnya audio merupakan titik permulaan yang terbaik. Penjana imej yang dihoskan sendiri dan penjanaan video yang dihoskan sendiri kedua-duanya memerlukan GPU sebelum ia boleh digunakan. Audio tidak memerlukannya.

Panduan ini merangkumi kedua-dua arah tersebut serta lapisan yang menghubungkannya. Whisper menukarkan audio kepada teks. Piper menukarkan teks kepada audio. Pelayan HTTP yang serasi dengan OpenAI di hadapan kedua-duanya membolehkan klien sedia ada menghala ke pelayan anda tanpa sebarang perubahan selain daripada URL asas.

Setiap versi yang dinamakan di sini adalah terkini setakat Ogos 2026.

Mengapa menggunakan faster-whisper, bukan pakej rujukan Whisper

Pakej whisper daripada OpenAI menjalankan model tersebut dalam PyTorch. faster-whisper menjalankan pemberat model yang sama pada CTranslate2, iaitu enjin inferens yang ditulis khusus untuk model transformer. Pemberatnya adalah sama, jadi transkrip yang dihasilkan juga adalah sama. Perbezaannya terletak sepenuhnya pada runtime.

CTranslate2 melakukan kuantisasi pada pemberat semasa ia dimuatkan, itulah sebabnya compute_type="int8" merupakan satu argumen dan bukannya langkah penukaran yang berasingan. Ia juga tidak mempunyai kebergantungan (dependency) kepada PyTorch. pip install faster-whisper menarik CTranslate2, tokenizer, dan PyAV untuk penyahkodan audio, jadi persekitaran maya (virtual environment) hanya bersaiz ratusan megabait dan bukannya beberapa gigabait. Pada VPS dengan cakera 40 GB, jurang ini adalah perbezaan antara ruang yang selesa dan ruang yang sempit.

Berikut adalah angka yang diterbitkan oleh projek tersebut bagi model small pada CPU. Penanda aras (benchmark) ini mentranskripsikan 13 minit audio menggunakan 8 thread pada Intel Core i7-12700K. Lajur x_realtime ialah 13 minit tersebut dibahagikan dengan masa yang diukur: 7.6 bermaksud rakaman 13 minit selesai dalam masa lebih sedikit daripada 1 minit 40 saat.

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

Baca baris kedua dengan teliti. Pada fp32, whisper.cpp lebih pantas daripada faster-whisper pada CPU ini, 6.2x berbanding 5.0x, dan ia melakukannya dengan penggunaan memori kurang daripada separuh. Ia adalah keluarga ggml yang sama yang menjadi asas kepada sisi llama.cpp bagi stack LLM tempatan. faster-whisper mendahului sebaik sahaja int8 dan batching diaktifkan, mencapai 15.3x, dan ia menggunakan 3,608 MB RAM untuk itu. Jadi: pilih faster-whisper untuk API Python dan batching, pilih whisper.cpp apabila RAM adalah kekangan yang tidak boleh diubah.

Baris pertama adalah tujuan utama bahagian ini. Pakej rujukan tersebut adalah 1.9x masa sebenar pada mesin yang sama, yang bermaksud satu jam audio mengambil masa setengah jam masa CPU.

Berapakah ruang cakera yang diperlukan oleh weight model 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"
  }
]

Ini adalah penukaran CTranslate2 yang diterbitkan, dalam float16. Perhatikan perkara yang tidak dilakukan oleh compute_type="int8": ia tidak mengecilkan saiz muat turun. Weight tiba dalam format float16 dan CTranslate2 melakukan kuantisasi dalam memori semasa proses muat turun, jadi large-v3 memerlukan 3,090 MB pada cakera sama ada anda menjalankannya dalam float16 atau int8. int8 memberikan penjimatan RAM dan kelajuan, bukan ruang cakera.

Model dimuat turun semasa penggunaan pertama ke dalam ~/.cache/huggingface/hub. Pada VPS dengan volum root yang kecil, halakan lokasi tersebut ke tempat yang mempunyai ruang mencukupi menggunakan argumen download_root atau pemboleh ubah persekitaran HF_HOME, atau percubaan pertama anda akan memenuhi cakera dan proses akan terhenti di tengah jalan semasa muat turun.

Memasang faster-whisper tanpa menjejaskan sistem Python

Ubuntu 24.04 dan Debian 13 menandakan sistem Python sebagai diurus secara luaran. Menjalankan pip install faster-whisper di luar persekitaran maya akan terhenti serta-merta dengan ralat:

error: externally-managed-environment

Ini adalah sistem pakej yang melindungi fail milik apt. Gunakan persekitaran maya.

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

Versi 1.2.1 ialah keluaran semasa, diterbitkan pada Oktober 2025. faster-whisper menyahkod audio melalui PyAV, yang menggabungkan pustaka ffmpeg miliknya sendiri, jadi ia boleh membaca fail mp3 atau m4a tanpa binari ffmpeg yang berasingan. Pakej ffmpeg di atas adalah untuk kerja video dalam bahagian panduan seterusnya.

Semak pemasangan sebelum anda memuat turun tiga gigabait fail pemberat (weights):

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

Baris yang memaparkan ok bermaksud pakej telah berjaya dipasang. Ralat ImportError yang menamakan ctranslate2 bermaksud pakej untuk seni bina anda tidak dipasang, yang biasanya berlaku pada imej ARM 32-bit.

Mentranskripsi rakaman mesyuarat atau nota suara

Simpan ini sebagai 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))

Jalankan ia dengan ~/stt/bin/python transcribe.py. Pelaksanaan pertama akan memuat turun pemberat (weights), jadi tiada apa-apa yang dipaparkan untuk seketika. Selepas itu, model akan dimuatkan daripada cache dalam beberapa saat.

segments ialah penjana (generator), jadi transkripsi tidak bermula sehingga anda melakukan lelaran (iterate) ke atasnya. Pengguna sering mengukur masa panggilan transcribe(), melihat ia kembali serta-merta, lalu menyangka ada sesuatu yang rosak. Tiada apa-apa yang rosak. Kerja sebenar berlaku di dalam gelung (loop).

vad_filter=True menjalankan Silero VAD (pengesanan aktiviti suara) terlebih dahulu dan membuang bahagian senyap sebelum Whisper memprosesnya. Bagi rakaman mesyuarat yang mempunyai jeda panjang, ini merupakan peningkatan kelajuan paling ketara kerana Whisper tidak membuang masa pada audio yang tidak mengandungi pertuturan. Ia juga menghalang gelung pengulangan ayat yang dihasilkan oleh Whisper apabila ia menerima audio senyap dan cuba mencari perkataan di dalamnya.

Tetapkan cpu_threads kepada bilangan teras (cores) yang anda miliki sebenarnya. Menetapkan nilai melebihi kiraan vCPU anda akan melambatkan transkripsi, kerana thread tambahan akan bersaing untuk teras yang sama dan penjadual (scheduler) akan menanggung kos bagi setiap pertukaran konteks.

Sari kata untuk pustaka Jellyfin

Jellyfin membaca fail sari kata luaran yang diletakkan bersebelahan dengan video dan berkongsi nama yang sama, jadi Movie (2019).en.srt di sebelah Movie (2019).mkv akan muncul sebagai trek bahasa Inggeris tanpa transkod dan tanpa perlu membina semula pustaka.

Ekstrak audio terlebih dahulu. Whisper melakukan pensampelan semula segala-galanya kepada 16 kHz mono secara dalaman, jadi memberikan fail 16 kHz mono mengurangkan beban kerja pada kedua-dua hujung:

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

faster-whisper tidak mempunyai penulis SRT, jadi formatkan segmen tersebut sendiri. Simpan ini sebagai 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())

Kemudian, jalankan skrip pada pustaka anda:

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 bukan sekadar hiasan. Tanpanya, ffmpeg membaca daripada input standard gelung, menelan baki senarai fail, dan gelung tersebut berhenti selepas satu filem tanpa sebarang mesej ralat.

Anggarkan masa sebelum anda bermula. Pada angka 7.6x di atas, filem berdurasi 100 minit memerlukan kira-kira 13 minit masa CPU, jadi pustaka dengan lima puluh filem adalah tugas yang mengambil masa semalaman. Pada pelan vCPU kongsi, proses ini lebih perlahan, itulah sebabnya nice digunakan: proses sari kata kemudian akan memberi laluan kepada apa sahaja tugas lain yang dilakukan oleh pelayan tersebut.

Teks ke pertuturan dengan Piper

Piper ialah enjin teks ke pertuturan neural yang menjalankan model suara ONNX pada CPU. Ia menyertakan espeak-ng untuk menukar teks kepada fonem, jadi tiada fonema berasingan yang perlu dipasang. Keluaran semasa ialah 1.6.0, diterbitkan pada Julai 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 menulis dua fail ke dalam direktori kerja: pemberat .onnx dan konfigurasi .onnx.json yang mengandungi kadar sampel serta senarai pembesar suara. Fail-fail ini mesti kekal bersama. Jika anda menyimpan suara di lokasi tetap, berikan --data-dir kepada kedua-dua arahan, kerana pemain akan mencari di dalam direktori kerja dan tidak akan menemui suara jika ia tidak berada di sana.

-- sebelum teks juga penting. Tanpanya, sebarang ayat yang bermula dengan tanda sempang akan dihuraikan sebagai pilihan baris arahan.

Suara diedarkan dalam beberapa tahap kualiti. Suara bahasa Inggeris sederhana bersaiz kira-kira 60 MB dan suara berkualiti tinggi adalah kira-kira dua kali ganda saiz tersebut. Kualiti yang lebih tinggi bermakna model yang lebih besar dan penggunaan CPU yang lebih banyak bagi setiap saat pertuturan, bukannya pembesar suara yang berbeza.

Jangan panggil CLI dalam gelung. Ia memuatkan model pada setiap panggilan, dan proses memuatkan model mendominasi kos bagi ayat yang pendek. Sebaliknya, jalankan pelayan 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 yang boleh anda mainkan bermakna ia berfungsi. Endpoint tersebut menggunakan format Piper sendiri, bukan format OpenAI, jadi klien yang menjangkakan /v1/audio/speech tidak akan dapat berhubung dengannya. Bahagian seterusnya akan membetulkan perkara ini.

Pastikan ia terus berjalan dengan fail unit dan bukannya terminal yang akan anda tutup:

[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 memulakannya dan mengaktifkannya semula selepas but semula. Jika arahan curl di atas tidak memulangkan apa-apa, journalctl -u piper -n 50 mengandungi puncanya, dan fail suara yang hilang biasanya menjadi sebab utama.

Bentuk pelayan yang serasi dengan OpenAI

Kebanyakan perisian yang mengendalikan audio sudah menyokong API audio OpenAI: POST multipart ke /v1/audio/transcriptions untuk fail, dan POST JSON ke /v1/audio/speech untuk ayat. Kendalikan kedua-dua laluan tersebut sendiri dan pelanggan hanya perlu membuat satu perubahan, iaitu URL asasnya.

Speaches ialah satu pelayan yang melakukan kedua-dua arah. Ia menjalankan faster-whisper untuk transkripsi dan Piper atau Kokoro untuk pertuturan, di sebalik laluan OpenAI. Keluaran semasa ialah v0.9.0-rc.3 dari Disember 2025, masih sebelum 1.0, jadi tetapkan tag imej anda dan baca nota keluaran sebelum anda menaik taraf.

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

Bentuk bekas tunggal, jika anda lebih suka tidak menyimpan fail 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 bernama adalah bahagian yang sering dilupakan oleh pengguna. Tanpanya, cache model berada di dalam bekas, jadi setiap kali dimulakan semula, ia akan memuat turun semula gigabait pemberat sebelum permintaan pertama dijawab.

Pertuturan memerlukan suara dimuat turun sebelum /v1/audio/speech akan menjawab:

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

Selepas itu, mana-mana pelanggan OpenAI berfungsi dengan URL asas yang telah ditukar:

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())

Pemegang tempat api_key diperlukan kerana pustaka pelanggan OpenAI enggan menghantar permintaan tanpanya. Pelayan mengabaikan nilainya sehingga anda mengkonfigurasi kunci yang sebenar.

vox-box ialah projek lain yang patut dinamakan di sini. Ia merupakan pakej Python dan bukannya bekas, dan ia menyediakan laluan yang sama dengan Whisper, FunASR, Bark, Dia atau CosyVoice di belakangnya. Versi 0.0.21 adalah versi semasa, dari Disember 2025, dan ia memerlukan Python 3.10 atau lebih tinggi.

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

Contoh projek itu sendiri mengikat port 80, yang memerlukan root. Port tinggi di sebalik reverse proxy adalah bentuk yang lebih baik pada pelayan yang melakukan tugas lain. vox-box start mengambil satu model, jadi untuk menampung kedua-dua arah bermakna instans kedua pada port kedua dengan id repo pertuturan.

Tanya pelayan apa yang dimuatkannya, kemudian gunakan id tersebut dalam medan 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"

Badan JSON dalam bentuk {"text": "..."} bermakna keseluruhan laluan berfungsi. Ralat 404 pada nama model bermakna anda meneka dan bukannya membaca output /v1/models.

Tiada satu pun daripada pelayan ini menghidupkan pengesahan secara lalai. Ikat ia ke 127.0.0.1 dan capai melalui VPN atau reverse proxy yang meminta kelayakan. /v1/audio/transcriptions yang terbuka pada IP awam adalah CPU percuma untuk sesiapa sahaja yang menemuinya, dan mereka pasti akan menemuinya.

Antaramuka suara untuk pembantu yang dihoskan sendiri

Apabila kedua-dua arah menjawab pada laluan OpenAI, antaramuka sembang boleh mengendalikannya. Open WebUI dan alternatifnya menerima URL asas yang serasi dengan OpenAI untuk audio dalam tetapan mereka, jadi satu kotak boleh menjalankan LLM tempatan dengan Ollama dan melengkapkan gelung suara pada kedua-dua hujung.

Anggarkan kependaman dengan jujur, kerana ketiga-tiga langkah tersebut berjalan satu demi satu pada teras yang sama. Soalan selama 10 saat mengambil masa kira-kira 1.3 saat untuk ditranskripsikan pada angka 7.6x di atas, dan itu adalah sebelum model membaca satu token pun. Tambahkan penjanaan token CPU dan perjalanan pergi-balik tersebut cukup perlahan sehingga penguji menganggap ia telah terhempas. Transkripsi kelompok selesa dijalankan pada CPU. Perbualan tidak, dan itulah titik di mana VPS dengan GPU mula berbaloi dengan harganya.

Bilakah GPU benar-benar berbaloi?

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

Pada GPU, model besar dalam format int8 berjalan pada 13.2x masa sebenar dengan penggunaan 2,926 MB VRAM, dan pemprosesan kelompok (batching) meningkatkannya kepada 48.8x. Perhatikan dengan teliti perkara yang tidak dinyatakan oleh kedua-dua carta tersebut. Ia menjalankan model yang berbeza: baris GPU menggunakan large-v2, manakala baris CPU menggunakan small. GPU tidak menjadikan model small enam kali lebih pantas. Ia menjadikan model yang tepat boleh digunakan.

Dari mana angka ini diperoleh

Kedua-dua carta menghasilkan semula penanda aras yang diterbitkan dalam README faster-whisper. Audio tersebut ialah satu fail berdurasi 13 minit. Baris CPU menggunakan 8 thread pada Intel Core i7-12700K, dan baris GPU menggunakan CUDA 12.4 pada NVIDIA RTX 3070 Ti dengan 8 GB VRAM. Lajur saat dan memori adalah angka yang diterbitkan. Lajur x_realtime ialah hasil pengiraan aritmetik daripadanya: 780 saat audio dibahagikan dengan masa yang diukur, dibundarkan kepada satu titik perpuluhan. Lajur memori ialah RAM sistem untuk carta CPU dan VRAM untuk carta GPU.

Pelan vCPU kongsi tidak akan mencapai angka CPU tersebut. Penanda aras itu menggunakan 8 thread daripada perkakasan desktop yang pantas secara eksklusif. Anggap 7.6x sebagai had maksimum, kemudian ukur prestasi pelayan anda sendiri dengan time pada rakaman sebenar sebelum merancang apa-apa mengenainya.

Empat peraturan praktikal yang terbukti berkesan:

  • Transkripsi sekali-sekala bagi rakaman sendiri: CPU, small, int8. Dua vCPU berdedikasi sudah memadai.
  • Kerja kelompok semalaman seperti pemprosesan sari kata: CPU, small atau medium, int8, dibalut dalam nice.
  • Sebarang tugasan interaktif, atau keseluruhan pustaka dalam satu malam: GPU.
  • Piper: CPU, sentiasa. Model suara sebesar ini hampir tidak mendapat manfaat daripada GPU.

Jika anda sedang mengira beban kerja lain yang boleh ditampung oleh perkakasan yang sama, soalan yang lebih luas tentang model AI yang boleh anda hos sendiri merangkumi saiz yang sesuai dan tidak sesuai untuk dimuatkan.

Mod kegagalan, berserta rentetan yang akan anda lihat

error: externally-managed-environment semasa pemasangan. Python sistem dilindungi oleh pengedaran (distribution). Cipta persekitaran maya (virtual environment) seperti yang ditunjukkan di atas.

Ketidakpadanan cuDNN pada mesin GPU. Kegagalan kelihatan seperti ini:

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 dan versi terkemudian memerlukan cuDNN 9 untuk CUDA 12, manakala hos mempunyai cuDNN 8. Sama ada pasang cuDNN 9, atau tetapkan runtime yang lebih lama dengan pip install --force-reinstall ctranslate2==4.4.0. Lakukan salah satu daripada dua pilihan tersebut. Melakukan kedua-duanya akan menyebabkan anda kembali ke titik asal.

This CTranslate2 package was not compiled with CUDA support ialah ralat berbeza dengan simptom yang serupa. Wheel yang dipasang adalah binaan khusus CPU sahaja. Bina semula persekitaran maya pada hos GPU dan biarkan pip memilih wheel tersebut sekali lagi.

Frasa berulang dalam transkrip. Ayat yang berulang sepuluh kali hampir selalu disebabkan oleh kesunyian atau muzik yang dinyahkod sebagai pertuturan. Hidupkan vad_filter=True terlebih dahulu. Jika masalah masih berlaku, dengar segmen tersebut: audio yang hampir sunyi tidak memberikan Whisper sebarang titik rujukan, lalu ia mengulangi tekaan terakhirnya yang paling yakin.

Bahasa yang salah dikesan. Whisper membuat tekaan berdasarkan 30 saat pertama sahaja. Nilai info.language_probability yang jauh di bawah 1.0 bermakna ia tidak pasti, yang berlaku apabila rakaman bermula dengan muzik atau perbualan bertindih. Berikan language="en" apabila anda sudah mengetahui jawapannya.

Proses mencetak Killed dan berhenti. Itu adalah kernel out-of-memory killer, dan dmesg akan menunjukkan baris oom-kill yang sepadan. large-v3 memerlukan lebih 3 GB untuk pemberat (weights) sahaja sebelum mengambil kira memori kerja. Pada VPS 2 GB, small pada int8 adalah model terbesar yang boleh dimuatkan.

Piper tidak dapat mencari suara. Pemain mencari dalam direktori kerja melainkan anda memberikan --data-dir. Jalankan ls pada direktori yang anda jangkakan dan sahkan bahawa .onnx dan .onnx.json kedua-duanya ada, kerana ketiadaan salah satu daripadanya akan menyebabkan kegagalan yang sama seperti ketiadaan kedua-duanya.

FAQ

Bolehkah saya menjalankan pertukaran pertuturan kepada teks pada VPS yang hanya menggunakan CPU?

Boleh, dan untuk kerja kelompok, ini adalah pilihan yang wajar. Menggunakan faster-whisper dengan model small pada int8, penanda aras yang diterbitkan oleh projek tersebut mentranskripsikan 13 minit audio dalam 102 saat pada 8 thread desktop i7, iaitu kira-kira 7.6x masa sebenar, dengan penggunaan RAM sebanyak 1,477 MB. Pelan vCPU kongsi akan berjalan lebih perlahan daripada itu, jadi buat ukuran pada pelayan anda sendiri. Pertukaran teks kepada pertuturan dengan Piper adalah lebih mudah dan tidak memerlukan GPU dalam apa jua keadaan.

Saiz model Whisper yang manakah patut saya gunakan?

Mulakan dengan small pada int8. Saiznya ialah 484 MB pada cakera dan ia mengendalikan pertuturan yang dirakam dengan jelas dengan baik. Beralih kepada medium apabila loghat atau bunyi latar belakang menyebabkan ralat yang tidak dapat diterima, dan kepada large-v3 hanya apabila ketepatan lebih penting daripada segala-galanya, memandangkan ia memerlukan 3,090 MB ruang cakera dan lebih 3 GB memori. Sebaliknya, tiny pada 75.5 MB berguna untuk pengesanan bahasa dan untuk menguji talian paip, bukan untuk transkrip yang akan dibaca oleh manusia.

Mengapa faster-whisper lebih pantas daripada pakej Whisper asal?

Modelnya adalah sama. Runtime-nya tidak. Pakej rujukan menjalankan Whisper dalam PyTorch, manakala faster-whisper menjalankan pemberat yang sama pada CTranslate2, iaitu enjin yang dibina untuk inferens transformer yang mengkuantisasi pemberat semasa pemuatan dan tidak memerlukan pemasangan PyTorch. Pada penanda aras CPU yang diterbitkan, kelajuannya adalah 1.9x masa sebenar untuk pakej rujukan berbanding 7.6x untuk faster-whisper pada int8, dengan penggunaan memori yang lebih rendah.

Mengapa transkrip saya mengulangi ayat yang sama berulang kali?

Whisper menyahkod kesunyian atau muzik sebagai pertuturan dan kembali kepada tekaan terakhir yang diyakininya. Tetapkan vad_filter=True dalam panggilan transcribe(), yang menjalankan pengesanan aktiviti suara Silero terlebih dahulu dan membuang bahagian senyap sebelum model melihatnya. Jika ia masih berulang, periksa tahap audio, kerana rakaman yang hampir senyap sepenuhnya tidak memberikan apa-apa input untuk diproses oleh model.

Bagaimanakah cara untuk mendapatkan endpoint audio yang serasi dengan OpenAI pada pelayan saya sendiri?

Jalankan pelayan yang melaksanakan POST /v1/audio/transcriptions dan POST /v1/audio/speech, kemudian halakan klien kepadanya dengan URL asas yang baharu. Speaches ialah satu pilihan, diterbitkan sebagai imej kontena dengan binaan CPU, menggunakan faster-whisper untuk transkripsi dan Piper atau Kokoro untuk pertuturan. vox-box ialah satu lagi pilihan, dipasang dengan pip install vox-box dan dimulakan dengan vox-box start --huggingface-repo-id, yang menyediakan satu model bagi setiap proses. Kedua-duanya tidak mendayakan pengesahan secara lalai, jadi ikat (bind) pada localhost dan letakkan proksi atau VPN di hadapannya.

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