o
    
j%x                     @   s  d dl Z d dlZd dlZd dlmZ d dlZd dlZd dlmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ dd ZdddZedZdd dD dd dD dd dD dd dD dd dD dd dD d d d!D d"d d#D d$d d#D d%d d&D d'd d(D d)d d*D d+d d,D d-d d.D d/d d#D d0Zdd2d3Z d4d d5D d6d d7D d8d d9D d:d d;D d<d d=D d>d d?D d@d dAD dBd dCD dDd dED dFd dGD dHd dID dJd dKD dLd dMD dNd dOD dPd dQD d0Z!ddRdSZ"edTedUedVedWedXedYedZed[ed\ed]ed^ed_ed`edadbZ#edcZ$eddedeedfdgZ%edhZ&ediZ'edjZ(dkdl Z)dmdn Z*ddodpZ+ddrdsZ,ddtduZ-ddvdwZ.ddxdyZ/dzd{ Z0d|d} Z1d~d Z2dd Z3dd Z4dd Z5dd Z6e j78e j79e j7:e;dZ<G dd dZ=dd Z>dd Z?dd Z@eAdkre>  e?  e@  dS dS )    N)cached_property)
Transliter)academic)	num2words)Arabic)English)Spanish)Japanese)Chinese)	Tokenizer)TextNormc                 C   s>   | dkrt  S | dkrt S | dkrt S | dkrt S t S )Nzhjaares)r
   r	   r   r   r   lang r   P/home/kuhnn/.local/lib/python3.10/site-packages/TTS/tts/layers/xtts/tokenizer.pyget_spacy_lang   s   r      c                 C   s
  g }|dur~t | |kr~|d t|}|d || }|jD ]K}t |d t t| |krF|d  dt| 7  < |d  |d< q!t t||kretjt||dddd	D ]	}|t| qZq!|t| q!t |dkr||d
 dkr||d
= |S |  g}|S )zPreprocess the input textN sentencizer TF   )widthdrop_whitespacebreak_on_hyphenstabsizer   )	lenappendr   add_pipesentsstrlstriptextwrapwrap)textr   text_split_lengthtext_splitsnlpdocsentenceliner   r   r   split_sentence#   s6   



	
r/   z\s+c                 C   *   g | ]}t d |d  t j|d fqS z\b%s\.r   r   recompile
IGNORECASE.0xr   r   r   
<listcomp>K       r9   ))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fortc                 C   r0   r1   r2   r6   r   r   r   r9   b   r:   ))srau   señora)sru   señorr?   )dradoctorarC   santo)rE   u
   compañíarG   r\   limitadac                 C   r0   r1   r2   r6   r   r   r   r9   o   r:   ))mmemadame)r=   monsieur)r@   docteurrB   )rE   	compagnierG   )r\   u   limitéec                 C   r0   r1   r2   r6   r   r   r   r9   {   r:   ))frfraur@   doktor)rC   sankt)rE   firmarG   c                 C   r0   r1   r2   r6   r   r   r   r9      r:   ))rb   senhora)rc   senhor)r@   doutor)rd   doutorarf   )rE   	companhia)rH   u   júniorrh   c                 C   r0   r1   r2   r6   r   r   r   r9      r:   ))sigsignore)r@   dottorerf   )rE   	compagniarG   )r\   limitatac                 C   r0   r1   r2   r6   r   r   r   r9      r:   ))ppani)mpanrq   )swu   świętyrG   c                 C   r0   r1   r2   r6   r   r   r   r9      r:   r   c                 C   r0   r1   r2   r6   r   r   r   r9      r:   c                 C   r0   r1   r2   r6   r   r   r   r9      r:   )rq   )ingu	   inženýr)r   r   c                 C   r0   )z\b%s\br   r   r2   r6   r   r   r   r9      r:   ))u   г-жаu   госпожа)u   г-нu   господин)u   д-рu   докторc                 C   r0   r1   r2   r6   r   r   r   r9      r:   ))dhrzde heer)mevrmevrouw)r@   dokter)jhrjonkheerc                 C   r0   r1   r2   r6   r   r   r   r9      r:   ))bbay)byku   büyükrq   c                 C   r0   r1   r2   r6   r   r   r   r9      r:   )rq   )r   u   bácsi)u   nővu   nővérc                 C   r0   r1   r2   r6   r   r   r   r9      r:   )enr   ro   deptitplr   r   csrunltrhukor   c                 C   s$   t | D ]\}}t||| } q| S N)_abbreviationsr3   subr(   r   regexreplacementr   r   r   !expand_abbreviations_multilingual   s   r   c              	   C   0   g | ]}t d t |d  t j|d fqS z%sr   r   r3   r4   escaper5   r6   r   r   r   r9          "))&z and @z at )%z	 percent )#z hash $z dollar )   £z pound )   °z degree c              	   C   r   r   r   r6   r   r   r   r9      r   ))r   z y r   z arroba )r   z por ciento )r   z	 numeral r   z dolar r   z libra )r   z grados c              	   C   r   r   r   r6   r   r   r   r9   
  r   ))r    et )r   z	 arobase )r   z pour cent )r   u    dièse r   )r   z livre )r   u	    degrés c              	   C   r   r   r   r6   r   r   r   r9     r   ))r    und r   )r   z	 prozent )r   z raute r   )r   z pfund )r   z grad c              	   C   r   r   r   r6   r   r   r   r9   "  r   )r    e r   )r   z por cento )r   z
 cardinal )r   u    dólar r   )r   z graus c              	   C   r   r   r   r6   r   r   r   r9   .  r   )r   )r   z chiocciola )r   z per cento )r   z cancelletto )r   z	 dollaro )r   z
 sterlina )r   z gradi c              	   C   r   r   r   r6   r   r   r   r9   :  r   ))r   z i )r   u    małpa r   z	 procent )r   u
    krzyżyk r   )r   z funt )r   z	 stopnie c              	   C   r   r   r   r6   r   r   r   r9   F      "))r   u    و )r   u    على )r   u    في المئة )r   u    رقم )r   u    دولار )r   u
    جنيه )r   u
    درجة c              	   C   r   r   r   r6   r   r   r   r9   S  r   ))r   u    和 )r   u    在 )r   u    百分之 )r   u    号 )r   u    美元 )r   u    英镑 )r   u    度 c              	   C   r   r   r   r6   r   r   r   r9   `  r   ))r   z a )r   z na )r   z
 procento )r   u    křížek r   r   )r   u	    stupně c              	   C   r   r   r   r6   r   r   r   r9   m  r   ))r   u    и )r   u    собака )r   u    процентов )r   u    номер )r   u    доллар )r   u
    фунт )r   u    градус c              	   C   r   r   r   r6   r   r   r   r9   z  r   ))r   z en )r   z bij r   )r   z hekje r   )r   z pond )r   z graden c              	   C   r   r   r   r6   r   r   r   r9     r   ))r   z ve r   )r   u    yüzde )r   z diyez r   )r   z	 sterlin )r   z derece c              	   C   r   r   r   r6   r   r   r   r9     r   ))r   u    és )r   z kukac )r   u    százalék )r   u    kettőskereszt )r   u	    dollár )r   z font )r   z fok c              	   C   r   r   r   r6   r   r   r   r9     r   ))r   u    그리고 )r   u    에 )r   u    퍼센트 )r   u    번호 )r   u    달러 )r   u    파운드 )r   u    도 c                 C   s4   t | D ]\}}t||| } | dd} q|  S )Nz  r   )_symbols_multilingualr3   r   replacestripr   r   r   r   expand_symbols_multilingual  s   r   z([0-9]+)(st|nd|rd|th)u   ([0-9]+)(º|ª|er|o|a|os|as)u   ([0-9]+)(º|ª|er|re|e|ème)u&   ([0-9]+)(st|nd|rd|th|º|ª|\.(?=\s|$))u   ([0-9]+)(º|ª|o|a|os|as)u   ([0-9]+)(º|°|ª|o|a|i|e)u   ([0-9]+)(º|ª|st|nd|rd|th)u   ([0-9]+)(ون|ين|ث|ر|ى)z([0-9]+)\.(?=\s|$)u'   ([0-9]+)(-й|-я|-е|-ое|-ье|-го)z([0-9]+)(de|ste|e)u$   ([0-9]+)(\.|inci|nci|uncu|üncü|\.)u0   ([0-9]+)(\.|adik|edik|odik|edik|ödik|ödike|ik)u   ([0-9]+)(번째|번|차|째))r   r   ro   r   r   r   r   r   r   r   r   r   r   r   z[0-9]+z+((\$[0-9\.\,]*[0-9]+)|([0-9\.\,]*[0-9]+\$))u+   ((£[0-9\.\,]*[0-9]+)|([0-9\.\,]*[0-9]+£))u/   (([0-9\.\,]*[0-9]+€)|((€[0-9\.\,]*[0-9]+))))USDGBPEURz\b\d{1,3}(,\d{3})*(\.\d+)?\bz\b\d{1,3}(.\d{3})*(\,\d+)?\bz([0-9]+[.,][0-9]+)c                 C   "   |  d}d|v r|dd}|S )Nr   ,r   groupr   r   r(   r   r   r   _remove_commas     
