
    g
f*f                     :   d Z dZdZdZdZdZd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 d	dlmZ d	dlmZ d	dlmZ d	dlmZmZ  ej(                  dd       ddlmZ 	  ej(                  dd       ddlmZ dZ G d dej4                        Zy# e$ r dZY w xY w)z1Provides an Orca speech server for Spiel backend.z$Id$z
$Revision$z$Date$z<andyholmes@gnome.org>u(   Copyright © 2024 GNOME Foundation Inc. LGPL    N   )debug)	guilabels)messages)speechserver)settings)settings_manager)ACSS)SSMLSSMLCapabilitiesGLibz2.0)r   Spielz1.0)r   TFc                       e Zd Zi Zi ZdZdZeej                  iZ	e
d        Ze
d        Zed        Zd Zed        Ze
d        Ze
d	        Z fd
Zd Zd Zd Zd Zd Zd Zd)dZd Zd Zd Zd Zd Zd Z d*dZ!d*dZ"d+dZ#d Z$d,dZ%d,dZ&d,dZ'd Z(d-d Z)d-d!Z*d.d"Z+d.d#Z,d.d$Z-d.d%Z.d& Z/d' Z0d/d(Z1 xZ2S )0SpeechServerNdefaultc                  "    t         j                  S N)r   SPIEL     ,/usr/lib/python3/dist-packages/orca/spiel.pygetFactoryNamezSpeechServer.getFactoryName>   s    r   c                  8   g } t         j                  t         j                        }|r| j                  |       t         j                  j
                  j                  D ]:  }| j                  t         j                  |j
                  j                               < | S r   )r   _getSpeechServerDEFAULT_SERVER_IDappendDEFAULT_SPEAKERprops	providerswell_known_name)serversr   providers      r   getSpeechServerszSpeechServer.getSpeechServersB   sx    //0N0NONN7#(88>>HH ^|<<X^^=[=[\]^r   c                 |   t         j                  t        j                  i| _        |D ]9  }|j
                  j                  | j                  |j
                  j                  <   ; | j                  j                         D ]$  \  }}|| j                  vs|j                          & |D ci c]  }|j
                  j                  | c}| _        t        |      dkD  r[| j                  | j                  v rB| j                  | j                     }|j                  |d   j
                  j                         yyyc c}w )zShutdown unavailable providers.r   N)r   r   r   DEFAULT_SYNTHESIZER_SERVER_NAMESr   namer!   _active_serversitemsshutdown_active_providerslen_updateVoicesvoices)clsr    r#   r!   serverps         r   _updateProviderszSpeechServer._updateProvidersL   s    *;;Y=Z=Z[! 	TH@H@S@SChnn<<=	T (+':':'@'@'B 	"#OVc&7&77!	" FO O!8!8!!; O y>A#"7"73;N;N"N(()>)>?F  1!3!3!:!:; #O !Ps   )D9c                     d}|D ]:  }|j                   j                  D ]  }||j                   j                  |dffz  }! < || _        y)zUpdate the list of known voices for the server.

        getVoiceFamilies() prepends the list with the locale default and
        the default family.
        r   N)r   	languagesr(   _current_voice_profiles)selfr/   voice_profilesvoicelanguages        r   r.   zSpeechServer._updateVoices`   s]      	HE!KK11 HEKK$4$4h#E"GGH	H (6$r   c                 d    || j                   vr | |       | j                   j                  |      S )zReturn an active server for given id.

        Attempt to create the server if it doesn't exist yet.  Returns None
        when it is not possible to create the server.

        )r)   get)r0   serverIds     r   r   zSpeechServer._getSpeechServerm   s2     3...M ""&&x00r   c                 Z    | | d   nt         j                  }t         j                  |      S )ziGets a given SpeechServer based upon the info.
        See SpeechServer.getInfo() for more info.
        r   )r   r   r   )infothisIds     r   getSpeechServerzSpeechServer.getSpeechServer{   s+    
 !,a,2P2P,,V44r   c                      t         j                  j                         D  cg c]  } |  }} |D ]  }|j                           y c c} w r   )r   r)   valuesr+   )sr"   r1   s      r   shutdownActiveServersz"SpeechServer.shutdownActiveServers   sC    *::AACD1DD 	FOO	 Es   	Ac                 b   t         t        |           || _        d | _        d| _        i | _        t        j                  dft        j                  dft        j                  dft        j                  i ff| _        t        s(d}t        j                  t        j                   |d       y 	 | j#                          | t        j$                  |<   y # t&        $ rW}t        j(                  t        j                          d| }t        j                  t        j                   |d       Y d }~y d }~ww xY w)Nr   2         @zERROR: Spiel is not availableTz'ERROR: Spiel service failed to connect )superr   __init___id_speakerr6   _current_voice_propertiesr   RATEAVERAGE_PITCHGAINFAMILY_acss_defaults_spiel_availabler   printMessageLEVEL_WARNING_initr)   	ExceptionprintException)r7   r=   msgerror	__class__s       r   rJ   zSpeechServer.__init__   s    lD*,')$)+&YYO%YY[["	  1Cu22C>	:JJL 6:L((2  	?  !4!45;E7CCu22C>>	?s   *C 	D.AD))D.c                 j    |dk(  ry|dz  dz  }|dkD  r||dz  dz  z  }t        dt        |d            S )	Nd         $@g      Y@   rG   r   	   g?maxmin)r7   	acss_raterates      r   	_get_ratezSpeechServer._get_rate   sH    E!Q&r>TAXN"D3D$((r   c                 8    |dz  }t        dt        |d            S )NrH                  @ra   )r7   
acss_pitchpitchs      r   
_get_pitchzSpeechServer._get_pitch   s    S 3E3((r   c                 8    |dz  }t        dt        |d            S )Nr^   rh   ri   ra   )r7   acss_volumevolumes      r   _get_volumezSpeechServer._get_volume   s     t#3FC())r   c                 H   |i }|j                  t        j                  j                        }|j                  t        j                  j                        }|sGdd l}|j                         \  }}d\  }}|r)|j                  d      }|d   }t        |      dk(  r|d   }||fS )Nr   ) rr   _r_   r   )	r<   r   VoiceFamilyLANGDIALECTlocalegetdefaultlocalesplitr-   )r7   acss_familyr:   dialectrw   familyLocaleencodinglocaleValuess           r   _get_language_and_dialectz&SpeechServer._get_language_and_dialect   s    K??<#;#;#@#@A//,":":"B"BC%+%<%<%>"L( &Hg+11#6'?|$)*1oG  r   c                 :    | j                  |      \  }}|dz   |z   S )N-)r   )r7   rz   langr{   s       r   _get_languagezSpeechServer._get_language   s%    66{CgczG##r   c                 \   t        | j                  j                  j                        dk(  ry|j	                  t
        j                  j                        }| j                  |      \  }}| d| }| j                  j                  j                  d   }d}| j                  j                  j                  D ]r  }|j                  j                  D ].  }	|	j                  d      \  }
}}|
|k(  s|||fvr|}|	}||k(  s. n K|| j                  |j                  j                  fv sp|c S  |S )a  Return a Spiel voice for an ACSS family.

        If an exact match is not found the fallback will prioritize
        lang-dialect, then lang, and failing that anything available. This
        method may return None, in the rare case no voices are available.
        r   Nr   )r-   rL   r   r/   r<   r   rt   NAMEr   r5   	partition_default_voice_namer(   )r7   rz   	acss_name	acss_langacss_dialectaccs_lang_dialectfallbackfallback_langr9   r:   r   rs   r{   s                r   
_get_voicezSpeechServer._get_voice   s-    t}}""))*a/OOL$<$<$A$AB	"&"@"@"M	<(k<.9==&&--a0]]((// 	E!KK11 %-%7%7%<"q'9$$->	,JJ#((0,.  T55u{{7G7GHH#	& r   c                    t         j                  t         j                  kD  ry 	 | j                  | j                  j                  t        j                              }| j                  | j                  j                  t        j                              }| j                  | j                  j                  t        j                              }| j                  | j                  j                  t        j                              }| j                  j                  t        j                        }t        j                   dt        j"                  dt        j$                  dt        j&                  di}t)        j*                         }d| d| j                  j                  t        j                         d| j                  j                  t        j                         d	| j                  j                  t        j                         d
| j-                  |      d    d|j                  |j/                  d             d| d| d	| d
| }	t        j0                  t         j                  |	d       y # t        $ r dx}x}x}}Y ~w xY w)Nz(exception occurred)NONESOMEMOSTALLzSPIEL: z
ORCA rate z, pitch z	, volume z, language r   z, punctuation: verbalizePunctuationStylez	
SD rate T)r   
debugLevel
LEVEL_INFOrf   rM   r<   r   rN   rl   rO   rp   rP   r   rQ   rW   r	   PUNCTUATION_STYLE_NONEPUNCTUATION_STYLE_SOMEPUNCTUATION_STYLE_MOSTPUNCTUATION_STYLE_ALLr
   
getManagerr   
getSettingrT   )
r7   prefixre   rk   ro   r:   familystylesmanagerrY   s
             r   _debug_spiel_valuesz SpeechServer._debug_spiel_values   s#   e...	F>>$"@"@"D"DTYY"OPDOOD$B$B$F$FtGYGY$Z[E%%d&D&D&H&H&STF))$*H*H*L*LT[[*YZH //33DKK@11611611600%9 #--/ fX 77;;DIIFG H33778J8JKL M4488CD E66v>qAB Czz',,-HIJK LfHUG9VHKzS 	 	5++S$7+  	F/EEDE5E6H	Fs   C I. .JJc                     |!t         j                  t         j                     }| j                  }| j                  D ]#  \  }}|j                  |      }||||<   |||<   % y r   )r	   r/   DEFAULT_VOICErM   rR   r<   )r7   acsscurrentacss_propertyr   values         r   _apply_acsszSpeechServer._apply_acss  sh    <??8#9#9:D00&*&9&9 	1"M7HH]+E ).&)0&	1r   c                    t         j                  t        j                  j	                  d       t         _        t         j                  j
                  j                  j                  dt         j                         t         j                  t         j                  j
                  j                         t         j                  | _	        d| _
        i | _        t        j                  t         j                  j                  | j                   | j                         z  | _        | j                   t         j$                  k7  rt         j&                  | j                      | _        | j(                  j
                  j*                  j                  d| j,                        | _        | j-                  | j(                  j
                  j*                         y t1        | j                  j
                  j                        dkD  rI| j                  j
                  j                  d   }| j-                  |j
                  j*                         y y )Nzitems-changedr   r   )r   r   r   Speakernew_syncr   r    connectr3   rL   r6   rM   r   SPEECH_DEFAULT_VOICEr'   r<   rK   r   r   r,   	_providerr/   r.   
_voices_idr-   )r7   r#   s     r   rV   zSpeechServer._init   s   ''/+0==+A+A$+GL(((..88@@AMA^A^`)),*F*F*L*L*V*VW$44')$)+&#,#A#A&&**488TXX>$?  88|555);;DHHEDN"nn2299AA/BFBTBTVDOt~~33::;$$../!3}}**44Q7Hx~~445 4r   c                    | j                  |j                  t        j                  d            }| j	                  |j                  t        j
                  d            }| j                  |j                  t        j                  d            }| j                  |j                  t        j                  i             }|&t        j                  t        j                  dd       y |j                  d      xr |j                  d      }|sW|j                  j                   t"        j$                  j&                  z  r&t)        j*                  |t,        j.                        }d}t#        j0                  ||||||      S )	NrH   rG      No available voicesTz<speak>z</speak>)textrk   re   ro   r9   is_ssml)rl   r<   r   rO   rf   rN   rp   rP   r   rQ   r   rT   rU   
