o
    i'                     @   s   d Z ddlZddlZddlZddl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 ddlmZ ejdkr?ddlZG dd	 d	ZdS )
z$Low-level bindings to the espeak API    N)CDLL)Path)Union)EspeakVoicewin32c                   @   s   e Zd ZdZdeeef deeedf fddZdd Ze	d	d
 Z
edd Ze	defddZdd Zdd ZdefddZdd Zdd Zdd Zdd ZdS )	EspeakAPIzExposes the espeak API to the EspeakWrapper

    This class exposes only low-level bindings to the API and should not be
    used directly.

    library	data_pathNc              
   C   s  d | _ |d urt|d}ztjt|}| |}~W n ty4 } z
tdt| d d }~ww t	
 | _tjdkrFt| j nt| | j| j | j t| j|j }tj||dd tjt|| _ z| j dd|ddkr{tdW n ty   td	d w || _d S )
Nzutf-8zfailed to load espeak library: r   F)follow_symlinks   r   z*failed to initialize espeak shared libraryzfailed to load espeak library)_librarystrencodectypescdllLoadLibrary_shared_library_pathOSErrorRuntimeErrortempfilemkdtemp_tempdirsysplatformatexitregister_delete_win32weakreffinalize_deletepathlibr   nameshutilcopyespeak_InitializeAttributeError_library_path)selfr   r	   espeaklibrary_patherrorespeak_copy r,   Q/home/ubuntu/.local/lib/python3.10/site-packages/phonemizer/backend/espeak/api.py__init__+   sH   	



zEspeakAPI.__init__c                 C   s   |  | j| j d S )N)r   r   r   r'   r,   r,   r-   r   d   s   zEspeakAPI._delete_win32c                 C   sL   z|    W n	 ty   Y nw tjdkrdd l}|| j t| d S )Nr   r   )	espeak_Terminater%   r   r   _ctypesFreeLibrary_handler"   rmtree)r   tempdirr1   r,   r,   r-   r   i   s   
zEspeakAPI._deletec                 C   s   | j S )z0Absolute path to the espeak library being in use)r&   r/   r,   r,   r-   r)   }   s   zEspeakAPI.library_pathreturnc              	   C   sZ   t | j }| r|S zt t| j W S  tt	fy,   t
d|  ddw )zReturns the absolute path to `library`

        This function is cross-platform and works for Linux, MacOS and Windows.
        Raises a RuntimeError if the library path cannot be retrieved

        zfailed to retrieve the path to z libraryN)r    r   _nameresolveis_filedlinfoDLInfopath	ExceptionImportErrorr   )r   r<   r,   r,   r-   r      s   	
zEspeakAPI._shared_library_pathc                 C   s0   | j j}tj|_t }|t|}||jfS )zBindings to espeak_Info

        Returns
        -------
        version, data_path: encoded strings containing the espeak version
            number and data path respectively

        )r   espeak_Infor   c_char_prestypebyrefvalue)r'   f_infor	   versionr,   r,   r-   info   s
   	
zEspeakAPI.infoc                 C   s4   | j j}ttjg|_tttj|_||S )zBindings to espeak_ListVoices

        Parameters
        ----------
        name (str or None): if specified, a filter on voices to be listed

        Returns
        -------
        voices: a pointer to EspeakVoice.Struct instances

        )r   espeak_ListVoicesr   POINTERr   VoiceStructargtypesrA   )r'   r!   f_list_voicesr,   r,   r-   list_voices   s   
zEspeakAPI.list_voicesc                 C   s   | j j}tjg|_||S )zBindings to espeak_SetVoiceByName

        Parameters
        ----------
        name (str) : the voice name to setup

        Returns
        -------
        0 on success, non-zero integer on failure

        )r   espeak_SetVoiceByNamer   r@   rJ   )r'   r!   f_set_voice_by_namer,   r,   r-   set_voice_by_name   s   
zEspeakAPI.set_voice_by_namec                 C   s   | j j}ttj|_| jS )zBindings to espeak_GetCurrentVoice

        Returns
        -------
        a EspeakVoice.Struct instance or None if no voice has been setup

        )r   espeak_GetCurrentVoicer   rH   r   rI   rA   contents)r'   f_get_current_voicer,   r,   r-   get_current_voice   s   zEspeakAPI.get_current_voicec                 C   s4   | j j}tj|_ttjtjtjg|_||||S )a  Bindings to espeak_TextToPhonemes

        Parameters
        ----------
        text_ptr (pointer): the text to be phonemized, as a pointer to a
            pointer of chars
        text_mode (bits field): see espeak sources for details
        phonemes_mode (bits field): see espeak sources for details

        Returns
        -------
        an encoded string containing the computed phonemes

        )r   espeak_TextToPhonemesr   r@   rA   rH   c_intrJ   )r'   text_ptr	text_modephonemes_modef_text_to_phonemesr,   r,   r-   text_to_phonemes   s   
zEspeakAPI.text_to_phonemesc                 C   s$   | j j}tjtjg|_||| dS )a=  "Bindings on espeak_SetPhonemeTrace

        This method must be called before any call to synthetize()

        Parameters
        ----------
        mode (bits field): see espeak sources for details
        file_pointer (FILE*): a pointer to an opened file in which to output
            the phoneme trace

        N)r   espeak_SetPhonemeTracer   rU   c_void_prJ   )r'   modefile_pointerf_set_phoneme_tracer,   r,   r-   set_phoneme_trace   s
   zEspeakAPI.set_phoneme_tracec              	   C   sF   | j j}tjtjtjtjtjttjtjg|_|||ddd|ddS )a  Bindings on espeak_Synth

        The output phonemes are sent to the file specified by a call to
        set_phoneme_trace().

        Parameters
        ----------
        text (pointer) : a pointer to chars
        size (int) : number of chars in `text`
        mode (bits field) : see espeak sources for details

        Returns
        -------
        0 on success, non-zero integer on failure

        r      N)	r   espeak_Synthr   r\   c_size_tc_uintrU   rH   rJ   )r'   rV   sizer]   f_synthetizer,   r,   r-   
synthetize   s   
zEspeakAPI.synthetize)__name__
__module____qualname____doc__r   r   r   r.   r   staticmethodr   propertyr)   r   rF   rL   intrO   rS   rZ   r`   rg   r,   r,   r,   r-   r   #   s"    $9

r   )rk   r   r   r    r"   r   r   r   r   r   typingr   phonemizer.backend.espeak.voicer   r   r:   r   r,   r,   r,   r-   <module>   s   
