Views
No views yet
m2m100-ukr-verbalization is a fine-tuned version of the facebook/m2m100_418M model, specifically designed for the task of verbalizing Ukrainian text to prepare it for Text-to-Speech (TTS) systems. This model aims to transform structured data like numbers, dates, measurements, and other non-verbal elements into their fully expanded textual representations in Ukrainian.1# training script for fine-tuning M2M100 model on Ukrainian verbalization dataset
2import os
3from datasets import load_dataset
4from transformers import (
5 M2M100ForConditionalGeneration,
6 M2M100Tokenizer,
7 DataCollatorForSeq2Seq,
8 Seq2SeqTrainingArguments,
9 Seq2SeqTrainer
10)
11import torch
12
13def main():
14 model_name = "facebook/m2m100_418M"
15 dataset_path = os.path.join(os.path.dirname(__file__), "dataset_ubertext_1kk_cleaned_m2m100.json")
16 output_dir = os.path.join(os.path.dirname(__file__), "../m2m100-ukr-verbalization")
17
18 # load dataset
19 raw_datasets = load_dataset("json", data_files={"train": dataset_path})
20 # load tokenizer and model
21 tokenizer = M2M100Tokenizer.from_pretrained(model_name)
22 model = M2M100ForConditionalGeneration.from_pretrained(model_name)
23
24 # set source language to Ukrainian
25 tokenizer.src_lang = "uk"
26 # set target language to Ukrainian for verbatim generation
27 tokenizer.tgt_lang = "uk"
28
29 max_input_length = 128
30 max_target_length = 128
31
32 def preprocess_function(examples):
33 inputs = examples["text"]
34 targets = examples["verbalized"]
35 model_inputs = tokenizer(
36 inputs,
37 max_length=max_input_length,
38 truncation=True,
39 padding="max_length"
40 )
41 # tokenize targets
42 with tokenizer.as_target_tokenizer():
43 labels = tokenizer(
44 targets,
45 max_length=max_target_length,
46 truncation=True,
47 padding="max_length"
48 )
49 model_inputs["labels"] = labels["input_ids"]
50 return model_inputs
51
52 # tokenize and prepare dataset
53 tokenized_datasets = raw_datasets["train"].map(
54 preprocess_function,
55 batched=True,
56 remove_columns=["text", "verbalized"],
57 num_proc=8,
58 load_from_cache_file=True,
59 )
60
61 # data collator for seq2seq tasks
62 data_collator = DataCollatorForSeq2Seq(
63 tokenizer,
64 model=model,
65 label_pad_token_id=-100
66 )
67
68 # training arguments
69 training_args = Seq2SeqTrainingArguments(
70 output_dir=output_dir,
71 overwrite_output_dir=True,
72 per_device_train_batch_size=28,
73 num_train_epochs=3,
74 learning_rate=1e-5,
75 save_strategy="epoch",
76 logging_steps=50,
77 fp16=torch.cuda.is_available(),
78 )
79
80 # initialize trainer
81 trainer = Seq2SeqTrainer(
82 model=model,
83 args=training_args,
84 train_dataset=tokenized_datasets,
85 tokenizer=tokenizer,
86 data_collator=data_collator
87 )
88
89 # start training
90 trainer.train()
91 trainer.save_model(output_dir)1# inference script for Ukrainian verbalization model using M2M100
2import os
3import time
4import torch
5from transformers import M2M100ForConditionalGeneration, M2M100Tokenizer
6
7def process_sentence(model, tokenizer, sentence: str, device: str = "cuda"):
8 # Tokenize input
9 inputs = tokenizer(
10 sentence,
11 return_tensors="pt",
12 padding=True,
13 truncation=True,
14 max_length=128
15 ).to(device)
16
17 # Run inference
18 with torch.inference_mode(), torch.cuda.amp.autocast():
19 outputs = model.generate(
20 input_ids=inputs["input_ids"],
21 attention_mask=inputs["attention_mask"],
22 forced_bos_token_id=tokenizer.get_lang_id("uk"),
23 max_length=128,
24 num_beams=1,
25 do_sample=False,
26 early_stopping=True,
27 use_cache=True,
28 repetition_penalty=1.0,
29 length_penalty=1.0,
30 pad_token_id=tokenizer.pad_token_id,
31 eos_token_id=tokenizer.eos_token_id,
32 )
33
34 # Decode output
35 return tokenizer.decode(outputs[0], skip_special_tokens=True)
36
37# Example sentences
38sentences = [
39 "Моя бабуся народилася 07.11.1919, у важкий післявоєнний час.",
40 "Зустріч призначена на 15:30 12.05.2025 у конференц-залі №3.",
41 "Телефонуйте нам за номером +380 (44) 123-45-67 або 0800 500 123.",
42 "Температура повітря сьогодні становить +25°C, а тиск 750 мм.рт.ст.",
43 "ТОВ «Мрія» було засновано 28/06/2022 з початковим капіталом 50 тис. грн."
44]1. Input : Моя бабуся народилася 07.11.1919, у важкий післявоєнний час.
Output: Моя бабуся народилася сьомого листопада тисяча дев'ятсот дев'ятнадцятого року, у важкий післявоєнний час.
Time : 0.531 seconds
2. Input : Зустріч призначена на 15:30 12.05.2025 у конференц-залі №3.
Output: Зустріч призначена на пʼятнадцяту тридцять 12.05.2025 у конференц-залі номер три.
Time : 0.434 seconds
3. Input : Телефонуйте нам за номером +380 (44) 123-45-67 або 0800 500 123.
Output: Телефонуйте нам за номером плюс триста вісімдесят (сорок чотири) сто двадцять три, сорок пʼять, шістдесят сім або нуль вісімсот пʼятсот, сто двадцять три.
Time : 0.828 seconds
4. Input : Температура повітря сьогодні становить +25°C, а тиск 750 мм.рт.ст.
Output: Температура повітря сьогодні становить плюс двадцять п'ять градусів Цельсія, а тиск сімсот п'ятдесят міліметрів р.т.ст.
Time : 0.586 seconds
5. Input : ТОВ «Мрія» було засновано 28/06/2022 з початковим капіталом 50 тис. грн.
Output: Товариство з обмеженою відповідальністю «Мрія» було засновано двадцять восьмого червня дві тисячі двадцять другого року з початковим капіталом пʼятдесят тисяч гривень.
Time : 0.719 seconds
6. Input : Швидкість вітру 15 м/с, видимість 10 км, вологість 65%.
Output: Швидкість вітру п'ятнадцять метрів за секунду, видимість десять кілометрів, вологість шістдесят п'ять відсотків.
Time : 0.612 seconds
7. Input : Потяг №743 Київ-Львів відправляється о 08:45 з платформи №2.
Output: Потяг номер сімсот сорок три Київ-Львів відправляється о восьмій годині сорок пʼять хвилин з платформи номер два.
Time : 0.527 seconds
8. Input : Ціна на пальне зросла на 2,5 грн/л і становить 54,99 грн.
Output: Ціна на пальне зросла на два з половиною гривні за літр і становить п'ятдесят чотири гривні дев'яносто дев'ять копійок.
Time : 0.634 seconds
9. Input : Площа квартири 75,5 м², висота стелі 2,75 м.
Output: Площа квартири сімдесят п'ять цілих п'ять десятих квадратних метрів, висота стелі два цілих сімдесят п'ять сотих метрів.
Time : 0.582 seconds
10. Input : Відстань між містами становить 450 км або 280 миль.
Output: Відстань між містами становить чотириста п'ятдесят кілометрів або двісті вісімдесят миль.
Time : 0.453 seconds
Total time: 5.90 seconds
Average time per sentence: 0.590 seconds@article{fan2020beyond,
title={Beyond English-Centric Multilingual Machine Translation},
author={Fan, Angela and Bhosale, Shruti and Schwenk, Holger and Ma, Zhiyi and El-Kishky, Ahmed and Goyal, Siddharth and Baines, Mandeep and Celebi, Onur and Wenzek, Guillaume and Chaudhary, Vishrav and Goyal, Naman and Birch, Tom and Liptchinsky, Vitaliy and Edunov, Sergey and Auli, Michael and Joulin, Armand},
journal={arXiv preprint},
year={2020}
}@inproceedings{chaplynskyi-2023-introducing,
title = "Introducing {U}ber{T}ext 2.0: A Corpus of Modern {U}krainian at Scale",
author = "Chaplynskyi, Dmytro",
booktitle = "Proceedings of the Second Ukrainian Natural Language Processing Workshop",
month = may,
year = "2023",
address = "Dubrovnik, Croatia",
publisher = "Association for Computational Linguistics",
url = "https://aclanthology.org/2023.unlp-1.1",
pages = "1--10",
}