startswithendswithr   featuresr   VoiceFeatureEVENTS_SSML_MARKr   
markupTextr   MARK	Utterance)r7   r   r   rk   re   ro   r9   r   s           r   _create_utterancezSpeechServer._create_utterance8  s   ););S AB~~dhhtyy"56!!$((499a"89b 9:=u224I4P //),Jz1J5;;//%2D2D2U2UU??4)9)>)>?DGD%*$(&,%*'.0 	0r   c                     |sy | j                  |       | j                  d|j                  j                   d       | j                  j                  |       y )Nz
Speaking 'z' )r   r   r   r   rL   speak)r7   	utterancer   s      r   _speak_utterancezSpeechServer._speak_utteranceP  sJ      :ioo.B.B-C2!FGI&r   c                 z    | j                   j                  | j                  | j                        | j                  gS r   )r'   r<   rK   r7   s    r   getInfozSpeechServer.getInfoX  s,    ""&&txx:DHHEEr   c                    ddl m}m}  ||      d   }|d|vrd }n|j                  d      \  }}|dz   |z   }| j                  }d}|r-|D ]  \  }	}
}|
|k(  s|} n |s|D ]  \  }	}
}|
k(  s|} |s|}| j
                  |d ff|z   }g }|D ]  \  }	}
}|j                  t        j                  t        j                  j                  |	t        j                  j                  |
j                  d      d   t        j                  j                  |
j                  d      d   t        j                  j                  |i              |S )Nr   )	getlocaleLC_MESSAGESrs   r   rr   r_   )rw   r   r   ry   r6   r   r   r   rt   r   ru   r   rv   VARIANT)r7   r   r   rw   locale_languagelocale_langlocale_dialectr/   default_langr(   r   variantfamiliess                r   getVoiceFamilieszSpeechServer.getVoiceFamilies[  sn    	2;'*>S."O*0,,s*;'K)C/.@O--'- #dG?*#2L  +1 3'D${*'23  .++\4@BVK#) 	;D$OOL44&&++T&&++T^^C-@-C&&..s0CA0F&&..69 : ;	; r   c                 P   t        j                  t         j                  d| d       |s!t        j                  t        j
                     }| j                  |j                  t        j                  i             }|&t        j                  t         j                  dd       y |j                  j                  }|t        j                  j                  z  rd| d}n&|t        j                  j                   z  rd| d}n|}| j#                  ||      }| j%                  ||       y )NzSPIEL Character: ''r   Tz9<speak><say-as interpret-as="characters" format="glyphs">z</say-as></speak>z)<speak><say-as interpret-as="characters">)r   rT   r   r	   r/   r   r   r<   r   rQ   rU   r   r   r   r   SSML_SAY_AS_CHARACTERS_GLYPHSSSML_SAY_AS_CHARACTERSr   r   )r7   	characterr   r9   r   r   r   s          r   speakCharacterzSpeechServer.speakCharacter  s    5++/A)A-NO??8#9#9:Db 9:=u224I4P;;''e((FFFIIR TD **AAA>ykIZ[DD**46	i.r   c                    |j                         }|j                         }| d| j                         }t        |      dk(  rOd| d}t	        j
                  t        j                  |d       | j                  |       | j                  ||       y d| d}t	        j
                  t        j                  |d       | j                  ||       y )N r   SPIEL: Speaking 'z' as keyT' as stringr   )

