|
|
import gradio as gr |
|
|
from gtts import gTTS |
|
|
import tempfile |
|
|
import os |
|
|
import random |
|
|
from typing import List, Optional |
|
|
|
|
|
class HealthTextGenerator: |
|
|
def __init__(self): |
|
|
self.health_templates = { |
|
|
"Nutrisi dan Diet Sehat": { |
|
|
"intro": "Nutrisi yang seimbang adalah kunci utama untuk menjaga kesehatan tubuh. ", |
|
|
"content": [ |
|
|
"Makanan yang kita konsumsi setiap hari memiliki dampak langsung terhadap kesehatan kita. ", |
|
|
"Penting untuk mengonsumsi berbagai jenis makanan yang mengandung nutrisi lengkap. ", |
|
|
"Sayuran hijau seperti bayam, brokoli, dan kale kaya akan vitamin dan mineral. ", |
|
|
"Buah-buahan segar memberikan antioksidan yang melindungi tubuh dari radikal bebas. ", |
|
|
"Protein dari daging tanpa lemak, ikan, dan kacang-kacangan penting untuk pertumbuhan dan perbaikan sel. ", |
|
|
"Karbohidrat kompleks dari beras merah, gandum utuh, dan ubi memberikan energi yang berkelanjutan. ", |
|
|
"Lemak sehat dari alpukat, kacang-kacangan, dan minyak zaitun mendukung fungsi otak dan jantung. " |
|
|
], |
|
|
"tips": [ |
|
|
"Minum air putih minimal 8 gelas per hari untuk menjaga hidrasi tubuh. ", |
|
|
"Hindari makanan olahan yang tinggi gula, garam, dan lemak trans. ", |
|
|
"Makan dalam porsi kecil tapi sering untuk menjaga metabolisme. ", |
|
|
"Kombinasikan protein dengan karbohidrat untuk energi yang optimal. " |
|
|
] |
|
|
}, |
|
|
"Olahraga dan Kebugaran": { |
|
|
"intro": "Olahraga teratur adalah investasi terbaik untuk kesehatan jangka panjang. ", |
|
|
"content": [ |
|
|
"Aktivitas fisik membantu memperkuat otot, tulang, dan sistem kardiovaskular. ", |
|
|
"Olahraga aerobik seperti jogging, bersepeda, dan berenang meningkatkan kapasitas paru-paru. ", |
|
|
"Latihan kekuatan dengan beban atau bodyweight membangun massa otot dan kepadatan tulang. ", |
|
|
"Fleksibilitas melalui yoga dan stretching mencegah cedera dan meningkatkan mobilitas. ", |
|
|
"Olahraga teratur membantu mengontrol berat badan dan mencegah obesitas. ", |
|
|
"Aktivitas fisik merangsang produksi endorfin yang meningkatkan mood dan mengurangi stres. " |
|
|
], |
|
|
"tips": [ |
|
|
"Mulai dengan olahraga ringan selama 30 menit, 3 kali seminggu. ", |
|
|
"Kombinasikan kardio, kekuatan, dan fleksibilitas dalam rutinitas mingguan. ", |
|
|
"Dengarkan tubuh Anda dan istirahat jika merasa lelah berlebihan. ", |
|
|
"Konsultasikan dengan dokter sebelum memulai program olahraga intensif. " |
|
|
] |
|
|
}, |
|
|
"Kesehatan Mental": { |
|
|
"intro": "Kesehatan mental sama pentingnya dengan kesehatan fisik dalam kehidupan sehari-hari. ", |
|
|
"content": [ |
|
|
"Stres kronis dapat mempengaruhi sistem kekebalan tubuh dan kesehatan jantung. ", |
|
|
"Meditasi dan mindfulness membantu mengurangi kecemasan dan meningkatkan fokus. ", |
|
|
"Tidur yang cukup 7-9 jam per malam penting untuk pemulihan mental dan fisik. ", |
|
|
"Hubungan sosial yang positif memberikan dukungan emosional dan mengurangi isolasi. ", |
|
|
"Hobi dan aktivitas kreatif membantu mengekspresikan emosi dan mengurangi stres. ", |
|
|
"Konseling profesional dapat membantu mengatasi masalah mental yang lebih serius. " |
|
|
], |
|
|
"tips": [ |
|
|
"Praktikkan teknik pernapasan dalam saat merasa stres. ", |
|
|
"Jaga rutinitas tidur yang konsisten setiap hari. ", |
|
|
"Luangkan waktu untuk aktivitas yang Anda nikmati. ", |
|
|
"Jangan ragu untuk mencari bantuan profesional jika diperlukan. " |
|
|
] |
|
|
}, |
|
|
"Penyakit Jantung": { |
|
|
"intro": "Penyakit jantung adalah salah satu penyebab kematian utama di dunia, namun dapat dicegah dengan gaya hidup sehat. ", |
|
|
"content": [ |
|
|
"Faktor risiko utama penyakit jantung meliputi tekanan darah tinggi, kolesterol tinggi, dan diabetes. ", |
|
|
"Diet rendah garam dan lemak jenuh membantu menjaga kesehatan jantung. ", |
|
|
"Olahraga teratur 150 menit per minggu dapat mengurangi risiko penyakit jantung hingga 30%. ", |
|
|
"Berhenti merokok adalah langkah terpenting untuk melindungi kesehatan jantung. ", |
|
|
"Stres kronis dapat meningkatkan tekanan darah dan risiko serangan jantung. ", |
|
|
"Pemeriksaan rutin tekanan darah dan kolesterol penting untuk deteksi dini. " |
|
|
], |
|
|
"tips": [ |
|
|
"Konsumsi ikan berlemak seperti salmon 2-3 kali seminggu. ", |
|
|
"Batasi asupan garam maksimal 6 gram per hari. ", |
|
|
"Lakukan aktivitas fisik minimal 30 menit setiap hari. ", |
|
|
"Kelola stres dengan teknik relaksasi dan meditasi. " |
|
|
] |
|
|
}, |
|
|
"Diabetes dan Gula Darah": { |
|
|
"intro": "Diabetes adalah kondisi kronis yang mempengaruhi cara tubuh memproses gula darah. ", |
|
|
"content": [ |
|
|
"Diabetes tipe 2 dapat dicegah dengan menjaga berat badan ideal dan pola makan sehat. ", |
|
|
"Karbohidrat kompleks memiliki indeks glikemik rendah yang lebih baik untuk penderita diabetes. ", |
|
|
"Olahraga teratur membantu meningkatkan sensitivitas insulin dan mengontrol gula darah. ", |
|
|
"Pemantauan gula darah secara rutin penting untuk mencegah komplikasi. ", |
|
|
"Komplikasi diabetes dapat mempengaruhi mata, ginjal, dan sistem saraf. ", |
|
|
"Kerjasama dengan tim medis sangat penting untuk manajemen diabetes yang optimal. " |
|
|
], |
|
|
"tips": [ |
|
|
"Pilih karbohidrat dengan indeks glikemik rendah seperti beras merah. ", |
|
|
"Makan dalam porsi kecil dan sering untuk menjaga gula darah stabil. ", |
|
|
"Kombinasikan karbohidrat dengan protein dan serat. ", |
|
|
"Hindari minuman manis dan makanan olahan tinggi gula. " |
|
|
] |
|
|
}, |
|
|
"Kesehatan Pencernaan": { |
|
|
"intro": "Sistem pencernaan yang sehat adalah fondasi kesehatan tubuh secara keseluruhan. ", |
|
|
"content": [ |
|
|
"Serat dari sayuran, buah, dan biji-bijian membantu melancarkan pencernaan. ", |
|
|
"Probiotik dari yogurt dan makanan fermentasi mendukung bakteri baik di usus. ", |
|
|
"Minum air putih yang cukup membantu melarutkan nutrisi dan melancarkan pencernaan. ", |
|
|
"Makan perlahan dan mengunyah dengan baik memudahkan proses pencernaan. ", |
|
|
"Stres dapat mempengaruhi fungsi pencernaan dan menyebabkan gangguan lambung. ", |
|
|
"Hindari makanan yang terlalu pedas, asam, atau berlemak untuk kesehatan lambung. " |
|
|
], |
|
|
"tips": [ |
|
|
"Konsumsi 25-30 gram serat per hari dari berbagai sumber. ", |
|
|
"Minum segelas air hangat di pagi hari untuk merangsang pencernaan. ", |
|
|
"Hindari makan 2-3 jam sebelum tidur. ", |
|
|
"Konsumsi probiotik secara teratur untuk kesehatan usus. " |
|
|
] |
|
|
} |
|
|
} |
|
|
|
|
|
def generate_health_text(self, topic: str, text_length: str, subtopics: List[str]) -> str: |
|
|
"""Generate health-related text based on topic and subtopics""" |
|
|
|
|
|
|
|
|
template = self.health_templates.get(topic, self.health_templates["Nutrisi dan Diet Sehat"]) |
|
|
|
|
|
|
|
|
subtopics_text = "" |
|
|
if subtopics and any(subtopic.strip() for subtopic in subtopics): |
|
|
valid_subtopics = [s.strip() for s in subtopics if s.strip()] |
|
|
if valid_subtopics: |
|
|
subtopics_text = f" dengan fokus khusus pada: {', '.join(valid_subtopics)}. " |
|
|
|
|
|
|
|
|
article = template["intro"] |
|
|
|
|
|
if subtopics_text: |
|
|
article += subtopics_text |
|
|
|
|
|
|
|
|
content_sentences = template["content"].copy() |
|
|
random.shuffle(content_sentences) |
|
|
|
|
|
if text_length == "Pendek (100-200 kata)": |
|
|
num_sentences = min(3, len(content_sentences)) |
|
|
elif text_length == "Sedang (300-500 kata)": |
|
|
num_sentences = min(6, len(content_sentences)) |
|
|
else: |
|
|
num_sentences = len(content_sentences) |
|
|
|
|
|
|
|
|
for i in range(num_sentences): |
|
|
article += content_sentences[i] |
|
|
|
|
|
|
|
|
tips = template["tips"].copy() |
|
|
random.shuffle(tips) |
|
|
num_tips = min(2, len(tips)) if text_length == "Pendek (100-200 kata)" else min(4, len(tips)) |
|
|
|
|
|
if num_tips > 0: |
|
|
article += "\n\nTips praktis:\n" |
|
|
for i in range(num_tips): |
|
|
article += f"β’ {tips[i]}\n" |
|
|
|
|
|
|
|
|
article += f"\n\nDengan menerapkan prinsip-prinsip kesehatan yang tepat, Anda dapat meningkatkan kualitas hidup dan mencegah berbagai penyakit. Konsultasikan selalu dengan tenaga medis profesional untuk mendapatkan panduan yang sesuai dengan kondisi kesehatan Anda." |
|
|
|
|
|
return article |
|
|
|
|
|
def text_to_speech(self, text: str, language: str = "id") -> str: |
|
|
"""Convert text to speech and return the audio file path""" |
|
|
if not text.strip(): |
|
|
return None |
|
|
|
|
|
try: |
|
|
|
|
|
with tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") as tmp_file: |
|
|
temp_path = tmp_file.name |
|
|
|
|
|
|
|
|
tts = gTTS(text=text, lang=language, slow=False) |
|
|
tts.save(temp_path) |
|
|
|
|
|
return temp_path |
|
|
except Exception as e: |
|
|
print(f"Error in text-to-speech: {e}") |
|
|
return None |
|
|
|
|
|
|
|
|
generator = HealthTextGenerator() |
|
|
|
|
|
|
|
|
HEALTH_TOPICS = [ |
|
|
"Nutrisi dan Diet Sehat", |
|
|
"Olahraga dan Kebugaran", |
|
|
"Kesehatan Mental", |
|
|
"Penyakit Jantung", |
|
|
"Diabetes dan Gula Darah", |
|
|
"Kesehatan Pencernaan", |
|
|
"Kesehatan Kulit", |
|
|
"Kesehatan Mata", |
|
|
"Kesehatan Gigi dan Mulut", |
|
|
"Kesehatan Reproduksi", |
|
|
"Kesehatan Anak", |
|
|
"Kesehatan Lansia", |
|
|
"Pencegahan Kanker", |
|
|
"Kesehatan Tulang dan Sendi", |
|
|
"Kesehatan Pernapasan", |
|
|
"Kesehatan Hati", |
|
|
"Kesehatan Ginjal", |
|
|
"Kesehatan Saraf", |
|
|
"Kesehatan Kardiovaskular", |
|
|
"Kesehatan Imunitas" |
|
|
] |
|
|
|
|
|
def generate_article(topic, text_length, subtopic1, subtopic2, subtopic3, subtopic4, subtopic5): |
|
|
"""Generate health article with given parameters""" |
|
|
subtopics = [subtopic1, subtopic2, subtopic3, subtopic4, subtopic5] |
|
|
subtopics = [s for s in subtopics if s and s.strip()] |
|
|
|
|
|
try: |
|
|
article = generator.generate_health_text(topic, text_length, subtopics) |
|
|
return article, None |
|
|
except Exception as e: |
|
|
return f"Error generating article: {str(e)}", None |
|
|
|
|
|
def convert_to_speech(text): |
|
|
"""Convert generated text to speech""" |
|
|
if not text or not text.strip(): |
|
|
return None |
|
|
|
|
|
try: |
|
|
audio_path = generator.text_to_speech(text) |
|
|
return audio_path |
|
|
except Exception as e: |
|
|
print(f"Error converting to speech: {e}") |
|
|
return None |
|
|
|
|
|
|
|
|
with gr.Blocks( |
|
|
title="Health Article Generator", |
|
|
theme=gr.themes.Soft(), |
|
|
css=""" |
|
|
.gradio-container { |
|
|
max-width: 1200px !important; |
|
|
margin: auto !important; |
|
|
} |
|
|
.main-header { |
|
|
text-align: center; |
|
|
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); |
|
|
color: white; |
|
|
padding: 2rem; |
|
|
border-radius: 10px; |
|
|
margin-bottom: 2rem; |
|
|
} |
|
|
""" |
|
|
) as app: |
|
|
|
|
|
gr.HTML(""" |
|
|
<div class="main-header"> |
|
|
<h1>π₯ Health Article Generator</h1> |
|
|
<p>Generate comprehensive health articles using AI and convert them to speech</p> |
|
|
<p><small>Powered by AI Health Templates</small></p> |
|
|
</div> |
|
|
""") |
|
|
|
|
|
with gr.Row(): |
|
|
with gr.Column(scale=1): |
|
|
gr.Markdown("### βοΈ Settings") |
|
|
|
|
|
topic = gr.Dropdown( |
|
|
choices=HEALTH_TOPICS, |
|
|
label="Pilih Topik Kesehatan", |
|
|
value=HEALTH_TOPICS[0], |
|
|
interactive=True |
|
|
) |
|
|
|
|
|
text_length = gr.Radio( |
|
|
choices=["Pendek (100-200 kata)", "Sedang (300-500 kata)", "Panjang (600-1000 kata)"], |
|
|
label="Panjang Artikel", |
|
|
value="Sedang (300-500 kata)", |
|
|
interactive=True |
|
|
) |
|
|
|
|
|
gr.Markdown("### π Subtopik (Opsional)") |
|
|
gr.Markdown("Tambahkan hingga 5 subtopik untuk fokus artikel:") |
|
|
|
|
|
subtopic1 = gr.Textbox( |
|
|
label="Subtopik 1", |
|
|
placeholder="Contoh: Tips diet sehat", |
|
|
interactive=True |
|
|
) |
|
|
|
|
|
subtopic2 = gr.Textbox( |
|
|
label="Subtopik 2", |
|
|
placeholder="Contoh: Makanan yang harus dihindari", |
|
|
interactive=True |
|
|
) |
|
|
|
|
|
subtopic3 = gr.Textbox( |
|
|
label="Subtopik 3", |
|
|
placeholder="Contoh: Jadwal makan yang baik", |
|
|
interactive=True |
|
|
) |
|
|
|
|
|
subtopic4 = gr.Textbox( |
|
|
label="Subtopik 4", |
|
|
placeholder="Contoh: Suplemen yang direkomendasikan", |
|
|
interactive=True |
|
|
) |
|
|
|
|
|
subtopic5 = gr.Textbox( |
|
|
label="Subtopik 5", |
|
|
placeholder="Contoh: Olahraga pendukung", |
|
|
interactive=True |
|
|
) |
|
|
|
|
|
generate_btn = gr.Button( |
|
|
"π Generate Article", |
|
|
variant="primary", |
|
|
size="lg" |
|
|
) |
|
|
|
|
|
with gr.Column(scale=2): |
|
|
gr.Markdown("### π Generated Article") |
|
|
|
|
|
article_output = gr.Textbox( |
|
|
label="Artikel yang Dihasilkan", |
|
|
lines=15, |
|
|
max_lines=20, |
|
|
interactive=False, |
|
|
show_copy_button=True |
|
|
) |
|
|
|
|
|
with gr.Row(): |
|
|
tts_btn = gr.Button( |
|
|
"π Convert to Speech", |
|
|
variant="secondary" |
|
|
) |
|
|
|
|
|
download_audio = gr.File( |
|
|
label="Download Audio (MP3)", |
|
|
visible=False |
|
|
) |
|
|
|
|
|
gr.Markdown("### π Audio Player") |
|
|
audio_player = gr.Audio( |
|
|
label="Generated Audio", |
|
|
type="filepath", |
|
|
visible=False |
|
|
) |
|
|
|
|
|
|
|
|
generate_btn.click( |
|
|
fn=generate_article, |
|
|
inputs=[topic, text_length, subtopic1, subtopic2, subtopic3, subtopic4, subtopic5], |
|
|
outputs=[article_output, audio_player] |
|
|
) |
|
|
|
|
|
tts_btn.click( |
|
|
fn=convert_to_speech, |
|
|
inputs=[article_output], |
|
|
outputs=[audio_player] |
|
|
) |
|
|
|
|
|
|
|
|
audio_player.change( |
|
|
fn=lambda x: gr.update(visible=True, value=x) if x else gr.update(visible=False), |
|
|
inputs=[audio_player], |
|
|
outputs=[download_audio] |
|
|
) |
|
|
|
|
|
|
|
|
gr.HTML(""" |
|
|
<div style="text-align: center; margin-top: 2rem; padding: 1rem; background-color: #f8f9fa; border-radius: 10px;"> |
|
|
<p><strong>Health Article Generator</strong> - Powered by AI Health Templates</p> |
|
|
<p>Generate comprehensive health articles and convert them to speech for better accessibility</p> |
|
|
</div> |
|
|
""") |
|
|
|
|
|
if __name__ == "__main__": |
|
|
app.launch( |
|
|
server_name="0.0.0.0", |
|
|
server_port=7860, |
|
|
share=False, |
|
|
show_error=True |
|
|
) |
|
|
|