o
    i                     @   s   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 deZdS )!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                       s@  e Zd ZdZe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dZedee fddZedd Zedd Zdd Zdd ZdedefddZd ed!eded"edeeef f
d#d$Zd%ee dee	eee f ef f fd&d'Zded"ef fd(d)Zedefd*d+Z  Z S )-EspeakBackendr   u	   [ˈˌ'-]+NF
keep-flagsignorelanguagepunctuation_markspreserve_punctuationwith_stresstielanguage_switchwords_mismatchloggerc	           	         sV   t  j||||d | j| || _| || _t|| j| j	| _
t|| j| _d S )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__ T/home/ubuntu/.local/lib/python3.10/site-packages/phonemizer/backend/espeak/espeak.pyr   %   s   

zEspeakBackend.__init__returnc                 C   s:   | sd S | du r
dS t | } t| dkrtd|  | S )NT   ͡   z0explicit tie must be a single charcacter but is )strlenRuntimeError)r   r)   r)   r*   r"   9   s   zEspeakBackend._init_tiec                   C   s   dS )Nespeakr)   r)   r)   r)   r*   nameH   s   zEspeakBackend.namec                 C   s   dd t   D S )Nc                 S   s   i | ]}|j |jqS r)   )r   r2   ).0voicer)   r)   r*   
<dictcomp>N   s    z5EspeakBackend.supported_languages.<locals>.<dictcomp>)r   available_voices)clsr)   r)   r*   supported_languagesL   s   z!EspeakBackend.supported_languagesc           
      C   s   | j d ur|jr| jd g }g }t|ddD ]$\}}| j|| j }| ||||\}}	|| |	r<|||  q||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_switchr)   r)   r*   _phonemize_auxR   s    
zEspeakBackend._phonemize_auxc                 C   s   | j r|S t| jd|S )N )r!   resub_ESPEAK_STRESS_RE)r&   wordr)   r)   r*   _process_stressd   s   zEspeakBackend._process_stressrN   rB   c                 C   s0   | j d ur| j dkr|d| j S |d|jS )Nr,   _)r#   replacer:   )r&   rN   rB   r)   r)   r*   _process_tiej   s   zEspeakBackend._process_tierG   rF   rC   c                 C   s   |  dddd}tdd|}tdd|}| j|\}}|s(d|fS d}|dD ]!}| |  }|sC| jd u rC|d7 }| 	||}|||j
 7 }q/|r`|j
r`|d t|j
  }||fS )N
 z  z_+rP   z_ rJ   )rC   rQ   rK   rL   r$   processsplitrO   r#   rR   rN   r/   )r&   rG   rF   rB   rC   rH   out_linerN   r)   r)   r*   r>   r   s    
zEspeakBackend._postprocess_liner@   c                    s$   t  |\}}| j| ||fS N)r   _phonemize_preprocessr%   
count_text)r&   r@   r   r'   r)   r*   rY      s   z#EspeakBackend._phonemize_preprocessc                    sH   |d }|d }| j || | j| t ||||}| j |S )Nr   r-   )r%   count_phonemizedr$   r;   r   _phonemize_postprocessrU   )r&   
phonemizedr   rB   rC   r@   switchesr'   r)   r*   r\      s   z$EspeakBackend._phonemize_postprocessc              	      s@   g }t t| d D ] |tt fdd| D  q
|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   s"    | ]}|  D ]}|V  qqd S rX   r)   )r3   chunkcir)   r*   	<genexpr>   s    z)EspeakBackend._flatten.<locals>.<genexpr>)ranger/   r?   list	itertoolschain)r]   	flattenedr)   ra   r*   _flatten   s   zEspeakBackend._flatten)NFFFr   r   N)!__name__
__module____qualname____doc__rK   compilerM   r.   r   r   r   boolr   r   r   r   staticmethodr"   r2   classmethodr8   rI   rO   r   rR   intr   r>   r   rY   r\   ri   __classcell__r)   r)   r'   r*   r      sZ    






.
r   )rm   rf   rK   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   r)   r)   r)   r*   <module>   s   