File size: 3,576 Bytes
f37379e 430a018 314ca3b f37379e ffe3c09 f37379e 0b7105c f37379e 0b7105c f37379e d110365 f37379e a337b22 f37379e 430a018 f37379e d110365 23fba37 430a018 803eeb9 23fba37 f37379e 23fba37 0b7105c 23fba37 0b7105c 430a018 0b7105c 16c32a6 23fba37 430a018 eeac776 23fba37 d110365 430a018 f37379e 430a018 |
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 101 102 103 104 105 106 107 108 109 110 111 112 113 |
import os
api_key = os.environ.get('api_key')
from openai import OpenAI
import gradio as gr
import codecs
import base64
import json
def login(username, password):
try:
users = json.loads(os.environ.get('users'))
return users[username] == password
except: return False
print("Start")
client = OpenAI(api_key=api_key)
assistants = client.beta.assistants.list()
for a in assistants:
if "Patient Sim" in a.name:
client.beta.assistants.delete(a.id)
instruction = codecs.open("instruction.txt", "r", "utf-8").read()
instruction = "You are helpful assistant. Keep your responses clear and concise."
model = "gpt-4o"
model = "gpt-3.5-turbo"
assistant = client.beta.assistants.create(name="Patient Sim", instructions=instruction, model=model)
toggle_js = open("toggle_speech.js").read()
play_js = open("play.js").read()
def start_thread():
return client.beta.threads.create()
def user(text, audio, history, thread):
if audio:
text = transcribe(audio)
print(f"User: {text}")
message = client.beta.threads.messages.create(thread_id=thread.id, role="user", content=text)
return "", history + [[text, None]]
def bot(history, thread):
stream = client.beta.threads.runs.create(thread_id=thread.id, assistant_id=assistant.id, stream=True)
history[-1][1] = ""
for event in stream:
try:
delta = event.data.delta.content[0].text.value
history[-1][1] += delta
yield history
except: pass
def transcribe(file):
print(f"Transcribe: {file}")
file = open(file, "rb")
response = client.audio.transcriptions.create(
file=file,
model="whisper-1",
language="en",
response_format="text"
)
return response
def speak(history):
text = history[-1][1]
print(f"Assistant: {text}")
speech = client.audio.speech.create(model="tts-1", voice="alloy", input=text)
audio = base64.b64encode(speech.read()).decode("utf-8")
src = f"data:audio/mpeg;base64,{audio}"
audio_element = f'<audio src="{src}" controls></audio>'
return audio_element
def vote(data: gr.LikeData):
if data.liked:
print("You upvoted this response: " + data.value)
else:
print("You downvoted this response: " + data.value)
css = """
.container {height: 100vh;}
#title_markdown {height: 10%;}
#chatbot {height: 60%;}
#speech {height: 10%;}
#textbox {height: 60%;}
footer{display:none !important}
"""
with gr.Blocks(title="Paitient Sim", css=css) as demo:
with gr.Column(elem_classes=["container"]):
gr.Markdown("""
# Patient Sim
Say goodbye to end the session and receive a feedback.
""", elem_id="title_markdown")
chatbot = gr.Chatbot(label="Messages", elem_id="chatbot")
chatbot.like(vote, None, None)
speech = gr.Button("Record", size="sm", elem_id="speech")
speech.click(None, js=toggle_js)
msg = gr.Textbox(label="Say something.", elem_id="textbox")
mic = gr.Microphone(type="filepath", format="mp3", editable=False, waveform_options={"show_controls": False}, visible=False, elem_id="recorder")
thread = gr.State(start_thread)
audio_html = gr.HTML(visible=False, elem_id="player")
msg.submit(user, [msg, mic, chatbot, thread], [msg, chatbot]).then(
bot, [chatbot, thread], chatbot).then(
speak, chatbot, audio_html).then(
None, None, None, js=play_js
)
mic.stop_recording(user, [msg, mic, chatbot, thread], [msg, chatbot]).then(
lambda:None, None, mic).then(
bot, [chatbot, thread], chatbot).then(
speak, chatbot, audio_html).then(
None, None, None, js=play_js
)
#demo.queue()
demo.launch(auth=login)
|