getKeyNamegetLockingStateStringstripr-   r   rT   r   r   r   r   )r7   eventr   event_stringlockingStateStringrY   s         r   speakKeyEventzSpeechServer.speakKeyEvent  s    '')"88:&q);(<=CCE|!%l^8<Cu//d;T"d3%l^;?Cu//d;JJ|$J/r   c                    |sy |s!t         j                  t         j                     }t        |      dk(  rOd| d}t	        j
                  t        j                  |d       | j                  |       | j                  ||       y d| d}t	        j
                  t        j                  |d       | j                  ||      }| j                  ||       y )Nr   r   z	' as charTr   )r	   r/   r   r-   r   rT   r   r   r   r   r   )r7   r   r   	interruptrY   r   s         r   r   zSpeechServer.speak  s    ??8#9#9:D t9>%dV95Cu//d;T"d+%dV;7Cu//d;..tT:I!!)T2r   c           	          	 t              \  }fd} fd}fd}fd}fd}fd}	fd}
fd} j                  j                  |      }|sy g }|||f}| j                  j	                  d	||       j                  j	                  d
||       j                  j	                  d||       j                  j	                  d||      gz  }|j
                  j                  }|j
                  j                  }|t        j                  j                  z  r,|j                   j                  j	                  d|
|             |t        j                  j                  z  r,|j                   j                  j	                  d||             |t        j                  j                  z  r,|j                   j                  j	                  d|	|             |t        j                  j                  z  r,|j                   j                  j	                  d||              j                  ||       y # t         $ r Y y w xY w)Nc                     t        j                  t         j                  d|j                  j                          |\  }}}||k(  r" |t
        j                  j                         y y )Nz	STARTED: )r   rT   r   r   r   r   SayAllContextPROGRESS)speakerr   sayall_datacallbackcurrentUtterancers   contexts         r   _utterance_startedz/SpeechServer.sayAll.<locals>._utterance_started  s[    ""5#3#3yAUAU@V5WX2=/+Q#y0Wl&@&@&I&IJ 1r   c                    t        j                  t         j                  d|j                  j                          |\  }}}||k(  r |t
        j                  j                         |D cg c]  }| j                  |       c}  |t
        j                  j                         j                  _        d _        j                  	|       y y c c}w )Nz
