File size: 3,557 Bytes
f37379e 39fed75 20a13a6 39fed75 f37379e dc6cc04 f37379e 943acb7 f37379e 430cba4 f37379e 430cba4 f37379e a337b22 f37379e f22c88d f37379e 430cba4 ae3adbe f37379e dc6cc04 5418c20 dc6cc04 943acb7 ae3adbe a337b22 dc6cc04 ae3adbe dc6cc04 a337b22 dc6cc04 943acb7 dc6cc04 f37379e dc6cc04 |
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 114 |
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):
users = json.loads(os.environ.get('users'))
return users[username] == password
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():
print("start_thread")
return client.beta.threads.create()
def user(text, audio, history, thread):
if audio:
text = transcribe(audio)
print("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("Assistant:", text)
speech = client.audio.speech.create(model="tts-1", voice="alloy", input=text).read()
audio = base64.b64encode(speech).decode("utf-8")
audio_element = f'<audio src="data:audio/mpeg;base64,{audio}"></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}
"""
def main():
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")
thread = gr.State(start_thread)
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")
player = gr.HTML(elem_id="player", visible=False)
msg.submit(user, [msg, mic, chatbot, thread], [msg, chatbot]).then(
bot, [chatbot, thread], chatbot).then(
speak, chatbot, player, 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, player, js=play_js
)
demo.queue()
demo.launch(auth=login)
if __name__ == "__main__":
main()
|