| 
							 | 
						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) | 
					
					
						
						| 
							 | 
						     | 
					
					
						
						| 
							 | 
						    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.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() | 
					
					
						
						| 
							 | 
						
 |