Spaces:
Sleeping
Sleeping
File size: 7,460 Bytes
a743eab 8593387 7166f82 de062b2 ef60d1f a7c7d5d 5a3b176 8593387 7166f82 43b6c17 7166f82 ef60d1f 7166f82 ef60d1f 37fb05d 4e4575b 7166f82 8593387 4e4575b 8593387 ef60d1f 7166f82 ef60d1f 37fb05d ef60d1f a7c7d5d ef60d1f 2169527 37fb05d a7c7d5d 2169527 a7c7d5d f46e5cc 0d9be8f 37fb05d a7c7d5d 37fb05d 2169527 37fb05d a7c7d5d 2169527 7166f82 ef60d1f 37fb05d |
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 |
import gradio as gr
import assemblyai as aai
from transformers import pipeline
import pandas as pd
import os
# Replace with your AssemblyAI API key
aai.settings.api_key = "62acec891bb04c339ec059b738bedac6"
# Initialize question answering pipeline
question_answerer = pipeline("question-answering", model='distilbert-base-cased-distilled-squad')
# List of questions
questions = [
"Which grade is the child studying?",
"How old is the child?",
"What is the gender?",
"Can you provide the name and location of the child's school?",
"What are the names of the child's guardians or parents?",
"What is the chief complaint regarding the child's oral health? If there is none, just say the word 'none', else elaborate only on medication history",
"Can you provide any relevant medical history for the child? If there is none, just say the word 'none', else elaborate",
"Does the child take any medications regularly? If there is none, just say the word 'none'. If yes, please specify.",
"When was the child's previous dental visit? If no visits before, just say the word 'first' or mention the visit number and nothing else",
"Does the child have any habits such as thumb sucking, tongue thrusting, nail biting, or lip biting? If yes, just list them and don't provide any further details",
"Does the patient brush their teeth? Just use the words 'once daily', 'twice daily', or 'thrice daily' to answer, nothing else",
"Does the child experience bleeding gums? Just say 'yes' or 'no' for this and nothing else",
"Has the child experienced early childhood caries? Just say 'yes' or 'no' and nothing else",
"Please mention if tooth decay is present with tooth number(s), else just say the word 'none' and nothing else",
"Have any teeth been fractured? If yes, please mention the tooth number(s), else just say 'none' and nothing else",
"Is there any pre-shedding mobility of teeth? If yes, please specify, else just say 'none' and nothing else",
"Does the child have malocclusion? If yes, please provide details, else just say the word 'none' and nothing else",
"Does the child experience pain, swelling, or abscess? If yes, please provide details, else just say 'none' and nothing else",
"Are there any other findings you would like to note?",
"What treatment plan do you recommend? Choose only from Options: (Scaling, Filling, Pulp therapy/RCT, Extraction, Medication, Referral) and nothing else"
]
oral_health_assessment_form = [
"Doctor’s Name",
"Child’s Name",
"Grade",
"Age",
"Gender",
"School name and place",
"Guardian/Parents name",
"Chief complaint",
"Medical history",
"Medication history",
"Previous dental visit",
"Habits",
"Brushing habit",
"Bleeding gums",
"Early Childhood caries",
"Decayed",
"Fractured teeth",
"Preshedding mobility",
"Malocclusion",
"Does the child have pain, swelling or abscess? (Urgent care need)",
"Any other finding",
"Treatment plan",
]
# Function to generate answers for the questions
def generate_answer(question, context):
result = question_answerer(question=question, context=context)
return result['answer']
# Function to handle audio recording and transcription
def transcribe_audio(audio_path):
print(f"Received audio file at: {audio_path}")
# Check if the file exists and is not empty
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:
# Transcribe the audio file using AssemblyAI
transcriber = aai.Transcriber()
print("Starting transcription...")
transcript = transcriber.transcribe(audio_path)
print("Transcription process completed.")
# Handle the transcription result
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 DataFrame with answers
def fill_dataframe(context):
data = []
for question in questions:
answer = generate_answer(question, context)
data.append({"Question": question, "Answer": answer})
return pd.DataFrame(data)
# Main Gradio app function
def main(audio):
context = transcribe_audio(audio)
if "Error" in context:
return context
df = fill_dataframe(context)
# Add doctor's and patient's name to the beginning of the DataFrame
df = pd.concat([pd.DataFrame({"Question": ["Doctor’s Name", "Child’s Name"], "Answer": ["Dr. Charles Xavier", ""]}), df])
# Add a title to the DataFrame
df['Question'] = oral_health_assessment_form
# Convert DataFrame to HTML table with editable text boxes
table_html = df.to_html(index=False, escape=False, formatters={"Answer": lambda x: f'<input type="text" value="{x}" />'})
# Add JavaScript to capture changes and submit
custom_js = """
<script>
function getTableData() {
var table = document.querySelector('table');
var data = [];
for (var i = 1, row; row = table.rows[i]; i++) {
var question = row.cells[0].innerText;
var answer = row.cells[1].querySelector('input').value;
data.push({question: question, answer: answer});
}
return data;
}
function submitTableData() {
var data = getTableData();
fetch('/submit_table_data', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(data),
})
.then(response => response.json())
.then(data => {
document.querySelector('#submit_status').innerText = 'Data submitted successfully!';
})
.catch((error) => {
console.error('Error:', error);
});
}
document.querySelector('#submit_button').addEventListener('click', submitTableData);
</script>
"""
return table_html + custom_js
# Function to handle submit button and store table data in dictionary
def submit_table_data(data):
tabledata = {item['question']: item['answer'] for item in data}
print("Submitted Table Data: ", tabledata)
return f"Data submitted successfully! {tabledata}"
# Create the Gradio interface
with gr.Blocks() as demo:
gr.Markdown("# Audio Transcription and Question Answering App")
with gr.Row():
with gr.Column():
audio_input = gr.Audio(type="filepath", label="Record your audio")
output_html = gr.HTML(label="Assessment Form")
with gr.Column():
transcribe_button = gr.Button("Transcribe and Generate Form")
submit_button = gr.Button("Submit", elem_id="submit_button")
submit_status = gr.Textbox(label="Submit Status", elem_id="submit_status")
transcribe_button.click(fn=main, inputs=audio_input, outputs=output_html)
demo.add_event_listener('submit_table_data', fn=submit_table_data, inputs=None, outputs=submit_status)
# Launch the app
demo.launch()
|