from flask import Flask, request, jsonify
import speech_recognition as sr
import os
import uuid

app = Flask(__name__)

@app.route("/transcribe", methods=["POST"])
def transcribe_audio():
    if 'file' not in request.files:
        return jsonify({"error": "No file part"}), 400

    file = request.files['file']
    if file.filename == '':
        return jsonify({"error": "No selected file"}), 400

    temp_id = str(uuid.uuid4())
    wav_path = f"/tmp/{temp_id}.wav"
    file.save(wav_path)

    print("📥 Received file:", file.filename)
    print("📦 File size:", os.path.getsize(wav_path), "bytes")
    print("🎙 Starting speech recognition")

    recognizer = sr.Recognizer()
    try:
        with sr.AudioFile(wav_path) as source:
            recognizer.adjust_for_ambient_noise(source, duration=0.2)
            audio_data = recognizer.record(source)
            text = recognizer.recognize_google(audio_data, language="ar-EG")
    except sr.UnknownValueError:
        text = "لم يتم التعرف على الصوت"
    except sr.RequestError as e:
        text = f"خطأ في الاتصال بـ Google API: {e}"

    os.remove(wav_path)
    return jsonify({"text": text})

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8002, debug=False)


# from flask import Flask, request, jsonify
# import os
# import uuid
# import wave
# from vosk import Model, KaldiRecognizer
# import json

# app = Flask(__name__)

# # تحميل نموذج اللغة مرة واحدة
# MODEL_PATH = "model-ar"
# if not os.path.exists(MODEL_PATH):
#     raise Exception("❌ نموذج اللغة العربية غير موجود. قم بتحميله من https://alphacephei.com/vosk/models")

# model = Model(MODEL_PATH)

# @app.route("/transcribe", methods=["POST"])
# def transcribe_audio():
#     if 'file' not in request.files:
#         return jsonify({"error": "No file part"}), 400

#     file = request.files['file']
#     if file.filename == '':
#         return jsonify({"error": "No selected file"}), 400

#     temp_id = str(uuid.uuid4())
#     wav_path = f"/tmp/{temp_id}.wav"
#     file.save(wav_path)

#     try:
#         wf = wave.open(wav_path, "rb")
#         if wf.getnchannels() != 1 or wf.getsampwidth() != 2 or wf.getcomptype() != "NONE":
#             return jsonify({"error": "الملف الصوتي يجب أن يكون WAV بصيغة PCM احادية القناة"}), 400

#         recognizer = KaldiRecognizer(model, wf.getframerate())
#         recognizer.SetWords(True)

#         text_result = ""
#         while True:
#             data = wf.readframes(4000)
#             if len(data) == 0:
#                 break
#             if recognizer.AcceptWaveform(data):
#                 result = json.loads(recognizer.Result())
#                 text_result += result.get("text", "") + " "

#         final_result = json.loads(recognizer.FinalResult())
#         text_result += final_result.get("text", "")

#         return jsonify({"text": text_result.strip() or "لم يتم التعرف على الصوت"})

#     except Exception as e:
#         return jsonify({"error": str(e)}), 500
#     finally:
#         os.remove(wav_path)


# if __name__ == "__main__":
#     app.run(host="0.0.0.0", port=8001)

# ضع Vosk داخل خدمة متعددة العمليات (Gunicorn أو uWSGI) لتوزيع الضغط

# import os
# os.environ["XDG_CACHE_HOME"] = "/tmp"

# import whisper
# import uuid
# import os
# from flask import Flask, request, jsonify

# app = Flask(__name__)
# model = whisper.load_model("large")  # أو "small" أو "medium" أو "large" حسب جهازك

# @app.route("/transcribe", methods=["POST"])
# def transcribe_audio():
#     try:
#         if 'file' not in request.files:
#             print("❌ No file part in request")
#             return jsonify({"error": "No file part"}), 400

#         file = request.files['file']
#         if file.filename == '':
#             print("❌ No selected file")
#             return jsonify({"error": "No selected file"}), 400

#         temp_id = str(uuid.uuid4())
#         wav_path = f"/tmp/{temp_id}.wav"
#         file.save(wav_path)

#         print(f"✅ File received: {file.filename}")
#         print(f"📦 File saved at: {wav_path}")
#         print(f"📦 File size: {os.path.getsize(wav_path)} bytes")

#         result = model.transcribe(wav_path, language="ar")
#         print("✅ Transcription done")
#         text = result["text"]

#         os.remove(wav_path)
#         return jsonify({"text": text})

#     except Exception as e:
#         print(f"🔥 Exception: {str(e)}")
#         return jsonify({"error": str(e)}), 500


# if __name__ == "__main__":
#     app.run(host="0.0.0.0", port=8002, debug=True)
