
    11i                         S r SSKrSSKrSSKJr  SSKJrJrJrJ	r	J
r
  SSKJr  SSKJrJrJr  SSKJrJrJr  SSKJr  SS	KJr   " S
 S\5      rg)!Espeak backend for the phonemizer    N)Logger)OptionalTupleListUnionPattern)BaseEspeakBackend)get_language_switch_processorLanguageSwitchBaseLanguageSwitch)get_words_mismatch_processorWordMismatchBaseWordsMismatch)EspeakWrapper)	Separatorc                     ^  \ rS rSrSr\R                  " S5      r       SS\S\	\
\\4      S\S\S\
\\4   S	\S
\S\	\   4U 4S jjjr\S\	\   4S j5       r\S 5       r\S 5       rS rS rS\S\4S jrS\S\S\S\S\\\4   4
S jrS\\   S\\
\\\   4   \4   4U 4S jjrS\S\4U 4S jjr\S\4S j5       r Sr!U =r"$ ) EspeakBackend   r   u	   [ˈˌ'-]+languagepunctuation_markspreserve_punctuationwith_stresstielanguage_switchwords_mismatchloggerc	                   > [         T	U ]  XX8S9  U R                  R                  U5        X@l        U R                  U5      U l        [        X`R                  U R                  5      U l
        [        XpR                  5      U l        g )N)r   r   r   )super__init___espeak	set_voice_with_stress	_init_tie_tier   r   r   _lang_switchr   _words_mismatch)
selfr   r   r   r   r   r   r   r   	__class__s
            Z/home/james-whalen/.local/lib/python3.13/site-packages/phonemizer/backend/espeak/espeak.pyr    EspeakBackend.__init__%   sv     	!5 	 	F 	x('NN3'	0M[[$--192NKK3)    returnc                 r    U (       d  g U SL a  g[        U 5      n [        U 5      S:w  a  [        SU  35      eU $ )NT   ͡   z0explicit tie must be a single charcacter but is )strlenRuntimeError)r   s    r*   r$   EspeakBackend._init_tie9   sF    $; #hs8q=B3%HJ J
r,   c                      g)Nespeak r7   r,   r*   nameEspeakBackend.nameH   s    r,   c                     [        5       R                  5        Vs0 s H  nUR                  UR                  _M     sn$ s  snf N)r   available_voicesr   r8   )clsvoices     r*   supported_languages!EspeakBackend.supported_languagesL   sA     '99;=; NNEJJ&;= 	= =s   !?c                 t   U R                   b,  UR                  (       a  U R                  R                  S5        / n/ n[	        USS9 Hk  u  pxU R
                  R                  XR                   5      nU R                  XX45      u  pUR                  U5        U	(       d  MX  UR                  Xr-   5        Mm     XV4$ )Nz>cannot use ties AND phone separation, ignoring phone separatorr0   )start)	r%   phoner   warning	enumerater!   text_to_phonemes_postprocess_lineappend)
r(   textoffset	separatorstripoutputlang_switchesnumline
has_switchs
             r*   _phonemize_auxEspeakBackend._phonemize_auxR   s    99 Y__KK+, "4q1IC<<00yyAD#559 -DMM$z$$S\2 2 $$r,   c                 l    U R                   (       a  U$ [        R                  " U R                  SU5      $ )N )r#   resub_ESPEAK_STRESS_RE)r(   words     r*   _process_stressEspeakBackend._process_stressd   s)    Kvvd,,b$77r,   rY   rK   c                     U R                   b,  U R                   S:w  a  UR                  SU R                   5      $ UR                  SUR                  5      $ )Nr/   _)r%   replacerC   )r(   rY   rK   s      r*   _process_tieEspeakBackend._process_tiej   sC     99 TYY$%6<<dii00||C11r,   rP   rO   rL   c                 b   UR                  5       R                  SS5      R                  SS5      n[        R                  " SSU5      n[        R                  " SSU5      nU R                  R                  U5      u  pU(       d  SU4$ SnUR                  S5       H]  nU R                  UR                  5       5      nU(       d  U R                  c  US-  nU R                  Xs5      nXgUR                  -   -  nM_     U(       a*  UR                  (       a  US [        UR                  5      *  nXe4$ )N
 z  z_+r]   z_ rU   )rL   r^   rV   rW   r&   processsplitrZ   r%   r_   rY   r2   )r(   rP   rO   rK   rL   rQ   out_linerY   s           r*   rG   EspeakBackend._postprocess_liner   s    zz|##D#.66tSA
 vveS$'vveS$',,44T:z>!JJsOD''

5DTYY.$$T5Dy~~--H $ Y^^ 5#inn"5!56H##r,   rI   c                 b   > [         TU ]  U5      u  pU R                  R                  U5        X4$ r;   )r   _phonemize_preprocessr'   
count_text)r(   rI   r   r)   s      r*   ri   #EspeakBackend._phonemize_preprocess   s2    "''"?"E''-&&r,   c                    > US   nUS   nU R                   R                  XS5        U R                  R                  U5        [        TU ]  XRX45      nU R                   R                  U5      $ )Nr   r0   )r'   count_phonemizedr&   rD   r   _phonemize_postprocessrd   )r(   
phonemizedr   rK   rL   rI   switchesr)   s          r*   rn   $EspeakBackend._phonemize_postprocess   se    !}a=--d>!!(+W3DY^
##++J77r,   c           	         ^ / n[        [        U S   5      5       H;  mUR                  [        [        R
                  " U4S jU  5       5      5      5        M=     U$ )zSpecialization of BaseBackend._flatten for the espeak backend

From [([1, 2], ['a', 'b']), ([3],), ([4], ['c'])] to [[1, 2, 3, 4],
['a', 'b', 'c']].

r   c              3   >   >#    U  H  oT     H  o"v   M     M     g 7fr;   r7   ).0chunkcis      r*   	<genexpr>)EspeakBackend._flatten.<locals>.<genexpr>   s      %A#-%Qx!AxA:s   )ranger2   rH   list	itertoolschain)ro   	flattenedrw   s     @r*   _flattenEspeakBackend._flatten   s]     	s:a=)*AY__ %A#-%A A BC + r,   )r&   r%   r#   r'   )NFFFz
keep-flagsignoreN)#__name__
__module____qualname____firstlineno____doc__rV   compilerX   r1   r   r   r	   boolr   r   r   r    staticmethodr$   r8   classmethodr?   rR   rZ   r   r_   intr   rG   r   ri   rn   r   __static_attributes____classcell__)r)   s   @r*   r   r      s   +

<0 EI.3%*).3?08,0) )$,U3<-@$A)'+) #) D#I&	)
 #1) ".) "&)) )( (3-     = =
%$82 2 2$c $ $%.$7;$@Ec4i@P$<'$s) 'eCcN>SUY>Y8Z '
8y 8ae 8   r,   r   )r   r|   rV   loggingr   typingr   r   r   r   r	   phonemizer.backend.espeak.baser
   )phonemizer.backend.espeak.language_switchr   r   r   (phonemizer.backend.espeak.words_mismatchr   r   r   !phonemizer.backend.espeak.wrapperr   phonemizer.separatorr   r   r7   r,   r*   <module>r      sI    (  	  8 8 <G GC C ; *M% Mr,   