SSD Nodes Learn 🎉 VPS $5.50/মাস থেকে
নির্দেশিকা Matt Connorদ্বারা Matt Connor · আপডেট করা হয়েছে 2026-08-13

VPS-এ self-hosted Whisper ও Piper চালানোর খরচ

নিজের VPS-এ faster-whisper ও Piper চালিয়ে speech to text এবং TTS সেটআপ করুন। CPU time, disk খরচ এবং OpenAI-compatible endpoint প্রকাশের বাস্তব নির্দেশনা দেখুন।

Self-hosted speech to text এবং TTS সংক্ষেপে

Self-hosted speech to text এবং TTS (text to speech) হলো আপনার মালিকানাধীন সার্ভারে চালানো সবচেয়ে সাশ্রয়ী AI-এর একটি ধরন। Transcription-এর জন্য faster-whisper runtime-এর মাধ্যমে Whisper চালানো হয়। Synthesis-এর জন্য Piper চালানো হয়। দুটিই কোনো GPU ছাড়াই সাধারণ CPU VPS-এ কাজ করে। ছোট Whisper model-এর জন্য প্রায় 484 MB disk লাগে, আর একটি Piper voice-এর আকার 150 MB-এর অনেক কম এবং এটি একটি মাত্র file।

এই কারণেই audio দিয়ে শুরু করা ভালো। Self-hosted image generator এবং self-hosted video generation ব্যবহারযোগ্য হওয়ার আগেই GPU চায়। Audio-এর ক্ষেত্রে তা প্রয়োজন হয় না।

এই guide-এ উভয় দিক এবং তাদের সংযুক্ত করা layer নিয়ে আলোচনা করা হয়েছে। Whisper audio-কে text-এ রূপান্তর করে। Piper text-কে audio-তে রূপান্তর করে। উভয়ের সামনে একটি OpenAI-compatible HTTP server রাখলে base URL ছাড়া আর কিছু পরিবর্তন না করেই কোনো existing client-কে আপনার server-এ নির্দেশ করা যায়।

এখানে উল্লেখ করা প্রতিটি version August 2026 পর্যন্ত current ছিল।

কেন faster-whisper, reference Whisper package নয়

OpenAI-এর whisper package মডেলটি PyTorch-এ চালায়। faster-whisper একই model weights CTranslate2-এ চালায়; এটি transformer model-এর জন্য বিশেষভাবে তৈরি একটি 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 install করে। ফলে virtual environment-এর আকার কয়েক gigabyte-এর বদলে কয়েকশ megabyte হয়। 40 GB disk-যুক্ত VPS-এ এই পার্থক্যটি পর্যাপ্ত জায়গা এবং সংকুচিত disk-এর মধ্যে পার্থক্য তৈরি করে।

CPU-তে small model-এর জন্য project-এর প্রকাশিত পরিসংখ্যান নিচে দেওয়া হলো। Benchmark-এ Intel Core i7-12700K-এর 8টি thread ব্যবহার করে 13 মিনিটের audio transcribe করা হয়েছে। x_realtime column-এ 13 মিনিটকে মাপা সময় দিয়ে ভাগ করা হয়েছে: 7.6 অর্থ 13 মিনিটের recording 1 মিনিট 40 সেকেন্ডের কিছু বেশি সময়ে শেষ হয়েছে।

ChartWhisper small on CPU, 13 minutes of audio (published project figures)
The data behind this chart
[
  {
    "label": "openai/whisper, fp32",
    "x_realtime": 1.9,
    "seconds": 418,
    "memory_mb": "2,335"
  },
  {
    "label": "whisper.cpp, fp32",
    "x_realtime": 6.2,
    "seconds": 125,
    "memory_mb": "1,049"
  },
  {
    "label": "faster-whisper, fp32",
    "x_realtime": 5.0,
    "seconds": 157,
    "memory_mb": "2,257"
  },
  {
    "label": "faster-whisper, int8",
    "x_realtime": 7.6,
    "seconds": 102,
    "memory_mb": "1,477"
  },
  {
    "label": "faster-whisper, int8, batch 8",
    "x_realtime": 15.3,
    "seconds": 51,
    "memory_mb": "3,608"
  }
]

দ্বিতীয় 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 real time-এর 1.9x গতিতে কাজ করে। অর্থাৎ 1 ঘণ্টার audio transcribe করতে CPU-তে আধা ঘণ্টা লাগে।

