import gradio as gr from models.watermark_faster import watermark_model from options import get_parser_main_model opts = get_parser_main_model().parse_args() model = watermark_model(language=opts.language, mode=opts.mode, tau_word=opts.tau_word, lamda=opts.lamda) def create_model(language,tau_word): global model model = watermark_model(language=language, mode=opts.mode, tau_word=tau_word, lamda=opts.lamda) # gr.update(visible=True) return language,tau_word def watermark_embed_demo(raw,tau_word): watermarked_text = model.embed(raw,tau_word) return watermarked_text def watermark_extract(raw): is_watermark, p_value, n, ones, z_value = model.watermark_detector_fast(raw) confidence = (1 - p_value) * 100 return f"{confidence:.2f}%" def precise_watermark_detect(raw,tau_word): is_watermark, p_value, n, ones, z_value = model.watermark_detector_precise(raw,tau_word) confidence = (1 - p_value) * 100 return f"{confidence:.2f}%" demo = gr.Blocks() with demo: with gr.Column(): with gr.Row(): with gr.Column(scale=9): gr.Markdown( """ # 💦[Watermarking Text Generated by Black-Box Language Models](https://arxiv.org/abs/2305.08883) """ ) language = gr.Dropdown( label="Language", choices=["English", "Chinese"], value="English" ) tau_word = gr.Number(label="tau_word", value=0.8) # with gr.Column(): # with gr.Row(): # gr.Markdown("# Watermarking Text Generated by Black-Box Language Models") # with gr.Row(scale=0.25): # language = gr.Dropdown( # label="Language", choices=["English", "Chinese"], value="English" # ) # tau_word = gr.Number(label="tau_word", value=0.8)#gr.Slider(0, 1, value=0.8, label="tau_word", info="Choose between 0 and 1") # model_button = gr.Button("Load Model") # inputs = [language,tau_word] # model_button.click(fn=create_model, inputs=inputs,outputs=[language,tau_word]) with gr.Tab("Welcome"): gr.Markdown( """ This space exhibits a watermarking technique that allows third parties to independently inject an authentication watermark into generated text. We provide implementations for both English and Chinese text (you can select the respective language in the top right corner). Furthermore, you can adjust the value of $\\tau_{word}$ to control the similarity between the original text and the watermarked text. We recommend setting $\\tau_{word}$ at 0.8 for English and 0.75 for Chinese. Generally, a larger $\\tau_{word}$ increases the similarity between the original and watermarked text, but it also weakens the strength of the watermark. More details can be found in our [ArXiv preprint](https://arxiv.org/abs/2305.08883). """ ) gr.Markdown( """ For a better experience, you may duplicate the space and upgrade to GPU in settings. """ ) with gr.Tab("Watermark Injection & Detection"): language.change(fn=create_model, inputs=language,outputs=language) with gr.Row(): inputs = gr.TextArea(label="Input text", placeholder="Copy your text here...") output = gr.Textbox(label="Watermarked Text",lines=7) analysis_button = gr.Button("Inject Watermark") inputs_embed = [inputs,tau_word] analysis_button.click(fn=watermark_embed_demo, inputs=inputs_embed, outputs=output) inputs_w = gr.TextArea(label="Text to Analyze", placeholder="Copy your watermarked text here...") with gr.Row(): mode = gr.Dropdown( label="Detection Mode", choices=["Fast", "Precise"], value="Fast" ) output_detect = gr.Textbox(label="Confidence (the likelihood of the text containing a watermark)") detect_button = gr.Button("Detect") def detect_watermark(inputs_w, mode, tau_word): if mode == "Fast": return watermark_extract(inputs_w) else: return precise_watermark_detect(inputs_w,tau_word) detect_button.click(fn=detect_watermark, inputs=[inputs_w, mode, tau_word], outputs=output_detect) if __name__ == "__main__": gr.close_all() demo.title = "Watermarking Text Generated by Black-Box Language Models" demo.launch()