r   c                 C   r   )Nr   .r   r   r   r   r   r   _remove_dots  r   r   c                 C   s2   |  ddd}tt||dkr|dS ddS )Nr   r   r   r   czr   )r   r   r   float)r   r   amountr   r   r   _expand_decimal_point  s    r   r   c                 C   s   t tdd| ddd}t|d||dkr|ndd	}d
dddddd
d
d
d
d
d
d
d
d}| rD||| }|dkrD|d | }|S )Nz[^\d.]r   r   r   r   currencyr   r   )tor   r   z, z con r   r   r   )r   r   ro   r   r   r   r   r   r   r   r   r   r   r   r   )r   r3   r   r   r   r   
is_integerrfind)r   r   r   r   full_amountand_equivalentslast_andr   r   r   _expand_currency  s,    r   c                 C   s(   t t| dd|dkr|dS ddS )Nr   Tr   r   )ordinalr   r   intr   r   r   r   r   r   _expand_ordinal  s   (r   c                 C   s&   t t| d|dkr|dS ddS )Nr   r   r   r   r   r   r   r   r   _expand_number  s   &r   c                    s    dkrt  | } | S  dv rttt| } nttt| } z)ttd  fdd| } ttd  fdd| } ttd  fd	d| } W n   Y  d
kr[tt fdd| } tt	   fdd| } tt
 fdd| } | S )Nr   )r   r   r   c                       t |  dS )Nr   r   r   r   r   r   <lambda>      z-expand_numbers_multilingual.<locals>.<lambda>r   c                    r   )Nr   r   r   r   r   r   r     r   r   c                    r   )Nr   r   r   r   r   r   r     r   r   c                    
   t |  S r   )r   r   r   r   r   r        
 c                    r   r   )r   r   r   r   r   r     r   c                    r   r   )r   r   r   r   r   r     r   )zh_num2wordsr3   r   _comma_number_rer   _dot_number_rer   _currency_re_decimal_number_re_ordinal_re
