
    $h?                     6   S SK r S SKJr  S SK	r	S SK
r
S SKrS SKrS SKrS SKrS SKJr  SrSrSr\S	\S
\S0rS rS r " S S5      r " S S5      rg! \ a?    \R
                  R                  S5      r\R
                  R                  S5      rS SKJr   Nf = f)    N)	SpeechLibzSAPI.SpVoicezSAPI.SpFileStream)Voicez@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                     [        U 5      $ N)SAPI5Driver)proxys    O/home/james-whalen/.local/lib/python3.13/site-packages/pyttsx3/drivers/sapi5.pybuildDriverr   "   s    u    c                     U R                  S5      u  p[        U5      S-  [        U5      -  n [        R                  U   R	                  SS5      $ ! [
         a    SU 3s $ f = f)N-
   _zUnknown Locale: )splitintlocalewindows_localereplaceKeyError)language_codeprimarysub	locale_ids       r
   lcid_to_localer   &   si     &&s+LGSR3w</I.$$Y/77SAA .!)--.s   "A A$#A$c                       \ rS rSrSS jrSS jrSS jrSS jrSS jr\	S 5       r
S	 rS
 rSS jrSS jrSS jrS rSrg)r   0   Nc                    [         R                  R                  S5      U l        SU R                  l        [        5       U l        U R                  R                  [        R                  " U 5      5        [         R                  R                  U R                  U R                  5      U l        Xl        SU l        SU l        SU l        SU l        SU l        U R%                  SU R'                  S5      5        g )NzSAPI.SPVoicei  F    voice)comtypesclientCreateObject_ttsEventInterestsSAPI5DriverEventSink_event_sink	setDriverweakrefr	   	GetEvents_advise_proxy_looping	_speaking	_stopping_current_text_rateWpmsetPropertygetProperty)selfr	   s     r
   __init__SAPI5Driver.__init__1   s    OO00@	#(		 /1""7==#6700D<L<LM$"2"27";<r   c                 &    SU R                   l        g )Nr   )r%   r&   r5   s    r
   destroySAPI5Driver.destroyA   s    #$		 r   c                    U R                   R                  S5        U R                   R                  S5        SU l        Xl        U R
                  R                  [        U5      R                  S5      R                  S5      S5        g )NTzstarted-utteranceutf-8   )
r-   setBusynotifyr/   r1   r%   Speakstrencodedecode)r5   texts     r
   saySAPI5Driver.sayD   se    D!./! 			IW%,,W5q	
r   c                     U R                   (       d  g U R                  R                  S5        SU l        U R                  R                  SS5        g )NTr      )r/   r-   r?   r0   r%   rA   r9   s    r
   stopSAPI5Driver.stopP   s7    ~~D!		Ar   c                    [         R                  " 5       n[        R                  R	                  S5      nUR                  U[        R                  5        U R                  R                  nXl
        X@R                  l	        U R                  R                  [        U5      R                  S5      R                  S5      5        XPR                  l	        UR                  5         [         R                   " U5        g )NzSAPI.SPFileStreamr=   )osgetcwdr"   r#   r$   Openr   SSFMCreateForWriter%   AudioOutputStreamr1   rA   rB   rC   rD   closechdir)r5   rE   filenamecwdstreamtemp_streams         r
   save_to_fileSAPI5Driver.save_to_fileW   s    iik--.ABHi::;ii11!&,		#		D	((188AB&1		#
r   c                 `   U R                   nU R                  5       nU R                  S5      n[        US5      nUS-   SUS-	  S-   3n[	        U5      /nU R                  S5      nU=(       d    SR                  5       nUS;   a  UOS n	U R                  S	5      n
U
S
;   a  U
OS n[        XXiUS9$ )NLanguage   i  r   r   Genderr   >   MaleFemaleAge>   TeenAdultChildSenior)idname	languagesgenderage)IdGetDescriptionGetAttributer   r   titler   )attrvoice_id
voice_namelanguage_attrr   primary_sub_coderg   gender_attrgender_title_caserh   age_attrri   s               r
   _toVoiceSAPI5Driver._toVoicec   s     77((*
 ))*5M2.+e34A}7Je6S5TU#$456	 ''1(.B557&7;M&M"SW $$U+"&JJhPT Y[^__r   c                     U R                   R                  5       nU H  nUR                  U:X  d  M  Us  $    Sn[        XA5      e)Nzunknown voice id %s)r%   	GetVoicesrj   
ValueError)r5   id_tokenstokenmsgs        r
   _tokenFromIdSAPI5Driver._tokenFromId{   s@    $$&Exx3  $""r   c                 |   US:X  a9  U R                   R                  5        Vs/ s H  o R                  U5      PM     sn$ US:X  a   U R                   R                  R                  $ US:X  a  U R
                  $ US:X  a  U R                   R                  S-  $ US:X  a  [        S5        g SU 3n[        U5      es  snf )	Nvoicesr!   ratevolumeg      Y@pitch/Pitch adjustment not supported when using SAPI5unknown property )	r%   ry   rv   r   rj   r2   Volumeprintr   )r5   rf   rn   r~   s       r
   r4   SAPI5Driver.getProperty   s    848II4G4G4IJ4IDMM$'4IJJ7?99??%%%6>== 899##e++7?CD!$(sm Ks   B9c                 N   US:X  a  U R                  U5      nX0R                  l        [        R	                  U[        [
           5      u  pE[        [        R                  " U R                  U-  U5      5      U R                  l
        g US:X  a|  U R                  R                  R                  n[        R	                  U[        [
           5      u  pE [        [        R                  " X$-  U5      5      U R                  l
        X l	        g US:X  a)   [        [        US-  S5      5      U R                  l        g US:X  a  [#        S5        g SU 3n[%        U5      e! [         a  n[        [        U5      5      eS nAff = f! [         a  n[        [        U5      5      eS nAff = f)	Nr!   r   r   d      r   r   r   )r   r%   r   E_REGgetMSMARYr   mathlogr2   Raterj   	TypeErrorrz   rB   roundr   r   r   )	r5   rf   valuer}   abr{   er~   s	            r
   r3   SAPI5Driver.setProperty   sG   7?%%e,E#IIO99UE&M2DA $--!*;Q!?@DIINV^))//$$C99S%-0DA)!$TXXei%;!<		 "MX)#&uUS[!'<#=		  W_CD%dV,C3-  ) Q(()  ) Q(()s0   1E 'F 
E>%E99E>
F$FF$c                     SnSU l         U R                   (       ac  U(       a  U R                  R                  S5        Sn[        R                  " 5         [
        R                  " S5        U R                   (       a  Mb  g g )NTFg?)r.   r-   r?   	pythoncomPumpWaitingMessagestimesleep)r5   firsts     r
   	startLoopSAPI5Driver.startLoop   sR    mm##E*))+JJt mmmr   c                     SU l         g NF)r.   r9   s    r
   endLoopSAPI5Driver.endLoop   s	    r   c              #   x   #    U R                   R                  S5         [        R                  " 5         S v   M  7fr   )r-   r?   r   r   r9   s    r
   iterateSAPI5Driver.iterate   s.     E"))+ s   8:)	r,   r1   r(   r.   r-   r2   r/   r0   r%   returnN)__name__
__module____qualname____firstlineno__r6   r:   rF   rJ   rX   staticmethodrv   r   r4   r3   r   r   r   __static_attributes__ r   r
   r   r   0   sO    = %


 ` `.# 2r   r   c                   F    \ rS rSrS	S jrS	S jrS	S jrS	S jrS	S jrSr	g)
r'      Nc                     S U l         g r   _driverr9   s    r
   r6   SAPI5DriverEventSink.__init__   s	    r   c                     Xl         g r   r   )r5   drivers     r
   r)   SAPI5DriverEventSink.setDriver   s    r   c                 L    U R                   R                  R                  SXS9  g )Nstarted-word)locationlength)r   r-   r@   )r5   stream_numberstream_positions      r
   _ISpeechVoiceEvents_StartStream4SAPI5DriverEventSink._ISpeechVoiceEvents_StartStream   s    "">M"br   c                    U R                   nUR                  (       a)  UR                  R                  SUR                  (       + S9  SUl        SUl        UR                  R                  S5        UR                  5         g )Nzfinished-utterance)	completedF)r   r/   r-   r@   r0   r?   r   )r5   r   r   ds       r
   _ISpeechVoiceEvents_EndStream2SAPI5DriverEventSink._ISpeechVoiceEvents_EndStream   sV    LL;;HHOO0OOL				r   c                     U R                   R                  =n(       a  XSX4-    OSnU R                   R                  R                  SXcUS9  g )NUnknownr   )rf   r   r   )r   r1   r-   r@   )r5   r   r   charr   current_textcurrent_words          r
   _ISpeechVoiceEvents_Word-SAPI5DriverEventSink._ISpeechVoiceEvents_Word   sO     !% : ::: . 	 	"">\b"cr   r   r   )
r   r   r   r   r6   r)   r   r   r   r   r   r   r
   r'   r'      s    cdr   r'   )comtypes.clientr"   comtypes.genr   ImportErrorr#   r$   enginerV   r   r   rM   r   r*   r   pyttsx3.voicer   MSSAMr   MSMIKEr   r   r   r   r'   r   r   r
   <module>r      s    '&   	     	Q	R	R 
O.L L`d du  '__)).9F__))*=>F&'s   A ABB