import gradio as gr import assemblyai as aai from transformers import pipeline import os from supabase import create_client, Client from datetime import datetime import csv from typing import Optional # Add your AssemblyAI API key as Environment Variable aai.settings.api_key = os.environ['Assembly'] url: str = os.environ['DBUrl'] key: str = os.environ['DBKey'] # Initialize question answering pipeline question_answerer = pipeline("question-answering", model='distilbert-base-cased-distilled-squad') # List of questions questions = [ "How old is the patient?", "What is the gender?", "What is the chief complaint regarding the patient's oral health?", "List the Medical history mentioned", "Give the Dental history in detail", "Please give all the clinical findings which were listed" ] # Oral Health Assessment Form oral_health_assessment_form = [ "Doctor's Name", "Location", "Patient's Name", "Age", "Gender", "Chief complaint", "Medical history", "Dental history", "Clinical Findings", "Treatment plan", "Referred to", "Calculus", "Stains" ] # Function to generate answers for the questions def generate_answer(question: str, context: str) -> str: result = question_answerer(question=question, context=context) return result['answer'] # Function to handle audio recording and transcription def transcribe_audio(audio_path: str) -> str: print(f"Received audio file at: {audio_path}") if not os.path.exists(audio_path): return "Error: Audio file does not exist." if os.path.getsize(audio_path) == 0: return "Error: Audio file is empty." try: transcriber = aai.Transcriber() print("Starting transcription...") transcript = transcriber.transcribe(audio_path) print("Transcription process completed.") if transcript.status == aai.TranscriptStatus.error: print(f"Error during transcription: {transcript.error}") return transcript.error else: context = transcript.text print(f"Transcription text: {context}") return context except Exception as e: print(f"Exception occurred: {e}") return str(e) # Function to fill in the answers for the text boxes def fill_textboxes(context: str) -> list: answers = [] for question in questions: answer = generate_answer(question, context) answers.append(answer) # Map answers to form fields in the correct order and return as a list return [ answers[0] if len(answers) > 0 else "", # Age answers[1] if len(answers) > 1 else "", # Gender answers[2] if len(answers) > 2 else "", # Chief complaint answers[3] if len(answers) > 3 else "", # Medical history answers[4] if len(answers) > 4 else "", # Dental history answers[5] if len(answers) > 5 else "", # Clinical Findings "", # Referred to "", # Calculus "", # Stains ] # Supabase configuration supabase: Client = create_client(url, key) def handle_transcription(audio: str, doctor_name: str, location: str) -> list: context = transcribe_audio(audio) if "Error" in context: # Fill all fields with the error message return [context] * (len(textboxes_left) + len(textboxes_right) + 3) # +3 for doctor_name, location, and treatment_plan answers = fill_textboxes(context) # Insert Doctor's Name and Location in the appropriate fields return [doctor_name, location] + answers + [""] # Empty string for treatment_plan dropdown def save_answers(doctor_name: str, location: str, patient_name: str, age: str, gender: str, chief_complaint: str, medical_history: str, dental_history: str, clinical_findings: str, treatment_plan: str, referred_to: str, calculus: str, stains: str) -> str: current_datetime = datetime.now().isoformat() answers_dict = { "Doctor's Name": doctor_name, "Location": location, "Patient's Name": patient_name, "Age": age, "Gender": gender, "Chief complaint": chief_complaint, "Medical history": medical_history, "Dental history": dental_history, "Clinical Findings": clinical_findings, "Treatment plan": treatment_plan, "Referred to": referred_to, "Calculus": calculus, "Stains": stains, "Submission Date and Time": current_datetime } print("Saved answers:", answers_dict) try: response = supabase.table('oral_health_assessments').insert(answers_dict).execute() print("Data inserted into Supabase:", response.data) return f"Saved answers: {answers_dict}" except Exception as e: print(f"Error inserting data into Supabase: {e}") return f"Error saving answers: {e}" def download_table_to_csv() -> Optional[str]: response = supabase.table("oral_health_assessments").select("*").execute() if not response.data: print("No data found in the table.") return None data = response.data csv_data = [] if len(data) > 0: csv_data.append(data[0].keys()) # Write header for row in data: csv_data.append(row.values()) # Write row values csv_file = "your_table.csv" with open(csv_file, "w", newline='') as f: writer = csv.writer(f) writer.writerows(csv_data) print("Downloaded table oral_health_assessments") return csv_file def gradio_download() -> Optional[str]: file_path = download_table_to_csv() if file_path: return file_path return None # Create the Gradio interface with gr.Blocks() as demo: gr.Markdown("# OHA Form Filler App") with gr.Tabs() as tabs: with gr.Tab("Doctor Info"): doctor_name_input = gr.Textbox(label="Doctor's Name", interactive=True) location_input = gr.Textbox(label="Location", interactive=True) submit_button = gr.Button("Submit") info_output = gr.HTML(label="Submitted Info") def submit_info(name, loc): return f"Doctor's Name: {name}
Location: {loc}" submit_button.click(fn=submit_info, inputs=[doctor_name_input, location_input], outputs=info_output) with gr.Tab("OHA Form"): audio_input = gr.Audio(type="filepath", label="Record your audio", elem_id="audio_input") transcribe_button = gr.Button("Transcribe and Generate Form", elem_id="transcribe_button", interactive=False) def enable_transcribe_button(audio): if audio: return gr.update(interactive=True) return gr.update(interactive=False) audio_input.change(fn=enable_transcribe_button, inputs=audio_input, outputs=transcribe_button) with gr.Row(elem_id="textboxes_row"): with gr.Column(): doctor_name_display = gr.Textbox(label="Doctor's Name", value="", interactive=False) location_display = gr.Textbox(label="Location", value="", interactive=False) patient_name_input = gr.Textbox(label="Patient's Name", value="", interactive=True) textboxes_left = [gr.Textbox(label=oral_health_assessment_form[i], value="", interactive=True) for i in range(3, 9)] # Age, Gender, Chief complaint, Medical history, Dental history, Clinical Findings with gr.Column(): textboxes_right = [ gr.Dropdown(choices=["None", "Oral Medicine and Radiology", "Periodontics", "Oral Surgery", "Conservative and Endodontics", "Prosthodontics", "Pedodontics", "Orthodontics"], label="Referred to", interactive=True), gr.Dropdown(choices=["+", "++", "+++"], label="Calculus", interactive=True), gr.Dropdown(choices=[ "+", "++", "+++"], label="Stains", interactive=True), ] treatment_plan_dropdown = gr.Dropdown(choices=["Scaling", "Filling", "Pulp therapy/RCT", "Extraction", "Medication"], label="Treatment plan", interactive=True) oha_output = gr.Textbox(label="OHA Output", value="", interactive=False) save_button = gr.Button("Save to Supabase", elem_id="save_button", interactive=True) # Update the transcription and form fields when the transcribe button is clicked transcribe_button.click( fn=handle_transcription, inputs=[audio_input, doctor_name_input, location_input], outputs=[doctor_name_display, location_display] + textboxes_left + textboxes_right + [treatment_plan_dropdown] ) # Save the form data to Supabase when the save button is clicked save_button.click( fn=save_answers, inputs=[doctor_name_display, location_display, patient_name_input] + textboxes_left + [treatment_plan_dropdown] + textboxes_right, outputs=[oha_output] ) with gr.Tab("Download Data"): download_button = gr.Button("Download CSV") download_output = gr.File(label="Download the CSV File", interactive=False) download_button.click(fn=gradio_download, inputs=[], outputs=download_output) # Launch the Gradio app demo.launch(share=True)