Spaces:
Sleeping
Sleeping
File size: 3,233 Bytes
be06d90 | 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 | import streamlit as st
import os
from audio_recorder_streamlit import audio_recorder
from streamlit_float import *
import base64
from openai import OpenAI
api_key = os.getenv("openapikey")
client = OpenAI(api_key=api_key)
def get_answer(messages):
system_message = [{"role": "system", "content": "You are an helpful AI chatbot, that answers questions asked by User."}]
messages = system_message + messages
response = client.chat.completions.create(
model="gpt-3.5-turbo-1106",
messages=messages
)
return response.choices[0].message.content
def speech_to_text(audio_data):
with open(audio_data, "rb") as audio_file:
transcript = client.audio.transcriptions.create(
model="whisper-1",
response_format="text",
file=audio_file
)
return transcript
def text_to_speech(input_text):
response = client.audio.speech.create(
model="tts-1",
voice="nova",
input=input_text
)
webm_file_path = "temp_audio_play.mp3"
with open(webm_file_path, "wb") as f:
response.stream_to_file(webm_file_path)
return webm_file_path
def autoplay_audio(file_path: str):
with open(file_path, "rb") as f:
data = f.read()
b64 = base64.b64encode(data).decode("utf-8")
md = f"""
<audio autoplay>
<source src="data:audio/mp3;base64,{b64}" type="audio/mp3">
</audio>
"""
st.markdown(md, unsafe_allow_html=True)
# Initialize floating features for the interface
float_init()
# Initialize session state for managing chat messages
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?"}]
initialize_session_state()
st.title("OpenAI Conversational Chatbot 🤖")
# Create a container for the microphone and audio recording
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🤔..."):
final_response = get_answer(st.session_state.messages)
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;") |