Whisper model weight-এর জন্য কতটা disk space প্রয়োজন?

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

এগুলো float16-এ প্রকাশিত CTranslate2 conversion। compute_type="int8" কী করে না, তা মনে রাখুন: এটি download-এর আকার কমায় না। Weight-গুলো float16 অবস্থায় download হয় এবং load করার সময় CTranslate2 সেগুলো memory-তে quantize করে। তাই আপনি এটি float16 বা int8-এ চালালেও disk-এ large-v3-এর জন্য 3,090 MB লাগে। int8 RAM ও গতি সাশ্রয় করে, disk space নয়।

প্রথমবার ব্যবহার করার সময় model-গুলো ~/.cache/huggingface/hub-এ download হয়। অল্প root volume-যুক্ত VPS-এ পর্যাপ্ত জায়গা আছে এমন স্থানে এটি রাখতে download_root argument বা HF_HOME environment variable ব্যবহার করুন। তা না হলে প্রথম run-এই disk পূর্ণ হয়ে যাবে এবং download শেষ হওয়ার আগেই process বন্ধ হয়ে যাবে।

system Python নষ্ট না করে faster-whisper ইনস্টল করুন

Ubuntu 24.04 এবং Debian 13 system 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.1

Version 1.2.1 হলো বর্তমান release, যা October 2025-এ প্রকাশিত হয়েছে। faster-whisper PyAV-এর মাধ্যমে audio decode করে। PyAV-এর নিজস্ব ffmpeg library bundled থাকে। তাই আলাদা ffmpeg binary ছাড়াই এটি mp3 বা m4a পড়তে পারে। এই guide-এর পরের অংশে video processing-এর জন্য উপরের ffmpeg package ব্যবহার করা হবে।

তিন gigabyte weights download করার আগে installation পরীক্ষা করুন:

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

ok লেখা একটি line দেখালে বুঝবেন wheels ইনস্টল হয়েছে। ImportError-এ ctranslate2 লেখা থাকলে বুঝবেন আপনার architecture-এর জন্য wheel ইনস্টল হয়নি। 32-bit ARM image-এ এমনটি ঘটে।

একটি meeting recording বা voice note transcribe করুন

এটি 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 থেকে load হয়।

segments একটি generator। তাই এর ওপর iterate না করা পর্যন্ত transcription শুরু হয় না। অনেকে transcribe() call-এর সময় মাপেন, সেটি সঙ্গে সঙ্গে return করতে দেখেন এবং মনে করেন কিছু সমস্যা হয়েছে। কোনো সমস্যা হয়নি। কাজটি loop-এর মধ্যে হয়।

vad_filter=True প্রথমে Silero VAD (voice activity detection) চালায় এবং Whisper সেগুলো process করার আগে নীরব অংশ বাদ দেয়। দীর্ঘ বিরতিসহ meeting recording-এ এটি সাধারণত সবচেয়ে বড় একক speed improvement দেয়, কারণ speech নেই এমন audio-তে Whisper একেবারেই সময় ব্যয় করে না। Silence দেওয়া হলে Whisper শব্দ খুঁজতে গিয়ে যে repeated-sentence loop তৈরি করে, এটিও তা কমায়।

cpu_threads-এ আপনার কাছে বাস্তবে থাকা core-এর সংখ্যা নির্ধারণ করুন। vCPU count-এর চেয়ে বেশি মান সেট করলে transcription ধীর হয়, কারণ অতিরিক্ত thread একই core ব্যবহারের জন্য প্রতিযোগিতা করে এবং scheduler-কে প্রতিটি context switch-এর জন্য অতিরিক্ত কাজ করতে হয়।

Jellyfin লাইব্রেরির জন্য সাবটাইটেল

Jellyfin ভিডিওর পাশে থাকা এবং ভিডিওর নামের সঙ্গে মিল থাকা বাহ্যিক subtitle file পড়ে। তাই Movie (2019).mkv-এর পাশে Movie (2019).en.srt রাখলে এটি transcoding বা library rebuild ছাড়াই English track হিসেবে প্রদর্শিত হয়।

প্রথমে audio আলাদা করুন। Whisper অভ্যন্তরীণভাবে সবকিছুকে 16 kHz mono-তে resample করে। তাই 16 kHz mono input দিলে দুই পাশের অতিরিক্ত কাজ কমে:

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

