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""" # Get template for the topic or use default template = self.health_templates.get(topic, self.health_templates["Nutrisi dan Diet Sehat"]) # Prepare subtopics text 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)}. " # Start building the article article = template["intro"] if subtopics_text: article += subtopics_text # Add content based on length 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: # Panjang num_sentences = len(content_sentences) # Add content sentences for i in range(num_sentences): article += content_sentences[i] # Add tips section 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" # Add conclusion 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: # Create temporary file with tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") as tmp_file: temp_path = tmp_file.name # Generate speech 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 # Initialize the generator generator = HealthTextGenerator() # Health topics 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 # Create Gradio interface 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("""

🏥 Health Article Generator

Generate comprehensive health articles using AI and convert them to speech

Powered by AI Health Templates

""") 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 ) # Event handlers 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] ) # Show download button when audio is generated 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] ) # Footer gr.HTML("""

Health Article Generator - Powered by AI Health Templates

Generate comprehensive health articles and convert them to speech for better accessibility

""") if __name__ == "__main__": app.launch( server_name="0.0.0.0", server_port=7860, share=False, show_error=True )