FINISHED: )r   rT   r   r   r   r   r   r   
disconnect	COMPLETED	endOffsetcurrentOffsetcurrentEndOffsetsayAll)
r   r   r   r   r   handlershandlerr   r7   utteranceIterators
          r   _utterance_finishedz0SpeechServer.sayAll.<locals>._utterance_finished  s    ""5#3#3z)//BVBVAW5XY9D6+X#y0Wl&@&@&I&IJ@HIWW''0IWl&@&@&J&JK,3,=,=G)/3G,KK 18< 1Is   -Cc                    t        j                  t         j                  d|j                  j                          |\  }}}||k(  rA|D cg c]  }| j                  |       c}  |t        j                  j                         y y c c}w )Nz
CANCELED: )	r   rT   r   r   r   r   r   r   INTERRUPTED)r   r   r   r   r   r   r   r   s          r   _utterance_canceledz0SpeechServer.sayAll.<locals>._utterance_canceled  sw    ""5#3#3z)//BVBVAW5XY9D6+X#y0@HIWW''0IWl&@&@&L&LM 1Is   B
c                 ~   t        j                  t         j                  d|j                  j                          t        j                  t         j
                  dt        |              |\  }}}||k(  rA|D cg c]  }| j                  |       c}  |t        j                  j                         y y c c}w )NzERROR: )r   rT   r   r   r   rU   reprr   r   r   r   )	r   r   rZ   r   r   r   r   r   r   s	           r   _utterance_errorz-SpeechServer.sayAll.<locals>._utterance_error  s    ""5#3#3wy?S?S>T5UV""5#6#6'$u+8OP9D6+X#y0@HIWW''0IWl&@&@&L&LM 1Is   <B:c                     t        j                  t         j                  d|        |\  }}}||k(  r" |t        j                  j
                         y y )NzMARK REACHED: r   rT   r   r   r   r   )rL   r   r(   r   r   r   r   r   s          r   _mark_reachedz*SpeechServer.sayAll.<locals>._mark_reached  sP    ""5#3#3~dV5LM9D6+X#y0Wl&@&@&I&IJ 1r   c                     t        j                  t         j                  d| d|        |\  }}}||k(  r" |t        j                  j
                         y y )NzRANGE STARTED: r   r   	rL   r   startendr   r   r   r   r   s	           r   _range_startedz+SpeechServer.sayAll.<locals>._range_started  sV    ""5#3#3ugQse5TU9D6+X#y0Wl&@&@&I&IJ 1r   c                     t        j                  t         j                  d| d|        |\  }}}||k(  r0|_        |_         |t
        j                  j                         y y )NzWORD STARTED: r   )r   rT   r   r   r   r   r   r   r  s	           r   _word_startedz*SpeechServer.sayAll.<locals>._word_started  sf    ""5#3#3~eWAcU5ST9D6+X#y0,1G)/2G,Wl&@&@&I&IJ	 1r   c                     t        j                  t         j                  d| d|        |\  }}}|k(  r" ||t        j                  j
                         y y )NzSENTENCE STARTED: r   r   )	rL   