faster-whisper-এর কোনো SRT writer নেই। তাই segment নিজেই format করুন। এটি 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())

এরপর 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 কোনো অতিরিক্ত সাজসজ্জা নয়। এটি না থাকলে ffmpeg loop-এর standard input থেকে পড়তে শুরু করে, file list-এর বাকি অংশ গিলে ফেলে, এবং কোনো error message ছাড়াই loop একটি film-এর পর থেমে যায়।

শুরু করার আগে সময়ের হিসাব করুন। উপরের 7.6x গতিতে 100 মিনিটের একটি film-এর জন্য প্রায় 13 মিনিট CPU সময় লাগে। তাই fifty-film-এর একটি library প্রক্রিয়া করতে রাতভর সময় লাগতে পারে। shared vCPU plan-এ এটি আরও ধীর হবে। সেই কারণেই nice ব্যবহার করা হয়। এতে subtitle run সার্ভারে চলা অন্য কাজকে অগ্রাধিকার দেয়।

Piper দিয়ে text-to-speech

Piper একটি neural text-to-speech engine, যা CPU-তে ONNX voice model চালায়। এটি text-কে phoneme-এ রূপান্তর করতে 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-তে দুটি file লেখে: .onnx weights এবং sample rate ও speaker list থাকা .onnx.json config। এগুলো একসঙ্গে রাখতে হবে। voice file কোনো নির্দিষ্ট directory-তে রাখলে উভয় command-এ --data-dir দিন। অন্যথায় player working directory-তে খোঁজে এবং সেখানে না থাকা voice file খুঁজে পায় না।

Text-এর আগে থাকা ---টিও গুরুত্বপূর্ণ। এটি না থাকলে hyphen দিয়ে শুরু হওয়া যেকোনো sentence command-line option হিসেবে parse হয়।

Voice-গুলো বিভিন্ন quality level-এ পাওয়া যায়। একটি medium English voice-এর আকার প্রায় 60 MB, আর high voice-এর আকার প্রায় দ্বিগুণ। বেশি quality-এর অর্থ বড় model এবং speech-এর প্রতি second-এ বেশি CPU ব্যবহার। এর অর্থ ভিন্ন speaker নয়।

CLI-কে loop-এর মধ্যে call করবেন না। প্রতিবার চালানোর সময় এটি model load করে, আর ছোট sentence-এর ক্ষেত্রে model load করতেই অধিকাংশ সময় ব্যয় হয়। এর পরিবর্তে 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

test.wav-এর output play করতে পারলে বোঝা যাবে যে এটি কাজ করছে। এই endpoint Piper-এর নিজস্ব format ব্যবহার করে, 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.target

sudo systemctl enable --now piper এটি চালু করে এবং reboot-এর পরে আবার চালু করে। উপরের curl command কোনো output না দিলে journalctl -u piper -n 50-এ কারণটি পাওয়া যাবে। সাধারণত কারণটি হয় voice file অনুপস্থিত।

OpenAI-সামঞ্জস্যপূর্ণ সার্ভারের কাঠামো

অডিও পরিচালনা করে এমন অধিকাংশ software ইতিমধ্যে OpenAI audio API সমর্থন করে: ফাইলের জন্য /v1/audio/transcriptions-এ multipart POST, আর বাক্যের জন্য /v1/audio/speech-এ JSON POST। আপনি নিজেই এই দুটি path সরবরাহ করলে client-এ শুধু একটি পরিবর্তন লাগে—তার base URL পরিবর্তন করা।

Speaches এমন একটি server, যা দুই দিকের কাজই করে। এটি transcription-এর জন্য faster-whisper এবং speech-এর জন্য Piper বা Kokoro চালায়, আর OpenAI path-এর মাধ্যমে সেগুলো সরবরাহ করে। বর্তমান release হলো December 2025-এর v0.9.0-rc.3। এটি এখনও 1.0-এর আগের সংস্করণ। তাই image tag নির্দিষ্ট করে ব্যবহার করুন এবং 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 file রাখতে না চান, তাহলে 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-cpu

Named volume-টি অনেকে বাদ দেন। এটি না থাকলে model cache container-এর ভেতরে থাকে। ফলে প্রতিটি restart-এর সময় প্রথম request-এর উত্তর দেওয়ার আগে gigabytes পরিমাণ weights আবার download হয়।

