speech_asr
2023-03-10 9e2a04d0e0823c0fe2f3dc9fafa68d2045b773d4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# -*- coding: utf-8 -*-
from __future__ import division, unicode_literals
 
import re
 
from . import lang_PT
 
 
class Num2Word_PT_BR(lang_PT.Num2Word_PT):
    def set_high_numwords(self, high):
        max = 3 + 3*len(high)
        for word, n in zip(high, range(max, 3, -3)):
            self.cards[10**n] = word + "ilhão"
 
    def setup(self):
        super(Num2Word_PT_BR, self).setup()
 
        self.low_numwords[1] = 'dezenove'
        self.low_numwords[3] = 'dezessete'
        self.low_numwords[4] = 'dezesseis'
 
        self.thousand_separators = {
            3: "milésimo",
            6: "milionésimo",
            9: "bilionésimo",
            12: "trilionésimo",
            15: "quadrilionésimo"
        }
 
    def merge(self, curr, next):
        ctext, cnum, ntext, nnum = curr + next
 
        if cnum == 1:
            if nnum < 1000000:
                return next
            ctext = "um"
        elif cnum == 100 and not nnum == 1000:
            ctext = "cento"
 
        if nnum < cnum:
            return ("%s e %s" % (ctext, ntext), cnum + nnum)
 
        elif (not nnum % 1000000) and cnum > 1:
            ntext = ntext[:-4] + "lhões"
 
        if nnum == 100:
            ctext = self.hundreds[cnum]
            ntext = ""
 
        else:
            ntext = " " + ntext
 
        return (ctext + ntext, cnum * nnum)
 
    def to_cardinal(self, value):
        result = lang_PT.Num2Word_EU.to_cardinal(self, value)
 
        # Transforms "mil E cento e catorze reais" into "mil, cento e catorze
        # reais"
        for ext in (
                'mil', 'milhão', 'milhões', 'bilhão', 'bilhões',
                'trilhão', 'trilhões', 'quatrilhão', 'quatrilhões'):
            if re.match('.*{} e \\w*ento'.format(ext), result):
                result = result.replace(
                    '{} e'.format(ext), '{},'.format(ext), 1
                )
 
        return result
 
    def to_currency(self, val, longval=True):
        integer_part, decimal_part = ('%.2f' % val).split('.')
 
        result = self.to_cardinal(int(integer_part))
 
        appended_currency = False
        for ext in (
                'milhão', 'milhões', 'bilhão', 'bilhões',
                'trilhão', 'trilhões', 'quatrilhão', 'quatrilhões'):
            if result.endswith(ext):
                result += ' de reais'
                appended_currency = True
 
        if result in ['um', 'menos um']:
            result += ' real'
            appended_currency = True
        if not appended_currency:
            result += ' reais'
 
        if int(decimal_part):
            cents = self.to_cardinal(int(decimal_part))
            result += ' e ' + cents
 
            if cents == 'um':
                result += ' centavo'
            else:
                result += ' centavos'
 
        return result