File size: 16,571 Bytes
2c4cdea
 
 
 
ff6b62d
2c4cdea
 
 
 
ff6b62d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2c4cdea
 
 
ff6b62d
 
 
2c4cdea
 
 
 
 
 
ff6b62d
2c4cdea
ff6b62d
 
2c4cdea
ff6b62d
 
2c4cdea
ff6b62d
 
 
2c4cdea
ff6b62d
 
 
 
 
 
2c4cdea
ff6b62d
 
 
2c4cdea
ff6b62d
 
 
 
2c4cdea
ff6b62d
 
 
 
2c4cdea
ff6b62d
 
00b3dfa
ff6b62d
2c4cdea
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ff6b62d
2c4cdea
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ff6b62d
2c4cdea
 
 
 
 
 
 
 
 
 
 
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
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
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("""
    <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
            )
    
    # 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("""
    <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
    )