Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import os | |
| import ctranslate2 | |
| from transformers import M2M100Tokenizer | |
| from huggingface_hub import snapshot_download | |
| import time | |
| # Model settings | |
| MODEL_PATH = os.getenv("MODEL_PATH", "skypro1111/m2m100-ukr-verbalization-ct2") | |
| TOKENIZER_PATH = os.getenv("TOKENIZER_PATH", "skypro1111/m2m100-ukr-verbalization") | |
| # Initialize translator and tokenizer globally | |
| def init_model(model_path=MODEL_PATH, tokenizer_path=TOKENIZER_PATH): | |
| print("\nInitializing CTranslate2 model and tokenizer...") | |
| # Download the model from HuggingFace Hub | |
| local_model_path = snapshot_download( | |
| repo_id=model_path, | |
| allow_patterns=["*.bin", "*.json", "tokenizer.json", "vocab.json"], | |
| ) | |
| # Initialize translator with optimizations for CPU | |
| translator = ctranslate2.Translator( | |
| local_model_path, | |
| device="cpu", | |
| compute_type="int8", # Use INT8 quantization for CPU | |
| intra_threads=4, # Adjust based on CPU cores available | |
| ) | |
| # Load tokenizer | |
| tokenizer = M2M100Tokenizer.from_pretrained(tokenizer_path) | |
| tokenizer.src_lang = "uk" | |
| return translator, tokenizer | |
| translator, tokenizer = init_model() | |
| def process_text(text: str): | |
| """Process a single text input using the CTranslate2 model.""" | |
| start_time = time.time() | |
| # Tokenize input | |
| source = tokenizer.convert_ids_to_tokens(tokenizer.encode(text)) | |
| target_prefix = [tokenizer.lang_code_to_token["uk"]] | |
| # Run inference | |
| results = translator.translate_batch( | |
| [source], | |
| target_prefix=[target_prefix], | |
| beam_size=1, | |
| num_hypotheses=1, | |
| use_vmap=True, | |
| ) | |
| # Get target tokens and decode | |
| target = results[0].hypotheses[0][1:] # Remove language token | |
| output = tokenizer.decode(tokenizer.convert_tokens_to_ids(target)) | |
| inference_time = time.time() - start_time | |
| return output, inference_time | |
| def inference(text): | |
| """Gradio interface function.""" | |
| output, inference_time = process_text(text) | |
| return output, f"{inference_time:.3f} секунд" | |
| # Define examples from inference_ct2.py | |
| examples = [ | |
| ["Моя бабуся народилася 07.11.1919, у важкий післявоєнний час."], | |
| ["Зустріч призначена на 15:30 12.05.2025 у конференц-залі №3."], | |
| ["Телефонуйте нам за номером +380 (44) 123-45-67 або 0800 500 123."], | |
| ["Температура повітря сьогодні становить +25°C, а тиск 750 мм.рт.ст."], | |
| ["ТОВ «Мрія» було засновано 28/06/2022 з початковим капіталом 50 тис. грн."], | |
| ["Швидкість вітру 15 м/с, видимість 10 км, вологість 65%."], | |
| ["Потяг №743 Київ-Львів відправляється о 08:45 з платформи №2."], | |
| ["Ціна на пальне зросла на 2,5 грн/л і становить 54,99 грн."], | |
| ["Площа квартири 75,5 м², висота стелі 2,75 м."], | |
| ["Відстань між містами становить 450 км або 280 миль."], | |
| ["Станом на 7:00 15 квітня 2025 року температура повітря становить +18°C, вологість 60%."] | |
| ] | |
| # Define Gradio interface | |
| with gr.Blocks() as interface: | |
| gr.Markdown("# Вербалізація українського тексту (M2M100-CT2)") | |
| gr.Markdown("""Модель для перетворення чисел, дат, одиниць вимірювання та інших символьних позначень | |
| у їх текстовий запис українською мовою. Використовує оптимізовану CTranslate2 версію для швидкого інференсу.""") | |
| with gr.Row(): | |
| with gr.Column(): | |
| input_text = gr.Textbox( | |
| label="Введіть текст для вербалізації", | |
| placeholder="Наприклад: Температура повітря сьогодні становить +25°C" | |
| ) | |
| submit_btn = gr.Button("Вербалізувати") | |
| gr.Examples( | |
| examples=examples, | |
| inputs=input_text, | |
| ) | |
| with gr.Column(): | |
| output_text = gr.Textbox(label="Вербалізований текст") | |
| inference_time = gr.Textbox(label="Час обробки") | |
| gr.Markdown(""" | |
| ### Можливості моделі: | |
| - Дати та час | |
| - Телефонні номери | |
| - Одиниці вимірювання | |
| - Грошові суми | |
| - Числові вирази | |
| ### Технічні деталі: | |
| - Базова модель: facebook/m2m100_418M | |
| - Оптимізація: CTranslate2 з INT8 квантизацією | |
| """) | |
| submit_btn.click( | |
| fn=inference, | |
| inputs=input_text, | |
| outputs=[output_text, inference_time], | |
| ) | |
| # Launch the interface | |
| interface.launch(share=False) |