File size: 3,872 Bytes
22808ba
 
 
67005eb
22808ba
 
 
 
 
 
 
 
59b3ced
 
 
 
 
 
 
 
 
 
 
 
 
22808ba
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
67005eb
22808ba
 
 
59b3ced
22808ba
59b3ced
 
22808ba
 
 
 
 
 
 
67005eb
22808ba
 
59b3ced
22808ba
 
8cf1ab9
82bfd91
22808ba
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
82bfd91
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
import os
from flask import Flask, render_template, request, jsonify, send_file
from transformers import AutoModelForCausalLM, AutoTokenizer
from deep_translator import GoogleTranslator
from gtts import gTTS
import uuid

# Initialize Flask app
app = Flask(__name__)

# Load the DeepSeek-V3 model and tokenizer
model_name = "deepseek-ai/DeepSeek-V3"
revision = "main"  # Pin to a specific revision if needed

try:
    tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True, revision=revision)
    model = AutoModelForCausalLM.from_pretrained(
        model_name,
        trust_remote_code=True,
        revision=revision,
        quantization_config=None  # Disable quantization
    )
except Exception as e:
    print(f"Error loading model: {e}")
    raise

# Supported languages for translation
SUPPORTED_LANGUAGES = {
    "english": "en", "hindi": "hi", "bengali": "bn", "telugu": "te", "marathi": "mr",
    "tamil": "ta", "gujarati": "gu", "kannada": "kn", "malayalam": "ml", "punjabi": "pa",
    "odia": "or", "urdu": "ur", "assamese": "as", "sanskrit": "sa", "arabic": "ar",
    "chinese": "zh-CN", "dutch": "nl", "french": "fr", "filipino": "tl", "greek": "el",
    "indonesian": "id", "italian": "it", "japanese": "ja", "korean": "ko", "latin": "la",
    "nepali": "ne", "portuguese": "pt", "romanian": "ro", "russian": "ru", "spanish": "es",
    "swedish": "sv", "thai": "th", "ukrainian": "uk", "turkish": "tr"
}

# Temporary directory for audio files
AUDIO_DIR = "audio"
os.makedirs(AUDIO_DIR, exist_ok=True)

# Handle user queries using DeepSeek-V3
def handle_query(query):
    inputs = tokenizer(query, return_tensors="pt")
    outputs = model.generate(
        inputs.input_ids,
        max_length=50,
        num_return_sequences=1,
        temperature=0.7,
        pad_token_id=tokenizer.eos_token_id
    )
    response = tokenizer.decode(outputs[0], skip_special_tokens=True)
    return response.strip()

# Generate response and translate if needed
def generate_response(query, language):
    try:
        bot_response = handle_query(query)
        target_lang = SUPPORTED_LANGUAGES.get(language.lower(), "en")
        if target_lang != "en":
            bot_response = GoogleTranslator(source='en', target=target_lang).translate(bot_response)
        return bot_response
    except Exception as e:
        return f"Error fetching the response: {str(e)}"

# Convert text to speech using gTTS
def text_to_speech(text, lang="en"):
    try:
        audio_filename = f"{uuid.uuid4()}.mp3"
        audio_path = os.path.join(AUDIO_DIR, audio_filename)
        tts = gTTS(text=text, lang=lang)
        tts.save(audio_path)
        return audio_path
    except Exception as e:
        print(f"Error generating speech: {e}")
        return None

# Flask routes
@app.route('/')
def index():
    return render_template('index.html')

@app.route('/chat', methods=['POST'])
def chat():
    try:
        data = request.json
        user_message = data.get("message")
        language = data.get("language", "english").lower()

        if not user_message:
            return jsonify({"response": "Please say something!", "audio_url": None})

        bot_response = generate_response(user_message, language)
        target_lang = SUPPORTED_LANGUAGES.get(language, "en")
        audio_path = text_to_speech(bot_response, lang=target_lang)

        if audio_path:
            audio_url = f"/audio/{os.path.basename(audio_path)}"
        else:
            audio_url = None

        return jsonify({"response": bot_response, "audio_url": audio_url})
    except Exception as e:
        return jsonify({"response": f"An error occurred: {str(e)}", "audio_url": None})

@app.route('/audio/<filename>')
def serve_audio(filename):
    return send_file(os.path.join(AUDIO_DIR, filename), mimetype="audio/mp3")

if __name__ == '__main__':
    app.run(debug=True)