Spaces:
Running
on
L40S
Running
on
L40S
# -*- coding: utf-8 -*- | |
"""基本类 | |
中文字符类 | |
中文数字/数位类 | |
中文数字类 | |
中文数位类 | |
中文数字系统类 | |
中文数学符号类 | |
*中文其他符号类 | |
""" | |
__author__ = "Zhiyang Zhou <zyzhou@stu.xmu.edu.cn>" | |
__data__ = "2019-05-02" | |
from fish_speech.text.chn_text_norm.basic_constant import NUMBERING_TYPES | |
class ChineseChar(object): | |
""" | |
中文字符 | |
每个字符对应简体和繁体, | |
e.g. 简体 = '负', 繁体 = '負' | |
转换时可转换为简体或繁体 | |
""" | |
def __init__(self, simplified, traditional): | |
self.simplified = simplified | |
self.traditional = traditional | |
self.__repr__ = self.__str__ | |
def __str__(self): | |
return self.simplified or self.traditional or None | |
def __repr__(self): | |
return self.__str__() | |
class ChineseNumberUnit(ChineseChar): | |
""" | |
中文数字/数位字符 | |
每个字符除繁简体外还有一个额外的大写字符 | |
e.g. '陆' 和 '陸' | |
""" | |
def __init__(self, power, simplified, traditional, big_s, big_t): | |
super(ChineseNumberUnit, self).__init__(simplified, traditional) | |
self.power = power | |
self.big_s = big_s | |
self.big_t = big_t | |
def __str__(self): | |
return "10^{}".format(self.power) | |
def create(cls, index, value, numbering_type=NUMBERING_TYPES[1], small_unit=False): | |
if small_unit: | |
return ChineseNumberUnit( | |
power=index + 1, | |
simplified=value[0], | |
traditional=value[1], | |
big_s=value[1], | |
big_t=value[1], | |
) | |
elif numbering_type == NUMBERING_TYPES[0]: | |
return ChineseNumberUnit( | |
power=index + 8, | |
simplified=value[0], | |
traditional=value[1], | |
big_s=value[0], | |
big_t=value[1], | |
) | |
elif numbering_type == NUMBERING_TYPES[1]: | |
return ChineseNumberUnit( | |
power=(index + 2) * 4, | |
simplified=value[0], | |
traditional=value[1], | |
big_s=value[0], | |
big_t=value[1], | |
) | |
elif numbering_type == NUMBERING_TYPES[2]: | |
return ChineseNumberUnit( | |
power=pow(2, index + 3), | |
simplified=value[0], | |
traditional=value[1], | |
big_s=value[0], | |
big_t=value[1], | |
) | |
else: | |
raise ValueError( | |
"Counting type should be in {0} ({1} provided).".format( | |
NUMBERING_TYPES, numbering_type | |
) | |
) | |
class ChineseNumberDigit(ChineseChar): | |
""" | |
中文数字字符 | |
""" | |
def __init__( | |
self, value, simplified, traditional, big_s, big_t, alt_s=None, alt_t=None | |
): | |
super(ChineseNumberDigit, self).__init__(simplified, traditional) | |
self.value = value | |
self.big_s = big_s | |
self.big_t = big_t | |
self.alt_s = alt_s | |
self.alt_t = alt_t | |
def __str__(self): | |
return str(self.value) | |
def create(cls, i, v): | |
return ChineseNumberDigit(i, v[0], v[1], v[2], v[3]) | |
class ChineseMath(ChineseChar): | |
""" | |
中文数位字符 | |
""" | |
def __init__(self, simplified, traditional, symbol, expression=None): | |
super(ChineseMath, self).__init__(simplified, traditional) | |
self.symbol = symbol | |
self.expression = expression | |
self.big_s = simplified | |
self.big_t = traditional | |
CC, CNU, CND, CM = ChineseChar, ChineseNumberUnit, ChineseNumberDigit, ChineseMath | |
class NumberSystem(object): | |
""" | |
中文数字系统 | |
""" | |
pass | |
class MathSymbol(object): | |
""" | |
用于中文数字系统的数学符号 (繁/简体), e.g. | |
positive = ['正', '正'] | |
negative = ['负', '負'] | |
point = ['点', '點'] | |
""" | |
def __init__(self, positive, negative, point): | |
self.positive = positive | |
self.negative = negative | |
self.point = point | |
def __iter__(self): | |
for v in self.__dict__.values(): | |
yield v | |
# class OtherSymbol(object): | |
# """ | |
# 其他符号 | |
# """ | |
# | |
# def __init__(self, sil): | |
# self.sil = sil | |
# | |
# def __iter__(self): | |
# for v in self.__dict__.values(): | |
# yield v | |