File size: 7,868 Bytes
523a4a0 6e988a5 523a4a0 54f604e 523a4a0 6e988a5 523a4a0 2b106d0 083e171 523a4a0 083e171 6e988a5 083e171 523a4a0 b78042d 523a4a0 14d2111 083e171 14d2111 2b88d53 14d2111 2b106d0 083e171 54f604e 8e1a910 083e171 54f604e 083e171 6e988a5 083e171 6e988a5 083e171 6e988a5 083e171 6e988a5 083e171 6e988a5 083e171 6e988a5 083e171 6e988a5 083e171 6e988a5 083e171 54f604e 083e171 54f604e 083e171 523a4a0 2b106d0 54f604e 2b106d0 523a4a0 083e171 523a4a0 083e171 523a4a0 083e171 523a4a0 6e988a5 523a4a0 083e171 523a4a0 |
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 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 |
import gradio as gr
import tempfile
import os
from pathlib import Path
from io import BytesIO
from settings import (
respond,
generate_random_string,
reset_interview,
generate_interview_report,
generate_report_from_file,
interview_history,
question_count,
language,
)
from ai_config import convert_text_to_speech, transcribe_audio, n_of_questions
from prompt_instructions import get_interview_initial_message
# Global variables
temp_audio_files = []
initial_audio_path = None
def reset_interview_action():
global question_count, interview_history
question_count = 0
interview_history.clear()
initial_message = get_interview_initial_message()
# Generate new audio for the initial message
initial_audio_buffer = BytesIO()
convert_text_to_speech(initial_message, initial_audio_buffer)
initial_audio_buffer.seek(0)
with tempfile.NamedTemporaryFile(suffix=".mp3", delete=False) as temp_file:
temp_audio_path = temp_file.name
temp_file.write(initial_audio_buffer.getvalue())
temp_audio_files.append(temp_audio_path)
return (
[(None, initial_message)], # Reset chatbot
temp_audio_path, # New audio
gr.File(visible=False), # Hide PDF output
gr.Textbox(visible=True), # Show message input
"Interview reset. You can start a new interview now." # Status message
)
# Initialize Gradio interface
def create_app():
global initial_audio_path
initial_message = get_interview_initial_message()
# Generate the audio for the initial message and save to a temporary file
initial_audio_buffer = BytesIO()
convert_text_to_speech(initial_message, initial_audio_buffer)
initial_audio_buffer.seek(0)
with tempfile.NamedTemporaryFile(suffix=".mp3", delete=False) as temp_file:
initial_audio_path = temp_file.name
temp_file.write(initial_audio_buffer.getvalue())
temp_audio_files.append(initial_audio_path)
with gr.Blocks(title="Clinical Psychologist Interviewer ๐ฟ") as demo:
gr.Markdown(
"""
# Clinical Psychologist Interviewer ๐ฟ
This chatbot conducts clinical interviews based on psychological knowledge.
Please note that this is a simulation and should not be used as a substitute for professional medical advice.
The interviewer will prepare a clinical report based on the interview.
"""
)
with gr.Tab("Interview"):
audio_output = gr.Audio(
label="Sarah",
scale=1,
value=initial_audio_path,
autoplay=True,
visible=True,
show_download_button=False,
)
reset_button = gr.Button("Reset Interview", size='sm')
chatbot = gr.Chatbot(value=[(None, f"{initial_message}")], label=f"Clinical Interview ๐ฟ๐")
with gr.Row():
msg = gr.Textbox(label="Type your message here...", scale=3)
audio_input = gr.Audio(sources=(["microphone"]), label="Record your message", type="filepath", scale=2)
send_button = gr.Button("Send")
pdf_output = gr.File(label="Download Report", visible=False)
def user(user_message, audio, history):
print(audio)
if audio is not None:
user_message = transcribe_audio(audio)
print(user_message)
return "", None, history + [[user_message, None]]
def bot_response(chatbot, message):
global question_count, temp_audio_files
question_count += 1
# Use the last user message from the chatbot history
last_user_message = chatbot[-1][0] if chatbot else message
response, audio_buffer = respond(chatbot, last_user_message)
# Add all bot responses to the chatbot history
for bot_message in response:
chatbot.append((None, bot_message[1]))
if isinstance(audio_buffer, BytesIO):
with tempfile.NamedTemporaryFile(suffix=".mp3", delete=False) as temp_file:
temp_audio_path = temp_file.name
temp_file.write(audio_buffer.getvalue())
temp_audio_files.append(temp_audio_path)
audio_output = temp_audio_path
else:
audio_output = audio_buffer
if question_count >= n_of_questions():
conclusion_message = "Thank you for participating in this interview. We have reached the end of our session. I hope this conversation has been helpful. Take care!"
chatbot.append((None, conclusion_message))
conclusion_audio_buffer = BytesIO()
convert_text_to_speech(conclusion_message, conclusion_audio_buffer)
conclusion_audio_buffer.seek(0)
with tempfile.NamedTemporaryFile(suffix=".mp3", delete=False) as temp_file:
temp_audio_path = temp_file.name
temp_file.write(conclusion_audio_buffer.getvalue())
temp_audio_files.append(temp_audio_path)
audio_output = temp_audio_path
# Generate report automatically
report_content, pdf_path = generate_interview_report(interview_history, language)
# Add report to the chat
chatbot.append((None, f"Interview Report:\n\n{report_content}"))
return chatbot, audio_output, gr.File(visible=True, value=pdf_path), gr.Textbox(visible=False)
return chatbot, audio_output, gr.File(visible=False), gr.Textbox(visible=True)
msg.submit(user, [msg, audio_input, chatbot], [msg, audio_input, chatbot], queue=False).then(
bot_response, [chatbot, msg], [chatbot, audio_output, pdf_output, msg]
)
send_button.click(user, [msg, audio_input, chatbot], [msg, audio_input, chatbot], queue=False).then(
bot_response, [chatbot, msg], [chatbot, audio_output, pdf_output, msg]
)
reset_button.click(
reset_interview_action,
inputs=[],
outputs=[chatbot, audio_output, pdf_output, msg, audio_input]
)
with gr.Tab("Upload Document"):
file_input = gr.File(label="Upload a TXT, PDF, or DOCX file")
language_input = gr.Textbox(label="Preferred Language for Report",
placeholder="Enter language")
generate_button = gr.Button("Generate Report")
report_output = gr.Textbox(label="Generated Report", lines=100)
pdf_output = gr.File(label="Download Report", visible=True)
def generate_report_and_pdf(file, language):
report_content, pdf_path = generate_report_from_file(file, language)
return report_content, pdf_path, gr.File(visible=True)
generate_button.click(
generate_report_and_pdf,
inputs=[file_input, language_input],
outputs=[report_output, pdf_output, pdf_output]
)
return demo
# Clean up function
def cleanup():
global temp_audio_files, initial_audio_path
for audio_file in temp_audio_files:
if os.path.exists(audio_file):
os.unlink(audio_file)
temp_audio_files.clear()
if initial_audio_path and os.path.exists(initial_audio_path):
os.unlink(initial_audio_path)
if __name__ == "__main__":
app = create_app()
try:
app.launch()
finally:
cleanup() |