FastSpeech2_HS / NumberToText.py
Aditya02's picture
Upload folder using huggingface_hub
91fc676 verified
import os
import csv
class NumberDictionary:
def __init__(self):
directoryPath = "numToText"
# print(directoryPath)
languages = self.get_filenames_in_folder(directoryPath)
# print(languages, directoryPath)
self.lang_num_dictionary = self.load_language_dictionary(directoryPath, languages)
# print(self.lang_num_dictionary)
def get_filenames_in_folder(self,folder_path):
file_list = []
# Loop through the files in the directory
for filename in os.listdir(folder_path):
# Check if it's a file (not a subdirectory)
if os.path.isfile(os.path.join(folder_path, filename)):
file_list.append(filename[:-4])
return file_list
def load_language_dictionary(self, directory_path, file_names):
lang_num_dictionary = {}
for file_name in file_names:
language = os.path.splitext(file_name)[0]
file_path = os.path.join(directory_path, f"{file_name}.csv")
if not os.path.exists(file_path):
# print(f"File '{file_path}' not found. Skipping...")
continue
with open(file_path, 'r', encoding='utf-8') as file:
reader = csv.reader(file)
language_map = {row[0].strip(): row[1].strip() for row in reader}
lang_num_dictionary[language] = language_map
return lang_num_dictionary
def num2text(self, input_str, language):
if language not in self.lang_num_dictionary:
return "Language not supported."
integer_part, *decimal_part = input_str.split('.')
try:
int_part = int(integer_part)
except ValueError:
return "Invalid input. Please provide a valid number."
if int_part < 0 or int_part > 999999999999999:
return "Number out of range (0-999999999999999)"
lang_map = self.lang_num_dictionary[language]
integer_text = self.convert_to_indian_number(int_part, lang_map)
if decimal_part:
decimal_text = lang_map.get('.', '') + ' '
for digit in decimal_part[0]:
decimal_text += lang_map.get(digit, '') + ' '
return (integer_text + ' ' + decimal_text).strip()
else:
return integer_text.strip()
def convert_to_indian_number(self, n, lang_map):
numeric_keys = [key for key in lang_map.keys() if key.isdigit()] # Filter numeric keys
if n <= 20 or (n <= 100 and str(n) in lang_map):
return lang_map.get(str(n), '')
elif n < 1000:
result = f"{lang_map.get(str(n // 100), '')} {lang_map.get('100', '')}"
if n % 100 != 0:
result += f" {self.convert_to_indian_number(n % 100, lang_map)}"
return result.strip()
else:
base, term = 0, ''
for key in sorted(numeric_keys, key=int, reverse=True): # Sort only numeric keys
if n >= int(key):
base = int(key)
term = lang_map[key]
break
if n % base == 0:
return f"{self.convert_to_indian_number(n // base, lang_map)} {term}"
else:
return f"{self.convert_to_indian_number(n // base, lang_map)} {term} {self.convert_to_indian_number(n % base, lang_map)}"
# number_dict = NumberDictionary()
# result = number_dict.num2text("2000048.145", "gujarati")
# print(result)