first commit

This commit is contained in:
2026-07-18 01:25:01 +03:30
parent dee06ba093
commit c18a1c2298
22 changed files with 981 additions and 0 deletions

21
stt/Dockerfile Normal file
View File

@@ -0,0 +1,21 @@
FROM nvidia/cuda:12.4.1-runtime-ubuntu22.04
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y \
python3 \
python3-pip \
ffmpeg \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY requirements.txt .
RUN pip3 install --no-cache-dir -r requirements.txt
COPY app.py .
EXPOSE 5001
CMD ["python3", "app.py"]

78
stt/app.py Normal file
View File

@@ -0,0 +1,78 @@
# -*- coding: utf-8 -*-
import os
import tempfile
from flask import Flask, request, jsonify
from faster_whisper import WhisperModel
# ==========================================================
# Configuration
# ==========================================================
MODEL_PATH = os.environ.get("WHISPER_MODEL", "/models/whisper")
DEVICE = os.environ.get("WHISPER_DEVICE", "cuda")
COMPUTE_TYPE = "float16" if DEVICE == "cuda" else "int8"
PORT = int(os.environ.get("PORT", 5001))
app = Flask(__name__)
# ==========================================================
# Load Whisper Model
# ==========================================================
print(f"[stt] Loading model from {MODEL_PATH} on {DEVICE} ({COMPUTE_TYPE})")
try:
model = WhisperModel(MODEL_PATH, device=DEVICE, compute_type=COMPUTE_TYPE)
print("[stt] Whisper model loaded successfully")
except Exception as e:
print(f"[stt] Fatal error loading model: {e}")
exit(1)
# ==========================================================
# Speech To Text Endpoint
# ==========================================================
@app.route("/transcribe", methods=["POST"])
def transcribe():
if "audio" not in request.files:
return jsonify({"error": "audio file missing"}), 400
audio_file = request.files["audio"]
# استفاده از NamedTemporaryFile با مدیریت بهتر برای محیط داکر
tmp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".wav")
audio_path = tmp_file.name
tmp_file.close()
try:
audio_file.save(audio_path)
# اجرای اینفرنس با تنظیمات بهینه شده
segments, info = model.transcribe(
audio_path,
language="fa",
beam_size=10,
vad_filter=True,
vad_parameters=dict(min_silence_duration_ms=500) # بهبود تشخیص سکوت
)
text = " ".join([segment.text.strip() for segment in segments])
return jsonify({
"text": text.strip(),
"language": info.language
})
except Exception as e:
print(f"[stt] Error during transcription: {e}")
return jsonify({"error": str(e)}), 500
finally:
if os.path.exists(audio_path):
os.remove(audio_path)
# ==========================================================
# Health Check
# ==========================================================
@app.route("/health", methods=["GET"])
def health():
return jsonify({"status": "ok"})
if __name__ == "__main__":
app.run(host="0.0.0.0", port=PORT)

5
stt/requirements.txt Normal file
View File

@@ -0,0 +1,5 @@
flask==3.0.3
faster-whisper==1.0.3
ctranslate2
requests
numpy