
    $hc*                         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rS SKJr  \R                  " 5       S:X  a  S SK
r
S SKJr  SSKJr  S r " S S	5      rg)
    N)NamedTemporaryFileWindows)Voice   )_espeakc                     [        U 5      $ N)EspeakDriver)proxys    P/home/james-whalen/.local/lib/python3.13/site-packages/pyttsx3/drivers/espeak.pybuildDriverr      s        c                       \ rS rSrSrSrS rS rS r\	S 5       r
S r\	S	\4S
 j5       r\	S	\4S j5       rS rS rS rS rS rS rS rSrg)r
      F c                    [         R                  (       d  [        R                  " [        R                  S5      nUS:X  a  Sn[        U5      e[        R                  " 5       nU(       aJ  UR                  R                  (       a/  UR                  R                  R                  S5      [         l
        OS[         l
        S[         l        Xl        SU l        SU l        SU l        S U l        SU l        / U l        S U l        [        R&                  " U R(                  5        U R+                  S	[         R                  5        U R+                  S
S5        U R+                  SS5        g )Ni  zcould not initialize espeakutf-8zgmw/enTFr   voicerate   volumeg      ?)r
   _moduleInitializedr   
InitializeAUDIO_OUTPUT_RETRIEVALRuntimeErrorGetCurrentVoicecontentsnamedecode_defaultVoice_proxy_looping	_stopping	_speaking_text_to_say_data_buffer_numerise_buffer
_save_fileSetSynthCallback_onSynthsetProperty)selfr   r   msgcurrent_voices        r   __init__EspeakDriver.__init__   s   .. %%g&D&DdKDrz3"3''#335M!7!7!<!<-:-C-C-H-H-O-OPW-X* .6*.2L+  "  /,"<"<=%3'r   c                     U R                   R                  U5        [        R                  " [	        U R                   5      5      $ r	   )r(   appendctypesc_void_plenr-   datas     r   numeriseEspeakDriver.numerise:   s0    $$T*s4#8#89::r   c                 8    U R                   [        U5      S-
     $ )Nr   )r(   intr7   s     r   decode_numericEspeakDriver.decode_numeric>   s    $$SY]33r   c                  0    [         R                  " S 5        g r	   )r   r*    r   r   destroyEspeakDriver.destroyA   s      &r   c                 r    [         R                  " 5       (       a  SU l        [         R                  " 5         g g )NT)r   	IsPlayingr$   Cancelr-   s    r   stopEspeakDriver.stopE   s'    !DNNN r   r   c                    U S:X  a  / n[         R                  " S 5       H  nUR                  R                  S5      R	                  5       nUUR
                  R                  S5      S.nUR                  (       a&   UR                  SS  nUR                  SSS9nU/US'   / S	QnXrR                     US
'   UR                  =(       d    S US'   UR                  [        S0 UD65        M     U$ U S:X  ak  [         R                  " 5       nU(       aN  UR                  R
                  (       a3  UR                  R                  R                  S5      R	                  5       $ g U S:X  a$  [         R                  " [         R                  5      $ U S:X  a'  [         R                  " [         R                   5      S-  $ U S:X  a$  [         R                  " [         R"                  5      $ SU  3n	[%        U	5      e! [         a
    S/US'    GNbf = f)Nvoicesr   )idr   r   ignore)errors	languagesUnknown)NMaleFemalegenderager   r   r   g      Y@pitchunknown property r@   )r   
ListVoices
identifierr    lowerr   rN   UnicodeDecodeErrorrR   rS   r3   r   r   r   GetParameterRATEVOLUMEPITCHKeyError)
r   rJ   vvoice_idkwargslanguage_code_byteslanguage_codegendersr   r.   s
             r   getPropertyEspeakDriver.getPropertyJ   s   8F''-<<..%'  #FFMM'2 ;;:./kk!"o+(;(B(B7S[(B(\/<o{+ 3#*88#4x  !ueofo.' .( M7?++-E,,~~0077@FFHH6>''558''7%??7?''66!$(sm' . :/8k{+:s   ;%G//HHc           	      0   U S:X  a  Uc  g  [        U5      R                  S5      n[        R                  " SU 35        [        R
                  " U5      nUS:X  a  [        R                  " SU 35        g US:X  a  SU 3n[        U5      eUS:X  a  S	U 3n[        U5      eS
U SU 3n[        U5      eU S:X  a(   [        R                  " [        R                  US5        g U S:X  a>   [        R                  " [        R                  [        [        US-  S5      5      S5        g U S:X  a1   [        R                  " [        R                  [        U5      S5        g SU  3n[!        U5      e! [        R                   a  nSU SU 3n[        U5      eS nAff = f! [        R                   a  n[        [        U5      5      eS nAff = f! [         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   zAttempting to set voice to: r   zSuccessfully set voice to: r   z=SetVoiceByName failed: EE_BUFFER_FULL while setting voice to    z@SetVoiceByName failed: EE_INTERNAL_ERROR while setting voice to z/SetVoiceByName failed with unknown return code z for voice: zInvalid voice name: z	, error: r   r   d   rT   rU   )strencodeloggingdebugr   SetVoiceByName
ValueErrorr4   ArgumentErrorSetParameterr[   r\   r<   round	TypeErrorr]   r^   )r   value	utf8Valueresultr.   es         r   r,   EspeakDriver.setPropertyq   s   7?}&J--g6	 <UGDE //	:Q;MM$?w"GHq[YZ_Y`aC$S/)q[\]b\cdC$S/) J!(,ug7  %S/) V^)$$W\\5!< X)$$W^^Sus{A9N5OQRS W_)$$W]]CJB &dV,C3-) '' &,UG9QC@ o%& '' ) Q(()
  ) Q(()
  ) Q(()sf   A(E- 5?E- ;&F )<G -/G2 -FFFG	0GG	
G/G**G/2
H<HHc                     X l         Xl        g)z8
Save the synthesized speech to the specified filename.
N)r)   r&   )r-   textfilenames      r   save_to_fileEspeakDriver.save_to_file   s     # r   c                    U R                   R                  S5        U R                   R                  S5        SU l        SU l         [
        R                  " [        U5      R                  S5      [
        R                  [
        R                  -  S9  g ! [         a;  nU R                   R                  S5        U R                   R                  SUS9  e S nAff = f)	NTzstarted-utterancer   r   )flagsFerror)	exception)r"   setBusynotifyr%   r'   r   Synthrj   rk   ENDPAUSE
CHARS_UTF8	Exception)r-   rz   rw   s      r   _start_synthesisEspeakDriver._start_synthesis   s    D!./	MM#d)**737;K;KgN`N`;`a 	KK&KKw!4	s   AB 
C6CCc           	      $   U R                   (       d  gSn X4   nUR                  [        R                  :X  a  GOUR                  [        R                  :X  aq  U R
                  (       a,  UR                  S-
  nXeR                  -   nU R
                  Xg nOSnU R                  R                  SUUR                  UR                  S9  GOnUR                  [        R                  :X  GaO  U R                  (       a   [        R                  " U R                  S5       n	U	R                  S5        U	R                  S5        U	R!                  S	5        U	R#                  U R$                  5        S
S
S
5        ['        SU R                   35        GOW [-        SSS9 n[        R                  " US5       n	U	R                  S5        U	R                  S5        U	R!                  S	5        U	R#                  U R$                  5        S
S
S
5        UR.                  nUR1                  5         S
S
S
5        [2        R4                  " 5       S:X  a  [6        R8                  " SW/SS9  Or[2        R4                  " 5       S:X  a  [:        R4                  " SW S35        O>[2        R4                  " 5       S:X  a%  [<        R>                  " W[<        R@                  5        [:        RB                  " W5        SU l        SU l         U R                  R                  SSS9  U R                  RE                  S5        U RG                  5         OUS-  nGM)  US:  aN  U =R$                  [H        RJ                  " X[H        RL                  " [H        RN                  5      -  5      -  sl        g! , (       d  f       GN1= f! [(         a  n
SU
 3n[+        U5      eS
n
A
ff = f! , (       d  f       GN= f! , (       d  f       GN= f! [(         a  n
['        SU
 35         S
n
A
GN'S
n
A
ff = f)zM
TODO: Refactor this function because it is too complex by several measures.
r   Tr   rO   zstarted-word)r   locationlengthwbrh   i"V  NzAudio saved to zError saving WAV file: z.wavF)suffixdeleteDarwinafplay)checkLinuxzaplay z -qr   zPlayback error: r   finished-utterance	completed)(r%   typer   EVENT_LIST_TERMINATED
EVENT_WORDr&   text_positionr   r"   r   EVENT_MSG_TERMINATEDr)   waveopensetnchannelssetsampwidthsetframeratewriteframesr'   printr   r   r   r   flushplatformsystem
subprocessrunoswinsound	PlaySoundSND_FILENAMEremover   endLoopr4   	string_atsizeofc_short)r-   wav
numsampleseventsieventstart_index	end_indexwordfrw   r.   temp_wavtemp_wav_names                 r   r+   EspeakDriver._onSynth   s"    ~~ IEzzW:::zzW///$$"'"5"5"9K +ll :I,,[CD$D""""00 <<	 #  w;;;??	0!YYt=NN1-NN1-NN51MM$*;*;<	 >
 /@AB
6/veLPX!%8T!:a !q 1 !q 1 !u 5 !d.?.? @	 "; -5MMM$NN, M $??,8&NNHm+DDQ%__.'9II}oS&AB%__.);$..}h>S>ST 		-0
 %(!!&""#74"H##E*FAA F >!1!1#FMMRXR`R`Da7a!bba >= % 0 7s;*3//0 ";!: ML( % 6 04556s{   :!N& AN* N& 
O, O/AO>$O"CO, 
N#N& &
O0O  O
O	O
O)$O, ,
P6P

Pc                     SU l         g )NF)r#   rF   s    r   r   EspeakDriver.endLoop  s	    r   c                 p   SnSU l         U R                   (       a  U R                   (       d  g U(       aI  U R                  R                  S5        SnU R                  (       a  U R	                  U R                  5        U R                  5         [        R                  " S5        U R                   (       a  M  g g )NTFg{Gz?)r#   r"   r   r&   r   iteratetimesleep)r-   firsts     r   	startLoopEspeakDriver.startLoop  sv    mm==##E*$$))$*;*;<LLNJJt mmmr   c                    U R                   (       d  g U R                  (       ab  [        R                  " 5         SU l        U R                  R                  SSS9  U R                  R                  S5        U R                  5         g g )NFr   r   )r#   r$   r   rE   r"   r   r   r   rF   s    r   r   EspeakDriver.iterate  s\    }}>>NN"DNKK3uEKK&LLN r   c                     Xl         g r	   )r&   )r-   rz   s     r   sayEspeakDriver.say  s     r   )r'   r#   r(   r"   r)   r%   r$   r&   N)__name__
__module____qualname____firstlineno__r   r!   r0   r9   r=   staticmethodrA   rG   rj   re   r,   r|   r   r+   r   r   r   r   __static_attributes__r@   r   r   r
   r
      s    M(<;4 ' '
 $# $ $L * # *  * X!
Ob!r   r
   )r4   rl   r   r   r   r   r   tempfiler   r   r   pyttsx3.voicer   r   r   r   r
   r@   r   r   <module>r      sF      	     '??	!  
F! F!r   