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)