_number_rer(   r   r   r   r   expand_numbers_multilingual
  s"   
r   c                 C   s   |   S r   )lowerr(   r   r   r   	lowercase  s   r   c                 C   s   t td| S )Nr   )r3   r   _whitespace_rer   r   r   r   collapse_whitespace#  s   r   c                 C   sl   |  dd} |dkr|  dd} |  dd} |  dd	} t| } t| |} t| |} t| |d
} t| } | S )N"r   r   u   İi   Ö   ö   Ü   ür   )r   r   r   r   r   r   r   r   r   r   multilingual_cleaners'  s   

r   c                 C   s   t | } t| } | S )zPBasic pipeline that lowercases and collapses whitespace without transliteration.)r   r   r   r   r   r   basic_cleaners5  s   r   c              	   C   s&   d dd tj| tjjdddD S )Nr   c                 S   s   g | ]}|d  qS )r   r   )r7   r   r   r   r   r9   >  s    z)chinese_transliterate.<locals>.<listcomp>FT)style	heteronymneutral_tone_with_five)joinpypinyinpinyinStyleTONE3r   r   r   r   chinese_transliterate<  s   r   c                 C   s   | | } t| } | S r   )romajir   )r(   katsur   r   r   japanese_cleanersB  s   
r  c                 C   s   t t}|| S r   )r   r   translit)r(   rr   r   r   korean_transliterateH  s   
r  z../data/tokenizer.jsonc                   @   sR   e Zd ZdddZedd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd ZdS )VoiceBpeTokenizerNc                 C   s   d | _ |d urt|| _ i ddddddddd	d
dddddddddddddddddddddd| _d S ) Nr   r   r      ro   i  r      r      r      r      r   R   r      r      r      r      r      r   G   r   r   _   )	tokenizerr   	from_filechar_limits)self
vocab_filer   r   r   __init__Q  sH   	

