VPS پر Whisper اور Piper: لاگت اور OpenAI API
اپنے VPS پر Whisper transcription اور Piper TTS چلائیں۔ CPU وقت، disk کی اصل ضرورت اور OpenAI-compatible endpoint بنانے کا طریقہ جانیں۔
مختصر طور پر self-hosted speech-to-text اور TTS
self-hosted speech-to-text اور TTS (text-to-speech) آپ کے زیرِ انتظام سرور پر چلایا جانے والا سب سے کم لاگت AI ہے۔ Transcription کے لیے Whisper کو faster-whisper runtime کے ذریعے چلایا جاتا ہے۔ Synthesis کے لیے Piper استعمال ہوتا ہے۔ دونوں عام CPU VPS پر بالکل GPU کے بغیر کام کرتے ہیں۔ چھوٹے Whisper model کو تقریباً 484 MB disk درکار ہوتی ہے، جبکہ Piper کی voice ایک ہی file ہوتی ہے جس کا حجم 150 MB سے کافی کم ہوتا ہے۔
اسی لیے audio سے آغاز کرنا بہتر ہے۔ self-hosted image generator اور self-hosted video generation دونوں کو قابلِ استعمال ہونے سے پہلے ہی GPU درکار ہوتا ہے۔ Audio کے لیے ایسا نہیں ہے۔
یہ guide دونوں سمتوں اور انہیں جوڑنے والی layer کا احاطہ کرتی ہے۔ Whisper audio کو text میں تبدیل کرتا ہے۔ Piper text کو audio میں تبدیل کرتا ہے۔ دونوں کے سامنے موجود OpenAI-compatible HTTP server کسی موجودہ client کو صرف base URL تبدیل کرکے آپ کے server سے connect کرنے دیتا ہے۔
یہاں درج ہر version August 2026 تک موجودہ تھا۔
faster-whisper کیوں، reference Whisper package کیوں نہیں
OpenAI کا whisper package model کو PyTorch میں چلاتا ہے۔ faster-whisper وہی model weights CTranslate2 پر چلاتا ہے، جو transformer models کے لیے خاص طور پر تیار کیا گیا inference engine ہے۔ Weights یکساں ہیں، اس لیے transcript بھی یکساں ہوتا ہے۔ فرق مکمل طور پر runtime کا ہے۔
CTranslate2 weights کو load کرتے وقت quantize کرتا ہے۔ اسی لیے compute_type="int8" ایک ہی argument ہے اور الگ conversion step درکار نہیں ہوتا۔ اس میں PyTorch dependency بھی نہیں ہوتی۔ pip install faster-whisper، CTranslate2، tokenizer اور audio decoding کے لیے PyAV شامل کرتا ہے، اس لیے virtual environment کا حجم کئی gigabytes کے بجائے چند سو megabytes رہتا ہے۔ 40 GB disk والے VPS پر یہ فرق آرام دہ گنجائش اور تنگی کے درمیان ہوتا ہے۔
یہاں small model کے لیے project کے اپنے شائع کردہ CPU اعداد و شمار دیے گئے ہیں۔ Benchmark، Intel Core i7-12700K پر 8 threads استعمال کرتے ہوئے 13 منٹ کی audio transcribe کرتا ہے۔ x_realtime column، 13 منٹ کو measured time سے تقسیم کرنے کا نتیجہ ہے: 7.6 کا مطلب ہے کہ 13 منٹ کی recording ایک منٹ 40 سیکنڈ سے کچھ زیادہ وقت میں مکمل ہوئی۔
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"
}
]دوسری row کو درست تناظر میں پڑھیں۔ fp32 میں، اس CPU پر whisper.cpp، faster-whisper سے تیز ہے: 6.2x کے مقابلے میں 5.0x، اور اس کے لیے نصف سے بھی کم memory استعمال ہوتی ہے۔ یہ اسی ggml family کا حصہ ہے جو مقامی LLM stack کے llama.cpp حصے کے پیچھے کام کرتی ہے۔ int8 اور batching فعال ہونے پر faster-whisper آگے نکل جاتا ہے اور 15.3x تک پہنچتا ہے، لیکن اس کے لیے 3,608 MB RAM درکار ہوتی ہے۔ لہٰذا Python API اور batching کے لیے faster-whisper منتخب کریں؛ جب RAM ایسی حد ہو جسے بڑھایا نہ جا سکے تو whisper.cpp منتخب کریں۔
اس section کا بنیادی نکتہ پہلی row ہے۔ اسی machine پر reference package 1.9x real time پر کام کرتا ہے، یعنی ایک گھنٹے کی audio کو transcribe کرنے میں CPU کا آدھا گھنٹہ لگتا ہے۔
Whisper کے model weights کے لیے کتنی disk درکار ہے؟
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"
}
]یہ float16 میں شائع شدہ CTranslate2 conversions ہیں۔ نوٹ کریں کہ compute_type="int8" کیا نہیں کرتا: یہ download کا سائز کم نہیں کرتا۔ weights float16 میں download ہوتے ہیں اور CTranslate2 انہیں load کے وقت memory میں quantize کرتا ہے، اس لیے large-v3 کے لیے disk پر 3,090 MB درکار ہوتے ہیں، چاہے آپ اسے float16 میں چلائیں یا int8 میں۔ int8 سے RAM اور speed میں فائدہ ہوتا ہے، disk میں نہیں۔
Models پہلی بار استعمال ہونے پر ~/.cache/huggingface/hub میں download ہوتے ہیں۔ کم root volume والے VPS پر download_root argument یا HF_HOME environment variable کے ذریعے اس location کو ایسی جگہ مقرر کریں جہاں کافی گنجائش ہو، ورنہ پہلی run میں disk بھر جائے گی اور download مکمل ہونے سے پہلے process ختم ہو جائے گا۔
نظام کے Python کو متاثر کیے بغیر faster-whisper انسٹال کریں
Ubuntu 24.04 اور Debian 13 نظام کے Python کو externally managed قرار دیتے ہیں۔ virtual environment کے باہر pip install faster-whisper چلانے سے عمل فوراً رک جاتا ہے:
error: externally-managed-environmentیہ packaging system ان فائلوں کی حفاظت کر رہا ہے جن کی ملکیت apt کے پاس ہے۔ 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.1Version 1.2.1 موجودہ release ہے، جو October 2025 میں شائع ہوئی۔ faster-whisper، PyAV کے ذریعے audio decode کرتا ہے۔ PyAV اپنی ffmpeg libraries شامل کرتا ہے، اس لیے الگ ffmpeg binary کے بغیر mp3 یا m4a فائل پڑھی جا سکتی ہے۔ اوپر دیا گیا ffmpeg package اس guide میں بعد میں video کے کام کے لیے ہے۔
تین gigabytes کے weights download کرنے سے پہلے installation کی جانچ کریں:
~/stt/bin/python -c "from faster_whisper import WhisperModel; print('ok')"ok دکھانے والی سطر کا مطلب ہے کہ wheels کامیابی سے install ہو گئے ہیں۔ ImportError میں ctranslate2 کا نام آنا اس بات کی نشاندہی کرتا ہے کہ آپ کے architecture کے لیے wheel install نہیں ہوا۔ یہ 32-bit ARM images پر ہوتا ہے۔
میٹنگ کی recording یا voice note کو تحریری متن میں تبدیل کریں
اسے 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 کے ساتھ چلائیں۔ پہلی بار weights download ہوتے ہیں، اس لیے کچھ دیر تک کوئی output ظاہر نہیں ہوتا۔ اس کے بعد model cache سے چند seconds میں load ہو جاتا ہے۔
segments ایک generator ہے، اس لیے جب تک آپ اس پر iterate نہیں کرتے، transcription شروع نہیں ہوتی۔ لوگ transcribe() call کا وقت ناپتے ہیں، اسے فوراً return ہوتا دیکھتے ہیں، اور سمجھتے ہیں کہ کچھ خراب ہے۔ کچھ بھی خراب نہیں ہے۔ اصل processing loop میں ہوتی ہے۔
vad_filter=True پہلے Silero VAD (voice activity detection) چلاتا ہے اور Whisper کے audio دیکھنے سے پہلے خاموش حصے نکال دیتا ہے۔ طویل وقفوں والی meeting recording میں یہ دستیاب سب سے بڑا واحد speed gain ہے، کیونکہ Whisper ایسے audio پر بالکل وقت صرف نہیں کرتا جس میں speech موجود نہ ہو۔ یہ ان repeated-sentence loops کو بھی روکتا ہے جو Whisper اس وقت بناتا ہے جب اسے silence دی جائے اور وہ اس میں الفاظ تلاش کرنے کی کوشش کرے۔
cpu_threads کو ان cores کی تعداد پر set کریں جو آپ کے پاس حقیقتاً موجود ہیں۔ اسے آپ کے vCPU count سے زیادہ set کرنے سے transcription سست ہو جاتی ہے، کیونکہ اضافی threads ایک ہی core کے لیے باہم مقابلہ کرتے ہیں اور scheduler ہر switch کی لاگت برداشت کرتا ہے۔
Jellyfin لائبریری کے لیے subtitles
Jellyfin بیرونی subtitle files کو پڑھتا ہے جو video کے ساتھ موجود ہوں اور اس کا نام share کرتی ہوں، اس لیے Movie (2019).en.srt کے ساتھ موجود Movie (2019).mkv بغیر transcoding اور library rebuild کے English track کے طور پر ظاہر ہوتی ہے۔
پہلے audio extract کریں۔ Whisper اندرونی طور پر ہر چیز کو 16 kHz mono میں resample کرتا ہے، اس لیے اسے 16 kHz mono دینا دونوں مراحل کا کام کم کر دیتا ہے:
ffmpeg -i "Movie (2019).mkv" -vn -ac 1 -ar 16000 -c:a pcm_s16le "Movie (2019).wav"faster-whisper میں SRT writer نہیں ہے، اس لیے segments کو خود format کریں۔ اسے srt.py کے طور پر save کریں:
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())پھر 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-nostdin محض decoration نہیں ہے۔ اس کے بغیر ffmpeg loop کے standard input سے پڑھتا ہے، باقی file list کو نگل لیتا ہے، اور loop بغیر کسی error message کے پہلی film کے بعد رک جاتا ہے۔
شروع کرنے سے پہلے وقت کا اندازہ لگائیں۔ اوپر دی گئی 7.6x رفتار کے مطابق 100 منٹ کی film کے لیے تقریباً 13 منٹ CPU time درکار ہے، اس لیے 50 films کی library کا کام رات بھر چل سکتا ہے۔ Shared vCPU plan پر یہ اس سے بھی سست ہوگا۔ اسی مقصد کے لیے nice ہے: اس کے بعد subtitle run مشین پر ہونے والے دوسرے اصل کام کو ترجیح دے گا۔
Piper کے ذریعے متن کو تقریر میں تبدیل کرنا
Piper ایک neural text-to-speech engine ہے جو CPU پر ONNX voice model چلاتا ہے۔ یہ متن کو phonemes میں تبدیل کرنے کے لیے espeak-ng شامل کرتا ہے، اس لیے الگ phonemizer install کرنے کی ضرورت نہیں ہوتی۔ موجودہ release 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 working directory میں دو files لکھتا ہے: .onnx weights اور .onnx.json config، جس میں sample rate اور speakers کی فہرست ہوتی ہے۔ یہ دونوں files ایک ساتھ رہنی چاہییں۔ اگر آپ voices کو کسی مقررہ جگہ پر رکھتے ہیں تو دونوں commands میں --data-dir دیں، کیونکہ player بصورتِ دیگر working directory میں تلاش کرتا ہے اور وہاں موجود نہ ہونے والی voice نہیں ڈھونڈ سکتا۔
متن سے پہلے -- بھی اہم ہے۔ اس کے بغیر hyphen سے شروع ہونے والا ہر جملہ command-line option کے طور پر parse ہوتا ہے۔
Voices کئی quality levels میں دستیاب ہوتی ہیں۔ ایک medium English voice تقریباً 60 MB کی ہوتی ہے، جبکہ high voice کا حجم تقریباً دوگنا ہوتا ہے۔ زیادہ quality کا مطلب بڑا model اور ہر second کی تقریر کے لیے زیادہ CPU استعمال ہے، مختلف speaker نہیں۔
CLI کو loop میں نہ چلائیں۔ یہ ہر invocation پر model load کرتا ہے، اور مختصر جملے کی لاگت میں model loading کا حصہ سب سے زیادہ ہوتا ہے۔ اس کے بجائے 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 5000curl -X POST -H 'Content-Type: application/json' \
-d '{ "text": "This is a test." }' \
-o test.wav localhost:5000/synthesizeاگر test.wav سے چلنے والی audio مل جائے تو سمجھیں کہ یہ کام کر رہا ہے۔ اس endpoint کا format Piper کا اپنا ہے، OpenAI کا نہیں؛ اس لیے /v1/audio/speech کی توقع رکھنے والا client اس سے رابطہ نہیں کر سکے گا۔ اگلا section اس مسئلے کو حل کرتا ہے۔
اسے بند ہونے والے terminal کے بجائے unit file کے ذریعے چلتا رکھیں:
[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 اسے start کرتا ہے اور reboot کے بعد دوبارہ چلا دیتا ہے۔ اگر اوپر دیا گیا curl کچھ واپس نہ کرے تو journalctl -u piper -n 50 وجہ بتاتا ہے، اور عموماً وجہ missing voice file ہوتی ہے۔
OpenAI-compatible سرور کی ساخت
آڈیو سنبھالنے والا زیادہ تر سافٹ ویئر پہلے ہی OpenAI audio API استعمال کرتا ہے: فائل کے لیے /v1/audio/transcriptions پر multipart POST، اور جملے کے لیے /v1/audio/speech پر JSON POST۔ یہ دونوں paths خود فراہم کریں، تو client میں صرف ایک تبدیلی درکار ہوگی: اس کا base URL تبدیل کرنا۔
Speaches ایک ایسا سرور ہے جو دونوں سمتوں میں کام کرتا ہے۔ یہ transcription کے لیے faster-whisper اور speech کے لیے Piper یا Kokoro چلاتا ہے، اور ان کے سامنے OpenAI paths فراہم کرتا ہے۔ موجودہ release دسمبر 2025 کا v0.9.0-rc.3 ہے۔ یہ اب بھی 1.0 سے پہلے کا ورژن ہے، اس لیے image tag کو pin کریں اور upgrade سے پہلے release notes پڑھیں۔
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 files برقرار نہیں رکھنا چاہتے تو single-container صورت یہ ہے:
docker run --rm --detach --publish 8000:8000 --name speaches \
--volume hf-hub-cache:/home/ubuntu/.cache/huggingface/hub \
ghcr.io/speaches-ai/speaches:latest-cpuNamed volume وہ حصہ ہے جسے لوگ اکثر چھوڑ دیتے ہیں۔ اس کے بغیر model cache container کے اندر رہتا ہے، اس لیے ہر restart پر پہلے request کا جواب دینے سے قبل gigabytes پر مشتمل weights دوبارہ download ہوتے ہیں۔
Speech کے لیے /v1/audio/speech جواب دینے سے پہلے ایک voice download کرنا ضروری ہے:
uvx speaches-cli model download speaches-ai/Kokoro-82M-v1.0-ONNXاس کے بعد base URL تبدیل کرکے کوئی بھی OpenAI client استعمال کیا جا سکتا ہے:
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 placeholder ضروری ہے، کیونکہ OpenAI client library اس کے بغیر request بھیجنے سے انکار کرتی ہے۔ جب تک آپ حقیقی key configure نہیں کرتے، سرور اس کی value کو نظرانداز کرتا ہے۔
vox-box یہاں قابل ذکر دوسرا project ہے۔ یہ container کے بجائے Python package ہے، اور اس کے paths کے پیچھے Whisper، FunASR، Bark، Dia یا CosyVoice فراہم کرتا ہے۔ موجودہ ورژن دسمبر 2025 کا 0.0.21 ہے، اور اسے 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 8010Project کی اپنی مثال port 80 پر bind ہوتی ہے، جس کے لیے root درکار ہے۔ ایسے server پر، جہاں دیگر خدمات بھی چل رہی ہوں، reverse proxy کے پیچھے high port استعمال کرنا بہتر ہے۔ vox-box start ایک وقت میں صرف ایک model لیتا ہے، اس لیے دونوں سمتیں فراہم کرنے کے لیے دوسرے port پر دوسری instance چلائیں اور اس میں speech repo id دیں۔
سرور سے معلوم کریں کہ اس نے کیا load کیا ہے، پھر وہ id model field میں استعمال کریں:
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"{"text": "..."} کی صورت والا JSON body ظاہر کرتا ہے کہ پورا path کام کر رہا ہے۔ model name پر 404 کا مطلب ہے کہ آپ نے /v1/models output پڑھنے کے بجائے نام کا اندازہ لگایا۔
ان میں سے کوئی بھی server default طور پر authentication فعال نہیں کرتا۔ انہیں 127.0.0.1 پر bind کریں اور VPN یا ایسے reverse proxy کے ذریعے access کریں جو credentials طلب کرے۔ public IP پر کھلا /v1/audio/transcriptions جسے بھی مل جائے، اس کے لیے مفت CPU فراہم کرتا ہے، اور وہ اسے تلاش کر لے گا۔
self-hosted اسسٹنٹ کے لیے voice front end
جب دونوں سمتیں OpenAI paths پر جواب دینے لگیں تو chat front end انہیں چلا سکتا ہے۔ Open WebUI اور اس کے متبادل اپنی settings میں audio کے لیے OpenAI-compatible base URL قبول کرتے ہیں، اس لیے ایک ہی box پر Ollama کے ساتھ local LLM چلائیں اور دونوں سروں پر voice loop مکمل کریں۔
Latency کا حقیقت پسندانہ اندازہ لگائیں، کیونکہ یہ تینوں مراحل ایک ہی cores پر یکے بعد دیگرے چلتے ہیں۔ 10 سیکنڈ کے سوال کو اوپر دیے گئے 7.6x اعداد و شمار کے مطابق transcribe کرنے میں تقریباً 1.3 سیکنڈ لگتے ہیں، اور اس سے پہلے model نے ایک بھی token نہیں پڑھا ہوتا۔ CPU پر token generation شامل کریں تو round trip اتنا سست ہو جاتا ہے کہ testers سمجھتے ہیں کہ یہ crash ہو گیا ہے۔ Batch transcription CPU پر قابلِ قبول ہے۔ Conversation اس کے برعکس ہے، اور اسی مرحلے پر GPU والا VPS اپنی قیمت کا جواز پیش کرنا شروع کرتا ہے۔
GPU در حقیقت کب مفید ثابت ہوتا ہے؟
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 میں بڑا model 13.2x real time کی رفتار سے 2,926 MB VRAM استعمال کرتے ہوئے چلتا ہے، اور batching کے ساتھ رفتار 48.8x تک پہنچ جاتی ہے۔ ان دو charts میں جو باتیں نہیں کہی گئی ہیں، انہیں غور سے دیکھیں۔ ان میں مختلف models استعمال ہوئے ہیں: GPU rows میں large-v2، جبکہ CPU rows میں small ہے۔ GPU، small model کو چھ گنا تیز نہیں بناتا۔ یہ زیادہ درست model کو قابلِ استعمال بناتا ہے۔
یہ اعداد کہاں سے آئے
دونوں charts، faster-whisper README میں شائع کیے گئے benchmark کو دوبارہ پیش کرتے ہیں۔ audio ایک single 13 minute file ہے۔ CPU rows میں Intel Core i7-12700K کے 8 threads استعمال ہوئے، جبکہ GPU rows میں 8 GB VRAM والے NVIDIA RTX 3070 Ti پر CUDA 12.4 استعمال ہوا۔ seconds اور memory columns میں شائع شدہ figures دی گئی ہیں۔ x_realtime column کا حساب ان figures کی بنیاد پر کیا گیا ہے: audio کے 780 seconds کو ناپے گئے وقت پر تقسیم کیا گیا ہے، پھر نتیجے کو ایک decimal تک round کیا گیا ہے۔ CPU chart میں memory column system RAM، جبکہ GPU chart میں VRAM دکھاتا ہے۔
Shared vCPU plan ان CPU figures تک نہیں پہنچ سکے گا۔ اس benchmark میں تیز desktop processor کے 8 threads صرف اسی کام کے لیے مختص تھے۔ 7.6x کو زیادہ سے زیادہ حد سمجھیں، پھر کسی بھی منصوبہ بندی سے پہلے حقیقی recording پر time کے ذریعے اپنے box کی کارکردگی ناپیں۔
عملی طور پر یہ چار عمومی اصول درست ثابت ہوتے ہیں:
- اپنی recordings کی کبھی کبھار transcription: CPU، small، int8۔ 2 dedicated vCPU کافی ہیں۔
- رات بھر چلنے والا batch کام، مثلاً subtitles بنانا: CPU، small یا medium، int8، اور
niceکے اندر چلائیں۔ - کوئی بھی interactive کام، یا ایک ہی شام میں پوری library process کرنا: GPU۔
- Piper: ہمیشہ CPU۔ اس سائز کا voice model GPU سے تقریباً کوئی فائدہ نہیں اٹھاتا۔
اگر آپ یہ طے کر رہے ہیں کہ یہی hardware مزید کیا کام سنبھال سکتا ہے تو کون سے AI models آپ self-host کر سکتے ہیں، اس کا وسیع تر جائزہ ان sizes کا احاطہ کرتا ہے جو fit ہوتے ہیں اور جو fit نہیں ہوتے۔
ناکامی کی صورتیں اور نظر آنے والے پیغامات
error: externally-managed-environment انسٹالیشن کے وقت۔ Distribution نے system Python کو محفوظ کر رکھا ہے۔ اوپر بتائے گئے طریقے کے مطابق virtual environment بنائیں۔
GPU سسٹم پر cuDNN کا عدم مطابقت۔ ناکامی اس طرح ظاہر ہوتی ہے:
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 درکار ہے، جبکہ host پر cuDNN 8 موجود ہے۔ یا تو cuDNN 9 انسٹال کریں، یا pip install --force-reinstall ctranslate2==4.4.0 کے ذریعے پرانا runtime مقرر کریں۔ دونوں میں سے صرف ایک طریقہ اختیار کریں۔ دونوں کرنے سے مسئلہ دوبارہ اسی حالت میں آ جاتا ہے۔
This CTranslate2 package was not compiled with CUDA support ایک الگ خرابی ہے، اگرچہ اس کی علامات ملتی جلتی ہیں۔ انسٹال ہونے والا wheel صرف CPU کے لیے بنایا گیا build ہے۔ GPU host پر virtual environment دوبارہ بنائیں اور pip کو دوبارہ wheel منتخب کرنے دیں۔
Transcript میں جملوں کا بار بار آنا۔ کسی جملے کا دس بار دہرایا جانا تقریباً ہمیشہ اس بات کی علامت ہے کہ خاموشی یا موسیقی کو speech کے طور پر decode کیا جا رہا ہے۔ پہلے vad_filter=True فعال کریں۔ اگر مسئلہ برقرار رہے تو اس segment کو سنیں: تقریباً خاموش audio Whisper کو اندازہ قائم کرنے کے لیے کافی معلومات نہیں دیتا، اس لیے وہ اپنا آخری پراعتماد اندازہ دہراتا رہتا ہے۔
غلط زبان کا پتا چلنا۔ Whisper صرف پہلے 30 seconds سے زبان کا اندازہ لگاتا ہے۔ 1.0 سے بہت کم info.language_probability کا مطلب ہے کہ اسے یقین نہیں تھا۔ یہ اس وقت ہوتا ہے جب recording موسیقی یا باہمی گفتگو کے ساتھ شروع ہو۔ اگر آپ کو زبان پہلے سے معلوم ہے تو language="en" دیں۔
Process Killed دکھا کر رک جاتا ہے۔ یہ kernel کا out-of-memory killer ہے، اور dmesg متعلقہ oom-kill لائن دکھائے گا۔ large-v3 کو working memory سے پہلے صرف weights کے لیے 3 GB سے زیادہ درکار ہوتے ہیں۔ 2 GB VPS پر int8 کے ساتھ small سب سے بڑا model ہے جو چل سکتا ہے۔
Piper کو voice نہیں ملتی۔ اگر آپ --data-dir فراہم نہ کریں تو player working directory میں تلاش کرتا ہے۔ متوقع directory پر ls چلائیں اور تصدیق کریں کہ .onnx اور .onnx.json دونوں موجود ہیں، کیونکہ ان میں سے صرف ایک کی موجودگی بھی، دونوں کے نہ ہونے کی طرح، ناکامی کا سبب بنتی ہے۔
FAQ
کیا میں صرف CPU والے VPS پر speech to text چلا سکتا ہوں؟
جی ہاں، اور batch کام کے لیے یہ مناسب انتخاب ہے۔ faster-whisper کو small model کے ساتھ int8 پر استعمال کرنے سے، project کے شائع کردہ benchmark کے مطابق desktop i7 کے 8 threads پر 13 منٹ کی audio کو 102 seconds میں transcribe کیا جاتا ہے، جو real time سے تقریباً 7.6x ہے، اور اس کے لیے 1,477 MB RAM درکار ہوتی ہے۔ Shared vCPU plan اس رفتار سے سست ہوگا، اس لیے اپنے server کی پیمائش خود کریں۔ Piper کے ساتھ text to speech اس سے بھی آسان ہے اور کسی بھی صورت GPU کی ضرورت نہیں ہوتی۔
مجھے Whisper model کا کون سا سائز استعمال کرنا چاہیے؟
int8 پر small سے شروع کریں۔ اس کے لیے disk پر 484 MB جگہ درکار ہوتی ہے اور یہ واضح recorded speech کو اچھی طرح handle کرتا ہے۔ جب accents یا background noise ایسی errors پیدا کریں جنہیں آپ برداشت نہیں کر سکتے، تو medium استعمال کریں۔ large-v3 صرف اس وقت استعمال کریں جب accuracy ہر دوسری چیز سے زیادہ اہم ہو، کیونکہ اسے disk پر 3,090 MB اور 3 GB سے زیادہ memory درکار ہوتی ہے۔ دوسری طرف، 75.5 MB والا tiny language detection اور pipeline testing کے لیے مفید ہے، لیکن ایسی transcripts کے لیے نہیں جنہیں کوئی شخص پڑھے گا۔
faster-whisper اصل Whisper package سے زیادہ تیز کیوں ہے؟
Model وہی ہے، لیکن runtime مختلف ہے۔ Reference package PyTorch میں Whisper چلاتا ہے، جبکہ faster-whisper اسی weights کو CTranslate2 پر چلاتا ہے۔ CTranslate2 transformer inference کے لیے بنایا گیا engine ہے، جو load کے وقت weights کو quantize کرتا ہے اور PyTorch installation کی ضرورت نہیں رکھتا۔ شائع کردہ CPU benchmark میں reference package کی رفتار real time سے 1.9x ہے، جبکہ int8 پر faster-whisper کی رفتار 7.6x ہے، اور یہ کم memory استعمال کرتا ہے۔
میری transcript ایک ہی sentence بار بار کیوں دہراتی ہے؟
Whisper silence یا music کو speech کے طور پر decode کر رہا ہے اور اپنی آخری پُراعتماد تشخیص پر واپس آ رہا ہے۔ vad_filter=True کو transcribe() call میں set کریں۔ یہ پہلے Silero voice activity detection چلاتا ہے اور model تک پہنچنے سے پہلے خاموش حصے ہٹا دیتا ہے۔ اگر تکرار پھر بھی جاری رہے تو audio level چیک کریں، کیونکہ تقریباً مکمل طور پر خاموش recording model کو کام کرنے کے لیے مناسب signal فراہم نہیں کرتی۔
میں اپنے server پر OpenAI-compatible audio endpoint کیسے حاصل کر سکتا ہوں؟
ایسا server چلائیں جو POST /v1/audio/transcriptions اور POST /v1/audio/speech implement کرتا ہو، پھر نئی base URL کے ذریعے client کو اس server کی طرف بھیجیں۔ Speaches ایک option ہے۔ یہ CPU build والی container image کے طور پر شائع ہوتا ہے اور transcription کے لیے faster-whisper، جبکہ speech کے لیے Piper یا Kokoro استعمال کرتا ہے۔ vox-box دوسرا option ہے۔ اسے pip install vox-box سے install کیا جاتا ہے اور vox-box start --huggingface-repo-id سے start کیا جاتا ہے، اور یہ ہر process میں ایک model serve کرتا ہے۔ دونوں میں default طور پر authentication enabled نہیں ہوتی، اس لیے service کو localhost پر bind کریں اور اس کے سامنے proxy یا VPN رکھیں۔