+
    Qi  c                  s^   R t ^ RIHt RtRtRtRtRtRt^ RI	t	^ RI
t
^ R	IHtHtHtHt ^ RIt ]P"                  ! R
R4       ^ RIHt Rt^RIHt ^RIHt ^RIHt ^RIHt ^RIHt ^RIHt ^RIHt ^RIH t H!t! ]'       d   ^RIH"t"  ! R R]PF                  4      t#R#   ] d    Rt Lbi ; i)z1Provides an Orca speech server for Spiel backend.)annotationsz$Id$z
$Revision$z$Date$z<andyholmes@gnome.org>u(   Copyright © 2024 GNOME Foundation Inc. ZLGPLN)TYPE_CHECKINGAnyCallableIteratorSpielz1.0)r   TF)debug)	guilabels)speechserver)settings)settings_manager)ACSS)VoiceFamily)SSMLSSMLCapabilities)input_eventc                  s  a  ] tR t^Bt$ Rt/ tR]R&   / tR]R&   RtR]R&   R	t	]	]
P                  /tR
]R&   ]R R l4       t]R R l4       t]R R l4       tR R lt]R R l4       t]ReR R ll4       t]R R l4       tR V 3R lltR R ltR R ltR  R! ltR" R# ltR$ R% ltR& R' ltRfR( R) lltR* R+ ltR, R- ltR. R/ lt R0 R1 lt!R2 R3 lt"R4 R5 lt#ReR6 R7 llt$ReR8 R9 llt%RgR: R; llt&R< R= lt'RhR> R? llt(RhR@ RA llt)RhRB RC llt*RD RE lt+RiRF RG llt,RiRH RI llt-RjRJ RK llt.RjRL RM llt/RjRN RO llt0RjRP RQ llt1RR RS lt2RT RU lt3RV RW lt4ReRX RY llt5RfRZ R[ llt6R\ R] lt7R^ R_ lt8R` Ra lt9Rb Rc lt:Rdt;V ;t<# )kSpeechServerzSpiel speech server for Orca.zdict[str, Any]_active_providerszdict[str, SpeechServer]_active_serversNr   DEFAULT_SPEAKERdefaultzdict[str, str]_SERVER_NAMESc                   V ^8  d   QhRR/#    returnstr Zformat   "//usr/lib/python3.14/site-packages/orca/spiel.py__annotate__SpeechServer.__annotate__M   s      c     c                 	s"    \         P                  # N)r   ZSPIELr   r!   r   get_factory_nameZSpeechServer.get_factory_nameL   s    r!   c               r   )r   r   zlist[SpeechServer]r   r   r   r   r   r    Q   s     	 	 2 	r!   c                 	sP   . p \         P                  \         P                  4      pVe}   V P                  V4       \         P                  P
                  P                   FC  p\         P                  VP
                  P                  4      pVf   K2  V P                  V4       KE  	  V # r"   )r   _get_speech_serverDEFAULT_SERVER_IDappendr   props	providerswell_known_name)serversr   providerservers       r   get_speech_serversZSpeechServer.get_speech_serversP   s    11,2P2PQNN7#(88>>HH%889W9WX%NN6* I r!   c                    V ^8  d   QhRRRR/# )r   r(   r   r   Noner   r   r   r   r   r    ]   s     < <# <$ <r!   c                s   \         P                  \        P                  /V n        V F:  pVP
                  P                  V P                  VP
                  P                  &   K<  	  V P                  P                  4        F'  w  r4W0P                  9  g   K  VP                  4        K)  	  V Uu/ uF  qUP
                  P                  VbK  	  upV n        \        V4      ^ 8  di   V P                  V P                  9   dL   V P                  V P                  ,          pVP                  V^ ,          P
                  P                  4       R# R# R# u upi )zShutdown unavailable providers.N)r   r%   r   DEFAULT_SYNTHESIZERr   r'   namer)   r   Zitemsshutdownr   lenupdate_voicesvoices)clsr(   r+   r)   r,   Zp   &&    r   _update_providersZSpeechServer._update_providers\   s    *;;Y=Z=Z[!H@H@S@SChnn<<= " (+':':'@'@'B#O&7&77! (C FO OY!8!8!!;Y O y>A#"7"73;N;N"N(()>)>?F  1!3!3!:!:; #O !Ps   /Ec               r.   )r   r5   r   r   r/   r   r   r   r   r   r    p   s     9 9C 9D 9r!   c                s   RV P                    R\        V4       R2p\        P                  ! \        P                  VR4       RpV F@  pVP
                  P                   F#  pW4P
                  P                  VR33,          pK%  	  KB  	  W0n        R\        V4       R2p\        P                  ! \        P                  VR4       R# )	zUpdate the list of known voices for the server.

