import streamlit as st from gradio_client import Client import speech_recognition as sr import pyttsx3 import threading # Initialize session state if "messages" not in st.session_state: st.session_state["messages"] = [] # Store chat history # Function to generate a response using Gradio client def generate_response(query): try: client = Client("Gopikanth123/llama2") result = client.predict(query=query, api_name="/predict") return result except Exception as e: return f"Error communicating with the Gradio backend: {e}" # Function to handle user input and bot response def handle_user_input(user_input): if user_input: # Add user message to session state st.session_state["messages"].append({"user": user_input}) # Generate bot response response = generate_response(user_input) st.session_state["messages"].append({"bot": response}) # Speak out bot response in a new thread to avoid blocking threading.Thread(target=speak_text, args=(response,), daemon=True).start() # Function for Speech Recognition (Voice Input) def recognize_speech(): recognizer = sr.Recognizer() with sr.Microphone() as source: st.info("Listening... Speak into the microphone.") try: audio = recognizer.listen(source, timeout=5, phrase_time_limit=10) recognized_text = recognizer.recognize_google(audio) st.session_state["user_input"] = recognized_text # Set recognized text to input field st.success(f"Recognized Text: {recognized_text}") handle_user_input(recognized_text) except sr.WaitTimeoutError: st.warning("Listening timed out. No speech detected. Please try again.") except sr.UnknownValueError: st.error("Sorry, I couldn't understand the audio. Try speaking more clearly.") except sr.RequestError: st.error("Could not request results; please check your internet connection.") except Exception as e: st.error(f"An unexpected error occurred: {e}") # Function to speak text (Voice Output) def speak_text(text): engine = pyttsx3.init() engine.stop() # Ensure no previous loop is running engine.say(text) engine.runAndWait() # Main Streamlit app st.set_page_config(page_title="Llama2 Chatbot", page_icon="🤖", layout="wide") st.markdown( """ """, unsafe_allow_html=True ) st.title("🤖 Chat with Llama2 Bot") st.markdown( """ Welcome to the *Llama2 Chatbot*! - *Type* your message below, or - *Use the microphone* to speak to the bot. """ ) # Display chat history chat_history_container = st.container() with chat_history_container: # st.markdown("### Chat History") # st.markdown("
", unsafe_allow_html=True) # Update chat history dynamically def update_chat_history(): chat_history = st.session_state["messages"] for msg in chat_history: if "user" in msg: st.markdown(f"
You: {msg['user']}
", unsafe_allow_html=True) if "bot" in msg: st.markdown(f"
Bot: {msg['bot']}
", unsafe_allow_html=True) # Add input field within a form with st.form(key='input_form', clear_on_submit=True): user_input = st.text_input("Type your message here...", placeholder="Hello, how are you?") submit_button = st.form_submit_button("Send") # Handle form submission if submit_button: handle_user_input(user_input) # update_chat_history() # Separate button for speech recognition outside of the form if st.button("Speak"): recognize_speech() # update_chat_history() st.markdown("### Chat History") # Update chat history on every interaction update_chat_history()