o
    mi3                     @   s   d Z ddlZddlZddlZddlmZ ddlmZ ddlmZm	Z	m
Z
mZ ddlmZ ddlmZ ddlmZ G d	d
 d
eZdS )z!Mbrola backend for the phonemizer    N)Logger)Path)UnionOptionalListDict)BaseEspeakBackend)EspeakWrapper)	Separatorc                       s   e Zd ZdZdZddedee f fddZe	dd Z
ed	efd
dZedd Zededeeef d	efddZed	eeef fddZdee dededed	ee f
ddZdedededed	ef
ddZ  ZS )EspeakMbrolaBackendz(Espeak-mbrola backend for the phonemizerNlanguageloggerc                    s    t  j||d | j| d S )N)r   )super__init___espeakZ	set_voice)selfr   r   	__class__ Z/home/kim/smarthome/.venv/lib/python3.10/site-packages/phonemizer/backend/espeak/mbrola.pyr   "   s   zEspeakMbrolaBackend.__init__c                   C   s   dS )Nzespeak-mbrolar   r   r   r   r   name&   s   zEspeakMbrolaBackend.namereturnc                 C   s   t  otdot  S )z,Mbrola backend is available for espeak>=1.49mbrola)r   is_availableshutilwhichZis_espeak_ngclsr   r   r   r   *   s
   z EspeakMbrolaBackend.is_availablec                 C   s   t  d}dd |D S )Nr   c                 S   s   i | ]}|j d d |jqS )   N)
identifierr   ).0voicer   r   r   
<dictcomp>6   s    z@EspeakMbrolaBackend._all_supported_languages.<locals>.<dictcomp>)r	   Zavailable_voices)r   Zvoicesr   r   r   _all_supported_languages2   s   z,EspeakMbrolaBackend._all_supported_languages	data_pathc                 C   st   |dd }t |d |  rdS tjdkr8d| d| d| d| g}|D ]}t | r7 dS q+d	S )
z6Returns True if the required mbrola voice is installedr   Nr   Twin32z/usr/share/mbrola//z/usr/share/mbrola/voices/F)pathlibr   is_filesysplatform)r   r   r$   r!   
candidates	candidater   r   r   _is_language_installed8   s   
z*EspeakMbrolaBackend._is_language_installedc                    s6    j du rt j fdd   D  _  j S )z+Returns the list of installed mbrola voicesNc                    s"   i | ]\}}  |r||qS r   )r-   )r    kvr   r$   r   r   r"   S   s    
z;EspeakMbrolaBackend.supported_languages.<locals>.<dictcomp>)_supported_languagesr	   r$   r#   itemsr   r   r0   r   supported_languagesN   s   

z'EspeakMbrolaBackend.supported_languagestextoffset	separatorstripc                 C   sH   g }t |ddD ]\}}| j|}| ||| ||}|| q|S )N   )start)	enumerater   Z
synthetize_postprocess_lineappend)r   r4   r5   r6   r7   outputnumliner   r   r   _phonemize_auxX   s   z"EspeakMbrolaBackend._phonemize_auxr?   r>   c                 C   s<   dd | dD }|jdd |D }|s||j7 }|S )Nc                 s   s&    | ]}|  r|d d V  qdS )	r   N)r7   split)r    Zphnr   r   r   	<genexpr>e   s    
z8EspeakMbrolaBackend._postprocess_line.<locals>.<genexpr>
c                 s   s    | ]	}|d kr|V  qdS )_Nr   )r    Zphor   r   r   rC   g   s    )rB   phonejoin)r   r?   r>   r6   r7   Zphonemesr   r   r   r;   a   s   
z%EspeakMbrolaBackend._postprocess_line)N)__name__
__module____qualname____doc__r1   strr   r   r   staticmethodr   classmethodboolr   r#   r   r   r-   r   r3   r   intr
   r@   r;   __classcell__r   r   r   r   r      s<    

	

	r   )rK   r'   r   r)   loggingr   r   typingr   r   r   r   Zphonemizer.backend.espeak.baser   Z!phonemizer.backend.espeak.wrapperr	   Zphonemizer.separatorr
   r   r   r   r   r   <module>   s   