o
    mi'                     @   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ctypesZcdllZLoadLibrary_shared_library_pathOSErrorRuntimeErrortempfilemkdtemp_tempdirsysplatformatexitregister_delete_win32weakreffinalize_deletepathlibr   nameshutilcopyZespeak_InitializeAttributeError_library_path)selfr   r	   Zespeaklibrary_patherrorZespeak_copy r'   W/home/kim/smarthome/.venv/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   )	Zespeak_Terminater"   r   r   _ctypesZFreeLibraryZ_handler    rmtree)r   tempdirr+   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dlinfoZDLInfopath	ExceptionImportErrorr   )r   r3   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   Zespeak_Infor   c_char_prestypeZbyrefvalue)r$   Z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   Zespeak_ListVoicesr   POINTERr   VoiceStructargtypesr7   )r$   r   Z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   Zespeak_SetVoiceByNamer   r6   r=   )r$   r   Z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   Zespeak_GetCurrentVoicer   r;   r   r<   r7   contents)r$   Z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   Zespeak_TextToPhonemesr   r6   r7   r;   c_intr=   )r$   text_ptr	text_modeZphonemes_modeZ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   Zespeak_SetPhonemeTracer   rB   c_void_pr=   )r$   modeZfile_pointerZ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   Zespeak_Synthr   rF   Zc_size_tZc_uintrB   r;   r=   )r$   rC   sizerG   Zf_synthetizer'   r'   r(   
synthetize   s   
zEspeakAPI.synthetize)__name__
__module____qualname____doc__r   r   r   r)   r   staticmethodr   propertyr%   r   r:   r>   intr?   rA   rE   rH   rK   r'   r'   r'   r(   r   #   s"    $9

r   )rO   r   r   r   r    r   r   r   r   r   typingr   Zphonemizer.backend.espeak.voicer   r   r2   r   r'   r'   r'   r(   <module>   s   
