Spaces:
Running
Running
import os | |
import faster_whisper | |
import gradio as gr | |
from dotenv import load_dotenv | |
from huggingface_hub import InferenceClient | |
# Load API key dari .env | |
load_dotenv() | |
HF_API_KEY = os.getenv("HF_API_KEY") | |
if not HF_API_KEY: | |
raise ValueError( | |
"API Key Hugging Face tidak ditemukan. Pastikan file .env berisi HF_API_KEY." | |
) | |
# Inisialisasi klien API Hugging Face | |
huggingface_client = InferenceClient(api_key=HF_API_KEY) | |
# Load Faster Whisper model versi large | |
model = faster_whisper.WhisperModel("turbo", device="cpu", compute_type="int8") | |
# Daftar model yang dapat dipilih | |
MODEL_OPTIONS = [ | |
"mistralai/Mistral-Small-3.1-24B-Instruct-2503", | |
"mistralai/Mistral-7B-Instruct-v0.3", | |
"deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", | |
"Qwen/Qwen2.5-Coder-32B-Instruct", | |
] | |
def save_to_file(content, filename): | |
with open(filename, "w", encoding="utf-8") as file: | |
file.write(content) | |
return filename | |
def transcribe_audio(audio_path): | |
"""Transkripsi audio menggunakan Faster Whisper tanpa koreksi model Hugging Face.""" | |
segments, _ = model.transcribe(audio_path) | |
raw_transcription = " ".join(segment.text for segment in segments) | |
return ( | |
raw_transcription, | |
save_to_file(raw_transcription, "transcription_large.txt"), | |
audio_path, | |
) | |
def generate_soap_summary(transcription_text, selected_model): | |
"""Membuat ringkasan SOAP dari teks transkripsi menggunakan model yang dipilih.""" | |
template = """ | |
Anda adalah asisten medis yang membantu dokter dalam menyusun catatan SOAP berdasarkan percakapan dokter dan pasien. | |
Ringkaskan dalam bentuk paragraf tanpa adanya bullet point dan gunakan bahasa Indonesia. | |
Harap buat ringkasan dalam format berikut: | |
Subjective: | |
Objective: | |
Assessment: | |
Plan: | |
### Percakapan: | |
{dialogue} | |
### Catatan SOAP: | |
""" | |
messages = [ | |
{"role": "user", "content": template.format(dialogue=transcription_text)} | |
] | |
response = huggingface_client.chat.completions.create( | |
model=selected_model, messages=messages, max_tokens=1000, stream=False | |
) | |
soap = response.choices[0].message.content.strip() | |
return soap, save_to_file(soap, "soap_summary.txt") | |
def detect_medical_tags(transcription_text, selected_model): | |
"""Mendeteksi tags Diagnosis, Obat, Hasil Lab, dan Radiologi menggunakan model yang dipilih.""" | |
template = """ | |
Identifikasi dan berikan luaran dalam bahasa indonesia tags berikut dari percakapan: | |
Diagnosis: | |
Obat: | |
Hasil Lab: | |
Radiologi: | |
### Percakapan: | |
{dialogue} | |
""" | |
messages = [ | |
{"role": "user", "content": template.format(dialogue=transcription_text)} | |
] | |
response = huggingface_client.chat.completions.create( | |
model=selected_model, messages=messages, max_tokens=500, stream=False | |
) | |
tags = response.choices[0].message.content.strip() | |
return tags, save_to_file(tags, "medical_tags.txt") | |
# Antarmuka Gradio | |
with gr.Blocks( | |
title="AI-based Medical SOAP Summarization and Tag Detection with Faster Whisper Large" | |
) as app: | |
gr.Markdown( | |
"## Medical SOAP Summarization and Tag Detection with Faster Whisper Large" | |
) | |
with gr.Row(): | |
with gr.Column(): | |
model_selector = gr.Dropdown( | |
choices=MODEL_OPTIONS, | |
value="mistralai/Mistral-Small-3.1-24B-Instruct-2503", | |
label="π Pilih Model AI", | |
) | |
audio_input = gr.Audio("microphone", type="filepath", label="ποΈ Rekam Suara") | |
transcribe_button = gr.Button("π§ Transkripsi dengan Whisper Large") | |
transcription_edit_box = gr.Textbox( | |
label="π Hasil Transkripsi (Faster Whisper Large) - Bisa Diedit", | |
lines=3, | |
interactive=True, | |
) | |
update_transcription_button = gr.Button("πΎ Simpan Hasil Edit") | |
soap_button = gr.Button("π Buat SOAP") | |
tags_button = gr.Button("π·οΈ Deteksi Tags") | |
with gr.Column(): | |
soap_output = gr.Textbox(label="π Hasil SOAP", lines=10, interactive=False) | |
tags_output = gr.Textbox( | |
label="π·οΈ Hasil Tags Diagnosis, Obat, Hasil Lab, Radiologi", | |
lines=10, | |
interactive=False, | |
) | |
download_audio = gr.File(label="β¬οΈ Download Rekaman") | |
download_transcription = gr.File(label="β¬οΈ Download Transkripsi") | |
download_soap = gr.File(label="β¬οΈ Download SOAP") | |
download_tags = gr.File(label="β¬οΈ Download Tags") | |
# Tombol Transkripsi | |
transcribe_button.click( | |
transcribe_audio, | |
inputs=[audio_input], | |
outputs=[transcription_edit_box, download_transcription, download_audio], | |
) | |
# Tombol Simpan Hasil Edit | |
update_transcription_button.click( | |
lambda text: (text, save_to_file(text, "user_edited_transcription.txt")), | |
inputs=[transcription_edit_box], | |
outputs=[transcription_edit_box, download_transcription], | |
) | |
# Tombol SOAP | |
soap_button.click( | |
generate_soap_summary, | |
inputs=[transcription_edit_box, model_selector], | |
outputs=[soap_output, download_soap], | |
) | |
# Tombol Tags | |
tags_button.click( | |
detect_medical_tags, | |
inputs=[transcription_edit_box, model_selector], | |
outputs=[tags_output, download_tags], | |
) | |
# Jalankan aplikasi | |
app.launch(share=True) | |