/v1/audio/speech উত্তর দেওয়ার আগে 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 না করা পর্যন্ত server এর মান উপেক্ষা করে।

এখানে উল্লেখ করার মতো অন্য project হলো vox-box। এটি container নয়, একটি Python package। এর মাধ্যমে Whisper, FunASR, Bark, Dia বা CosyVoice ব্যবহার করে একই path সরবরাহ করা যায়। December 2025-এর বর্তমান version হলো 0.0.21। এটি Python 3.10 বা তার পরের version প্রয়োজন।

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

Project-এর নিজস্ব example port 80-এ bind করে, যার জন্য root প্রয়োজন। অন্য কাজও করে এমন server-এ reverse proxy-এর পেছনে একটি high port ব্যবহার করাই ভালো পদ্ধতি। vox-box start একবারে একটি model নেয়। তাই দুই দিকই চালাতে হলে দ্বিতীয় port-এ speech repo id দিয়ে আরেকটি instance চালাতে হবে।

Server কী load করেছে তা জিজ্ঞাসা করুন। এরপর সেই id 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"

{"text": "..."} ধরনের একটি JSON body ব্যবহার করলে পুরো path কাজ করছে কি না বোঝা যায়। Model name-এর ক্ষেত্রে 404 মানে হলো আপনি /v1/models output পড়ার পরিবর্তে অনুমান করেছেন।

এই server-গুলোর কোনোটিই default অবস্থায় authentication চালু করে না। এগুলো 127.0.0.1-এ bind করুন এবং VPN-এর মাধ্যমে, অথবা credentials চাওয়া reverse proxy-এর মাধ্যমে access করুন। Public IP-তে উন্মুক্ত /v1/audio/transcriptions যে কেউ খুঁজে পেলে বিনা খরচে CPU ব্যবহার করতে পারবে। তারা এটি খুঁজে পাবেই।

একটি self-hosted assistant-এর জন্য voice front end

দুই দিকই OpenAI path-এ সাড়া দিতে পারলে একটি chat front end সেগুলো পরিচালনা করতে পারে। Open WebUI এবং এর বিকল্পগুলো তাদের settings-এ audio-এর জন্য OpenAI-compatible base URL গ্রহণ করে। তাই একই box-এ Ollama দিয়ে একটি local LLM চালানো এবং voice loop-এর উভয় প্রান্ত যুক্ত করা যায়।

Latency-এর হিসাব বাস্তবসম্মতভাবে করুন, কারণ একই core-এ এই তিনটি ধাপ একটির পর আরেকটি চলে। 10 second-এর একটি প্রশ্ন উপরের 7.6x হারে transcribe করতে প্রায় 1.3 seconds লাগে। এর আগে model একটি token-ও পড়ে না। এর সঙ্গে CPU token generation যোগ হলে সম্পূর্ণ round trip এত ধীর হয় যে tester-রা ধরে নেন এটি crash করেছে। CPU-তে batch transcription স্বাচ্ছন্দ্যে করা যায়। Conversation-এর ক্ষেত্রে তা যায় না। এই পর্যায়েই GPU-সহ একটি VPS-এর খরচ সার্থক হতে শুরু করে।

GPU কখন বাস্তবে উপযোগী?

ChartWhisper large-v2 on an RTX 3070 Ti, 13 minutes of audio (published project figures)
The data behind this chart
[
  {
    "label": "openai/whisper, fp16",
    "x_realtime": 5.5,
    "seconds": 143,
    "memory_mb": "4,708"
  },
  {
    "label": "faster-whisper, fp16",
    "x_realtime": 12.4,
    "seconds": 63,
    "memory_mb": "4,525"
  },
  {
    "label": "faster-whisper, int8",
    "x_realtime": 13.2,
    "seconds": 59,
    "memory_mb": "2,926"
  },
  {
    "label": "faster-whisper, int8, batch 8",
    "x_realtime": 48.8,
    "seconds": 16,
    "memory_mb": "4,500"
  }
]