zVoiceBpeTokenizer.__init__c                 C   s   dd l }| S )Nr   )cutletCutlet)r  r  r   r   r   r   h  s   zVoiceBpeTokenizer.katsuc                 C   sF   | dd }| j|d}t||kr!td| d| d d S d S )N-r   r   z<[!] Warning: The text length exceeds the character limit of z for language 'z$', this might cause truncated audio.)splitr  getr    print)r  txtr   limitr   r   r   check_input_lengthn  s   z$VoiceBpeTokenizer.check_input_lengthc                 C   sr   |dv rt ||}|dkrt|}|dkrt|}|S |dkr't|| j}|S |dkr1t|}|S td| d)N>   r   r   r   r   r   ro   r   r   r   r   r   r   r   r   r   r   r   r   hiz
Language 'z' is not supported.)r   r   r  r  r   r   NotImplementedErrorr  r  r   r   r   r   preprocess_textv  s   
z!VoiceBpeTokenizer.preprocess_textc                 C   s`   | dd }| || | ||}|dkrdn|}d| d| }|dd}| j|jS )	Nr  r   r   zzh-cn[]r   [SPACE])r  r!  r%  r   r  encodeidsr$  r   r   r   r)    s   zVoiceBpeTokenizer.encodec                 C   sX   t |tjr|  }| jj|dddd}|dd}|dd}|dd}|S )NF)skip_special_tokensr   r   r(  z[STOP]z[UNK])
isinstancetorchTensorcpunumpyr  decoder   )r  seqr  r   r   r   r1    s   zVoiceBpeTokenizer.decodec                 C   s
   | j  S r   )r  get_vocab_sizer  r   r   r   __len__  s   
zVoiceBpeTokenizer.__len__c                 C   s   t | j  d S )Nr   )maxr  	get_vocabvaluesr4  r   r   r   get_number_tokens  s   z#VoiceBpeTokenizer.get_number_tokensr   )__name__
__module____qualname__r  r   r   r!  r%  r)  r1  r5  r9  r   r   r   r   r  P  s    

		r  c                  C   F   g d} | D ]\}}}t ||d}||ks J d| d| dqd S )N)B)zIn 12.5 seconds.zIn twelve point five seconds.r   )zThere were 50 soldiers.zThere were fifty soldiers.r   )zThis is a 1st testzThis is a first testr   )zThat will be $20 sir.z That will be twenty dollars sir.r   )u   That will be 20€ sir.zThat will be twenty euro sir.r   )u   That will be 20.15€ sir.z,That will be twenty euro, fifteen cents sir.r   )zThat's 100,000.5.z'That's one hundred thousand point five.r   )zEn 12,5 secondes.zEn douze virgule cinq secondes.ro   )zIl y avait 50 soldats.zIl y avait cinquante soldats.ro   )zCeci est un 1er testzCeci est un premier testro   )zCela vous fera $20 monsieur.z&Cela vous fera vingt dollars monsieur.ro   )u   Cela vous fera 20€ monsieur.z$Cela vous fera vingt euros monsieur.ro   )u!   Cela vous fera 20,15€ monsieur.z7Cela vous fera vingt euros et quinze centimes monsieur.ro   )zCe sera 100.000,5.z Ce sera cent mille virgule cinq.ro   )zIn 12,5 Sekunden.u   In zwölf Komma fünf Sekunden.r   )zEs gab 50 Soldaten.u   Es gab fünfzig Soldaten.r   )zDies ist ein 1. TestzDies ist ein erste Testr   )zDas macht $20 Herr.zDas macht zwanzig Dollar Herr.r   )u   Das macht 20€ Herr.zDas macht zwanzig Euro Herr.r   )u   Das macht 20,15€ Herr.u/   Das macht zwanzig Euro und fünfzehn Cent Herr.r   )zEn 12,5 segundos.zEn doce punto cinco segundos.r   )u   Había 50 soldados.u   Había cincuenta soldados.r   )zEste es un 1er testzEste es un primero testr   )u   Eso le costará $20 señor.u'   Eso le costará veinte dólares señor.r   )u   Eso le costará 20€ señor.u$   Eso le costará veinte euros señor.r   )u    Eso le costará 20,15€ señor.u9   Eso le costará veinte euros con quince céntimos señor.r   )zIn 12,5 secondi.z!In dodici virgola cinque secondi.r   )zC'erano 50 soldati.zC'erano cinquanta soldati.r   )u   Questo è un 1° testu   Questo è un primo testr   )u   Ti costerà $20 signore.u"   Ti costerà venti dollari signore.r   )u   Ti costerà 20€ signore.u   Ti costerà venti euro signore.r   )u   Ti costerà 20,15€ signore.u4   Ti costerà venti euro e quindici centesimi signore.r   )zEm 12,5 segundos.u    Em doze vírgula cinco segundos.r   )zHavia 50 soldados.zHavia cinquenta soldados.r   )u   Este é um 1º testeu   Este é um primeiro tester   )u   Isso custará $20 senhor.u$   Isso custará vinte dólares senhor.r   )u   Isso custará 20€ senhor.u!   Isso custará vinte euros senhor.r   )u   Isso custará 20,15€ senhor.u4   Isso custará vinte euros e quinze cêntimos senhor.r   )zW 12,5 sekundy.u&   W dwanaście przecinek pięć sekundy.r   )u   Było 50 żołnierzy.u"   Było pięćdziesiąt żołnierzy.r   )u"   To będzie kosztować 20€ panie.u.   To będzie kosztować dwadzieścia euro panie.r   )u%   To będzie kosztować 20,15€ panie.uD   To będzie kosztować dwadzieścia euro, piętnaście centów panie.r   )u   في الـ 12,5 ثانية.u5   في الـ اثنا عشر  , خمسون ثانية.r   )u    كان هناك 50 جنديًا.u(   كان هناك خمسون جنديًا.r   )u   Za 12,5 vteřiny.u    Za dvanáct celá pět vteřiny.r   )u   Bylo tam 50 vojáků.u   Bylo tam padesát vojáků.r   )u   To bude stát 20€ pane.u   To bude stát dvacet euro pane.r   )u   To bude 20.15€ pane.u*   To bude dvacet euro, patnáct centů pane.r   )u   Через 12.5 секунды.uG   Через двенадцать запятая пять секунды.r   )u    Там было 50 солдат.u0   Там было пятьдесят солдат.r   )u"   Это будет 20.15€ сэр.uV   Это будет двадцать евро, пятнадцать центов сэр.r   )u6   Это будет стоить 20€ господин.uJ   Это будет стоить двадцать евро господин.r   )zIn 12,5 seconden.zIn twaalf komma vijf seconden.r   )zEr waren 50 soldaten.zEr waren vijftig soldaten.r   )zDat wordt dan $20 meneer.z$Dat wordt dan twintig dollar meneer.r   )u   Dat wordt dan 20€ meneer.z"Dat wordt dan twintig euro meneer.r   )u   在12.5秒内u   在十二点五秒内r   )u   有50名士兵u   有五十名士兵r   )u   50 asker vardı.u   elli asker vardı.r   )z
Bu 1. testzBu birinci testr   )u   12,5 másodperc alatt.u.   tizenkettő egész öt tized másodperc alatt.r   )z50 katona volt.u   ötven katona volt.r   )zEz az 1. tesztu   Ez az első tesztr   )u   12.5 초 안에.u   십이 점 다섯 초 안에.r   )u   50 명의 병사가 있었다.u"   오십 명의 병사가 있었다.r   )u%   이것은 1 번째 테스트입니다u'   이것은 첫 번째 테스트입니다r   r   '' vs ')r   
test_casesar   r   outr   r   r    test_expand_numbers_multilingual  s
   ] rD  c                  C   r=  )N))zHello Mr. Smith.zHello mister Smith.r   )zDr. Jones is here.zdoctor Jones is here.r   )zHola Sr. Garcia.u   Hola señor Garcia.r   )zLa Dra. Martinez es muy buena.z!La doctora Martinez es muy buena.r   )zBonjour Mr. Dupond.zBonjour monsieur Dupond.ro   )z$Mme. Moreau est absente aujourd'hui.z&madame Moreau est absente aujourd'hui.ro   )u   Frau Dr. Müller ist sehr klug.u"   Frau doktor Müller ist sehr klug.r   )u   Olá Sr. Silva.u   Olá senhor Silva.r   )u$   Dra. Costa, você está disponível?u'   doutora Costa, você está disponível?r   )zBuongiorno, Sig. Rossi.zBuongiorno, signore Rossi.r   )u   Dzień dobry, P. Kowalski.u   Dzień dobry, pani Kowalski.r   )u#   M. Nowak, czy mogę zadać pytanie?u$   pan Nowak, czy mogę zadać pytanie?r   )u	   P. Nováku
   pan Novákr   )u   Dr. Vojtěchu   doktor Vojtěchr   )zDhr. Jansenzde heer Jansenr   )zMevr. de Vrieszmevrouw de Vriesr   )u,   Здравствуйте Г-н Иванов.u7   Здравствуйте господин Иванов.r   )uB   Д-р Смирнов здесь, чтобы увидеть вас.uI   доктор Смирнов здесь, чтобы увидеть вас.r   )u   Merhaba B. Yılmaz.u   Merhaba bay Yılmaz.r   )u   Dr. Ayşe burada.u   doktor Ayşe burada.r   )u   Dr. Szabó itt van.u   doktor Szabó itt van.r   r   r>  r?  )r   r@  r   r   r   test_abbreviations_multilingual  s
   % rE  c                  C   r=  )N))zI have 14% batteryzI have 14 percent batteryr   )zTe veo @ la fiestazTe veo arroba la fiestar   )u   J'ai 14° de fièvreu   J'ai 14 degrés de fièvrero   )u   Die Rechnung beträgt £ 20u   Die Rechnung beträgt pfund 20r   )u!   O meu email é ana&joao@gmail.comu*   O meu email é ana e joao arroba gmail.comr   )zlinguaggio di programmazione C#z*linguaggio di programmazione C cancellettor   )u   Moja temperatura to 36.6°z Moja temperatura to 36.6 stopnier   )u   Mám 14% baterieu   Mám 14 procento baterier   )u   Těším se na tebe @ partyu   Těším se na tebe na partyr   )u   У меня 14% зарядаu.   У меня 14 процентов зарядаr   )u   Я буду @ домаu!   Я буду собака домаr   )zIk heb 14% batterijzIk heb 14 procent batterijr   )zIk zie je @ het feestzIk zie je bij het feestr   )u    لدي 14% في البطاريةu/   لدي 14 في المئة في البطاريةr   )u   我的电量为 14%u   我的电量为 14 百分之r   )zPilim %14 dolu.u   Pilim yüzde 14 dolu.r   )u$   Az akkumulátorom töltöttsége 14%u.   Az akkumulátorom töltöttsége 14 százalékr   )u!   배터리 잔량이 14%입니다.u*   배터리 잔량이 14 퍼센트입니다.r   r   r>  r?  )r   r@  r   r   r   test_symbols_multilingual-  s
    rF  __main__)r   )r   )r   r   )Bosr3   r&   	functoolsr   r   r-  hangul_romanizer   hangul_romanize.ruler   r   spacy.lang.arr   spacy.lang.enr   spacy.lang.esr   spacy.lang.jar	   spacy.lang.zhr
   
tokenizersr    TTS.tts.layers.xtts.zh_num2wordsr   r   r   r/   r4   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  pathr   dirnamerealpath__file__DEFAULT_VOCAB_FILEr  rD  rE  rF  r:  r   r   r   r   <module>   sH   

$

		
		  
"  
?








Oc+

