Spaces:
Sleeping
Sleeping
import base64 | |
import os | |
import openai | |
import streamlit as st | |
from audio_recorder_streamlit import audio_recorder | |
from utils.helper import * | |
# API KEY | |
st.set_page_config(layout="wide") | |
api_key = os.environ["OPENAI_API_KEY"] | |
# Initialize the ChatBot with the OpenAI API key and a protocol. | |
assistant = ChatBot( | |
api_key=api_key, | |
protocol=""" | |
You are a helpful assistant. | |
""", | |
) | |
# Set the title of the Streamlit app | |
st.title("Voice Command Here") | |
# Initialize session state for conversation history | |
if "history" not in st.session_state: | |
st.session_state.history = [] | |
# Create two columns | |
col1, col2 = st.columns(2) | |
# Column 1: Audio control and playback | |
with col1: | |
# Set the initial status to "recording" | |
status = "recording" | |
# Record audio from the user | |
audio_bytes = audio_recorder( | |
text="Click here to record!", | |
recording_color="#e8b62c", | |
neutral_color="#6aa36f", | |
icon_name="user", | |
icon_size="6x", | |
) | |
with st.expander("Expand/collapse to listen to your own audio:"): | |
if audio_bytes: | |
# If audio is recorded, play the audio in the app | |
st.audio(audio_bytes, format="audio/wav") | |
# Define the filename for the recorded audio | |
some_string = generate_random_string() | |
audio_file = f"audio_{some_string}.wav" | |
# Save the recorded audio to a file | |
status = "" | |
with open(audio_file, "wb") as f: | |
try: | |
f.write(audio_bytes) | |
status = "Recording saved successfully." | |
st.success("Success.") # Notify the user that the audio has been saved | |
except: | |
st.warning( | |
"Please record audio." | |
) # Warn the user if the audio could not be saved | |
if len(status) > 1: | |
# If the audio file has been saved successfully | |
# Open the saved audio file for reading | |
audio_file = open(audio_file, "rb") | |
# Transcribe the audio using OpenAI's Whisper model | |
transcript = assistant.client.audio.transcriptions.create( | |
model="whisper-1", file=audio_file | |
) | |
# Extract the transcribed text | |
prompt = transcript.text | |
# Add user input to session state history | |
st.session_state.history.append(f"π€ User: {prompt}") | |
# Generate a response from the assistant using the transcribed text | |
response = assistant.generate_response(prompt) | |
# Add assistant response to session state history | |
st.session_state.history.append(f"π€ Bot: {response}") | |
try: | |
# Clear existing audio elements | |
st.empty() | |
# Convert the assistant's response to speech using OpenAI's TTS model | |
response_voice = assistant.client.audio.speech.create( | |
model="tts-1", voice="alloy", input=response | |
) | |
# Define the filename for the generated speech | |
some_string_out = generate_random_string() | |
speech_file_path = f"output_{some_string_out}.mp3" | |
# Save the generated speech to a file | |
response_voice.write_to_file(speech_file_path) | |
# Play the generated speech in the app | |
autoplay_audio(speech_file_path) | |
st.success( | |
"Autoplay attempted." | |
) # Notify the user that autoplay was attempted | |
except: | |
st.error( | |
"No response file found." | |
) # Display an error if the response file could not be found | |
# Column 2: Display conversation history | |
with col2: | |
st.header("Conversation History") | |
for entry in st.session_state.history: | |
st.markdown(entry) | |