_utterancer  r  r   r   currentContextrs   r   s	           r   _sentence_startedz.SpeechServer.sayAll.<locals>._sentence_started  sY    ""5#3#37I%PQRUQV5WX0;->1!W,^\-G-G-P-PQ -r   zutterance-startedzutterance-finishedzutterance-canceledzutterance-errorzword-startedzsentence-startedzrange-startedzmark-reached)nextr   r   rL   r   r   r9   r   r   r   EVENTS_WORDr   EVENTS_SENTENCEEVENTS_RANGEr   r   StopIteration)r7   r   progressCallbackr   r   r   r   r   r  r  r  r  r   r   r   r9   r   r   s   ``               @r   r   zSpeechServer.sayAll  s#   c	3 !23MGTK	=NNKKKR ..w/@/@$GIH+YAK%%&9;M{[%%&:<OQ\]%%&:<OQ\]%%&79I;W	 H OO))E{{++H%,,888 5 5n6C6A!C D %,,<<< 5 56H6G6A!C D %,,999 5 5o6D6A!C D %,,=== 5 5n6C6A!C D !!)T2C  		s   H; ;	IIc                    t         j                  t         j                     }||xr dxs dz  }	 |t        j                     }t        dt        d||z               |t        j                  <   d| }t        j                  t        j                  |d       | j                  |xr t        j                  xs t        j                  |       y # t
        $ r d}Y w xY w)	Nr   rG   r   c   zSPIEL: Rate set to Tr   )r	   r/   r   r   rN   KeyErrorrb   rc   r   rT   r   r   r   SPEECH_SLOWERSPEECH_FASTER)r7   stepdecreaser   deltare   rY   s          r   _change_default_speech_ratez(SpeechServer._change_default_speech_rate&  s    x556R-2.			?D aR!67TYY#D6*5++S$7

86 6 6 -,,4 	 	9  	D	   C CCc                    t         j                  t         j                     }||xr dxs dz  }	 |t        j                     }t        dt        d||z               |t        j                  <   d| }t        j                  t        j                  |d       | j                  |xr t        j                  xs t        j                  |       y # t
        $ r d}Y w xY w)	Nr  r   r   r   r`   zSPIEL: Pitch set to Tr   )r	   r/   r   r   rO   r  rb   rc   r   rT   r   r   r   SPEECH_LOWERSPEECH_HIGHER)r7   r  r  r   r  rk   rY   s          r   _change_default_speech_pitchz)SpeechServer._change_default_speech_pitch3  s    x556R-2.	++,E $'q#a*?#@T $UG,5++S$7

85 5 5 -,,4 	 	9  	E	r  c                    t         j                  t         j                     }||xr dxs dz  }	 |t        j                     }t        dt        d||z               |t        j                  <   d| }t        j                  t        j                  |d       | j                  |xr t        j                  xs t        j                  |       y # t
        $ r d}Y w xY w)	Nr  r   
   r   r`   zSPIEL: Volume set to Tr   )r	   r/   r   r   rP   r  rb   rc   r   rT   r   r   r   SPEECH_SOFTERSPEECH_LOUDER)r7   r  r  r   r  ro   rY   s          r   _change_default_speech_volumez*SpeechServer._change_default_speech_volume@  s    x556R-2.	$))_F aQ!78TYY%fX.5++S$7

