Spaces:
Sleeping
Sleeping
File size: 6,281 Bytes
c6a2cab e0e82c4 c2d641e 1b9a98a 4ee7273 1b9a98a c6a2cab 4ee7273 1b9a98a e0e82c4 4ee7273 1b9a98a c6a2cab e0e82c4 4ee7273 19cb3f1 dedcd45 1b9a98a dedcd45 1b9a98a dedcd45 1b9a98a 19cb3f1 1b9a98a 19cb3f1 1b9a98a dedcd45 19cb3f1 4ee7273 19cb3f1 4ee7273 19cb3f1 4ee7273 19cb3f1 4ee7273 e0e82c4 4ee7273 c6a2cab 4ee7273 c6a2cab 4ee7273 1b9a98a 4ee7273 1b9a98a e0e82c4 1b9a98a c2d641e 1b9a98a e0e82c4 4ee7273 1b9a98a dedcd45 4ee7273 1b9a98a 4ee7273 1b9a98a 4ee7273 1b9a98a 4ee7273 1b9a98a 4ee7273 1b9a98a dedcd45 1b9a98a dedcd45 e0e82c4 1b9a98a 4ee7273 c6a2cab 4ee7273 c6a2cab 4ee7273 e0e82c4 4ee7273 c6a2cab 4ee7273 c6a2cab 4ee7273 e0e82c4 4ee7273 e0e82c4 4ee7273 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 | from flask import Flask, request, jsonify, send_file, after_this_request
from flask_cors import CORS
import json
import os
import uuid
# π Text To Speech
from gtts import gTTS
# π Optional translator
try:
from deep_translator import GoogleTranslator
TRANSLATOR_AVAILABLE = True
except:
TRANSLATOR_AVAILABLE = False
app = Flask(__name__)
CORS(app)
# -----------------------------
# Load disease data
# -----------------------------
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
DATA_PATH = os.path.join(BASE_DIR, "diseases.json")
with open(DATA_PATH, "r", encoding="utf-8") as f:
disease_data = json.load(f) # dict
# -----------------------------
# Disease aliases
# -----------------------------
DISEASE_ALIASES = {
"vascular": "vascular lesion",
"vascular lesion": "vascular lesion",
"bcc": "Basal Cell Carcinoma (BCC)",
"basal cell": "Basal Cell Carcinoma (BCC)",
"scc": "squamous cell carcinoma",
"squamous": "squamous cell carcinoma",
"nv": "Melanocytic Nevi (NV)",
"melanocytic": "Melanocytic Nevi (NV)",
"mole": "nevus",
"bkl": "Benign Keratosis-like Lesions (BKL)",
"keratosis": "Benign Keratosis-like Lesions (BKL)",
"ringworm": "Tinea Ringworm Candidiasis",
"fungal infection": "Tinea Ringworm Candidiasis",
"warts": "Warts Molluscum Viral Infections",
"ak": "actinic keratosis",
"actinic": "actinic keratosis",
"df": "dermatofibroma",
"dermatofibroma": "dermatofibroma",
"pigmented keratosis": "pigmented benign keratosis"
}
# -----------------------------
# Supported languages
# -----------------------------
SUPPORTED_LANGUAGES = {
"en": "English",
"ta": "Tamil",
"hi": "Hindi",
"te": "Telugu",
"ml": "Malayalam",
"kn": "Kannada",
"bn": "Bengali",
"mr": "Marathi",
"ur": "Urdu",
"es": "Spanish"
}
# -----------------------------
# Home
# -----------------------------
@app.route("/")
def home():
return "Chatbot backend running"
# -----------------------------
# CHAT API
# -----------------------------
@app.route("/chat", methods=["GET", "POST"])
def chat():
# GET β simple test
if request.method == "GET":
return jsonify({
"info": "Use POST method",
"example": {
"message": "acne",
"language": "en"
}
})
try:
data = request.get_json(force=True)
if "message" not in data:
return jsonify({"reply": "Invalid request"}), 400
user_input = data["message"]
user_lang = data.get("language", "en")
if user_lang not in SUPPORTED_LANGUAGES:
user_lang = "en"
# π Translate input β English
translated_input = user_input
if user_lang != "en" and TRANSLATOR_AVAILABLE:
try:
translated_input = GoogleTranslator(
source=user_lang, target="en"
).translate(user_input)
except:
translated_input = user_input
normalized_input = translated_input.lower()
# π Alias match
matched_disease = None
for key, value in DISEASE_ALIASES.items():
if key in normalized_input:
matched_disease = value
break
# π Direct match
if not matched_disease:
for disease_name in disease_data.keys():
if disease_name.lower() in normalized_input:
matched_disease = disease_name
break
if not matched_disease or matched_disease not in disease_data:
return jsonify({"reply": "Disease information not found."})
info = disease_data[matched_disease]
# π§Ύ English response
english_response = (
f"Disease: {matched_disease}\n\n"
f"Type: {info.get('type','-')}\n"
f"Nature: {info.get('nature','-')}\n"
f"Contagious: {info.get('contagious','-')}\n\n"
f"Description:\n{info.get('description','-')}\n\n"
f"Symptoms:\nβ€ " + "\nβ€ ".join(info.get("symptoms", [])) + "\n\n"
f"Causes:\nβ€ " + "\nβ€ ".join(info.get("causes", [])) + "\n\n"
f"Precautions:\nβ€ " + "\nβ€ ".join(info.get("precautions", [])) + "\n\n"
f"Treatment:\nβ€ " + "\nβ€ ".join(info.get("treatment", [])) + "\n\n"
"β Educational purpose only. Consult a dermatologist."
)
# π Translate output
final_response = english_response
if user_lang != "en" and TRANSLATOR_AVAILABLE:
try:
final_response = GoogleTranslator(
source="en", target=user_lang
).translate(english_response)
except:
final_response = english_response
return jsonify({
"reply": final_response,
"language": SUPPORTED_LANGUAGES[user_lang]
})
except Exception as e:
print("CHAT ERROR:", e)
return jsonify({"reply": "Server error"}), 500
# -----------------------------
# π TEXT TO SPEECH API (FINAL)
# -----------------------------
@app.route("/tts", methods=["POST"])
def tts():
try:
data = request.get_json(force=True)
text = data.get("text")
lang = data.get("language", "en")
if not text:
return jsonify({"error": "No text provided"}), 400
if lang not in SUPPORTED_LANGUAGES:
lang = "en"
filename = f"tts_{uuid.uuid4()}.mp3"
gTTS(text=text, lang=lang).save(filename)
# π₯ delete file after sending
@after_this_request
def cleanup(response):
try:
os.remove(filename)
except:
pass
return response
return send_file(
filename,
mimetype="audio/mpeg",
as_attachment=False # IMPORTANT for browser play
)
except Exception as e:
print("TTS ERROR:", e)
return jsonify({"error": "TTS failed"}), 500
# -----------------------------
# RUN
# -----------------------------
if __name__ == "__main__":
app.run(host="0.0.0.0", port=7860, debug=True)
|