o
    CZh
                     @   s   d dl Zzd dlmZ W n ey'   ejdZejdZd dlmZ Y nw 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mZ d	Zd
ZdZededediZdd ZG dd deZG dd deZdS )    N)	SpeechLibzSAPI.SpVoicezSAPI.SpFileStream   )Voice   )fromUtf8toUtf8z@HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\MSSamzAHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\MSMaryzAHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\MSMike)gGz<a@(\?)g\(c@r   )gp=
Kc@r   c                 C   s   t | S N)SAPI5Driver)proxy r   D/var/www/auris/lib/python3.10/site-packages/pyttsx3/drivers/sapi5.pybuildDriver$   s   r   c                   @   sp   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zedd Z	dd Z
dd Zdd Zdd Zdd Zdd ZdS )r
   c                 C   s~   t jd| _d| j_t | _| jt	|  t j
| j| j| _|| _d| _d| _d| _d| _d| _| d| d d S )NzSAPI.SPVoicei  F    voice)comtypesclientCreateObject_ttsEventInterestsSAPI5DriverEventSinkZ_event_sink	setDriverweakrefr   Z	GetEventsZ_advise_proxy_looping	_speaking	_stopping_current_text_rateWpmsetPropertygetProperty)selfr   r   r   r   __init__*   s   zSAPI5Driver.__init__c                 C   s   d| j _d S )Nr   )r   r   r"   r   r   r   destroy:   s   zSAPI5Driver.destroyc                 C   s>   | j d | j d d| _|| _| jtt|d d S )NTzstarted-utterancer   )	r   setBusynotifyr   r   r   Speakr   r   )r"   textr   r   r   say=   s
   zSAPI5Driver.sayc                 C   s.   | j sd S | jd d| _| jdd d S )NTr      )r   r   r&   r   r   r(   r$   r   r   r   stopG   s
   zSAPI5Driver.stopc                 C   sd   t  }tjd}||tj | jj	}|| j_	| j
tt| || j_	|  t | d S )NzSAPI.SPFileStream)osgetcwdr   r   r   ZOpenr   ZSSFMCreateForWriter   ZAudioOutputStreamr(   r   r   closechdir)r"   r)   filenamecwdstreamZtemp_streamr   r   r   save_to_fileN   s   zSAPI5Driver.save_to_filec                 C   s   t | j|  S r	   )r   IdZGetDescription)attrr   r   r   _toVoiceY   s   zSAPI5Driver._toVoicec                 C   s0   | j  }|D ]}|j|kr|  S qtd|)Nzunknown voice id %s)r   	GetVoicesr5   
ValueError)r"   id_tokenstokenr   r   r   _tokenFromId]   s   


zSAPI5Driver._tokenFromIdc                    st   |dkr fdd j  D S |dkr j jjS |dkr  jS |dkr* j jd S |dkr4td	 d S td
| )NZvoicesc                    s   g | ]}  |qS r   )r7   ).0r6   r$   r   r   
<listcomp>f   s    z+SAPI5Driver.getProperty.<locals>.<listcomp>r   ratevolumeg      Y@pitch/Pitch adjustment not supported when using SAPI5unknown property %s)r   r8   r   r5   r   VolumeprintKeyError)r"   namer   r$   r   r!   d   s   
zSAPI5Driver.getPropertyc              
   C   s(  |dkr&|  |}|| j_t|tt \}}tt| j	| || j_
d S |dkr_| jjj}t|tt \}}ztt|| || j_
W n tyY } ztt|d }~ww || _	d S |dkrztt|d d| j_W d S  ty } ztt|d }~ww |dkrtd d S td| )	Nr   r@   rA   d   r   rB   rC   rD   )r=   r   r   E_REGgetMSMARYintmathlogr   ZRater5   	TypeErrorr9   strroundrE   rF   rG   )r"   rH   valuer<   abr:   er   r   r   r    r   s2   


zSAPI5Driver.setPropertyc                 C   sD   d}d| _ | j r |r| jd d}t  td | j sd S d S )NTFg?)r   r   r&   	pythoncomPumpWaitingMessagestimesleep)r"   firstr   r   r   	startLoop   s   
zSAPI5Driver.startLoopc                 C   s
   d| _ d S NF)r   r$   r   r   r   endLoop      
zSAPI5Driver.endLoopc                 c   s     | j d 	 t  d V  qr]   )r   r&   rW   rX   r$   r   r   r   iterate   s   zSAPI5Driver.iterateN)__name__
__module____qualname__r#   r%   r*   r,   r4   staticmethodr7   r=   r!   r    r\   r^   r`   r   r   r   r   r
   )   s    


r
   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )r   c                 C   s
   d | _ d S r	   _driverr$   r   r   r   r#      r_   zSAPI5DriverEventSink.__init__c                 C   s
   || _ d S r	   re   )r"   Zdriverr   r   r   r      r_   zSAPI5DriverEventSink.setDriverc                 C   s   | j jjd||d d S )Nstarted-word)locationlength)rf   r   r'   )r"   stream_numberstream_positionr   r   r   _ISpeechVoiceEvents_StartStream   s   
z4SAPI5DriverEventSink._ISpeechVoiceEvents_StartStreamc                 C   sD   | j }|jr|jjd|j d d|_d|_|jd |  d S )Nzfinished-utterance)	completedF)rf   r   r   r'   r   r&   r^   )r"   rj   rk   dr   r   r   _ISpeechVoiceEvents_EndStream   s   z2SAPI5DriverEventSink._ISpeechVoiceEvents_EndStreamc                 C   s<   | j j}|r||||  }nd}| j jjd|||d d S )NUnknownrg   )rH   rh   ri   )rf   r   r   r'   )r"   rj   rk   charri   Zcurrent_textZcurrent_wordr   r   r   _ISpeechVoiceEvents_Word   s   
z-SAPI5DriverEventSink._ISpeechVoiceEvents_WordN)ra   rb   rc   r#   r   rl   ro   rr   r   r   r   r   r      s    	r   )Zcomtypes.clientr   Zcomtypes.genr   ImportErrorr   r   Zenginer3   rN   r-   rY   r   rW   r   r   r   r   r   ZMSSAMrL   ZMSMIKErJ   r   objectr
   r   r   r   r   r   <module>   s2   v