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
93import re
from typing import Dict, Any
from unidecode import unidecode
from gladosTTS.utils.text.numbers import normalize_numbers
from gladosTTS.utils.text.symbols import phonemes_set
from dp.phonemizer import Phonemizer
import torch
# Regular expression matching whitespace:
_whitespace_re = re.compile(r'\s+')
# List of (regular expression, replacement) pairs for abbreviations:
_abbreviations = [(re.compile('\\b%s\\.' % x[0], re.IGNORECASE), x[1]) for x in [
('mrs', 'misess'),
('mr', 'mister'),
('dr', 'doctor'),
('st', 'saint'),
('co', 'company'),
('jr', 'junior'),
('maj', 'major'),
('gen', 'general'),
('drs', 'doctors'),
('rev', 'reverend'),
('lt', 'lieutenant'),
('hon', 'honorable'),
('sgt', 'sergeant'),
('capt', 'captain'),
('esq', 'esquire'),
('ltd', 'limited'),
('col', 'colonel'),
('ft', 'fort')
]]
def expand_abbreviations(text):
for regex, replacement in _abbreviations:
text = re.sub(regex, replacement, text)
return text
def collapse_whitespace(text):
return re.sub(_whitespace_re, ' ', text)
def no_cleaners(text):
return text
def english_cleaners(text):
text = unidecode(text)
text = normalize_numbers(text)
text = expand_abbreviations(text)
return text
class Cleaner:
def __init__(self,
cleaner_name: str,
use_phonemes: bool,
lang: str) -> None:
if cleaner_name == 'english_cleaners':
self.clean_func = english_cleaners
elif cleaner_name == 'no_cleaners':
self.clean_func = no_cleaners
else:
raise ValueError(f'Cleaner not supported: {cleaner_name}! '
f'Currently supported: [\'english_cleaners\', \'no_cleaners\']')
self.use_phonemes = use_phonemes
self.lang = lang
if use_phonemes:
self.phonemize = Phonemizer.from_checkpoint('src\gladosTTS\models\en_us_cmudict_ipa_forward.pt')
def __call__(self, text: str) -> str:
text = self.clean_func(text)
if self.use_phonemes:
text = self.phonemize(text, lang='en_us')
text = ''.join([p for p in text if p in phonemes_set])
text = collapse_whitespace(text)
text = text.strip()
return text
@classmethod
def from_config(cls, config: Dict[str, Any]) -> 'Cleaner':
return Cleaner(
cleaner_name=config['preprocessing']['cleaner_name'],
use_phonemes=config['preprocessing']['use_phonemes'],
lang=config['preprocessing']['language']
)