
    rHJj3                         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
e      Zy)z!Mbrola backend for the phonemizer    N)Logger)Path)UnionOptionalListDict)BaseEspeakBackend)EspeakWrapper)	Separatorc                        e Zd ZdZdZddedee   f fdZe	d        Z
edefd       Zed	        Zeded
eeef   defd       Zedeeef   fd       Zdee   dedededee   f
dZdededededef
dZ xZS )EspeakMbrolaBackendz(Espeak-mbrola backend for the phonemizerNlanguageloggerc                 ^    t         |   ||       | j                  j                  |       y )N)r   )super__init___espeak	set_voice)selfr   r   	__class__s      j/Users/ahmed/devFolder/claude-voice/.venv/lib/python3.12/site-packages/phonemizer/backend/espeak/mbrola.pyr   zEspeakMbrolaBackend.__init__"   s'    &1x(    c                       y)Nzespeak-mbrola r   r   r   namezEspeakMbrolaBackend.name&   s    r   returnc                     t        j                         xr+ t        j                  d      xr t        j                         S )z,Mbrola backend is available for espeak>=1.49mbrola)r	   is_availableshutilwhichis_espeak_ng)clss    r   r   z EspeakMbrolaBackend.is_available*   s7     "..0 1X&1!..0	2r   c                     t               j                  d      }|D ci c]  }|j                  dd  |j                   c}S c c}w )Nr      )r
   available_voices
identifierr   )r#   voicesvoices      r   _all_supported_languagesz,EspeakMbrolaBackend._all_supported_languages2   sD     11(;>DEfU  $ejj0fEEEs   !A	data_pathc                    |dd }t        j                  |dz  |z        j                         ryt        j                  dk7  r=d| d| d| d| g}|D ]'  }t        j                  |      j                         s' y y	)
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	candidates         r   _is_language_installedz*EspeakMbrolaBackend._is_language_installed8   s     <<	H,u45==?<<7"$UG,$UG1UG4+E735J (	<<	*224 ( r   c                     | j                   ]t               j                  }| j                         j	                         D ci c]  \  }}| j                  ||      r|| c}}| _         | j                   S c c}}w )z+Returns the list of installed mbrola voices)_supported_languagesr
   r+   r*   itemsr5   )r#   r+   kvs       r   supported_languagesz'EspeakMbrolaBackend.supported_languagesN   sz     ##+%11I!$!=!=!?!E!E!G(=!GA--a; 1!G(=C$ '''(=s   A6textoffset	separatorstripc                     g }t        |d      D ]H  \  }}| j                  j                  |      }| j                  |||z   ||      }|j	                  |       J |S )N   )start)	enumerater   
synthetize_postprocess_lineappend)r   r<   r=   r>   r?   outputnumlines           r   _phonemize_auxz"EspeakMbrolaBackend._phonemize_auxX   s]    "4q1IC<<**40D))$iODMM$ 2 r   rI   rH   c                     d |j                  d      D        }|j                  j                  d |D              }|s||j                  z  }|S )Nc              3   f   K   | ])  }|j                         s|j                  d       d    + yw)	r   N)r?   split).0phns     r   	<genexpr>z8EspeakMbrolaBackend._postprocess_line.<locals>.<genexpr>e   s+      K*:3ciikCIIdOA*:s   11
c              3   ,   K   | ]  }|d k7  s	|  yw)_Nr   )rO   phos     r   rQ   z8EspeakMbrolaBackend._postprocess_line.<locals>.<genexpr>g   s     'Nx3#:xs   
)rN   phonejoin)r   rI   rH   r>   r?   phonemess         r   rE   z%EspeakMbrolaBackend._postprocess_linea   sL    K*.**T*:K??'''Nx'NN	'Hr   )N)__name__
__module____qualname____doc__r7   strr   r   r   staticmethodr   classmethodboolr   r*   r   r   r5   r   r;   r   intr   rJ   rE   __classcell__)r   s   @r   r   r      s   2) )hv.> )   2T 2 2 F F
 c eCI>N  * (DcN ( (49 c "+48=A#Yc  %.7;@Cr   r   )r\   r/   r    r1   loggingr   r   typingr   r   r   r   phonemizer.backend.espeak.baser	   !phonemizer.backend.espeak.wrapperr
   phonemizer.separatorr   r   r   r   r   <module>rh      s7    (   
   . . < ; *O+ Or   