import gradio as gr import googlemaps from dotenv import load_dotenv import requests import pyperclip import os from PIL import Image from io import BytesIO from transformers import pipeline from messages import * # ---------------------------------------------------------------------------- # # ---------------------------------------------------------------------------- # # ---------------------------------------------------------------------------- # # PREPARATIONS # ---------------------------------------------------------------------------- # # ---------------------------------------------------------------------------- # # ---------------------------------------------------------------------------- # # prepare Google Maps API load_dotenv() API_KEY = os.getenv("GOOGLE_MAPS_API_KEY") gmaps = googlemaps.Client(key=API_KEY) # prepare the HF model save_path = "./saved_model" oracle = pipeline('question-answering', tokenizer=save_path, model=save_path) # ---------------------------------------------------------------------------- # # ---------------------------------------------------------------------------- # # ---------------------------------------------------------------------------- # # FUNCTIONS # ---------------------------------------------------------------------------- # # ---------------------------------------------------------------------------- # # ---------------------------------------------------------------------------- # def extract_func(text, question_input, prev_addresses): oracle_output = oracle(question=question_input, context=text) answer = oracle_output['answer'] prev_addresses += f'{answer}\n' return prev_addresses def get_address(address): geocode_result = gmaps.geocode(address) formatted_address = geocode_result[0].get('formatted_address', address) # encoded_address = urllib.parse.quote(formatted_address) return formatted_address def undo_func(addresses): new_addresses = [line for line in addresses.splitlines()] return_value = '\n'.join(new_addresses[0:-1]) return_value += '\n' return return_value def get_static_map(addresses, zoom=13): adr_list = [] adr_str = '' line_id = 1 for line in addresses.splitlines(): if len(line) < 2: continue address = get_address(line) adr_list.append(address) adr_str += f'&markers=color:red|label:{line_id}|{address}' line_id += 1 url = ( "https://maps.googleapis.com/maps/api/staticmap" "?size=900x900" f"&zoom={zoom}" f"{adr_str}" f"&key={API_KEY}" ) response = requests.get(url) image = Image.open(BytesIO(response.content)) return image # ---------------------------------------------------------------------------- # # ---------------------------------------------------------------------------- # # ---------------------------------------------------------------------------- # # MAIN # ---------------------------------------------------------------------------- # # ---------------------------------------------------------------------------- # # ---------------------------------------------------------------------------- # with gr.Blocks() as demo: gr.Markdown("# ๐Ÿƒโ€โ™‚๏ธโ€โžก๏ธ๐Ÿ“ฆ๐Ÿ“ฆ๐Ÿ“ฆ๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ‘จ๐Ÿ† Locate All Necessary Addresses on the Google Map By Couple Clicks") with gr.Accordion("About the project", open=False): gr.Markdown(""" My wife orders _so many_ things online that sometimes I find myself chasing down a thousand packages scattered all over the cityโ€”and occasionally even in multiple cities. The pickup locations are so random that I have to keep a mental map of all of them and try to figure out the most efficient route, like Iโ€™m collecting Pokรฉmons. Thatโ€™s the pain. And thatโ€™s why I built this little spaceโ€”for me at first, and now for you too! Here, you can simply paste the message you get from the courier (limited only to Hebrew by now), and the amazing model [dicta-il/dictabert-heq](https://huggingface.co/dicta-il/dictabert-heq) will extract the address and add it to your list. Each new line in the address list represents a new location, so feel free to correct or clean up the entries to help the system organize better. Then hit the "Locate" button, and itโ€™ll drop pins for all your packages on the map. When you can literally see all the locations in front of you, it becomes way easier to plan your route! A bit about me: Hi, Iโ€™m Arseniyโ€”and Iโ€™m currently looking for a job. This project is one of several Iโ€™ve created to support my applications. If you like this demo, please consider sharing it, giving it a like on Hugging Face, mentioning it on LinkedIn โ€” or OMG if you're hiring an algorithm developer / scientific researcher (please contact me!!), Iโ€™d be thrilled to connect. ๐Ÿ”ฅ Thanks so much :) """) with gr.Row(): with gr.Column(): # question = gr.Textbox(label='Question', value='ืžื” ื”ื›ืชื•ื‘ืช ืฉืœ ื”ืžืฉืœื•ื— ืฉื™ืฉ ื‘ื”ื•ื“ืขื”?') question = gr.Radio([ "ืžื” ื”ื›ืชื•ื‘ืช?", "ืžื” ื”ื›ืชื•ื‘ืช ืฉืœ ื”ืžืฉืœื•ื— ืฉื™ืฉ ื‘ื”ื•ื“ืขื”?", "ืื™ื–ื• ื›ืชื•ื‘ืช ื‘ื™ืฉืจืืœ ื™ืฉ ื‘ื”ื•ื“ืขื”?" ], value="ืžื” ื”ื›ืชื•ื‘ืช?", label="Questions to the Courier's Message", info="Try different questions...") message_inp = gr.Textbox(label='Input Courier Message', placeholder='Enter the text message...', lines=5) with gr.Row(): clear_btn_1 = gr.Button('Clear') new_paste_btn = gr.Button('Paste') extreact_btn = gr.Button('Extract Address', variant='primary') addresses_inp = gr.Textbox(placeholder='Enter the address...', label='Addresses (every new line is a new address and you can correct it, if needed)', lines=5, max_lines=None) undo_btn = gr.Button('Clear last row...') locate_btn = gr.Button('Locate All', variant='primary') clear_btn_2 = gr.Button('Clear') gr.Markdown('### Examples of messages of couriers') with gr.Row(): example_1_btn = gr.Button('1') example_2_btn = gr.Button('2') example_3_btn = gr.Button('3') example_4_btn = gr.Button('4') with gr.Column(): zoom = gr.Slider(1, 20, 14, step=1) with gr.Row(): b_further = gr.Button('Zoom Out') b_closer = gr.Button('Zoom In') map_out = gr.Image() # events extreact_btn.click(fn=extract_func, inputs=[message_inp, question, addresses_inp], outputs=addresses_inp) # extreact_btn.click(fn=lambda x: '', inputs=message_inp, outputs=message_inp) clear_btn_1.click(fn=lambda x: '', inputs=message_inp, outputs=message_inp) new_paste_btn.click(fn=lambda _: pyperclip.paste(), inputs=message_inp, outputs=message_inp) undo_btn.click(fn=undo_func, inputs=addresses_inp, outputs=addresses_inp) locate_btn.click(fn=get_static_map, inputs=[addresses_inp, zoom], outputs=map_out) locate_btn.click(fn=lambda x: '', inputs=message_inp, outputs=message_inp) clear_btn_2.click(fn=lambda x: '', inputs=addresses_inp, outputs=addresses_inp) example_1_btn.click(fn=lambda x: examples_dict[x], inputs=example_1_btn, outputs=message_inp) example_2_btn.click(fn=lambda x: examples_dict[x], inputs=example_2_btn, outputs=message_inp) example_3_btn.click(fn=lambda x: examples_dict[x], inputs=example_3_btn, outputs=message_inp) example_4_btn.click(fn=lambda x: examples_dict[x], inputs=example_4_btn, outputs=message_inp) zoom.change(fn=get_static_map, inputs=[addresses_inp, zoom], outputs=map_out) b_further.click(fn=lambda x: max(x-1, 1), inputs=zoom, outputs=zoom) b_closer.click(fn=lambda x: min(x+1, 20), inputs=zoom, outputs=zoom) demo.launch() # ---------------------------------------------------------------------------- # # ---------------------------------------------------------------------------- # # ---------------------------------------------------------------------------- # # url = ( # "https://maps.googleapis.com/maps/api/staticmap" # "?size=900x900" # f"&zoom={zoom}" # "&markers=color:blue|label:A|Williamsburg,Brooklyn,NY" # "&markers=color:red|label:B|Prospect+Park,Brooklyn,NY" # f"&key={API_KEY}" # )