o
    CZh!                     @   s   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 e dkr(d dl	Z	ddl
mZ ddlmZmZmZ dd	 ZG d
d deZdS )    N)NamedTemporaryFileWindows   )Voice   )_espeakfromUtf8toUtf8c                 C   s   t | S N)EspeakDriver)proxy r   E/var/www/auris/lib/python3.10/site-packages/pyttsx3/drivers/espeak.pybuildDriver   s   r   c                   @   s   e Zd ZdZdZdd Zdd Zdd Zed	d
 Z	dd Z
edefddZedefddZdd Zdd Zdd Zdd Zdd Zdd Zdd Zd S )!r   F c                 C   s   t jsttjd}|dkrtddt _dt _|| _d| _d| _	d| _
d | _d| _g | _t| j | dt j | d	d
 | dd d S )Ni  zcould not initialize espeakdefaultTF    voicerate   volumeg      ?)r   _moduleInitializedr   Z
InitializeZAUDIO_OUTPUT_RETRIEVALRuntimeError_defaultVoice_proxy_looping	_stopping	_speaking_text_to_say_data_buffer_numerise_bufferSetSynthCallback_onSynthsetProperty)selfr   r   r   r   r   __init__   s"   zEspeakDriver.__init__c                 C   s   | j | tt| j S r
   )r!   appendctypesZc_void_plenr%   datar   r   r   numerise0   s   zEspeakDriver.numerisec                 C   s   | j t|d  S )Nr   )r!   intr*   r   r   r   decode_numeric4   s   zEspeakDriver.decode_numericc                   C   s   t d  d S r
   )r   r"   r   r   r   r   destroy7   s   zEspeakDriver.destroyc                 C   s   t  rd| _t   d S d S )NT)r   Z	IsPlayingr   Cancelr%   r   r   r   stop;   s   zEspeakDriver.stopnamec           	      C   s6  | dkrgg }t d D ]Y}t|jt|jd}|jrLz|jdd  }|jddd}|g|d< W n tyG } zdg|d< W Y d }~nd }~ww g d	}||j |d
< |jpWd |d< |	t
di | q|S | dkrut  }t|jjS | dkrt t jS | dkrt t jd S | dkrt t jS td|  )Nvoices)idr3   r   zutf-8ignore)errors	languagesUnknown)NZmaleZfemalegenderager   r   r   g      Y@pitchunknown property %sr   )r   Z
ListVoicesr   r3   r8   decodeUnicodeDecodeErrorr:   r;   r'   r   ZGetCurrentVoicecontentsZGetParameterRATEVOLUMEPITCHKeyError)	r3   r4   vkwargsZlanguage_code_bytesZlanguage_codeeZgendersr   r   r   r   getProperty@   s8   zEspeakDriver.getPropertyc              
   C   s@  | dkr*|d u r
d S zt |}t| W d S  tjy) } ztt|d }~ww | dkrMzttj|d W d S  tjyL } ztt|d }~ww | dkrvzttj	t
t|d dd W d S  tyu } ztt|d }~ww | dkrzttjt
|d W d S  ty } ztt|d }~ww td|  )	Nr   r   r   r   d   r   r<   r=   )r	   r   ZSetVoiceByNamer(   ArgumentError
ValueErrorstrZSetParameterrA   rB   r-   round	TypeErrorrC   rD   )r3   valueZ	utf8ValuerG   r   r   r   r$   ^   sH   

zEspeakDriver.setPropertyc                 C   s*   |  |}tjt|tjtjB |d d S )N)flags	user_data)r,   r   Synthr	   ENDPAUSE
CHARS_UTF8)r%   textfilenamecoder   r   r   save_to_file}   s   
 zEspeakDriver.save_to_filec              
   C   s|   | j d | j d d| _d| _ztjt|tjtj	B d W d S  t
y= } z| j d | j jd|d  d }~ww )NTzstarted-utterancer   )rP   Ferror)	exception)r   setBusynotifyr   r    r   rR   r	   rS   rT   	Exception)r%   rU   rG   r   r   r   _start_synthesis   s    zEspeakDriver._start_synthesisc                 C   s  d}	 || }|j tjkrn5|j tjkr:| jr*|jd }||j }| j|| }nd}| jjd||j|jd n|j tj	kr?t
ddd	}	zzt|	d
}
|
d |
d |
d |
| j W d    n1 sow   Y  d| _|jrtd|	j d| |j d nHt dkrztjd|	jgdddd}W n3 tjy } ztd| d }~ww t dkrtd|	j d nt dkrt|	jtj W n ty } ztd| d }~ww W z|	   t!|	j W n5 ty
 } ztd| d }~ww z|	   t!|	j W w  ty+ } ztd| d }~ww | jjddd | j"d | #  n|d7 }q|dkrZ|  jt$%||t$&t$j' 7  _dS )Nr   Tr   r9   zstarted-word)r3   locationlengthFz.wav)deletesuffixwbr   g    @r   zffmpeg -y -i  z -loglevel quietDarwinZafplay)checkcapture_outputrU   z6[EspeakDriver._onSynth] Mac afplay failed with error: Linuxzaplay z -qr   zError during playback: z#Error deleting temporary WAV file: finished-utterance	completed)(typer   ZEVENT_LIST_TERMINATEDZ
EVENT_WORDr   Ztext_positionr`   r   r\   Z	EVENT_ENDr   waveopenZsetnchannelsZsetsampwidthZsetframerateZwriteframesr    rQ   ossystemr3   r.   platform
subprocessrunCalledProcessErrorr   winsoundZ	PlaySoundZSND_FILENAMEr]   closeremover[   endLoopr(   Z	string_atZsizeofZc_short)r%   ZwavZ
numsampleseventsieventstart_indexZ	end_indexwordstreamfresultrG   r   r   r   r#      s   




$
8"zEspeakDriver._onSynthc                 C   s
   d| _ d S )NF)r   r1   r   r   r   rx         
zEspeakDriver.endLoopc                 C   s`   d}d| _ | j r.| j sd S |r | jd d}| jr | | j |   td | j sd S d S )NTFg{Gz?)r   r   r[   r   r^   iteratetimesleep)r%   firstr   r   r   	startLoop   s   
zEspeakDriver.startLoopc                 C   sJ   | j sd S | jr#t  d| _| jjddd | jd |   d S d S )NFri   rj   )r   r   r   r0   r   r\   r[   rx   r1   r   r   r   r      s   zEspeakDriver.iteratec                 C   s
   || _ d S r
   )r   )r%   rU   r   r   r   say   r   zEspeakDriver.sayN)__name__
__module____qualname__r   r   r&   r,   r.   staticmethodr/   r2   rL   rH   r$   rX   r^   r#   rx   r   r   r   r   r   r   r   r      s(    
?
r   )ro   rm   rq   r(   r   rr   tempfiler   rp   ru   r   r   r   r   r   r	   r   objectr   r   r   r   r   <module>   s    