Spaces:
Sleeping
Sleeping
# This code is based on a YouTube video from | |
# https://www.youtube.com/@parttimelarry | |
import os | |
import gradio as gr | |
import openai | |
from gtts import gTTS # Google Text To Speech | |
# load the api key | |
openai.api_key = os.environ["OPEN_AI_KEY"] | |
# takes an audio file from the microphone | |
# submits the raw audio to OpenAI for | |
# Speech to Text Translation | |
# input from Microphone Component | |
# output to User Input - Textbox Component | |
def transcribe(audio): | |
audio_file = open(audio, "rb") | |
# Call the transcribe method with the file-like object | |
transcript = openai.Audio.transcribe("whisper-1", audio_file) | |
return transcript["text"] | |
# Create a Gradio App using Blocks | |
with gr.Blocks() as demo: | |
gr.Markdown( | |
""" | |
# Welcome to the Virtual Therapist Chat Bot! | |
""" | |
) | |
with gr.Accordion("Click for Instructions:"): | |
gr.Markdown( | |
""" | |
* Tell the therapist your problems, by recording your query. | |
* Submit your query, and follow the chat or listen to the Therapists advice. | |
* When you are ready to respond, clear your last recording and resubmit. | |
note: Transcribe Audio does not work on iOS | |
""") | |
# First message as instructions to OpenAI | |
# Establishes a State object to create a | |
# unique state for each user and on reload | |
messages = gr.State(value=[{"role": "system", "content": "You are a therapist. Respond in less than 5 sentences."}]) | |
# Takes the users transcribed audio as a string | |
# Takes the messages list as a reference | |
# Sends the ongoing chat log to OpenAI | |
# input from User Input - Textbox Component | |
# output to Chat Log - Textbox Component | |
def botResponse(user_input, messages): | |
# adds the user input to the ongoing chat log | |
# and submits the log to OpenAI | |
messages.append({"role": "user", "content": user_input}) | |
response = openai.ChatCompletion.create( | |
model="gpt-3.5-turbo-0301", | |
messages=messages | |
) | |
# Parse the response from OpenAI and store | |
# it in the chat log | |
system_message = response["choices"][0]["message"]["content"] | |
messages.append({"role": "assistant", "content": system_message}) | |
# Process the messages list to get the | |
# chat log into a string. Exclude the | |
# System responses from the string | |
chat_transcript = "" | |
for message in messages: | |
if (message["role"] != "system"): | |
chat_transcript += message["role"] + ": " + message["content"] + "\n\n" | |
return chat_transcript | |
# Gets the last message in the | |
# chat log and uses GTTS to | |
# convert the last response into | |
# an audio file. Returns a path to | |
# the converted text as an mp3 file | |
# input from messages as a reference | |
# output to GPT Voice - Audio Component | |
def giveVoice(messages): | |
bot_message=messages[-1] | |
myobj = gTTS(text=bot_message["content"]) | |
myobj.save("temp.mp3") | |
dir = os.getcwd() | |
new_path = os.path.join(dir, "temp.mp3") | |
return new_path | |
# Creates the Gradio interface objects | |
# The submit button triggers a cascade of | |
# events that each engage a different | |
# component as input/output | |
with gr.Row(): | |
with gr.Column(scale=1): | |
user_audio = gr.Audio(source="microphone", type="filepath", label="Input Phrase") | |
submit_btn = gr.Button(value="Transcribe Audio") | |
submit_btn2 = gr.Button(value="Submit Text") | |
gpt_voice = gr.Audio(label="Therapists Advice") | |
with gr.Column(scale=2): | |
user_transcript = gr.Text(label="Audio Translation", interactive=False) | |
user_text = gr.Text(label="Text Input") | |
gpt_transcript = gr.Text(label="Chat Transcript") | |
submit_btn.click(transcribe, user_audio, user_transcript) | |
submit_btn2.click(botResponse, [user_text, messages], gpt_transcript) | |
user_transcript.change(botResponse, [user_transcript, messages], gpt_transcript) | |
gpt_transcript.change(giveVoice, messages, gpt_voice) | |
# creates a local web server | |
# if share=True creates a public | |
# demo on huggingface.co | |
demo.launch(share=False) |