o
    mi                     @   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___espeakZ	set_voice_with_stress	_init_tie_tier
   r   r   _lang_switchr   _words_mismatch)	selfr   r   r   r   r   r   r   r   	__class__ Z/home/kim/smarthome/.venv/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 )NZ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   r0   ).0Zvoicer(   r(   r)   
<dictcomp>N   s    z5EspeakBackend.supported_languages.<locals>.<dictcomp>)r   Z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   Ztext_to_phonemes_postprocess_lineappend)
r%   textoffset	separatorstripoutputZ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_stressrH   r=   c                 C   s0   | j d ur| j dkr|d| j S |d|jS )Nr+   _)r"   replacer6   )r%   rH   r=   r(   r(   r)   _process_tiej   s   zEspeakBackend._process_tierA   r@   r>   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_+rJ   z_ rD   )r>   rK   rE   rF   r#   processsplitrI   r"   rL   rH   r.   )r%   rA   r@   r=   r>   rB   out_linerH   r(   r(   r)   r9   r   s    
zEspeakBackend._postprocess_liner;   c                    s$   t  |\}}| j| ||fS N)r   _phonemize_preprocessr$   Z
count_text)r%   r;   r   r&   r(   r)   rS      s   z#EspeakBackend._phonemize_preprocessc                    sH   |d }|d }| j || | j| t ||||}| j |S )Nr   r,   )r$   Zcount_phonemizedr#   r7   r   _phonemize_postprocessrO   )r%   
phonemizedr   r=   r>   r;   Zswitchesr&   r(   r)   rT      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 rR   r(   )r1   chunkcir(   r)   	<genexpr>   s    z)EspeakBackend._flatten.<locals>.<genexpr>)ranger.   r:   list	itertoolschain)rU   Z	flattenedr(   rX   r)   _flatten   s   zEspeakBackend._flatten)NFFFr   r   N)!__name__
__module____qualname____doc__rE   compilerG   r-   r   r   r   boolr   r   r   r   staticmethodr!   r0   classmethodr4   rC   rI   r   rL   intr   r9   r   rS   rT   r_   __classcell__r(   r(   r&   r)   r      sZ    






.
r   )rc   r]   rE   loggingr   typingr   r   r   r   r   Zphonemizer.backend.espeak.baser	   Z)phonemizer.backend.espeak.language_switchr
   r   r   Z(phonemizer.backend.espeak.words_mismatchr   r   r   Z!phonemizer.backend.espeak.wrapperr   Zphonemizer.separatorr   r   r(   r(   r(   r)   <module>   s   