File size: 2,274 Bytes
18a35e1
 
 
2bf8ad3
8498878
18a35e1
2bf8ad3
18a35e1
 
 
 
8498878
18a35e1
8498878
 
 
 
 
 
18a35e1
8498878
 
 
9b51f9d
8498878
2bf8ad3
8498878
 
 
 
 
c0b6253
8498878
 
 
 
 
2bf8ad3
8498878
9b51f9d
 
8498878
2bf8ad3
8498878
 
2bf8ad3
 
 
c2b1d8b
 
 
 
 
 
 
 
 
 
18a35e1
 
c2b1d8b
 
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
import gradio as gr
from transformers import pipeline, AutoTokenizer, AutoModelForCausalLM
import torch
import json
import re

MODEL_ID = "cahya/gpt2-small-indonesian-522M"

tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)
model = AutoModelForCausalLM.from_pretrained(MODEL_ID, torch_dtype=torch.float32, device_map={"": "cpu"})

generator = pipeline("text-generation", model=model, tokenizer=tokenizer)

def clean_and_extract_json(text):
    json_start = text.find('{')
    if json_start >= 0:
        text = text[json_start:]
    text = re.sub(r"```json|```", "", text).strip()
    return text

def generate_ui(prompt):
    out = generator(prompt, max_new_tokens=180, do_sample=True, top_p=0.95, top_k=40, temperature=0.8)
    raw_text = out[0]["generated_text"]

    cleaned_text = clean_and_extract_json(raw_text)
    try:
        parsed = json.loads(cleaned_text)
        script = parsed.get("script", "").strip()
        caption = parsed.get("caption", "").strip()
        hashtags = parsed.get("hashtags", [])
        if not script or not caption or not isinstance(hashtags, list):
            raise ValueError("Missing or invalid fields")
        return {
            "script": script,
            "caption": caption,
            "hashtags": hashtags
        }
    except Exception:
        fallback_script = raw_text.strip()
        if prompt in fallback_script:
            fallback_script = fallback_script.replace(prompt, "").strip()
        fallback_caption = fallback_script.split(".")[0].strip() or "Simak info menarik ini!"
        return {
            "script": fallback_script,
            "caption": fallback_caption,
            "hashtags": ["#indonesia", "#fyp"]
        }

# Use gr.Blocks to enable enable_api properly
with gr.Blocks() as demo:
    prompt_input = gr.Textbox(lines=6, placeholder="Masukkan prompt...")
    output_json = gr.JSON()
    generate_btn = gr.Button("Generate")

    generate_btn.click(fn=generate_ui, inputs=prompt_input, outputs=output_json)

    gr.Markdown("# TikTok Script Generator")
    gr.Markdown("Generates short Indonesian scripts (JSON).")

if __name__ == "__main__":
    # IMPORTANT: Use `api_open=True` instead of enable_api (since Gradio 3.40+)
    demo.launch(server_name="0.0.0.0", port=7860, api_open=True)