get_voice_families() prepends the list with the locale default and
the default family.
z$SPIEL: Updating voices for provider z, got z voicesTNzSPIEL: Updated voice profiles: z	 profilesr   )	_idr3   r   print_message
LEVEL_INFOr'   	languagesr1   _current_voice_profiles)selfr5   msgZvoice_profilesvoicelanguager7   r   r4   ZSpeechServer.update_voicesp   s     5TXXJfS[MQXYE,,c48<>E!KK11KK$4$4h#E"GG 2  (6$/N0C/DINE,,c48r!   c               r.   )r   	server_idr   r   SpeechServer | Noner   r   r   r   r   r       s     2 23 23F 2r!   c                sh    WP                   9  d	   V ! V4       V P                   P                  V4      # )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)r6   rB      &&r   r$   ZSpeechServer._get_speech_server   s0     ///	N ""&&y11r!   c               r.   )r   infozlist[str] | Noner   rC   r   r   r   r   r   r       s     8 8 0 8<O 8r!   c                sf    V e
   V ^,          M\         P                  p\         P                  V4      # )z.Gets a given SpeechServer based upon the info.)r   r%   r$   )rF   Zthis_id   & r   get_speech_serverZSpeechServer.get_speech_server   s+     "-$q'<3Q3Q..w77r!   c               r   r   r   r/   r   r   r   r   r   r       s      T r!   c                 	s    \        \        P                  P                  4       4      p V  F  pVP	                  4        K  	  R # r"   )Zlistr   r   valuesr2   )r*   r,   s     r   shutdown_active_serversZ$SpeechServer.shutdown_active_servers   s/    |33::<=FOO r!   c               r.   )r   rB   r   r   r/   r   r   r   r   r   r       s     #; #;# #;$ #;r!   c                	s   < \         SV `  4        V\        P                  8w  d&   V\        P                  9  d   \        P                  pWn        R V n        RV n        / V n        R V n	        R V n
        RV n        R V n        \        P                  ^23\        P                  R3\        P                   R3\        P"                  / 33V n        \&        '       g+   Rp\(        P*                  ! \(        P,                  VR4       R #  V P/                  4        V \        P0                  V&   R #   \2         d[   p\(        P4                  ! \(        P,                  4       RT 2p\(        P*                  ! \(        P,                  TR4        R p?R # R p?ii ; i)N       @zERROR: Spiel is not availableTz'ERROR: Spiel service failed to connect r   )Zsuper__init__r   r%   r   r9   _speakerr=   _current_voice_properties	_provider
