
    rHJj                         d Z ddlZddlZddlmZ ddlmZmZmZm	Z	m
Z
 ddlmZ ddlmZmZmZ ddlmZmZmZ ddlmZ dd	lmZ  G d
 de      Zy)!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                   t    e Zd ZdZ ej
                  d      Z	 	 	 	 	 	 	 ddedee	ee
f      dedede	eef   ded	ed
ee   f fdZedee   fd       Zed        Zed        Zd Zd ZdedefdZdededededeeef   f
dZdee   dee	eee   f   ef   f fdZdedef fdZedefd       Z xZ S )EspeakBackendr   u	   [ˈˌ'-]+languagepunctuation_markspreserve_punctuationwith_stresstielanguage_switchwords_mismatchloggerc	                    t         	|   ||||       | j                  j                  |       || _        | j                  |      | _        t        || j                  | j                        | _
        t        || j                        | _        y )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
            j/Users/ahmed/devFolder/claude-voice/.venv/lib/python3.12/site-packages/phonemizer/backend/espeak/espeak.pyr   zEspeakBackend.__init__%   s     	(9!5f 	 	F 	x('NN3'	0MT[[$--192NDKK3)    returnc                 d    | sy | du ryt        |       } t        |       dk7  rt        d|        | S )NT   ͡   z0explicit tie must be a single charcacter but is )strlenRuntimeError)r   s    r)   r#   zEspeakBackend._init_tie9   sF    $; #hs8q=B3%HJ J
r*   c                       y)Nespeak r4   r*   r)   namezEspeakBackend.nameH   s    r*   c                     t               j                         D ci c]  }|j                  |j                   c}S c c}w N)r   available_voicesr   r5   )clsvoices     r)   supported_languagesz!EspeakBackend.supported_languagesL   sA     '99;=; NNEJJ&;= 	= =s   <c                 l   | j                   '|j                  r| j                  j                  d       g }g }t	        |d      D ]j  \  }}| j
                  j                  || j                         }| j                  ||||      \  }}	|j                  |       |	sW|j                  ||z          l ||fS )Nz>cannot use ties AND phone separation, ignoring phone separatorr.   )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_auxzEspeakBackend._phonemize_auxR   s    99 Y__KK+, "4q1IC<<00tyyAD#55c9e -D*MM$$$S6\2 2 }$$r*   c                 `    | j                   r|S t        j                  | j                  d|      S )N )r"   resub_ESPEAK_STRESS_RE)r'   words     r)   _process_stresszEspeakBackend._process_stressd   s)    Kvvd,,b$77r*   rS   rF   c                     | j                   +| j                   dk7  r|j                  d| j                         S |j                  d|j                        S )Nr-   _)r$   replacer>   )r'   rS   rF   s      r)   _process_tiezEspeakBackend._process_tiej   sC     99 TYY$%6<<dii00||C11r*   rK   rJ   rG   c                 8   |j                         j                  dd      j                  dd      }t        j                  dd|      }t        j                  dd|      }| j                  j                  |      \  }}|sd|fS d}|j                  d      D ]X  }| j                  |j                               }|s| j                  |dz  }| j                  ||      }|||j                  z   z  }Z |r%|j                  r|d t        |j                          }||fS )N
 z  z_+rV   z_ rO   )rG   rW   rP   rQ   r%   processsplitrT   r$   rX   rS   r0   )r'   rK   rJ   rF   rG   rL   out_linerS   s           r)   rB   zEspeakBackend._postprocess_liner   s    zz|##D#.66tSA
 vveS$'vveS$',,44T:jz>!JJsOD''

5DTYY.$$T95Dy~~--H $ Y^^ 5#inn"5!56H##r*   rD   c                 f    t         |   |      \  }}| j                  j                  |       ||fS r7   )r   _phonemize_preprocessr&   
count_text)r'   rD   r   r(   s      r)   r`   z#EspeakBackend._phonemize_preprocess   s8    "''"?"E''-&&&r*   c                     |d   }|d   }| j                   j                  ||       | j                  j                  |       t        |   ||||      }| j                   j                  |      S )Nr   r.   )r&   count_phonemizedr%   r?   r   _phonemize_postprocessr\   )r'   
phonemizedr   rF   rG   rD   switchesr(   s          r)   rd   z$EspeakBackend._phonemize_postprocess   sm    !}a=--dI>!!(+W3D:KYX]^
##++J77r*   c           	          g }t        t        | d               D ]8  |j                  t        t	        j
                  fd| D                           : |S )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   6   K   | ]  }|   D ]  }|   y wr7   r4   ).0chunkcis      r)   	<genexpr>z)EspeakBackend._flatten.<locals>.<genexpr>   s"      %A#-%uQx!AxA:s   )ranger0   rC   list	itertoolschain)re   	flattenedrl   s     @r)   _flattenzEspeakBackend._flatten   s]     	s:a=)*AY__ %A#-%A A BC + r*   )NFFFz
keep-flagsignoreN)!__name__
__module____qualname____doc__rP   compilerR   r/   r   r   r	   boolr   r   r   r   staticmethodr#   r5   classmethodr;   rM   rT   r   rX   intr   rB   r   r`   rd   rs   __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   )rx   rp   rP   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   r4   r*   r)   <module>r      sI    (  	  8 8 <G GC C ; *M% Mr*   