import gradio as gr from transformers import GPT2LMHeadModel from tokenizers import IndoNLGTokenizer gpt_tokenizer = IndoNLGTokenizer.from_pretrained("indobenchmark/indogpt") gpt_tokenizer.pad_token = gpt_tokenizer.eos_token kancilgpt = GPT2LMHeadModel.from_pretrained("abdiharyadi/kancilgpt") def generate_story(judul: str): yield "...", "..." stop = False while not stop: gpt_input = gpt_tokenizer(' awal cerita | judul:', return_tensors='pt') gpt_out = kancilgpt.generate(**gpt_input, do_sample=True, max_length=512, pad_token_id=gpt_tokenizer.eos_token_id) result = gpt_tokenizer.decode(gpt_out[0]) _, judul_prompt, isi, *end_part = result.split(" | ") end_part = "".join(end_part) _, *judul_words = judul_prompt.split() judul = " ".join(judul_words) if "" in judul or "" in isi or "|" in isi or (not any(end_part.startswith(x) for x in ["bersambung", "tamat"])): print("Invalid output! Regenerating ....") continue quote_count = 0 for c in isi: if c == "\"": quote_count += 1 if quote_count % 2 != 0: print("Invalid output! Regenerating ....") continue stop = True yield judul, isi + " ..." total_isi = isi while not end_part.startswith("tamat"): yield judul, total_isi + " ..." i = 0 in_quote = False end_sentence = False limit = 1750 while i < len(isi) and not (end_sentence and (not in_quote) and isi[i] == " " and (len(isi) - i) < limit): if isi[i] == "\"": in_quote = not in_quote if end_sentence: end_sentence = isi[i] not in "abcdefghijklmnopqrstuvwxyz" else: end_sentence = isi[i] in ".?!" i += 1 # i == len(isi) or end_sentence or (not in_quote) or isi[i] == " " while i < len(isi) and not (isi[i] in "abcdefghijklmnopqrstuvwxyz\""): i += 1 # i == len(isi) or isi[i] in "abcdefghijklmnopqrstuvwxyz\"" if i == len(isi): raise ValueError("What???") next_isi = isi[i:] stop = False while not stop: gpt_input = gpt_tokenizer(f' pertengahan cerita | judul: {judul} | {next_isi}', return_tensors='pt') gpt_out = kancilgpt.generate(**gpt_input, do_sample=True, max_length=512, pad_token_id=gpt_tokenizer.eos_token_id) result = gpt_tokenizer.decode(gpt_out[0]) _, judul_prompt, isi, *end_part = result.split(" | ") end_part = "".join(end_part) _, *judul_words = judul_prompt.split() judul = " ".join(judul_words) if isi[len(next_isi) + 1:].strip() != "": print(isi[len(next_isi) + 1:]) if "" in isi or "|" in isi or (not any(end_part.startswith(x) for x in ["bersambung", "tamat"])): print("Invalid output! Regenerating ....") continue quote_count = 0 for c in isi: if c == "\"": quote_count += 1 if quote_count % 2 != 0: print("Invalid output! Regenerating ....") continue stop = True total_isi += " " + isi[len(next_isi) + 1:] yield judul, total_isi + "\n\ntamat." demo = gr.Interface( fn=generate_story, inputs=None, outputs=[ gr.Textbox(label="judul", lines=1), gr.Textbox(label="cerita", lines=7) ] ) demo.launch()