File size: 3,457 Bytes
f37379e
 
 
 
 
 
39fed75
 
 
20a13a6
39fed75
f37379e
 
dc6cc04
f37379e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f22c88d
f37379e
 
 
 
 
 
 
 
 
 
 
 
 
 
f22c88d
f37379e
 
 
 
 
 
 
 
 
 
 
 
 
7dbb133
2781a45
5cda8bb
f37379e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
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()

def start_thread():
	return client.beta.threads.create()

def user(text, audio, history, thread):
	if audio:
		text = transcribe(audio)
	print(f"Message: {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]
	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 autoplay></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")
			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)
			thread = gr.State(start_thread)
			audio_html = gr.HTML(visible=False)
			msg.submit(user, [msg, mic, chatbot, thread], [msg, chatbot]).then(
				bot, [chatbot, thread], chatbot).then(
				speak, chatbot, audio_html
			)
			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
			)
		
	demo.queue()
	demo.launch(auth=login)
	
if __name__ == "__main__":
	main()