86 6 6 -,,4 	 	9  	F	r  c                    t        t        j                  j                               dk(  rt        j                  j
                  j                  rRt        j                  j                         j                  d       t        j                  j
                  j                  rRt        j                  j                          d t        _        yy)Nr   FT)r-   r   r)   rC   r   r   speakingr   MainContextr   	iterationpauser   s    r   _maybe_shutdownzSpeechServer._maybe_shutdownM  s    |++2245:..44==  ((*44U; ..44== ((..0+/L(r   c                 &    | j                  |       y r   r  r7   r  s     r   increaseSpeechRatezSpeechServer.increaseSpeechRateZ  s    ((.r   c                 *    | j                  |d       y NT)r  r.  r/  s     r   decreaseSpeechRatezSpeechServer.decreaseSpeechRate]  s    (((=r   c                 &    | j                  |       y r   r!  r/  s     r   increaseSpeechPitchz SpeechServer.increaseSpeechPitch`  s    ))$/r   c                 *    | j                  |d       y r2  r5  r/  s     r   decreaseSpeechPitchz SpeechServer.decreaseSpeechPitchc  s    ))$)>r   c                 &    | j                  |       y r   r&  r/  s     r   increaseSpeechVolumez!SpeechServer.increaseSpeechVolumef  s    **40r   c                 *    | j                  |d       y r2  r:  r/  s     r   decreaseSpeechVolumez!SpeechServer.decreaseSpeechVolumei  s    **4$*?r   c                 8    | j                   j                          y r   )rL   cancelr   s    r   stopzSpeechServer.stopl  s    r   c                    | j                   t        j                  k7  r9| j                  j                  j
                  j                  | j                         | j                          t        j                  | j                   = y r   )
rK   r   r   r   r   r/   r   r   r,  r)   r   s    r   r+   zSpeechServer.shutdowno  sT    88|555NN  ''224??C((2r   c                    | j                   j                          | j                  t        j                  k7  r9| j
                  j                  j                  j                  | j                         | j                          y r   )rL   r?  rK   r   r   r   r   r/   r   r   rV   )r7   r   r   s      r   resetzSpeechServer.resetu  sO    88|555NN  ''224??C

r   )rr   r   )NNT)F)r   )g      ?)NN)3__name__
__module____qualname__r,   r)   r   r   r   r&   r'   staticmethodr   r$   classmethodr3   r.   r   rA   rE   rJ   rf   rl   rp   r   r   r   r   r   rV   r   r   r   r   r   r   r   r   r  r!  r&  r,  r0  r3  r6  r8  r;  r=  r@  r+   rC  __classcell__)r[   s   @r   r   r   4   sH    OO!&	(E(EFM    < <&6 1 1 5 5  :4))
*
!($#J8@	16000'F'R/003,d3L999/>0?1@3r   r   )__doc____id____version____date__
__author____copyright____license__girr   r   r   r   r   r	   r
   r   r   ssmlr   r   require_versiongi.repositoryr   r   rS   rW   r   r   r   r   <module>rU     s   , 8	(
: 	        (   65 ! Bw&#E	<,, E	  s   B BB