_voices_id_default_voice_name_current_voicer   RATEAVERAGE_PITCHGAINFAMILY_acss_defaults_SPIEL_AVAILABLEr   r:   LEVEL_WARNING_initr   	ExceptionZprint_exception)r>   rB   r?   error	__class__s   &&  r   rN   ZSpeechServer.__init__   sC    666 > >>$66I!')$9;&"&*(* #'YYO%YY[["	  1C 3 3S$?	;JJL 7;L((3  	@!!%"5"56;E7CC 3 3S$??	@s   D( (F3AFFc                    V ^8  d   QhRRRR/# )r   	acss_ratefloatr   r   r   r   r   r   r       s     ) )5 )U )r!   c                	s    V^d8X  d   R# VR,          ^,          pV^28  d   W"^,          ^	,          ,          p\        R\        VR4      4      # )id         $@g      Y@g?maxmin)r>   ra   rate   && r   	_get_rateZSpeechServer._get_rate   sF    E!Q&r>AXN"D3D$((r!   c               r`   )r   
acss_pitchrb   r   r   r   r   r   r   r       s     ) )U )u )r!   c                	@    VR ,          p\        R\        VR4      4      # )rM                  @rd   )r>   rj   pitchrh   r   
_get_pitchZSpeechServer._get_pitch   s    S 3E3((r!   c               r`   )r   acss_volumerb   r   r   r   r   r   r   r       s     * *u * *r!   c                	rk   )rc   rl   rm   rd   )r>   rp   volumerh   r   _get_volumeZSpeechServer._get_volume   s     t#3FC())r!   c               r.   )r   acss_familyVoiceFamily | Noner   tuple[str, str]r   r   r   r   r   r       s     + +5G +O +r!   c                	s   Vf   \        R 4      pVP                  \        P                   P                  4      pVP                  \        P                   P                  4      pV'       gV   \
        P                  ! 4       w  rERRr2V'       d4   VP                  R4      pV^ ,          p\        V4      ^8X  d
   V^,          p\        V4      \        V4      3# )NrL   _)
r   rD   r   LANGDIALECTlocale	getlocalesplitr3   r   )r>   rs   rA   dialectZfamily_localeZ	_encodingZlocale_valuess   &&     r   _get_language_and_dialectZ&SpeechServer._get_language_and_dialect   s    %d+K??<#;#;#@#@A//,":":"B"BC'-'7'7'9$M "Bg - 3 3C 8(+}%*+A.G8}c'l**r!   c               r.   )r   rs   rt   r   r   r   r   r   r   r   r       s     $ $); $ $r!   c                	sH    V P                  V4      w  r#VR ,           V,           # )-)r}   )r>   rs   langr|   s   &&  r   _get_languageZSpeechServer._get_language   s#    66{CczG##r!   c               r.   )r   rs   rt   r   r   r   r   r   r   r   r       s     2 2&8 2S 2r!   c                s\   V P                   e/   \        V P                   P                  P                  4      ^ 8X  d8   RV P                   2p\
        P                  ! \
        P                  VR4       R# Vf   \        R4      pVP                  \        P                  P                  4      pV P                  V4      w  rEV RV 2pV P                  '       d   V P                  # V P                   P                  P                  pV'       g   V'       d
   V^ ,          # R# V^ ,          pRp	V F|  p
V
P                  P                   F3  pVP                  R4      w  rpW8X  g   K  WV39  d   T
pTp	W8X  g   K3   M	  KR  W0P                   V
P                  P"                  39   g   Kz  V
u # 	  V# )zReturn 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.
Nz(SPIEL: No voices available for provider Tr~   )rQ   r3   r'   r5   r9   r   r:   r[   r   rD   r   NAMEr}   rT   r<   	partitionrS   r1   )r>   rs   r?   Z	acss_nameZ	acss_langZacss_dialectZaccs_lang_dialectr5   ZfallbackZfallback_langr@   rA   r   rv   r|   s   &&             r   
_get_voiceZSpeechServer._get_voice   s{    >>!S)=)=)D)D%E%J<TXXJGC 3 3S$?%d+KOOL$<$<$A$AB	"&"@"@"M	(k<.9 &&& %%,, &6!90D0!9E!KK11%-%7%7%<"'$$	,JJ#((0. 2  55u{{7G7GHH# & r!   c               r.   )r   prefixr   r   r/   r   r   r   r   r   r    #  s     "9 "9# "9t "9r!   c                	s~   \         P                  \         P                  8  d   R #  V P                  V P                  P                  \        P                  R4      4      pV P                  V P                  P                  \        P                  R4      4      pV P                  V P                  P                  \        P                  R4      4      pV P                  V P                  P                  \        P                  \        R 4      4      4      p\        V4      p\        V4      p\        V4      pV P                  P                  \        P                  4      p	\"        P$                  R\"        P&                  R\"        P(                  R\"        P*                  R/p
\,        P.                  ! 4       pRV R	V P                  P                  \        P                  4       R
V P                  P                  \        P                  4       RV P                  P                  \        P                  4       RV P1                  V	4      ^ ,           RV
P                  VP3                  R4      4       RV R
V RV RV 2p\         P4                  ! \         P                  VR4       R #   \          d    R;p;p;r ELi ; i)Ng      I@rM   z(exception occurred)ZNONEZSOMEZMOSTZALLSPIEL: z
ORCA rate z, pitch z	, volume z, language z, punctuation: ZverbalizePunctuationStylez
SPIEL rate T)r   Z
debugLevelr;   ri   rP   rD   r   rU   ro   rV   rr   rW   r   rX   r   r   r]   r	   ZPUNCTUATION_STYLE_NONEZPUNCTUATION_STYLE_SOMEZPUNCTUATION_STYLE_MOSTZPUNCTUATION_STYLE_ALLr
   Zget_managerr}   Zget_settingr:   )r>   r   Zrate_valZ	pitch_valZ
volume_valrA   rg   rn   rq   familyZstylesZmanagerr?   s   &&           r   _debug_spiel_valuesZ SpeechServer._debug_spiel_values#  sR   e...
	F~~d&D&D&H&HTX&YZH(F(F(J(J4K]K]_b(cdI))$*H*H*L*LTYYX[*\]J))..224;;D@QRTHx=D	NE_F //33DKK@11611611600%9 #..0 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'--.IJKL Mxwix{8*V 	 	E,,c48+  	F/EEDE5E6H	Fs   DJ& &J<;J<c               r.   )r   acssACSS | Noner   r/   r   r   r   r   r   r    G  s     	1 	1 	1 	1r!   c                	s    Vf&   \         P                  \         P                  ,          pV P                  pV P                   F$  w  r4VP                  V4      pVe   WRV&   K   WBV&   K&  	  R # r"   )r	   r5   DEFAULT_VOICErP   rY   rD   )r>   r   ZcurrentZacss_propertyr   Zvaluer7   r   _apply_acssZSpeechServer._apply_acssG  s]    <??8#9#9:D00&*&9&9"MHH]+E ).&)0& ':r!   c               r   rI   r   r   r   r   r   r    R  s     $: $:t $:r!   c                	s   \         P                  f   \        P                  P	                  R 4      \         n        \         P                  P
                  P                  P                  R\         P                  4       \         P                  \         P                  P
                  P                  4       \         P                  V n	        / V n
        \        P                  \         P                  P                  V P                  V P                  4      ,          V n        \         P"                  '       g+   Rp\$        P&                  ! \$        P(                  VR4       R # \         P"                  P                  V P                  4      V n        V P*                  f6   \-        \/        \         P"                  P1                  4       4      4      V n        V P                  \         P2                  8w  d   V P*                  P
                  P4                  P                  RV P6                  4      V n        RV P8                   RV P                   2p\$        P&                  ! \$        P:                  VR4       V P7                  V P*                  P
                  P4                  4       R # Rp\$        P&                  ! \$        P:                  VR4       \=        V P                  P
                  P                  4      ^ 8  dO   V P                  P
                  P                  ^ ,          pV P7                  VP
                  P4                  4       R # R # )Nitems-changedz$ERROR: No Spiel providers available.T'SPIEL: Connected voices signal with ID z for provider z5SPIEL: No voices signal connection for default server)r   r   r   ZSpeakerZnew_syncr'   r(   connectr8   rO   rP   r   SPEECH_DEFAULT_VOICEr   rD   r9   rS   r   r   r:   r[   rQ   nextiterrJ   r%   r5   r4   rR   r;   r3   )r>   r?   r+      &  r   r\   ZSpeechServer._initR  s:   ''/+0==+A+A$+GL(((..88@@AMA_A_a**<+G+G+M+M+W+WX$44)+&#,#A#A&&**488TXX>$?  ---8C 3 3S$?%77;;DHHE>>!!$|'E'E'L'L'N"OPDN 88|555"nn2299AA/BFBTBTVDO :$//9J.Y]YaYaXbc   0 0#t<t~~33::;IC 0 0#t<4==&&001A5==..88;""8>>#8#89 6r!   c               $    V ^8  d   QhRRRRRR/# )r   textr   r   r   r   zSpiel.Utterance | Noner   r   r   r   r   r    x  s"     0 0c 0 0:P 0r!   c           	     	sD   V P                  VP                  \        P                  R 4      4      pV P	                  VP                  \        P
                  ^24      4      pV P                  VP                  \        P                  R 4      4      pV P                  VP                  \        P                  \        R4      4      4      pVf)   \        P                  ! \        P                  RR4       R# VP                  R4      ;'       d    VP                  R4      pV'       gc   VP                   P"                  \$        P&                  P(                  ,          '       d(   \*        P,                  ! V\.        P0                  4      pRp\$        P2                  ! VVVVVVR7      # )rM   NNo available voicesTz<speak>z</speak>)r   rn   rg   rq   r@   is_ssml)ro   rD   r   rV   ri   rU   rr   rW   r   rX   r   r   r:   r[   Z
startswithZendswithr'   featuresr   VoiceFeatureEVENTS_SSML_MARKr   Zmarkup_textr   ZMARKZ	Utterance)r>   r   r   rn   rg   rq   r@   r   s   &&&     r   _create_utteranceZSpeechServer._create_utterancex  s$   ););S AB~~dhhtyy"56!!$((499c":;k$6G HI= 3 35JDQ //),JJz1J5;;//%2D2D2U2UUU##D*:*?*?@DGD%*$(&,%*'.0 	0r!   c               r   )r   	utterancer   r   r   r   r/   r   r   r   r   r   r      s!     + +# +T +d +r!   c                	s    V'       g   R # V P                  V4       V P                  RVP                  P                   R24       V P                  e   V P                  P                  V4       R # R # )Nz
Speaking 'z' )r   r   r'   r   rO   speak)r>   r   r   s   &&&r   _speak_utteranceZSpeechServer._speak_utterance  sY      :ioo.B.B-C2!FG==$MM	* %r!   c               r   )r   r   z	list[str]r   r   r   r   r   r      s     F F) Fr!   c                	sz    V P                   P                  V P                  V P                  4      V P                  .# r"   )r   rD   r9   r>      &r   get_infoZSpeechServer.get_info  s,    ""&&txx:DHHEEr!   c               r   )r   r   zlist[speechserver.VoiceFamily]r   r   r   r   r   r      s     & &$B &r!   c                	s$   \         P                  ! \         P                  4      ^ ,          pVe   RV9  d   RpM#VP                  R4      w  r4VR,           V,           pV P                  pRpV'       d@   V F  w  rxp	W8X  g   K  Tp M	  V'       g   V F  w  rxp	VX8X  g   K  TpK  	  V'       g   TpV P
                  VR33V,           p. p
V F  w  rxp	V
P                  \        P                  ! \        P                  P                  V\        P                  P                  VP                  R4      ^ ,          \        P                  P                  VP                  R4      ^,          \        P                  P                  V	/4      4       K  	  V
# )i    Nrv   r~   rL   )ry   rz   ZLC_MESSAGESr{   r=   rS   r&   r   r   r   rw   r   rx   VARIANT)r>   Zcurrent_localeZlocale_languageZlocale_langZlocale_dialectr5   Zdefault_langr1   r   ZvariantZfamiliess   &          r   get_voice_familiesZSpeechServer.get_voice_families  sa     ))&*<*<=a@!S%>"O*8*>*>s*C'K)C/.@O:>:V:V'-#G*#2L (.  +1'D{*'2 ,2  .++\4@BVK#)DOOL44&&++T&&++T^^C-@-C&&..s0CA0F&&..69 : ; $* r!   c               r   )r   	characterr   r   r   r   r/   r   r   r   r   r   r      s!     / / /K /4 /r!   c                	s   \         P                  ! \         P                  R V R24       V'       g&   \        P                  \        P
                  ,          pV P                  VP                  \        P                  \        R4      4      4      pVf)   \         P                  ! \         P                  RR4       R# VP                  P                  pV\        P                  P                   ,          '       d   RV R2pM0V\        P                  P"                  ,          '       d   RV R2pMTpV P%                  WR4      pV P'                  Wb4       R# )zSPIEL Character: 'Z'Nr   Tz9<speak><say-as interpret-as="characters" format="glyphs">z</say-as></speak>z)<speak><say-as interpret-as="characters">)r   r:   r;   r	   r5   r   r   rD   r   rX   r   r[   r'   r   r   r   ZSSML_SAY_AS_CHARACTERS_GLYPHSZSSML_SAY_AS_CHARACTERSr   r   )r>   r   r   r@   r   r   r      &&&    r   speak_characterZSpeechServer.speak_character  s   E,,0B9+Q.OP??8#9#9:Dk$6G HI= 3 35JDQ;;''e((FFFFIIR TD **AAAA>ykIZ[DD**46	i.r!   c               r   )r   eventzinput_event.KeyboardEventr   r   r   r/   r   r   r   r   r   r      s(     0 0(0 0 
	0r!   c                s   VP                  4       pVP                  4       pV RV 2P                  4       p\        V4      ^8X  dQ   RV R2p\        P
                  ! \        P                  VR4       V P                  V4       V P                  W24       R# RV R2p\        P
                  ! \        P                  VR4       V P                  W2R7       R# )zSpeaks event.Z SPIEL: Speaking 'z' as keyT' as string)r   N)
Zget_key_nameZget_locking_state_stringZstripr3   r   r:   r;   r   r   r   )r>   r   r   Zevent_stringZlocking_state_stringr?   s   &&&   r   speak_key_eventZSpeechServer.speak_key_event  s     ))+$==?&q)=(>?EEG|!%l^8<C 0 0#t<T"  4%l^;?C 0 0#t<JJ|J/r!   c               s(    V ^8  d   QhRRRRRRRR/# )	r   r   z
str | Noner   r   	interruptboolr   r/   r   r   r   r   r   r      s2     3 33 3 	3
 
3r!   c                	s   V'       g   R # V'       g&   \         P                  \         P                  ,          p\        V4      ^8X  dQ   RV R2p\        P
                  ! \        P                  VR4       V P                  V4       V P                  W4       R # RV R2p\        P
                  ! \        P                  VR4       V P                  W4      pV P                  WR4       R # )Nr   z	' as charTr   )r	   r5   r   r3   r   r:   r;   r   r   r   r   )r>   r   r   r   r?   r   s   &&&&  r   r   ZSpeechServer.speak  s     ??8#9#9:D t9>%dV95C 0 0#t<T"  ,%dV;7C 0 0#t<..t:I!!)2r!   c               r   )r   utterance_iteratorz;Iterator[tuple[speechserver.SayAllContext, dict[str, Any]]]progress_callbackz1Callable[[speechserver.SayAllContext, int], None]r   r/   r   r   r   r   r   r      s.     t9 t9Wt9 Mt9 
	t9r!   c           	     s  a aa  \        S4      w  op\        V\        4      '       d   \        V4      MTpV3R lpVV V3R lpV3R lpV3R lpV3R lp	V3R lp
V3R lpV3R lpS P	                  SP
                  V4      pV'       g   R	# . pW-V3pS P                  ev   VS P                  P                  R
W_4      S P                  P                  RWo4      S P                  P                  RW4      S P                  P                  RW4      .,          p\        VR4      '       dJ   \        VP                  R4      '       d.   VP                  P                  pVP                  P                  pM^ pS P                  EeM   V\        P                  P                  ,          '       d-   VP                  S P                  P                  RVV4      4       V\        P                  P                   ,          '       d-   VP                  S P                  P                  RVV4      4       V\        P                  P"                  ,          '       d-   VP                  S P                  P                  RV
V4      4       V\        P                  P$                  ,          '       d-   VP                  S P                  P                  RV	V4      4       S P'                  W4       R	#   \(         d     R	# i ; i)zGIterates through the given utterance_iterator, speaking each utterance.c                s   < \         P                  ! \         P                  R VP                  P                   24       Vw  r4pWA8X  d$   V! S\
        P                  P                  4       R# R# )z	STARTED: N)r   r:   r;   r'   r   r   SayAllContextPROGRESS)rO   r   sayall_datacallbackcurrent_utterancerv   contexts   &&&   r   _utterance_startedZ0SpeechServer.say_all.<locals>._utterance_started  sV    ##E$4$4	)//BVBVAW6XY3>0a$1Wl&@&@&I&IJ 2r!   c                s  < \         P                  ! \         P                  R VP                  P                   24       Vw  r4pWA8X  d   V! S\
        P                  P                  4       V F  pV P                  V4       K  	  V! S\
        P                  P                  4       SP                  Sn        RSn        SP                  S	V4       R# R# )z
FINISHED: N)r   r:   r;   r'   r   r   r   r   
disconnectZ	COMPLETEDZ
end_offsetcurrent_offsetcurrent_end_offsetsay_all)
speakerr   r   r   r   handlershandlerr   r>   r   s
   &&&    r   _utterance_finishedZ1SpeechServer.say_all.<locals>._utterance_finished  s    ##E$4$4
9??CWCWBX6YZ:E7h$1Wl&@&@&I&IJ#+**73 $,Wl&@&@&J&JK-4-?-?G*15G.LL!3X> 2r!   c                s  < \         P                  ! \         P                  R VP                  P                   24       Vw  r4pWA8X  d>   V F  pV P                  V4       K  	  V! S\        P                  P                  4       R# R# )z
CANCELED: N)	r   r:   r;   r'   r   r   r   r   INTERRUPTED)r   r   r   r   r   r   r   r   s   &&&    r   _utterance_canceledZ1SpeechServer.say_all.<locals>._utterance_canceled+  sn    ##E$4$4
9??CWCWBX6YZ:E7h$1#+**73 $,Wl&@&@&L&LM 2r!   c                sr  < \         P                  ! \         P                  R VP                  P                   24       \         P                  ! \         P
                  R \        V4       24       Vw  rEpWQ8X  d>   V F  pV P                  V4       K  	  V! S\        P                  P                  4       R# R# )zERROR: N)r   r:   r;   r'   r   r[   Zreprr   r   r   r   )	r   r   r^   r   r   r   r   r   r   s	   &&&&    r   _utterance_errorZ.SpeechServer.say_all.<locals>._utterance_error3  s    ##E$4$4	@T@T?U6VW##E$7$774;-9PQ:E7h$1#+**73 $,Wl&@&@&L&LM 2r!   c                s   < \         P                  ! \         P                  R V 24       Vw  rEpWQ8X  d$   V! S\        P                  P
                  4       R# R# )zMARK REACHED: Nr   r:   r;   r   r   r   )rO   r   r1   r   r   r   	_handlersr   s   &&&&   r   _mark_reachedZ+SpeechServer.say_all.<locals>._mark_reached<  sK    ##E$4$4tf6MN;F8i$1Wl&@&@&I&IJ 2r!   c                   < \         P                  ! \         P                  R V RV 24       Vw  rVpWa8X  d$   V! S\        P                  P
                  4       R# R# )zRANGE STARTED: r~   Nr   	rO   r   startendr   r   r   r   r   	   &&&&&   r   _range_startedZ,SpeechServer.say_all.<locals>._range_startedB  sR    ##E$4$4waPSu6UV;F8i$1Wl&@&@&I&IJ 2r!   c                s   < \         P                  ! \         P                  R V RV 24       Vw  rVpWa8X  d2   VSn        VSn        V! S\
        P                  P                  4       R# R# )zWORD STARTED: r~   N)r   r:   r;   r   r   r   r   r   r   r   r   _word_startedZ+SpeechServer.say_all.<locals>._word_startedI  sa    ##E$4$4ugQse6TU;F8i$1-2G*14G.Wl&@&@&I&IJ	 2r!   c                r   )zSENTENCE STARTED: r~   Nr   )	rO   Z
_utterancer   r   r   r   r   r   r   r   r   _sentence_startedZ/SpeechServer.say_all.<locals>._sentence_startedR  sU    ##E$4$48J5'QRSVRW6XY;F8i$2Wl&@&@&I&IJ 3r!   Nzutterance-startedzutterance-finishedzutterance-canceledzutterance-errorr'   r@   zword-startedzsentence-startedzrange-startedzmark-reached)r   Z
isinstanceZdictr   r   r   rO   r   Zhasattrr'   r@   r   r   r   ZEVENTS_WORDr&   ZEVENTS_SENTENCEZEVENTS_RANGEr   r   ZStopIteration)r>   r   r   Z	acss_datar   r   r   r   r   r   r   r   r   Zspiel_utterancer   r   r@   r   r   s   ff&               @r   r   ZSpeechServer.say_all  st   m	9!%&8!9GY&0D&A&A4	?yDK
?NNKKKK #44W5F5FMO"H,xHK}}(MM))*=?Q_MM))*>@SaMM))*>@SaMM))*;=M[	  00W_=R=RT[5\5\'--33 ;;//}}(e00<<<<OODMM$9$9.:G:E%G H e00@@@@OODMM$9$9:L:K:E%G H e00====OODMM$9$9/:H:E%G H e00AAAAOODMM$9$9.:G:E%G H !!/8S  		s   #K" K" "K10K1c               r   )r   stepintdecreaser   r   r/   r   r   r   r   r   r      s"     	9 	9 	9t 	9PT 	9r!   c                	s   \         P                  \         P                  ,          pY;'       d    R;'       g    ^,          p V\        P                  ,          p\        ^ \        ^cWT,           4      4      V\        P                  &   RV 2p\        P                  ! \        P                  VR4       R#   \
         d    ^2p Lii ; i)   zSPIEL: Rate set to TN)r	   r5   r   r   rU   KeyErrorre   rf   r   r:   r;   )r>   r   r   r   deltarg   r?   r   r   _change_default_speech_rateZ(SpeechServer._change_default_speech_rate  s    x556R--2.			?D aR!67TYY#D6*E,,c48	  	D	   B4 4CCc               r   r   r   rb   r   r   r   r/   r   r   r   r   r   r      s"     	9 	9 	9$ 	9SW 	9r!   c                	s   \         P                  \         P                  ,          pY;'       d    R;'       g    ^,          p V\        P                  ,          p\        ^ \        ^	WT,           4      4      V\        P                  &   RV 2p\        P                  ! \        P                  VR4       R#   \
         d    ^p Lii ; i)r   zSPIEL: Pitch set to TNr   )r	   r5   r   r   rV   r   re   rf   r   r:   r;   )r>   r   r   r   r   rn   r?   r   r   _change_default_speech_pitchZ)SpeechServer._change_default_speech_pitch  s    x556R--2.	++,E $'q#a*?#@T $UG,E,,c48	  	E	r   c               r   r   r   r   r   r   r   r      s"     	9 	9% 	94 	9TX 	9r!   c                	s   \         P                  \         P                  ,          pY;'       d    R;'       g    ^,          p V\        P                  ,          p\        ^ \        ^	WT,           4      4      V\        P                  &   RV 2p\        P                  ! \        P                  VR4       R#   \
         d    ^
p Lii ; i)r   zSPIEL: Volume set to TNr   )r	   r5   r   r   rW   r   re   rf   r   r:   r;   )r>   r   r   r   r   rq   r?   r   r   _change_default_speech_volumeZ*SpeechServer._change_default_speech_volume  s    x556R--2.	$))_F aQ!78TYY%fX.E,,c48	  	F	r   c               r   )r   r   r   r   r   r   r   r   r      s       r!   c                	s   \        \        P                  4      ^8  d   R# \        P                  f   R# \	        ^4       Fe  p \        P                  P
                  P                  '       g!   \        P                  P                  4         M \        P                  ! R4       Kg  	  R\        n        R#   \        \        3 d      K"  i ; i)r   FNTg{Gz?)r3   r   r   r   Zranger'   ZspeakingZpauseAttributeErrorZ	TypeErrortimeZsleep)r>   rv   rG   r   _maybe_shutdownZSpeechServer._maybe_shutdown  s    |++,q0 ''/ sA#3399BBB 00668 C
 JJt  (,$ #I. s   AB66CCc               r.   r   r   r   r   r/   r   r   r   r   r   r      s     / / /T /r!   c                	(    V P                  V4       R # r"   r   r>   r   rE   r   increase_speech_rateZ!SpeechServer.increase_speech_rate  s    ((.r!   c               r.   r   r   r   r   r   r   r      s     > > >T >r!   c                	,    V P                  VR R7       R# T)r   Nr   r   rE   r   decrease_speech_rateZ!SpeechServer.decrease_speech_rate  s    (((=r!   c               r.   r   r   rb   r   r/   r   r   r   r   r   r      s     0 0% 0$ 0r!   c                	r   r"   r   r   rE   r   increase_speech_pitchZ"SpeechServer.increase_speech_pitch  s    ))$/r!   c               r.   r   r   r   r   r   r   r      s     ? ?% ?$ ?r!   c                	r   r   r   r   rE   r   decrease_speech_pitchZ"SpeechServer.decrease_speech_pitch  s    ))$)>r!   c               r.   r   r   r   r   r   r   r      s     1 15 14 1r!   c                	r   r"   r   r   rE   r   increase_speech_volumeZ#SpeechServer.increase_speech_volume  s    **40r!   c               r.   r   r   r   r   r   r   r      s     @ @5 @4 @r!   c                	r   r   r   r   rE   r   decrease_speech_volumeZ#SpeechServer.decrease_speech_volume  s    **4$*?r!   c               r   rI   r   r   r   r   r   r      s     # #d #r!   c                	sZ    V P                   e   V P                   P                  4        R # R # r"   )rO   cancelr   r   r   stopZSpeechServer.stop  s!    ==$MM  " %r!   c               r   rI   r   r   r   r   r   r      s     7 7$ 7r!   c                	s   R V P                    RV P                   2p\        P                  ! \        P                  VR4       V P                   \
        P                  8w  d   V P                  ew    V P                  P                  P                  P                  V P                  4       RV P                   2p\        P                  ! \        P                  VR4       RV n        V P                  4        V P                   \
        P                  9   d   \
        P                  V P                    R# R#   \         dJ   pRT P                   RT 2p\        P                  ! \        P                  TR4       RT n         Rp?LRp?ii ; i)zSPIEL: Shutting down server z, voices_id: TNz/SPIEL: Successfully disconnected voices signal z)SPIEL: Error disconnecting voices signal z: )r9   rR   r   r:   r;   r   r%   rQ   r'   r5   r   r]   r[   r   r   )r>   r?   r^   r   r   r2   ZSpeechServer.shutdown  s+   ,TXXJmDOOCTUE,,c4888|555$//:U'$$++66tGGGXY##E$4$4c4@"&
 	88|333,,TXX6 4  'A$//ARRTUZT[\##E$7$7dC"&'s   1A5D4 4F??FFc               r   rI   r   r   r   r   r   r      s      t r!   c                	s   V P                   e   V P                   P                  4        V P                  \        P                  8w  dP   V P
                  eB    V P                  P                  P                  P                  V P
                  4       R V n        V P                  4        R #   \         d=   pRT 2p\        P                  ! \        P                  TR4       R T n         R p?LTR p?ii ; i)Nz3SPIEL: Error disconnecting voices signal in reset: T)rO   r   r9   r   r%   rR   rQ   r'   r5   r   r]   r   r:   r[   r\   )r>   r^   r?   r   r   resetZSpeechServer.reset  s    ==$MM  "88|555$//:U'$$++66tG"&
 	

	  'KE7S##E$7$7dC"&'s   A B) )C042C++C0c               s(    V ^8  d   QhRRRRRRRR/# )r   rA   r   r|   maximumz
int | Noner   z!list[tuple[str, str, str | None]]r   r   r   r   r   r      s2        	
 
+r!   c                s>   V P                  W4      w  rE. pV P                  pV Fu  pV P                  V^,          4      w  rW8w  d   K%  W8X  d   VP                  V4       MV
'       g   WY8X  d   VP                  V4       Vf   Kb  \        V4      V8  g   Kt   V# 	  V# )zGReturns the families for language available in the current synthesizer.) _normalized_language_and_dialectr=   r&   r3   )r>   rA   r|   r   Ztarget_languageZtarget_dialectZresultZ
all_voicesr@   normalized_languagenormalized_dialects   &&&&       r   get_voice_families_for_languageZ,SpeechServer.get_voice_families_for_language  s     +/*O*OPX*b'4611
E55eAh? 4"5!3e$'N,Qe$"s6{g'=   r!   c               s$    V ^8  d   QhRRRRRR/# )r   rA   r   r|   r   ru   r   r   r   r   r   r      s"     
7 
7 
7s 
7Tc 
7r!   c                s    RV9   dR   VP                  R^4      ^ ,          P                  4       pVP                  R^4      R,          P                  4       pW43# VP                  4       pVP                  4       pW43# )z;Attempts to ensure consistency across inconsistent formats.r~   r   )r{   Zlower)r>   rA   r|   r   r   s   &&&  r   r   Z-SpeechServer._normalized_language_and_dialect  sx     (?"*..a"8";"A"A"C!)Q!7!;!A!A!C
 #66 #+.."2!("66r!   c               r   r   r   r   r   r   r   r      s      3 r!   c                sv    V P                   e!   V P                   P                  P                  # V P                  # )z=Returns the output module associated with this speech server.)rQ   r'   r1   r9   r   r   r   get_output_moduleZSpeechServer.get_output_module  s-     >>%>>'',,,xxr!   c               r.   )r   	module_idr   r   r/   r   r   r   r   r   r      s     /9 /93 /94 /9r!   c                sP   V\         P                  9  d?   RV R2\         P                  .p\        P                  ! \        P                  VR4       R# V P
                  V8X  d.   RV 2p\        P                  ! \        P                  VR4       R# V P
                  '       d   V P
                  \         P                  8w  d   V P                  ew    V P                  P                  P                  P                  V P                  4       RV n        RV P
                   2p\        P                  ! \        P                  VR4       V P
                  pWn        \         P                  P                  V P
                  4      V n	        V P                  f6   \!        \#        \         P                  P%                  4       4      4      V n	        V\         P&                  9   d   \         P&                  V V \         P&                  V P
                  &   V P
                  \         P                  8w  d   V P                  P                  P                  P)                  RV P*                  4      V n        R	V P                   R
V P
                   2p\        P                  ! \        P                  VR4       V P+                  V P                  P                  P                  4       \,        P.                  \         P0                  P                  V P
                  V P
                  4      ,          V n        RV RV P
                   2p\        P                  ! \        P                  VR4       R#   \         d7   pRT 2p\        P                  ! \        P                  TR4        Rp?ELYRp?ii ; i)z7Set the speech output module to the specified provider.r   z
 is not inTNzSPIEL: Already using provider z3SPIEL: Disconnected voices signal for old provider z*SPIEL: Error disconnecting voices signal: r   r   z for new provider zSPIEL: Switched from z to )r   r   r   Zprint_tokensr;   r9   r:   r%   rR   rQ   r'   r5   r   r]   r[   rD   r   r   rJ   r   r   r4   r   r   r   rS   )r>   r   Ztokensr?   r^   Zold_idr7   r   set_output_moduleZSpeechServer.set_output_module  s    L:::	{*5|7U7UVFu//>88y 29+>C 0 0#t<888L$B$BBtGbD$$++66tG"&KDHH:V##E$4$4c4@
 %77;;DHHE>>!!$|'E'E'L'L'N"OPDN\111,,V415$$TXX.88|555"nn2299AA!3!35DO :$//9J K$$(HH:/   0 0#t<4>>//667#,#A#A&&**488TXX>$?  &fXT$((<E,,c489  DB5'J##E$7$7dCCDs   A5M$ $N%/+N  N%c               r   )r   r   r   r   r   r   r   r   r    L  s     
 
+ 
r!   c           
     s   RpRp V P                   '       dU   V P                   P                  P                  pV P                   P                  P                  pV'       d
   V^ ,          MRpMV P                  ;'       g    Rp VP                  R4      pV^ ,          pV^,          p\        P                  ! \        P                  P                  V\        P                  P                  V\        P                  P                  V\        P                  P                  R/4      #   \
        \        3 d    T P                  ;'       g    Rp Li ; i)z=Returns the current voice family as a VoiceFamily dictionary.rL   zspiel-defaultr~   N)rT   r'   r1   r<   rS   r   Z
IndexErrorr   r   r   r   rw   rx   r   )r>   
voice_namerA   r<   Z
lang_partsr   r|   s   &      r   get_voice_familyZSpeechServer.get_voice_familyL  s    
	E"""!0066;;
 //55??	+49Q<"!55HH
 '',
!}Q-'''',,j'',,d''//''//	
 	
 
+ 	E11DD_J	Es/   D$ AD$  D$ ,D$ ?D$ $#EEEc               r.   )r   r   r   r   r/   r   r   r   r   r   r    g  s     (5 (5{ (5t (5r!   c                s.   V'       g   R# VP                  \        P                  P                  R4      pVP                  \        P                  P                  R4      pVP                  \        P                  P
                  R4      pV'       d   V'       d   V RV 2MTpV'       g   R#  V P                  P                  P                  p. pT F]  p	 T	P                  P                  T8X  d?   T'       d   Y9P                  P                  9   d
   Yn         R# TP!                  T	4       K]  K_  	  T'       dS   R\#        T4       RT R	T^ ,           R
2p\        P                  ! \        P                  TR4       T^ ,          T n        R# R#   \         d7   pRT 2p\        P                  ! \        P                  TR4        Rp?R# Rp?ii ; i  \         d8   pRT 2p\        P                  ! \        P                  TR4        Rp?EK>  Rp?ii ; i)z7Sets the voice family to family VoiceFamily dictionary.NrL   r~   z+SPIEL: Error getting voices from provider: Tz)SPIEL: Error accessing voice properties: r   z" partial matches found for voice 'z'. Using the first (Z))rD   r   r   r   rw   rx   rQ   r'   r5   r   r   r:   r[   r1   r<   rT   r&   r3   )
r>   r   r   rA   r|   r5   r^   r?   Zpartial_matchesr@   s
   &&        r   set_voice_familyZSpeechServer.set_voice_familyg  s    ZZ 8 8 = =rB
::l66;;R@**\55==rB2:(1WI.H	^^))00F ED;;##z1#KK4I4I(I.3+#**51	 2  #o.//QR\Q] ^$$3A$6#7q:   3 3S$?"1!"4D #  	?wGC 3 3S$?	 " DA%I##E$7$7dCCDs<   - F "G8 GGG+G

GH+HH)	rY   rT   r=   rP   rS   r9   rQ   rO   rR   r"   )rL   )NNT)F)i   )g      ?)=Z__name__Z
__module__Z__qualname__Z__firstlineno____doc__r   Z__annotations__r   r   r%   r   r0   r   Zstaticmethodr#   r-   Zclassmethodr8   r4   r$   rH   rK   rN   ri   ro   rr   r}   r   r   r   r   r\   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r2   r   r   r   r   r   r   r   Z__static_attributes__Z__classcell__)r_   s   @r   r   r   B   s   '(*~*/1O,1OS!%6	8U8U$VM>V  	 	 < <&9$ 2 2 8 8  #; #;J))
*
+($2h"9H	1$:L00+F&P/00(36t9l	9	9	9./>0?1@#7"4
7/9b
6(5 (5r!   r   )$r   Z
__future__r    Z__id__Z__version__Z__date__Z
__author__Z__copyright__Z__license__ry   r   Ztypingr   r   r   r   ZgiZrequire_versionZgi.repositoryr   rZ   r]   rL   r   r   r   r	   r
   r   r   r   Zssmlr   r   r   r   r   r!   r   <module>r      s   : 8 #	(
:   9 9 	w&#       % (M5<,, M5  s   B   	B,+B,