general_chatbot / app.py
JaweriaGenAI's picture
Update app.py
4efd4d3 verified
raw
history blame
5.25 kB
import gradio as gr
import os, json, re, uuid
from datetime import datetime
from pydub import AudioSegment
import whisper
import requests
import emoji
groq_key = os.getenv("GROQ_API_KEY")
whisper_model = whisper.load_model("base")
def filter_emojis(text):
allowed_emojis = {"😊", "πŸ˜„", "πŸ‘", "πŸ€–", "✨", "πŸŽ‰", "πŸ’¬", "πŸ™Œ", "😎", "πŸ“’", "🧠", "βœ…"}
return "".join(char if char not in emoji.EMOJI_DATA or char in allowed_emojis else "" for char in text)
def chat_with_groq(message, history):
messages = [{"role": "system", "content": "You are JAWERIA'SBOT πŸ€– – cheerful, emoji-savvy, and sleek."}]
messages += history + [{"role": "user", "content": message}]
headers = {
"Authorization": f"Bearer {groq_key}",
"Content-Type": "application/json"
}
payload = {
"model": "llama3-70b-8192",
"messages": messages
}
response = requests.post("https://api.groq.com/openai/v1/chat/completions", headers=headers, json=payload)
if response.status_code != 200:
return "", history, f"❌ API Error {response.status_code}: {response.text}"
raw_reply = response.json()["choices"][0]["message"]["content"]
reply = filter_emojis(raw_reply)
history += [{"role": "user", "content": message}, {"role": "assistant", "content": reply}]
return "", history, history
def transcribe_audio(audio_path):
if audio_path is None or not os.path.exists(audio_path):
return "⚠️ No audio recorded."
try:
temp_wav = f"{uuid.uuid4()}.wav"
AudioSegment.from_file(audio_path).export(temp_wav, format="wav")
result = whisper_model.transcribe(temp_wav)
os.remove(temp_wav)
return result["text"]
except Exception as e:
return f"❌ Transcription error: {e}"
def save_session(history):
prompt = next((m["content"] for m in history if m["role"] == "user"), "chat")
title = re.sub(r"[^\w\s]", "", prompt).strip()
title = " ".join(title.split()[:6])
timestamp = datetime.now().strftime("%b %d %Y %H-%M")
filename = f"{title} - {timestamp}.json"
with open(filename, "w", encoding="utf-8") as f:
json.dump(history, f, indent=2, ensure_ascii=False)
return f"βœ… Saved `{filename[:-5]}`"
def list_saved_files():
return sorted([f[:-5] for f in os.listdir() if f.endswith(".json")])
def load_chat(name):
filename = f"{name}.json"
try:
with open(filename, "r", encoding="utf-8") as f:
history = json.load(f)
return history, history, f"βœ… Loaded `{name}`"
except Exception as e:
return [], [], f"❌ Load error: {e}"
with gr.Blocks(css="""
body { background-color: #111 !important; font-family: 'Segoe UI', sans-serif !important; }
.gr-chatbot { border-radius: 10px; border: 1px solid #333; background-color: #1e1e1e !important; }
.gr-chatbot-message { background-color: #292929 !important; color: #f1f1f1 !important; border-radius: 10px; margin-bottom: 5px; }
textarea, input[type='text'] { background-color: #222 !important; color: #fff !important; border-radius: 8px !important; border: 1px solid #444 !important; padding: 10px; }
.gr-button { background-color: #333 !important; color: #fff !important; border: 1px solid #444 !important; border-radius: 8px; padding: 8px 14px; font-weight: bold; transition: background-color 0.2s; }
.gr-button:hover { background-color: #555 !important; cursor: pointer; }
.gr-dropdown { background-color: #222 !important; color: #fff !important; border-radius: 8px; border: 1px solid #444; padding: 8px; }
h1, h2, h3, .gr-markdown { color: #f1f1f1 !important; text-align: center; }
audio { background-color: #000 !important; border: 1px solid #333 !important; }
""") as demo:
state = gr.State([])
gr.Markdown("# ✨ JAWERIA'SBOT πŸ€–")
gr.Markdown("Speak or type β€” your assistant listens and replies with text and emojis πŸ’¬")
chatbot = gr.Chatbot(type="messages", height=400)
chat_input = gr.Textbox(label="πŸ’¬ Message", placeholder="Type or speak your message...")
send_btn = gr.Button("Send πŸš€")
with gr.Row():
voice_input = gr.Audio(label="🎀 Speak", type="filepath", interactive=True)
voice_btn = gr.Button("πŸŽ™οΈ Transcribe to Text")
with gr.Row():
new_chat_btn = gr.Button("πŸ†• New")
save_btn = gr.Button("πŸ’Ύ Save")
saved_dropdown = gr.Dropdown(label="πŸ“‚ Load Saved", choices=list_saved_files())
load_btn = gr.Button("πŸ“₯ Load")
save_msg = gr.Markdown()
load_msg = gr.Markdown()
send_btn.click(chat_with_groq, inputs=[chat_input, state], outputs=[chat_input, chatbot, state])
chat_input.submit(chat_with_groq, inputs=[chat_input, state], outputs=[chat_input, chatbot, state])
voice_btn.click(transcribe_audio, inputs=[voice_input], outputs=[chat_input])
new_chat_btn.click(fn=lambda: ("", [], []), outputs=[chat_input, chatbot, state])
save_btn.click(fn=save_session, inputs=[state], outputs=[save_msg])
save_btn.click(fn=list_saved_files, outputs=[saved_dropdown])
load_btn.click(fn=load_chat, inputs=[saved_dropdown], outputs=[chatbot, state, load_msg])
demo.load(fn=list_saved_files, outputs=[saved_dropdown])
demo.launch()