GPU-তে int8-এ large modelটি 13.2x real time গতিতে চলে এবং 2,926 MB VRAM ব্যবহার করে। batching করলে গতি 48.8x-এ পৌঁছায়। দুটি chart-এ কী বলা হয়নি, তা খেয়াল করুন। এগুলো ভিন্ন model ব্যবহার করে: GPU row-গুলোতে large-v2, আর CPU row-গুলোতে small। GPU small model-কে ছয় গুণ দ্রুত করে না। এটি নির্ভুল model-টিকে ব্যবহারযোগ্য করে।

এই সংখ্যাগুলো কোথা থেকে এসেছে

দুটি chart-ই faster-whisper README-তে প্রকাশিত benchmark পুনরুৎপাদন করে। অডিওটি একটি 13 মিনিটের ফাইল। CPU row-গুলো Intel Core i7-12700K-তে 8টি thread ব্যবহার করেছে, আর GPU row-গুলো 8 GB VRAM-সহ NVIDIA RTX 3070 Ti-তে CUDA 12.4 ব্যবহার করেছে। seconds এবং memory column-এ প্রকাশিত পরিসংখ্যান দেওয়া হয়েছে। x_realtime column-টি ওই পরিসংখ্যানের ওপর করা হিসাব: মাপা সময় দিয়ে 780 সেকেন্ডের অডিও ভাগ করে ফলাফল এক দশমিক ঘরে round করা হয়েছে। CPU chart-এ memory column system RAM বোঝায়, আর GPU chart-এ এটি VRAM বোঝায়।

Shared vCPU plan benchmark-এর CPU ফলাফলে পৌঁছাতে পারবে না। ওই benchmark-এ একটি দ্রুত desktop processor-এর 8টি thread সম্পূর্ণভাবে এই কাজের জন্য বরাদ্দ ছিল। 7.6x-কে সর্বোচ্চ সীমা হিসেবে ধরুন। এরপর কোনো পরিকল্পনা করার আগে বাস্তব recording-এ time ব্যবহার করে নিজের server মাপুন।

বাস্তবে কার্যকর চারটি সাধারণ নিয়ম:

  • নিজের recording মাঝে মাঝে transcribe করা: CPU, small, int8। 2টি dedicated vCPU যথেষ্ট।
  • subtitle run-এর মতো রাতভর batch কাজ: CPU, small বা medium, int8, nice-এর মধ্যে চালান।
  • যেকোনো interactive কাজ, অথবা এক সন্ধ্যায় সম্পূর্ণ library প্রক্রিয়া করা: GPU।
  • Piper: সবসময় CPU। এই আকারের voice model GPU থেকে প্রায় কোনো সুবিধাই পায় না।

একই hardware-এ আর কী চালানো সম্ভব তা নির্ধারণ করতে চাইলে, কোন AI model নিজে host করতে পারবেন—এই বৃহত্তর প্রশ্নটি কোন আকারের model ব্যবহার করা যায় এবং কোনটি যায় না, তা ব্যাখ্যা করে।

যে ব্যর্থতার ধরনগুলো দেখা যায়

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 cudnnCreateTensorDescriptor

CTranslate2 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-only build। GPU host-এ virtual environment নতুন করে তৈরি করুন এবং pip-কে আবার wheel নির্বাচন করতে দিন।

Transcript-এ একই বাক্য বারবার আসা। একটি বাক্য দশবার পুনরাবৃত্তি হলে প্রায় সব সময় silence বা music-কে speech হিসেবে decode করা হচ্ছে। প্রথমে vad_filter=True চালু করুন। তাতেও সমস্যা থাকলে segment-টি শুনুন: প্রায় নীরব audio-তে Whisper-এর নির্ভর করার মতো কোনো শব্দ থাকে না, তাই এটি শেষের confident অনুমানটি পুনরাবৃত্তি করে।

ভুল language শনাক্ত হওয়া। Whisper শুধু প্রথম 30 সেকেন্ড দেখে অনুমান করে। 1.0-এর তুলনায় অনেক কম info.language_probability মানে এটি নিশ্চিত ছিল না। Recording-এর শুরুতে music বা cross-talk থাকলে এমনটি হয়। উত্তরটি আগে থেকেই জানা থাকলে language="en" দিন।

Process Killed দেখিয়ে বন্ধ হয়ে যায়। এটি kernel-এর out-of-memory killer। dmesg-এ সংশ্লিষ্ট oom-kill line দেখা যাবে। Working memory ব্যবহারের আগেই large-v3-এর weights-এর জন্য 3 GB-এর বেশি প্রয়োজন। 2 GB VPS-এ int8 সহ small হলো সর্ববৃহৎ মানানসই model।

