mana-tts / text_utils.py
abreza's picture
feat: improved number handling and audio processing
da2ee9a
raw
history blame
2.8 kB
PERSIAN_DIGITS = {
'۰': 'صفر', '۱': 'یک', '۲': 'دو', '۳': 'سه', '۴': 'چهار',
'۵': 'پنج', '۶': 'شش', '۷': 'هفت', '۸': 'هشت', '۹': 'نه',
'0': 'صفر', '1': 'یک', '2': 'دو', '3': 'سه', '4': 'چهار',
'5': 'پنج', '6': 'شش', '7': 'هفت', '8': 'هشت', '9': 'نه'
}
PERSIAN_NUMBERS = {
10: 'ده', 11: 'یازده', 12: 'دوازده', 13: 'سیزده', 14: 'چهارده',
15: 'پانزده', 16: 'شانزده', 17: 'هفده', 18: 'هجده', 19: 'نوزده',
20: 'بیست', 30: 'سی', 40: 'چهل', 50: 'پنجاه',
60: 'شصت', 70: 'هفتاد', 80: 'هشتاد', 90: 'نود',
100: 'صد', 200: 'دویست', 300: 'سیصد', 400: 'چهارصد', 500: 'پانصد',
600: 'ششصد', 700: 'هفتصد', 800: 'هشتصد', 900: 'نهصد'
}
def convert_three_digit(num: int) -> str:
if num == 0:
return ''
if num < 10:
return PERSIAN_DIGITS[str(num)]
elif num < 20:
return PERSIAN_NUMBERS[num]
elif num < 100:
tens = (num // 10) * 10
ones = num % 10
if ones == 0:
return PERSIAN_NUMBERS[tens]
return PERSIAN_NUMBERS[tens] + ' و ' + PERSIAN_DIGITS[str(ones)]
else:
hundreds = (num // 100) * 100
remainder = num % 100
if remainder == 0:
return PERSIAN_NUMBERS[hundreds]
return PERSIAN_NUMBERS[hundreds] + ' و ' + convert_three_digit(remainder)
def convert_number_to_text(num_str: str, phone_mode: bool = False) -> str:
try:
num_str = num_str.replace(',', '').replace('٬', '').replace(' ', '')
persian_to_english = str.maketrans('۰۱۲۳۴۵۶۷۸۹', '0123456789')
num_str = num_str.translate(persian_to_english)
if phone_mode:
return ' '.join(PERSIAN_DIGITS[d] for d in num_str if d.isdigit())
num = int(num_str)
if num == 0:
return 'صفر'
if num < 0:
return 'منفی ' + convert_number_to_text(str(abs(num)))
if num < 1000:
return convert_three_digit(num)
parts = []
if num >= 1_000_000_000:
billions = num // 1_000_000_000
parts.append(convert_three_digit(billions) + ' میلیارد')
num %= 1_000_000_000
if num >= 1_000_000:
millions = num // 1_000_000
parts.append(convert_three_digit(millions) + ' میلیون')
num %= 1_000_000
if num >= 1000:
thousands = num // 1000
parts.append(convert_three_digit(thousands) + ' هزار')
num %= 1000
if num > 0:
parts.append(convert_three_digit(num))
return ' و '.join(parts)
except:
return num_str