o
    
j                      @   sb  d dl Z d dlZd dlZd dlmZmZ d dlmZ d dlm	Z	 d dl
mZ dd ZedZd	d
 Zdd ZedrAdZe ZnedrKdZe ZndZdZddededee fddZG dd de	ZedkreddZee  ee  eej ee  ee  edddZeded d  edddZeded d  dS dS )    N)DictList)Version)BasePhonemizer)Punctuationc                 C   s   ddl m} || d uS )Nr   )which)shutilr   )namer    r
   `/home/kuhnn/.local/lib/python3.10/site-packages/TTS/tts/utils/text/phonemizers/espeak_wrapper.pyis_tool   s   r   z.text-to-speech:\s(?P<version>\d+\.\d+(\.\d+)?)c                  C   s   t d} t| }|dS )Nzespeak --versionversion)
subprocess	getoutputespeak_version_patternsearchgroup)outputmatchr
   r
   r   get_espeak_version   s   


r   c                  C   s   t d} |  d S )Nzespeak-ng --version   )r   r   split)r   r
   r
   r   get_espeakng_version   s   
r   	espeak-ngespeakF
espeak_libargsreturnc                 C   s   | dddg}| | tdt| tj|tjtjdU}t|j	j
d}|sE|j	  |jr4|j  |jr<|j  |W  d   S g }|D ]}|| qI|j	  |jr^|j  |jrf|j  |  W d   |S 1 suw   Y  |S )z$Run espeak with the given arguments.z-qz-b1zespeakng: executing %s)stdoutstderr    N)extendloggingdebugreprr   PopenPIPESTDOUTiterr   readlinecloser    stdinappendwait)r   r   synccmdpresres2liner
   r
   r   _espeak_exe/   sF   








r5   c                       s   e Zd ZdZeZeZde	 dfde
f fddZedd Zed	d
 Zejdd ZdddZedd Zd de
de
de
fddZd!ddZedefddZde
fddZedd Z  ZS )"ESpeaku\  ESpeak wrapper calling `espeak` or `espeak-ng` from the command-line the perform G2P

    Args:
        language (str):
            Valid language code for the used backend.

        backend (str):
            Name of the backend library to use. `espeak` or `espeak-ng`. If None, set automatically
            prefering `espeak-ng` over `espeak`. Defaults to None.

        punctuations (str):
            Characters to be treated as punctuation. Defaults to Punctuation.default_puncs().

        keep_puncs (bool):
            If True, keep the punctuations after phonemization. Defaults to True.

    Example:

        >>> from TTS.tts.utils.text.phonemizers import ESpeak
        >>> phonemizer = ESpeak("tr")
        >>> phonemizer.phonemize("Bu Türkçe, bir örnektir.", separator="|")
        'b|ʊ t|ˈø|r|k|tʃ|ɛ, b|ɪ|r œ|r|n|ˈɛ|c|t|ɪ|r.'

    NTlanguagec                    sZ   | j d u r	td| j | _|dkrd}|dkrd}t j|||d |d ur+|| _d S d S )NzI [!] No espeak backend found. Install espeak-ng or espeak to your system.enen-uszzh-cncmn)punctuations
keep_puncs)_ESPEAK_LIB	Exceptionbackendsuper__init__)selfr7   r?   r;   r<   	__class__r
   r   rA   p   s   

zESpeak.__init__c                 C      | j S N)r=   rB   r
   r
   r   r?         zESpeak.backendc                 C   rE   rF   )_ESPEAK_VERrG   r
   r
   r   backend_version   rH   zESpeak.backend_versionc                 C   s:   |dvr
t d| || _|dkrt | _d S t | _d S )N)r   r   zUnknown backend: %sr   )r>   r=   r   r   rI   )rB   r?   r
   r
   r   r?      s    r   c                 C   s<   t drd| _t | _d S t drd| _t | _d S td)Nr   r   z?Cannot set backend automatically. espeak-ng or espeak not found)r   r=   r   rI   r   r>   rG   r
   r
   r   auto_set_espeak_lib   s   zESpeak.auto_set_espeak_libc                   C   s   dS )Nr   r
   r
   r
   r
   r   r	      s   zESpeak.name|Ftext	separatorc                 C   s   d| j  g}|r| jdkr|d n%|d n| jdkr3t| jtdkr-|d n|d n|d |rA|d|  || d}t| j|dd	D ]}td
t	| |
d }tdd|}|| 7 }qP|d|S )um  Convert input text to phonemes.

        Args:
            text (str):
                Text to be converted to phonemes.

            tie (bool, optional) : When True use a '͡' character between
                consecutive characters of a single phoneme. Else separate phoneme
                with '_'. This option requires espeak>=1.49. Default to False.
        z-vr   z--ipa=1z--ipa=3z1.48.15z--tie=%s Tr/   line: %sutf8z\(.+?\)_)	_languager?   r-   r   rJ   r5   r=   r#   r$   r%   decodestripresubreplace)rB   rM   rN   tier   phonemesr4   
ph_decodedr
   r
   r   phonemize_espeak   s(   




zESpeak.phonemize_espeakc                 C   s   | j ||ddS )NF)rZ   )r]   )rB   rM   rN   r
   r
   r   
_phonemize   s   zESpeak._phonemizec                  C   s   t du ri S dg} i }d}tt | ddD ])}|d }|dkr1| }|d }|d }|||< td	t| |d7 }q|S )
zsGet a dictionary of supported languages.

        Returns:
            Dict: Dictionary of language codes.
        Nz--voicesr   TrP   rR      r   rQ   )_DEF_ESPEAK_LIBr5   rU   rV   r   r#   r$   r%   )r   langscountr4   cols	lang_code	lang_namer
   r
   r   supported_languages   s   
zESpeak.supported_languagesc                 C   sL   dg}t | j|ddD ]}|d  d }tdt| |  S dS )zmGet the version of the used backend.

        Returns:
            str: Version of the used backend.
        z	--versionTrP   rR      rQ   N)r5   r?   rU   rV   r   r#   r$   r%   )rB   r   r4   r   r
   r
   r   r      s   zESpeak.versionc                 C   s   t dpt dS )z-Return true if ESpeak is available else falser   r   )r   )clsr
   r
   r   is_available   s   zESpeak.is_available)r   N)rL   FrF   )__name__
__module____qualname____doc__r`   r=   _DEF_ESPEAK_VERrI   r   default_puncsstrrA   propertyr?   rJ   setterrK   staticmethodr	   r]   r^   r   rf   r   classmethodri   __classcell__r
   r
   rC   r   r6   S   s*    






4r6   __main__r9   )r7   )r7   r<   `zhello how are you today?T)F)r#   rW   r   typingr   r   packaging.versionr   #TTS.tts.utils.text.phonemizers.baser   TTS.tts.utils.text.punctuationr   r   compiler   r   r   r`   rn   rp   r5   r6   rj   eprintrf   r   r7   r	   ri   	phonemizer
   r
   r
   r   <module>   sD    
$ *