Piper voice খুঁজে পায় না। --data-dir না দিলে player working directory-তে voice খোঁজে। প্রত্যাশিত directory-তে ls চালান এবং নিশ্চিত করুন যে .onnx.onnx.json দুটিই আছে। একটি ছাড়া অন্যটি থাকলে কাজ হবে না, আর দুটিই না থাকলেও একই ফল হবে।

FAQ

আমি কি শুধু CPU-ভিত্তিক VPS-এ speech to text চালাতে পারি?

হ্যাঁ। Batch কাজের জন্য এটি যুক্তিসঙ্গত পছন্দ। int8-এ small model ব্যবহার করে প্রকল্পটির প্রকাশিত benchmark অনুযায়ী, desktop i7-এর 8টি thread-এ 102 সেকেন্ডে 13 মিনিটের audio transcribe করা যায়। এটি real time-এর প্রায় 7.6x। এতে 1,477 MB RAM লাগে। Shared vCPU plan এর চেয়ে ধীর হবে, তাই নিজের server-এ মাপ নিন। Piper দিয়ে text to speech আরও সহজ এবং কোনো অবস্থাতেই GPU লাগে না।

কোন Whisper model size ব্যবহার করা উচিত?

int8-এ small দিয়ে শুরু করুন। Disk-এ এর আকার 484 MB এবং পরিষ্কারভাবে record করা speech এটি ভালোভাবে প্রক্রিয়া করে। Accent বা background noise-এর কারণে সহনীয় নয় এমন error হলে medium ব্যবহার করুন। Accuracy অন্য সবকিছুর চেয়ে বেশি গুরুত্বপূর্ণ হলে large-v3 ব্যবহার করুন। এর জন্য 3,090 MB disk এবং 3 GB-এর বেশি memory লাগে। বিপরীতভাবে, 75.5 MB আকারের tiny language detection এবং pipeline test করার জন্য কার্যকর। মানুষ পড়বে এমন transcript তৈরির জন্য এটি উপযুক্ত নয়।

মূল Whisper package-এর চেয়ে faster-whisper দ্রুত কেন?

Model একই। Runtime একই নয়। Reference package PyTorch-এ Whisper চালায়। faster-whisper একই weights CTranslate2-এ চালায়। CTranslate2 transformer inference-এর জন্য তৈরি একটি engine। এটি load করার সময় weights quantize করে এবং PyTorch install-এর প্রয়োজন হয় না। প্রকাশিত CPU benchmark-এ reference package-এর গতি real time-এর 1.9x। int8-এ faster-whisper-এর গতি 7.6x। faster-whisper কম memory ব্যবহার করে।

আমার transcript একই sentence বারবার পুনরাবৃত্তি করে কেন?

Whisper silence বা music-কে speech হিসেবে decode করছে এবং শেষবারের confident guess-এ ফিরে যাচ্ছে। vad_filter=True transcribe() call-এ সেট করুন। এটি প্রথমে Silero voice activity detection চালায় এবং model-এর কাছে পৌঁছানোর আগে silent অংশ সরিয়ে দেয়। এরপরও পুনরাবৃত্তি হলে audio level পরীক্ষা করুন। কারণ পুরো recording প্রায় নীরব হলে model-এর কাজ করার মতো কোনো তথ্য থাকে না।

নিজের server-এ OpenAI-compatible audio endpoint কীভাবে পাব?

POST /v1/audio/transcriptions এবং POST /v1/audio/speech বাস্তবায়ন করে এমন একটি server চালান। এরপর নতুন base URL দিয়ে client-কে সেটির দিকে নির্দেশ করুন। Speaches একটি বিকল্প। এটি CPU build-সহ container image হিসেবে প্রকাশিত এবং transcription-এর জন্য faster-whisper, speech-এর জন্য Piper বা Kokoro ব্যবহার করে। vox-box আরেকটি বিকল্প। এটি pip install vox-box দিয়ে install করা যায় এবং vox-box start --huggingface-repo-id দিয়ে চালু করা যায়। এটি প্রতি process-এ একটি model পরিবেশন করে। কোনোটি defaultভাবে authentication চালু করে না। তাই localhost-এ bind করুন এবং সামনে একটি proxy বা VPN ব্যবহার করুন।

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