File size: 3,119 Bytes
afe4a62
450f755
9fe39cc
 
 
9c931f4
9fe39cc
0135b7b
c84008c
2303bce
9ddce39
2303bce
 
9fe39cc
 
 
 
 
 
 
 
 
 
 
 
 
058d081
9fe39cc
 
 
 
 
 
 
 
 
 
 
 
 
13faa7d
9fe39cc
 
 
 
 
 
 
b76d0bb
9fe39cc
 
 
 
 
 
b76d0bb
9fe39cc
 
 
 
 
 
 
948da99
 
 
 
 
450f755
 
 
 
 
9fe39cc
b76d0bb
13faa7d
9fe39cc
 
b76d0bb
9fe39cc
13faa7d
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
import streamlit as st
import hmac
import os
from helpers import text_to_speech, autoplay_audio, speech_to_text, get_api_key
from generate_answer import base_model_chatbot, with_pdf_chatbot
from audio_recorder_streamlit import audio_recorder
from streamlit_float import *
from PIL import Image 

# Display image/logo in the "Course Query Assistant" section (optional)
voice = Image.open("8090687.png")  # Ensure the file is in the correct directory
st.image(voice, width=150)  # Adjust the size as per preference

def main(answer_mode: str):
    # Float feature initialization
    float_init()

    # Prompt for API key
    api_key = get_api_key()
    if not api_key:
        st.error("You must provide a valid OpenAI API Key to proceed.")
        st.stop()

    def initialize_session_state():
        if "messages" not in st.session_state:
            st.session_state.messages = [
                {"role": "assistant", "content": "Hi! How may I assist you today? (Please Speak Clearly)"}
            ]

    initialize_session_state()

    st.title("OpenAI Conversational Chatbot 🤖")

    # Create footer container for the microphone
    footer_container = st.container()
    with footer_container:
        audio_bytes = audio_recorder()

    for message in st.session_state.messages:
        with st.chat_message(message["role"]):
            st.write(message["content"])

    if audio_bytes:
        # Write the audio bytes to a file
        with st.spinner("Transcribing..."):
            webm_file_path = "temp_audio.mp3"
            with open(webm_file_path, "wb") as f:
                f.write(audio_bytes)

            transcript = speech_to_text(webm_file_path)
            if transcript:
                st.session_state.messages.append({"role": "user", "content": transcript})
                with st.chat_message("user"):
                    st.write(transcript)
                os.remove(webm_file_path)

    if st.session_state.messages[-1]["role"] != "assistant":
        with st.chat_message("assistant"):
            with st.spinner("Thinking🤔..."):
                if answer_mode == 'base_model':
                    final_response = base_model_chatbot(st.session_state.messages)
                elif answer_mode == 'pdf_chat':
                    final_response = with_pdf_chatbot(st.session_state.messages)
    
                # Add final check for punctuation and completeness
                if not final_response.strip()[-1] in ".!?":
                    final_response += " This is the end of the response. Let me know if you need anything else."
    
            with st.spinner("Generating audio response..."):
                audio_file = text_to_speech(final_response)
                autoplay_audio(audio_file)
            st.write(final_response)
            st.session_state.messages.append({"role": "assistant", "content": final_response})
            os.remove(audio_file)


    # Float the footer container and provide CSS to target it with
    footer_container.float("bottom: 0rem;")

if __name__ == "__main__":
    main(answer_mode='base_model')  # Or: answer_mode='pdf_chat'