+
    TV-j‹) ã                   ó  a€ Rv tŠ0 t R t^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
t
^ RIt^ RIt^ RIHt ^ RIHtHtHt ^ RIHt ^ RIHtHtHtHt ^ RIHt ^ RIHt ^ RIt ^ RI!t!^ RI"t"^ RI#H$t$H%t%H&t&H't'H(t(H)t)H*t*H+t+H,t, ^ RI-H.t. ^ R	I/H0t0H1t1H2t2 ^ R
I3H4t4 ^ RI5H6t6 ^ RI7H8t9 ^ RI7H:t; ^ RI<H=t=H>t>H?t?H@t@HAtAHBtB ^ RICHDtDHEtEHFtFHGtGHHtH ^ RIIHJtJHKtK ^ RILHMtM R R ltN ! R R4      tO]$! 4       tPR R ltQ]P¤                  ! R4      tS]S'       d/   ]SP©                  R4       U u. uF  q P«                  4       NK  	  up MR.tV]Q! ]P]V4       ]R R l4       tW]W]PP°                  nY         ! R R]64      tZ ! R R ]64      t[ ! R! R"]64      t\]O! 4       t]]P¼                  ! 4       t_Rs`] ^ k ] ! R# R$4      4       ta] ! R% R&4      4       tb] ! R' R(4      4       tcR) R* ltdR+ R, lteR-R.0tf ! R/ R0]D4      tg ! R1 R24      th ! R3 R4]D4      ti ! R5 R6]D4      tjR7 R8 ltkR9 R: ltlR; R< ltmR= R> ltn]PPß                  R?4      R@ 4       tp]PPß                  RA4      RB 4       tq]PPå                  RA4      RC RD l4       ts]PPé                  RA4      RE RF l4       tu]PPå                  RG4      RH RI l4       tv]PPß                  RJ4      RwRK RL ll4       tw]PPå                  RM4      ]%! RN4      ]&! RN4      ]&! R4      ]&! RO4      ]&! RP4      ]&! RQ4      ]&! ^4      ]&! RO4      ]&! R4      ]&! RR4      ]&! R4      ]&! RS4      ]&! RO4      ]&! R4      3RT RU ll4       tx]PPå                  RV4      ]%! RN4      ]&! RW4      ]&! RX4      ]&! RY4      ]&! ^4      3RZ R[ ll4       tyRxR\ R] lltz]PP÷                  R^4      R_ R` l4       t|Rat}Rb Rc lt~Rd Re ltRf Rg lt€Rh Ri lt�Rjt‚] ^k / tƒ] ^k Rk Rl lt„Rm Rn lt…]PP÷                  Ro4      Rp Rq l4       t† ! Rr Rs4      t‡Rt tˆ]‰Ru8X  d
   ]ˆ! 4        R# R# u up i )ya  Main module for MLX Audio API server.

This module provides a FastAPI-based server for hosting MLX Audio models,
including Text-to-Speech (TTS), Speech-to-Text (STT), and Speech-to-Speech (S2S) models.
It offers an OpenAI-compatible API for Audio completions and model management.
N)Úasynccontextmanager)ÚasdictÚ	dataclassÚis_dataclass)ÚPath)ÚAnyÚDictÚListÚOptional)Úunquote)	ÚFastAPIÚFileÚFormÚHTTPExceptionÚRequestÚResponseÚ
UploadFileÚ	WebSocketÚWebSocketDisconnect)ÚCORSMiddleware)ÚJSONResponseÚPlainTextResponseÚStreamingResponse)ÚRepositoryNotFoundError)Ú	BaseModel)Úread)Úwrite)ÚVAD_SAMPLE_RATEÚServerVadConfigÚStreamingVadÚTurnDetectionErrorÚTurnEventKindÚparse_turn_detection)ÚBaseModelExecutionAdapterÚInferenceBrokerÚInferenceHandleÚInferenceRequestÚInferenceResultChunk)ÚTTSBatchItemÚTTSBatchOptions)Ú
load_modelc                ó0   € V ^8„  d   QhR\         R\         /# )é   ÚobjÚreturn)r   )Úformats   "Úa/Volumes/fast/ai/experiments/ui-tars-smoke/.venv/lib/python3.14/site-packages/mlx_audio/server.pyÚ__annotate__r1   B   s   € ÷ ñ œ3ð ¤3ñ ó    c                óà  € \        V 4      '       d"   \        V \        4      '       g   \        V 4      p \        V \        4      '       d/   V P                  4        UUu/ uF  w  rV\        V4      bK  	  upp# \        V \        4      '       d   V  Uu. uF  p\        V4      NK  	  up# \        V \        4      '       d?   \        P                  ! V 4      '       d   R# \        P                  ! V 4      '       d   R# V # \        V \        P                  4      '       dH   \        P                  ! V 4      '       d   R# \        P                  ! V 4      '       d   R# \        V 4      # V # u uppi u upi )zPRecursively sanitize NaN, Infinity, and -Infinity values for JSON serialization.N)r   Ú
isinstanceÚtyper   ÚdictÚitemsÚsanitize_for_jsonÚlistÚfloatÚnpÚisnanÚisinfÚfloating)r-   ÚkÚvÚitems   &   r0   r8   r8   B   sü   € ô �C×Ò¤¨C´×!6Ò!6Ü�S‹kˆä�#”t×ÒØ47·I±I´KÔ@±K©D¨A�Ô$ QÓ'Ò'±KÒ@Ð@Ü	�Cœ×	Ò	Ù47Ó8±C¨DÔ! $Ö'±CÑ8Ð8Ü	�Cœ×	Ò	Ü�8Š8�C�=Š=ÙÜ�XŠX�c�]Š]ÙØˆ
Ü	�CœŸ™×	%Ò	%Ü�8Š8�C�=Š=ÙÜ�XŠX�c�]Š]ÙÜ�S‹zÐàˆ
ùó! Aùâ8s   ÁE%ÂE+c                   óP   a € ] tR t^\t o R tV 3R lR ltV 3R lR ltR tRtV t	R# )	ÚModelProviderc                óH   € / V n         \        P                  ! 4       V n        R # ©N)ÚmodelsÚasyncioÚLockÚlock©Úselfs   &r0   Ú__init__ÚModelProvider.__init__]   s   € Ø13ˆŒÜ—L’L“NˆŽ	r2   c                ó    <€ V ^8„  d   QhRS[ /# ©r,   Ú
model_name©Ústr)r/   Ú__classdict__s   "€r0   r1   ÚModelProvider.__annotate__a   s   ø€ ÷ 'ñ '¡Sñ 'r2   c                óx   € WP                   9  d   \        V4      V P                   V&   V P                   V,          # rE   )rF   r*   ©rK   rP   s   &&r0   r*   ÚModelProvider.load_modela   s.   € ØŸ[™[Ô(Ü&0°Ó&<ˆD�K‰K˜
Ñ#à�{‰{˜:Õ&Ð&r2   c                ó&   <€ V ^8„  d   QhRS[ RS[/# )r,   rP   r.   )rR   Úbool)r/   rS   s   "€r0   r1   rT   g   s   ø€ ÷ ñ ©Sð ±Tñ r2   c              ƒ  ó  "  € V P                   ;_uu_4       GR j  x€L
  WP                  9   d!   V P                  V  R R R 4      GR j  x€L
  R#  R R R 4      GR j  x€L
  R#  LG L L
  + GR j  x€L 
 '       g   i     R # ; i5i)NTF©rI   rF   rV   s   &&r0   Úremove_modelÚModelProvider.remove_modelg   sH   é € Ø—9—9—9“9ØŸ[™[Ô(Ø—K‘K 
Ð+Ø÷ —9‘9ð ÷	 —9—9—9—9—9‘9üsg   ‚B›A#œBŸA)¾BÁ	A%Á
BÁA)ÁBÁA'ÁBÁ%BÁ'BÁ)B	Á/A2Á0
B	Á;B	Á=	Bc              ƒ  óð   "  € V P                   ;_uu_4       GR j  x€L
  \        V P                  P                  4       4      uuR R R 4      GR j  x€L
  #  L9 L  + GR j  x€L 
 '       g   i     R # ; i5irE   )rI   r9   rF   ÚkeysrJ   s   &r0   Úget_available_modelsÚ"ModelProvider.get_available_modelsn   s6   é € Ø—9—9—9“9Ü˜Ÿ™×(Ñ(Ó*Ó+÷ —9—9—9—9—9�9üsJ   ‚A6›AœA6Ÿ#AÁA6ÁAÁA6ÁA6ÁA3	ÁA"Á 
A3	Á+A3	Á-	A6r[   N)
Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__rL   r*   r\   r`   Ú__static_attributes__Ú__classdictcell__©rS   s   @r0   rC   rC   \   s(   ø‡ € ò#÷'ð '÷ð ÷,ð ,r2   rC   c                óF   € V ^8„  d   QhR\         R\        \        ,          /# )r,   ÚappÚallowed_origins)r   r	   rR   )r/   s   "r0   r1   r1   w   s   € ÷ ñ ”Gð ¬d´3­iñ r2   c                ó´   € V P                    Uu. uF  q"P                  \        Jg   K  VNK  	  upV n         V P                  \        VRR.R.R7       R# u upi )z5(Re)configure CORS middleware with the given origins.TÚ*)Úallow_originsÚallow_credentialsÚallow_methodsÚallow_headersN)Úuser_middlewareÚclsr   Úadd_middleware)rj   rk   Úms   && r0   Ú
setup_corsrv   w   s_   € ð ×&Ò&óÙ&ˆa¯%©%´~Ð*E�ˆÑ&ñ€CÔð ×ÑÜØ%ØØ�eØ�eð ö ùò	s
   �A©AÚMLX_AUDIO_ALLOWED_ORIGINSÚ,rm   c                ó$   € V ^8„  d   QhR\         /# )r,   rj   )r   )r/   s   "r0   r1   r1   ˜   s   € ÷ $ñ $œGñ $r2   c                ó¤   "  € ?  R 5x € \         e   \         P                  4        R s R # R #   \         e   \         P                  4        R s i i ; i5irE   )ÚINFERENCE_BROKERÚstop_and_join)rj   s   &r0   Úapp_lifespanr}   —   sM   é € àð$Üô Ò'Ü×*Ñ*Ô,Ø#Òñ (øÔÒ'Ü×*Ñ*Ô,Ø#Ñð (üs   ‚A…, Š"A¬!AÁAc                   óp   a € ] tR t^§t o RtRtRtRtRtRt	Rt
RtRtRt^(tRtRtRtR	tR
tRtV 3R ltRtV tR# )ÚSpeechRequestNç      ð?ÚmaleÚagffffffæ?gffffffî?Úmp3Fg       @i°  c                ó´  <€ V ^8„  d   Qh/ S[ ;R&   S[ ;R&   S[ R,          ;R&   S[ R,          ;R&   S[R,          ;R&   S[ R,          ;R&   S[R,          ;R&   S[ R,          ;R	&   S[ R,          ;R
&   S[ R,          ;R&   S[R,          ;R&   S[R,          ;R&   S[R,          ;R&   S[R,          ;R&   S[ R,          ;R&   S[;R&   S[;R&   S[;R&   S[;R&   # )r,   ÚmodelÚinputNÚinstructÚvoiceÚspeedÚgenderÚpitchÚ	lang_codeÚ	ref_audioÚref_textÚtemperatureÚtop_pÚtop_kÚrepetition_penaltyÚresponse_formatÚstreamÚstreaming_intervalÚ
max_tokensÚverbose)rR   r:   ÚintrY   )r/   rS   s   "€r0   r1   ÚSpeechRequest.__annotate__§   s*  ø‡ ‚ Ù�Jñ á�Jñ ñ �D�jÑñ ñ ��:Ññ	 ñ
 �4�<Ññ ñ �$�JÑñ ñ �4�<Ññ ñ �T�zÑñ ñ �T�zÑ ñ ñ �D�jÑñ ñ ˜•Ñ#ñ ñ �4�<Ññ ñ ��:Ññ ñ  �Ñ*ñ ñ ˜4•ZÑ'ñ ñ  Ññ! ñ" Ñ#ñ# ñ$ Ññ% ñ& Ñò' r2   © )rb   rc   rd   re   r‡   rˆ   r‰   rŠ   r‹   rŒ   r�   rŽ   r�   r�   r‘   r’   r“   r”   r•   r–   r—   Ú__annotate_func__rf   rg   rh   s   @r0   r   r   §   se   ø‡ € ð  €HØ€EØ€EØ€FØ€EØ€IØ €IØ€HØ #€KØ€EØ€EØ'*ÐØ"'€OØ€FØ #ÐØ€JØ€G÷' ƒ r2   r   c                   óX   a € ] tR t^½t o RtRtRtRt^tRt	Rt
RtRtRtRtV 3R ltRtV tR# )ÚTranscriptionRequestNFé   ç      >@é   c                óä   <€ V ^8„  d   Qh/ S[ ;R&   S[ R,          ;R&   S[;R&   S[;R&   S[;R&   S[;R&   S[;R&   S[ R,          ;R	&   S[;R
&   S[ R,          ;R&   S[;R&   S[S[ ,          ;R&   # )r,   r…   NÚlanguager—   r–   Úchunk_durationÚframe_thresholdr”   ÚcontextÚprefill_step_sizeÚtextÚword_timestampsÚtimestamp_granularities)rR   rY   r˜   r:   r
   )r/   rS   s   "€r0   r1   Ú!TranscriptionRequest.__annotate__½   s¬   ø‡ ‚ Ù�Jñ á�D�jÑñ ñ Ññ ñ Ññ	 ñ
 Ñ ñ ñ Ññ ñ Ññ ñ �4�ZÑñ ñ Ñ!ñ ñ ��*Ññ ñ Ñ!ñ ñ &¡c�]Ñ1ò r2   rš   )rb   rc   rd   re   r¢   r—   r–   r£   r¤   r”   r¥   r¦   r§   r¨   r©   r›   rf   rg   rh   s   @r0   r�   r�   ½   sE   ø‡ € à€HØ€GØ€JØ €NØ€OØ€FØ€GØ!ÐØ€DØ!€OØ-1Ð÷ ƒ r2   r�   c                   ó,   a € ] tR t^Ìt o V 3R ltRtV tR# )ÚSeparationResponsec                ó>   <€ V ^8„  d   Qh/ S[ ;R&   S[ ;R&   S[;R&   # )r,   ÚtargetÚresidualÚsample_rate)rR   r˜   )r/   rS   s   "€r0   r1   ÚSeparationResponse.__annotate__Ì   s&   ø‡ ‚ Ù�Kñ á�Mñ ñ Ñò r2   rš   N©rb   rc   rd   re   r›   rf   rg   rh   s   @r0   r¬   r¬   Ì   ó   ø‡ ‡ „ r2   r¬   c                   ó,   a € ] tR t^Øt o V 3R ltRtV tR# )ÚSpeechTaskPayloadc                ó&   <€ V ^8„  d   Qh/ S[ ;R&   # ©r,   Úrequest)r   )r/   rS   s   "€r0   r1   ÚSpeechTaskPayload.__annotate__Ø   s   ø‡ ‚ áÑò r2   rš   Nr²   rh   s   @r0   rµ   rµ   Ø   r³   r2   rµ   c                   ó,   a € ] tR t^Ýt o V 3R ltRtV tR# )ÚTranscriptionTaskPayloadc                ó^   <€ V ^8„  d   Qh/ S[ ;R&   S[;R&   S[P                  ;R&   S[;R&   # )r,   r¸   ÚfilenameÚaudior°   )r�   rR   r;   Úndarrayr˜   )r/   rS   s   "€r0   r1   Ú%TranscriptionTaskPayload.__annotate__Ý   s:   ø‡ ‚ á!Ñ!ñ ñ �Mñ ñ �:‰:Ññ	 ñ
 Ñò r2   rš   Nr²   rh   s   @r0   r»   r»   Ý   r³   r2   r»   c                   ó,   a € ] tR t^åt o V 3R ltRtV tR# )ÚSeparationTaskPayloadc                óv   <€ V ^8„  d   Qh/ S[ ;R&   S[P                  ;R&   S[;R&   S[ ;R&   S[ ;R&   S[;R&   # )r,   rP   r¾   r°   ÚdescriptionÚmethodÚsteps)rR   r;   r¿   r˜   )r/   rS   s   "€r0   r1   Ú"SeparationTaskPayload.__annotate__å   sR   ø‡ ‚ á�Oñ ñ �:‰:Ññ ñ Ññ	 ñ
 Ññ ñ �Kñ ñ �Jò r2   rš   Nr²   rh   s   @r0   rÂ   rÂ   å   r³   r2   rÂ   c                ó$   € V ^8„  d   QhR\         /# rO   rQ   )r/   s   "r0   r1   r1   ï   s   € ÷ 1ñ 1¬#ñ 1r2   c                 ó,   € \         P                  V 4      # rE   ©Úmodel_providerr*   ©rP   s   &r0   Ú_load_model_for_inferencerÍ   ï   s   € Ü×$Ñ$ ZÓ0Ð0r2   c                ó(   € V ^8„  d   QhR\         RR/# )r,   rP   r.   NrQ   )r/   s   "r0   r1   r1   ó   s   € ÷ ñ ¬Cð °Dñ r2   c              ƒ  ó  "  €  \         P                  ! \        V 4      G Rj  x€L
  R#  L  \         d    h \         d   p\        RRT : R2R7      ThRp?i\
         d   p\        RRT : RT 2R7      ThRp?ii ; i5i)	aÄ  Load ``model_name`` synchronously and translate failures into HTTPException.

Routes that return a ``StreamingResponse`` commit the HTTP status + headers
before the body generator runs, so any failure inside the inference worker
surfaces as 200 OK with an empty body. Pre-flighting the load here lets the
framework's exception handlers turn the failure into a real HTTP error
response. Warm models are a no-op (``ModelProvider.load_model`` is cached).
Né”  zModel not found: z. is not a known HuggingFace repo or local path©Ústatus_codeÚdetailiô  zFailed to load model z: )rG   Ú	to_threadrÍ   r   r   Ú	Exception)rP   Úexcs   & r0   Ú_preflight_model_loadr×   ó   s�   é € ðÜ×ÒÔ 9¸:ÓF×FÔFøÜô ØÜ"ô ÜØØ& z¡nÐ4bÐcô
ð ð	ûô ô ÜØØ*¨:©.¸¸3¸%Ð@ô
ð ð	ûðüsI   ‚A?„+ ¢)£+ §A?©+ «A<Á A<ÁAÁA<Á!A<Á"A7Á7A<Á<A?r¨   r©   c                   ó2   a € ] tR tRt o V 3R lR ltRtV tR# )ÚSTTExecutionAdapteri  c                ó$   <€ V ^8„  d   QhRS[ RR/# ©r,   r¸   r.   N©r&   )r/   rS   s   "€r0   r1   Ú STTExecutionAdapter.__annotate__  s   ø€ ÷ .ñ .Ñ"2ð .°tñ .r2   c                ó&  € VP                   p\        P                  P                  VP                  ;'       g    R 4      w  r4T;'       g    RpR\
        P
                  ! 4        RVP                   V 2p\        WbP                  VP                  4        \        VP                  4      pVP                  P                  R0RR7      p\        P                  ! VP                   4      p	VP#                  4        U
Uu/ uF$  w  r«W©P$                  9   g   V
\&        9   g   K"  W«bK&  	  pp
pVP                   ! V3/ VB p\)        VR4      '       dÝ   \)        VR4      '       dË   R pV FÁ  pVP*                  P-                  4       '       d    Mö\/        V\0        4      '       d   WÞ,          pR	VR
V/pMBR	VP2                  R\5        VRR4      R\5        VRR4      R\5        VRR4      R\5        VRR4      /pVP7                  \8        P:                  ! \=        V4      4      R,           4       KÃ  	  MUVP*                  P-                  4       '       g6   VP7                  \8        P:                  ! \=        V4      4      R,           4       \        P                  P?                  V4      '       d   \        P@                  ! V4       TPC                  4        R# u upp
i   \        P                  P?                  T4      '       d   \        P@                  ! T4       i i ; i)Ú ú.mp3z/tmp/Ú_r…   T©ÚexcludeÚexclude_noneÚ__iter__Ú__next__r§   ÚaccumulatedÚstartÚ
start_timeNÚendÚend_timeÚis_finalr¢   Ú
)"ÚpayloadÚosÚpathÚsplitextr½   ÚtimeÚ
request_idÚaudio_writer¾   r°   rÍ   rP   r¸   Ú
model_dumpÚinspectÚ	signatureÚgenerater7   Ú
parametersÚ_STT_EXTRA_KWARGSÚhasattrÚcancel_eventÚis_setr4   rR   r§   ÚgetattrÚ	emit_dataÚjsonÚdumpsr8   ÚexistsÚremoveÚ	emit_done)rK   r¸   rî   rá   ÚextÚsuffixÚtmp_pathÚ	stt_modelÚ
gen_kwargsr÷   ÚkeyÚvalueÚresultÚaccumulated_textÚchunkÚ
chunk_datas   &&              r0   Ú
run_serialÚSTTExecutionAdapter.run_serial  s„  € Ø,3¯O©OˆÜ—‘×!Ñ! '×"2Ñ"2×"8Ð"8°bÓ9‰ˆØ—�˜ˆØœ4Ÿ9š9›;˜- q¨×);Ñ);Ð(<¸V¸HÐEˆÜ�HŸm™m¨W×-@Ñ-@ÔAð%	$Ü1°'×2DÑ2DÓEˆIØ Ÿ™×3Ñ3Ø ˜	°ð 4ó ˆJô  ×)Ò)¨)×*<Ñ*<Ó=ˆIð #-×"2Ñ"2Ô"4ôá"4‘J�CØ×.Ñ.Ô.°#Ô9JÑ2Jô �’
Ù"4ð ñ ð ×'Ò'¨Ñ?°JÑ?ˆFÜ�v˜z×*Ò*¬w°v¸z×/JÒ/JØ#%Ð Û#�EØ×+Ñ+×2Ñ2×4Ò4ÙÜ! %¬×-Ò-Ø(Õ1Ð(à" EØ)Ð+;ð&™
ð # E§J¡JØ#¤W¨U°LÀ$Ó%GØ!¤7¨5°*¸dÓ#CØ&¬°°zÀ4Ó(HØ&¬°°zÀ4Ó(Hð&˜
ð ×%Ñ%¤d§j¢jÔ1BÀ:Ó1NÓ&OÐRVÕ&VÖWò# $ð$ ×)Ñ)×0Ñ0×2Ò2Ø×!Ñ!¤$§*¢*Ô->¸vÓ-FÓ"GÈ$Õ"NÔOä�w‰w�~‰~˜h×'Ò'Ü—	’	˜(Ô#à×ÑÖùóCøô< �w‰w�~‰~˜h×'Ò'Ü—	’	˜(Õ#ð (ús,   ÂA&K Ã<KÄ KÄ&D#K É
5K ËK Ë>Lrš   N)rb   rc   rd   re   r  rf   rg   rh   s   @r0   rÙ   rÙ     s   ø‡ € ÷.ö .r2   rÙ   c                   ó–   a € ] tR tRt o V 3R lR lt]V 3R lR l4       tV 3R lR ltV 3R lR	 ltV 3R
 lR lt	V 3R lR lt
RtV tR# )Ú_TTSAdapterContinuousSessioniA  c                ó   <€ V ^8„  d   QhRR/# )r,   ÚadapterÚTTSExecutionAdapterrš   )r/   rS   s   "€r0   r1   Ú)_TTSAdapterContinuousSession.__annotate__B  s   ø€ ÷ 
#ñ 
#ð 'ñ
#r2   c               óX   € Wn         W n        / V n        \        4       V n        ^ V n        R# )é    N)r  Úmodel_sessionÚ	_requestsÚsetÚ_emitted_audioÚ_next_sequence_id)rK   r  r  s   &$$r0   rL   Ú%_TTSAdapterContinuousSession.__init__B  s(   € ð ŒØ*ÔØ68ˆŒÜ(+«ˆÔØ!"ˆÖr2   c                ó    <€ V ^8„  d   QhRS[ /# ©r,   r.   )rY   )r/   rS   s   "€r0   r1   r  O  s   ø€ ÷ >ñ >‘dñ >r2   c                ó`   € V P                   P                  ;'       d    V P                  '       * # rE   )r  Úidler  rJ   s   &r0   r#  Ú!_TTSAdapterContinuousSession.idleN  s#   € à×!Ñ!×&Ñ&×=Ð=¨t¯~©~Ô+=Ð=r2   c                ó$   <€ V ^8„  d   QhRS[ RR/# rÛ   rÜ   )r/   rS   s   "€r0   r1   r  R  s   ø€ ÷ 
ñ 
Ñ.ð 
°4ñ 
r2   c                óü  € VP                   P                  4       '       d   VP                  4        R # VP                  pVP                  pV P
                  pV ;P
                  ^,          un        WP                  V&   V P                  P                  \        VVP                  VP                  VP                  VP                  VP                  VP                  VP                   VP"                  R7	      .4       R # )N)	Úsequence_idr§   rˆ   r‡   r‰   rŠ   r‹   r�   rŽ   )rü   rý   r  rî   r¸   r  r  r  Úaddr(   r†   rˆ   r‡   r‰   rŠ   r‹   r�   rŽ   )rK   r¸   rî   Úspeech_requestr'  s   &&   r0   ÚsubmitÚ#_TTSAdapterContinuousSession.submitR  sÌ   € Ø×Ñ×&Ñ&×(Ò(Ø×ÑÔÙà%,§_¡_ˆØ Ÿ™ˆØ×,Ñ,ˆØ×Ò !Õ#ÕØ&-�‰�{Ñ#Ø×Ñ×ÑäØ +Ø'×-Ñ-Ø(×.Ñ.Ø+×4Ñ4Ø(×.Ñ.Ø)×0Ñ0Ø(×.Ñ.Ø,×6Ñ6Ø+×4Ñ4ô
ðö	
r2   c                ó   <€ V ^8„  d   QhRR/# ©r,   r.   Nrš   )r/   rS   s   "€r0   r1   r  l  s   ø€ ÷ (?ñ (?�dñ (?r2   c                óF  € V P                  4        V P                  P                  4       pV EFo  pV P                  P	                  VP
                  4      pVf   K/  VP                  ey   VP                  VP                  4       VP                  4        V P                  P                  VP
                  R 4       V P                  P                  VP
                  4       Kµ  VP                  Ee   VP                  ^ 8”  dô   VP                  P                  pVP                   fy   VP                  \#        R4      4       VP                  4        V P                  P                  VP
                  R 4       V P                  P                  VP
                  4       EKq  V P$                  P'                  VVVP                  VP                   4       V P                  P)                  VP
                  4       VP*                  '       g   EKÝ  VP
                  V P                  9  d   VP                  \-        RRR7      4       VP                  4        V P                  P                  VP
                  R 4       V P                  P                  VP
                  4       EKr  	  R # )Nz2TTS batch event included audio without sample_rateé�  úNo audio generatedrÑ   )Ú_cancel_disconnected_requestsr  Ústepr  Úgetr'  ÚerrorÚ
emit_errorr  Úpopr  Údiscardr¾   Úsamplesrî   r¸   r°   Ú
ValueErrorr  Ú_emit_audior(  Údoner   )rK   ÚeventsÚeventr¸   r)  s   &    r0   r2  Ú!_TTSAdapterContinuousSession.stepl  sö  € Ø×*Ñ*Ô,Ø×#Ñ#×(Ñ(Ó*ˆÜˆEØ—n‘n×(Ñ(¨×):Ñ):Ó;ˆGØŠÙà�{‰{Ò&Ø×"Ñ" 5§;¡;Ô/Ø×!Ñ!Ô#Ø—‘×"Ñ" 5×#4Ñ#4°dÔ;Ø×#Ñ#×+Ñ+¨E×,=Ñ,=Ô>Ùà�{‰{Ó&¨5¯=©=¸1Ô+<Ø07·±×0GÑ0G�Ø×$Ñ$Ò,Ø×&Ñ&Ü"Ð#WÓXôð ×%Ñ%Ô'Ø—N‘N×&Ñ& u×'8Ñ'8¸$Ô?Ø×'Ñ'×/Ñ/°×0AÑ0AÔBÚØ—‘×(Ñ(ØØ"Ø—K‘KØ×%Ñ%ô	ð ×#Ñ#×'Ñ'¨×(9Ñ(9Ô:à�z�z‹zØ×$Ñ$¨D×,?Ñ,?Ô?Ø×&Ñ&Ü%°#Ð>RÔSôð ×!Ñ!Ô#Ø—‘×"Ñ" 5×#4Ñ#4°dÔ;Ø×#Ñ#×+Ñ+¨E×,=Ñ,=×>óK r2   c                ó$   <€ V ^8„  d   QhRS[ RR/# )r,   r4  r.   N)ÚBaseException)r/   rS   s   "€r0   r1   r  –  s   ø€ ÷ $ñ $™-ð $¨Dñ $r2   c                ó  € \        V P                  P                  4       4       F$  pVP                  V4       VP	                  4        K&  	  V P                  P                  4        V P                  P                  4        R # rE   )r9   r  Úvaluesr5  r  Úclearr  )rK   r4  r¸   s   && r0   ÚfailÚ!_TTSAdapterContinuousSession.fail–  s\   € Ü˜DŸN™N×1Ñ1Ó3Ö4ˆGØ×Ñ˜uÔ%Ø×ÑÖñ 5ð 	�‰×ÑÔØ×Ñ×!Ñ!Ö#r2   c                ó   <€ V ^8„  d   QhRR/# r-  rš   )r/   rS   s   "€r0   r1   r  �  s   ø€ ÷ 5ñ 5¨tñ 5r2   c                óf  € \        V P                  P                  4       4       F‰  w  rVP                  P	                  4       '       g   K'  V P
                  P                  V4       VP                  4        V P                  P                  VR 4       V P                  P                  V4       K‹  	  R # rE   )r9   r  r7   rü   rý   r  Úcancelr  r6  r  r7  )rK   r'  r¸   s   &  r0   r1  Ú:_TTSAdapterContinuousSession._cancel_disconnected_requests�  s‚   € Ü$(¨¯©×)=Ñ)=Ó)?Ö$@Ñ ˆKØ×'Ñ'×.Ñ.×0Ò0ÙØ×Ñ×%Ñ% kÔ2Ø×ÑÔØ�N‰N×Ñ˜{¨DÔ1Ø×Ñ×'Ñ'¨Ö4ó %Ar2   )r  r  r  r  r  N)rb   rc   rd   re   rL   Úpropertyr#  r*  r2  rD  r1  rf   rg   rh   s   @r0   r  r  A  sL   ø‡ € ÷
#ð 
#ð ÷>ó ð>÷
ð 
÷4(?ð (?÷T$ð $÷5ö 5r2   r  c                   ó8  a € ] tR tRt o RtR tV 3R lR ltV 3R lR ltV 3R lR	 ltV 3R
 lR lt	V 3R lR lt
V 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltV 3R  lR! ltR"tV tR## )$r  i§  Ú_mlx_audio_loaded_modelc                óœ   € \         P                  ! R R4      p \        ^\        V4      4      V n        R#   \
         d    ^T n         R# i ; i)ÚMLX_AUDIO_TTS_MAX_BATCH_SIZEÚ8N)rï   ÚgetenvÚmaxr˜   Úmax_batch_sizer9  )rK   Úraw_max_batch_sizes   & r0   rL   ÚTTSExecutionAdapter.__init__ª  sE   € ÜŸYšYÐ'EÀsÓKÐð	$Ü"% a¬Ð-?Ó)@Ó"AˆDÖøÜô 	$Ø"#ˆD×ð	$ús   ™5 µAÁ
Ac                ó    <€ V ^8„  d   QhRS[ /# r·   rÜ   )r/   rS   s   "€r0   r1   Ú TTSExecutionAdapter.__annotate__±  s   ø€ ÷ ñ Ñ.>ñ r2   c                ó�   € \        WP                  R 4      pVf,   \        VP                  4      p\	        WP                  V4       V# rE   )rþ   Ú_REQUEST_MODEL_ATTRrÍ   rP   Úsetattr©rK   r¸   r…   s   && r0   Ú_get_model_for_requestÚ*TTSExecutionAdapter._get_model_for_request±  s>   € Ü˜×!9Ñ!9¸4Ó@ˆØŠ=Ü-¨g×.@Ñ.@ÓAˆEÜ�G×5Ñ5°uÔ=Øˆr2   c                ó&   <€ V ^8„  d   QhRS[ RS[/# ©r,   r¸   r.   )r&   r)   )r/   rS   s   "€r0   r1   rV  ¸  s   ø€ ÷ 
ñ 
Ñ,<ð 
Áñ 
r2   c                ó   € VP                   P                  p\        VP                  VP                  VP
                  VP                  VP                  VP                  VP                  VP                  V P                  VP                  R 7
      # ))
r�   r�   r‘   r’   r–   rŒ   r”   r•   rR  r—   )rî   r¸   r)   r�   r�   r‘   r’   r–   rŒ   r”   r•   rR  r—   ©rK   r¸   r)  s   && r0   Ú_build_batch_optionsÚ(TTSExecutionAdapter._build_batch_options¸  sx   € Ø(/¯©×(?Ñ(?ˆÜØ&×2Ñ2Ø ×&Ñ&Ø ×&Ñ&Ø-×@Ñ@Ø%×0Ñ0Ø$×.Ñ.Ø!×(Ñ(Ø-×@Ñ@Ø×.Ñ.Ø"×*Ñ*ô
ð 	
r2   c                ó<   <€ V ^8„  d   QhRS[ RS[S[S[3,          /# r^  )r&   r6   rR   r   )r/   rS   s   "€r0   r1   rV  Ç  s(   ø€ ÷ Oñ OÑ'7ð O¹DÁÁcÀ½Nñ Or2   c                óV   € VP                   P                  pVP                  R 0RR7      # )r…   Trâ   )rî   r¸   rõ   r`  s   && r0   Ú_request_kwargsÚ#TTSExecutionAdapter._request_kwargsÇ  s)   € Ø(/¯©×(?Ñ(?ˆØ×(Ñ(°'°ÈÐ(ÓNÐNr2   c                ó    <€ V ^8„  d   QhRS[ /# ©r,   ÚnamerQ   )r/   rS   s   "€r0   r1   rV  Ë  s   ø€ ÷ 	ñ 	±Cñ 	r2   c                óœ   € \        WR 4      p\        V4      '       g   R # \        V4      P                  R8X  d   V\	        V4      9  d   R # V# )Nzunittest.mock)rþ   Úcallabler5   rc   Úvars)rK   r…   ri  r  s   &&& r0   Ú_get_callable_model_attrÚ,TTSExecutionAdapter._get_callable_model_attrË  sA   € Ü˜ TÓ*ˆÜ˜�ŠÙô �‹;×!Ñ! _Ô4¸ÄTÈ%Ã[Ô9PÙØˆr2   c                ó,   <€ V ^8„  d   QhRS[ RS[RS[/# )r,   r¸   Ú
continuousr.   ©r&   rY   )r/   rS   s   "€r0   r1   rV  Ö  s+   ø€ ÷ ñ ñ "ðñ
 ðñ 
ñr2   c          	     ó´  € VP                   P                  pV'       d   R MRpV P                  W4      p\        V4      '       d!   \	        V! R/ V P                  V4      B 4      # VP                  '       d   R# VP                  '       g   VP                  '       d   R# VP                  R9  d   R# VP                  R9  d   R# VP                  R9  d   R# R# )Úsupports_tts_continuous_batchÚsupports_tts_batchFTrš   ©Nr�   ©Nr€   )rî   r¸   rm  rk  rY   re  r”   r�   rŽ   rŠ   r‰   r‹   )rK   r…   r¸   rp  r)  Ú	hook_nameÚhooks   &&&$   r0   Ú_model_supports_requestÚ+TTSExecutionAdapter._model_supports_requestÖ  s¹   € ð )0¯©×(?Ñ(?ˆç/9Ñ+Ð?Sð 	ð ×,Ñ,¨UÓ>ˆÜ�D�>Š>Ü™Ñ=˜t×3Ñ3°GÓ<Ñ=Ó>Ð>à× × Ð ÙØ×#×#Ð# ~×'>×'>Ð'>ÙØ× Ñ ¨Ô6ÙØ×Ñ {Ô2ÙØ×Ñ {Ô2ÙÙr2   c                ó&   <€ V ^8„  d   QhRS[ RS[/# r^  rq  )r/   rS   s   "€r0   r1   rV  ñ  s   ø€ ÷ ñ Ñ7Gð ÉDñ r2   c                óŠ  € V P                  VR 4      pVf   R# V P                  WRR7      '       g   R# VP                  P                  pVP                  '       d   R# \
        P                  ! V4      pVP                  pRV9  d   R# VP                  '       d
   RV9  d   R# VP                  '       d
   RV9  d   R# VP                  R9  d
   RV9  d   R# VP                  R9  d
   RV9  d   R# VP                  R9  d
   RV9  d   R# VP                  '       d
   R	V9  d   R# VP                  '       d
   R
V9  d   R# R# )Úbatch_generateF©rp  ÚtextsÚvoicesÚ	instructsÚgendersÚspeedsÚpitchesÚ
ref_audiosÚ	ref_textsTru  rv  )rm  ry  rî   r¸   r”   rö   r÷   rù   rˆ   r‡   rŠ   r‰   r‹   r�   rŽ   )rK   r…   r¸   r}  r)  r÷   Úparamss   &&&    r0   Ú_can_call_batch_generateÚ,TTSExecutionAdapter._can_call_batch_generateñ  s  € Ø×6Ñ6°uÐ>NÓOˆØÒ!ÙØ×+Ñ+¨EÀuÐ+×MÒMÙà(/¯©×(?Ñ(?ˆØ× × Ð Ùä×%Ò% nÓ5ˆ	Ø×%Ñ%ˆØ˜&Ô ÙØ××Ð H°FÔ$:ÙØ×"×"Ð" {¸&Ô'@ÙØ× Ñ ¨Ô6¸9ÈFÔ;RÙØ×Ñ {Ô2°xÀvÔ7MÙØ×Ñ {Ô2°yÈÔ7NÙØ×#×#Ð#¨¸FÔ(BÙØ×"×"Ð" {¸&Ô'@ÙÙr2   c                ó&   <€ V ^8„  d   QhRS[ RS[/# r^  rq  )r/   rS   s   "€r0   r1   rV    s   ø€ ÷ 
ñ 
Ñ;Kð 
ÑPTñ 
r2   c                ód   € V P                  VR 4      pVRJ;'       d    V P                  WRR7      # )Úcreate_tts_batch_sessionNTr~  )rm  ry  )rK   r…   r¸   Úcreate_sessions   &&& r0   Ú_can_call_continuous_sessionÚ0TTSExecutionAdapter._can_call_continuous_session  sI   € Ø×6Ñ6ØØ&ó
ˆð  TÐ)÷ 
ð 
¨d×.JÑ.JØ tð /Kó /
ð 	
r2   c                ó&   <€ V ^8„  d   QhRS[ RS[/# r^  rq  )r/   rS   s   "€r0   r1   rV    s   ø€ ÷ =ñ =Ñ&6ð =¹4ñ =r2   c                óF   € V P                  V4      pV P                  W!4      # rE   )r[  rˆ  rZ  s   && r0   Úsupports_batchÚ"TTSExecutionAdapter.supports_batch  s#   € Ø×+Ñ+¨GÓ4ˆØ×,Ñ,¨UÓ<Ð<r2   c                ó&   <€ V ^8„  d   QhRS[ RS[/# r^  rq  )r/   rS   s   "€r0   r1   rV    s    ø€ ÷ Añ AÑ1Að AÁdñ Ar2   c                óF   € V P                  V4      pV P                  W!4      # rE   )r[  rŽ  rZ  s   && r0   Úsupports_continuous_batchÚ-TTSExecutionAdapter.supports_continuous_batch  s#   € Ø×+Ñ+¨GÓ4ˆØ×0Ñ0°Ó@Ð@r2   c                ó&   <€ V ^8„  d   QhRS[ RS[/# r^  ©r&   r   )r/   rS   s   "€r0   r1   rV  !  s   ø€ ÷ 
ñ 
Ñ!1ð 
±cñ 
r2   c                óf  € VP                   P                  pR VP                  VP                  VP                  VP
                  VP                  VP                  VP                  VP                  VP                  VP                  '       d   VP                  VP                  3# RVP                  3# )ÚttsN)rî   r¸   r”   rŒ   r�   r�   r‘   r’   r–   r�   rŽ   r•   r—   r`  s   && r0   Ú	batch_keyÚTTSExecutionAdapter.batch_key!  s¦   € Ø(/¯©×(?Ñ(?ˆàØ×!Ñ!Ø×$Ñ$Ø×&Ñ&Ø× Ñ Ø× Ñ Ø×-Ñ-Ø×%Ñ%Ø×$Ñ$Ø×#Ñ#Ø1?×1F×1FÐ1FˆN×-Ñ-Ø×"Ñ"ð
ð 	
ð MQØ×"Ñ"ð
ð 	
r2   c                ó&   <€ V ^8„  d   QhRS[ RS[/# r^  r™  )r/   rS   s   "€r0   r1   rV  2  s   ø€ ÷ 'ñ 'Ñ,<ð 'Áñ 'r2   c                ó$   € V P                  V4      # rE   )rœ  )rK   r¸   s   &&r0   Úcontinuous_batch_keyÚ(TTSExecutionAdapter.continuous_batch_key2  s   € Ø�~‰~˜gÓ&Ð&r2   c                ó    <€ V ^8„  d   QhRS[ /# r·   rÜ   )r/   rS   s   "€r0   r1   rV  5  s   ø€ ÷ 
ñ 
Ñ7Gñ 
r2   c                ó®   € V P                  V4      pV P                  VR 4      pVf   \        R4      hV! V P                  V4      4      p\	        V VR7      # )rŒ  z/Model does not provide create_tts_batch_session)r  r  )r[  rm  ÚNotImplementedErrorra  r  )rK   r¸   r…   r�  r  s   &&   r0   Úcreate_continuous_batch_sessionÚ3TTSExecutionAdapter.create_continuous_batch_session5  sd   € Ø×+Ñ+¨GÓ4ˆØ×6Ñ6ØØ&ó
ˆð Ò!Ü%Ð&WÓXÐXÙ& t×'@Ñ'@ÀÓ'IÓJˆÜ+ØØ'ô
ð 	
r2   c                ó0   <€ V ^8„  d   QhRS[ RS[RS[RR/# )r,   r¸   r)  r°   r.   N)r&   r   r˜   )r/   rS   s   "€r0   r1   rV  C  s3   ø€ ÷ -ñ -á!ð-ñ &ð-ñ
 ð-ð 
ñ-r2   c                ó    € \         P                  ! 4       p\        VVVVP                  R 7       VP	                  VP                  4       4       R# )©r/   N)ÚioÚBytesIOrô   r“   rÿ   Úgetvalue)rK   r¸   r)  r¾   r°   Úbuffers   &&&&& r0   r:  ÚTTSExecutionAdapter._emit_audioC  s@   € ô —’“ˆÜØØØØ!×1Ñ1õ		
ð 	×Ñ˜&Ÿ/™/Ó+Ö,r2   c                ó$   <€ V ^8„  d   QhRS[ RR/# rÛ   rÜ   )r/   rS   s   "€r0   r1   rV  S  s    ø€ ÷ Fñ FÑ"2ð F°tñ Fr2   c                ó¶  € VP                   pVP                  pV P                  V4      pVP                  pV'       dŠ   \	        V\
        4      '       dt   \        P                  P                  V4      '       g   \        R RV 2R7      h^ RI
Hp \        VR4      ;'       d    VP                  R8H  pV! VVP                  VR7      p. pRp	/ RVP                  bR	VP                   bR
VP"                  bRVP$                  bRVP&                  bRVP(                  bRVbRVP*                  bRVP,                  bRVP.                  bRVP0                  bRVP2                  bRVP4                  bRVP6                  bRVP8                  bRVP:                  bp
VP<                  ! VP>                  3/ V
B  F´  pVP@                  PC                  4       '       d)   \D        PF                  ! 4        VPI                  4         R# VP4                  '       d+   V PK                  VVVPL                  VP                  4       K‡  VPO                  VPL                  4       V	e   K¨  VP                  p	K¶  	  VP4                  '       d   VPI                  4        R# V'       g   \        R RR7      h\P        PR                  ! V4      pV PK                  WWÉ4       VPI                  4        R# )r/  ú Reference audio file not found: rÑ   )Ú
load_audioÚ
model_typeÚspark)r°   Úvolume_normalizeNrˆ   r‰   rŠ   r‹   r‡   rŒ   r�   rŽ   r�   r�   r‘   r’   r”   r•   r–   r—   r0  )*rî   r¸   r[  r�   r4   rR   rï   rð   r  r   Úmlx_audio.tts.generater²  rû   r³  r°   rˆ   r‰   rŠ   r‹   r‡   rŒ   rŽ   r�   r�   r‘   r’   r”   r•   r–   r—   rø   r†   rü   rý   ÚmxÚclear_cacher  r:  r¾   Úappendr;   Úconcatenate)rK   r¸   rî   r)  r…   r�   r²  Ú	normalizeÚaudio_chunksr°   Úgenerate_kwargsr  Úconcatenated_audios   &&           r0   r  ÚTTSExecutionAdapter.run_serialS  sÏ  € Ø%,§_¡_ˆØ Ÿ™ˆØ×+Ñ+¨GÓ4ˆà"×,Ñ,ˆ	ßœ I¬s×3Ò3Ü—7‘7—>‘> )×,Ò,Ü#Ø #Ø=¸i¸[ÐIôð õ
 :ä  |Ó4×TÐT¸×9IÑ9IÈWÑ9TˆIÙ"ØØ!×-Ñ-Ø!*ôˆIð ˆØˆð
Ø�^×)Ñ)ð
à�^×)Ñ)ð
ð �n×+Ñ+ð
ð �^×)Ñ)ð	
ð
 ˜×/Ñ/ð
ð ˜×1Ñ1ð
ð ˜ð
ð ˜×/Ñ/ð
ð ˜>×5Ñ5ð
ð �^×)Ñ)ð
ð �^×)Ñ)ð
ð ! .×"CÑ"Cð
ð �n×+Ñ+ð
ð ! .×"CÑ"Cð
ð ˜.×3Ñ3ð
ð  �~×-Ñ-ð!
ˆð& —n’n ^×%9Ñ%9ÑM¸_ÔMˆFØ×#Ñ#×*Ñ*×,Ò,Ü—’Ô Ø×!Ñ!Ô#Úà×$×$Ð$Ø× Ñ ØØ"Ø—L‘LØ×&Ñ&ö	ð ×#Ñ# F§L¡LÔ1ØÔ&Ø"(×"4Ñ"4’Kñ! Nð$ × × Ð Ø×ÑÔÙçÜ¨CÐ8LÔMÐMäŸ^š^¨LÓ9ÐØ×Ñ˜Ð2DÔRØ×ÑÖr2   c                ó4   <€ V ^8„  d   QhRS[ S[,          RR/# )r,   Úrequestsr.   N)r9   r&   )r/   rS   s   "€r0   r1   rV  ›  s%   ø€ ÷ V ñ V ¡$Ñ'7Õ"8ð V ¸Tñ V r2   c                ó
  a a€ \        V4      ^8X  d   S P                  V^ ,          4       R# S P                  V^ ,          4      o\        ;QJ d     VV 3R lV 4       F  '       d   K   RM	  RM! VV 3R lV 4       4      '       g   V F  pS P                  V4       K  	  R# V^ ,          P                  P
                  pV Uu. uF"  q"P                  P
                  P                  NK$  	  ppV Uu. uF"  q"P                  P
                  P                  NK$  	  ppV Uu. uF"  q"P                  P
                  P                  NK$  	  ppV Uu. uF"  q"P                  P
                  P                  NK$  	  ppV Uu. uF"  q"P                  P
                  P                  NK$  	  ppV Uu. uF"  q"P                  P
                  P                  NK$  	  p	pV Uu. uF"  q"P                  P
                  P                  NK$  	  p
pV Uu. uF"  q"P                  P
                  P                  NK$  	  ppS P                  SR4      pVf   V F  pS P                  V4       K  	  R# \        P                   ! V4      p/ RVbRVbRVbR	VbR
VbRV	bRV
bRVbRVP"                  bRVP$                  bRVP&                  bRVP(                  bRVP*                  bRVP,                  bRRbRVP.                  bpVP1                  4        UUu/ uF  w  ppWýP2                  9   g   K  VVbK  	  pppV Uu. uF  p. NK  	  ppV Uu. uF  pRNK  	  ppV! R/ VB  F„  pVP4                  pV^ 8  g   V\        V4      8¼  d   K(  VV,          pVP6                  P9                  4       '       d   KS  VV,          P;                  VP<                  4       VP>                  VV&   K†  	  \A        V4       Fë  w  ppVP6                  P9                  4       '       d   VPC                  4        K8  VV,          pVV,          pV'       d   Vf/   VPE                  \G        RRR7      4       VPC                  4        K„  \        V4      ^8X  d
   V^ ,          M\H        PJ                  ! V4      pS PM                  VVP                  P
                  VV4       VPC                  4        Kí  	  R# u upi u upi u upi u upi u upi u upi u upi u upi u uppi u upi u upi )é   Nc              3   óH   <"  € T F  pSP                  SV4      x € K  	  R # 5irE   )rˆ  )Ú.0r¸   r…   rK   s   & €€r0   Ú	<genexpr>Ú0TTSExecutionAdapter.run_batch.<locals>.<genexpr>¡  s$   øé € ð 
ÙIQ¸gˆD×)Ñ)¨%°×9Ð9Ëùs   ƒ"FTr}  r  r€  r�  rƒ  r‚  r„  r…  r†  r�   rŒ   r–   r‘   r�   r’   r”   r—   r/  r0  rÑ   rš   )'Úlenr  r[  Úallrî   r¸   r†   rˆ   r‡   r‰   rŠ   r‹   r�   rŽ   rm  rö   r÷   r�   rŒ   r–   r‘   r�   r’   r—   r7   rù   Úsequence_idxrü   rý   r¹  r¾   r°   Ú	enumerater  r5  r   r;   rº  r:  )rK   rÁ  r¸   Úfirst_speech_requestr  r€  r�  rƒ  r‚  r„  r…  r†  r}  r÷   Úkwargsr
  r  rá   Úaudio_chunks_by_sequenceÚsample_ratesr  rÊ  Úchunksr°   r¾   r…   s   f&                       @r0   Ú	run_batchÚTTSExecutionAdapter.run_batch›  s¹  ù€ Üˆx‹=˜AÔØ�O‰O˜H Q�KÔ(Ùà×+Ñ+¨H°Q­KÓ8ˆß‹sõ 
ÙIQó
�s�sŠsõ 
ÙIQó
÷ 
ò 
ó $�Ø—‘ Ö(ñ $áà.6°q­k×.AÑ.A×.IÑ.IÐÙ>FÓG¹h°7—‘×(Ñ(×.Ô.¹hˆÐGÙ?GÓH¹x°G—/‘/×)Ñ)×/Ô/¹xˆÐHÙEMÓNÁX¸'—_‘_×,Ñ,×5Ô5ÁXˆ	ÐNÙ?GÓH¹x°G—/‘/×)Ñ)×/Ô/¹xˆÐHÙAIÓJÁ°g—?‘?×*Ñ*×1Ô1ÁˆÐJÙ@HÓIÁ°W—?‘?×*Ñ*×0Ô0ÁˆÐIÙGOÓPÁx¸G—o‘o×-Ñ-×7Ô7Áxˆ
ÐPÙEMÓNÁX¸'—_‘_×,Ñ,×5Ô5ÁXˆ	ÐNà×6Ñ6°uÐ>NÓOˆØÒ!Û#�Ø—‘ Ö(ñ $áä×%Ò% nÓ5ˆ	ð
Ø�Uð
à�fð
ð ˜ð
ð �fð	
ð
 �wð
ð �wð
ð ˜*ð
ð ˜ð
ð Ð/×;Ñ;ð
ð Ð-×7Ñ7ð
ð Ð.×9Ñ9ð
ð Ð)×/Ñ/ð
ð Ð)×/Ñ/ð
ð !Ð"6×"IÑ"Ið
ð �eð
ð  Ð+×3Ñ3ð!
ˆð& *0¯©¬ô
Ù)7™:˜3 ¸3×BVÑBVÑ;VŒJˆC�ŠJ©ð 	ñ 
ñ BJÓ4JÁ¸A³RÁÐ Ð4JÙ8@Ó)A¹°1«$¹ˆÐ)Aá$Ñ. vÔ.ˆFØ!×.Ñ.ˆLØ˜aÔ <´3°x³=Ô#@ÙØ˜|Õ,ˆGØ×#Ñ#×*Ñ*×,Ò,ÙØ$ \Õ2×9Ñ9¸&¿,¹,ÔGØ)/×);Ñ);ˆL˜Ó&ñ /ô &/¨xÖ%8Ñ!ˆL˜'Ø×#Ñ#×*Ñ*×,Ò,Ø×!Ñ!Ô#Ùà-¨lÕ;ˆFØ& |Õ4ˆKß˜[Ò0Ø×"Ñ"Ü!¨cÐ:NÔOôð ×!Ñ!Ô#Ùä!$ V£°Ô!1�F˜1–I´r·~²~ÀfÓ7MˆEØ×ÑØØ—‘×'Ñ'ØØô	ð ×ÑÖó+ &9ùòg HùÚHùÚNùÚHùÚJùÚIùÚPùÚNùó6
ùò 5KùÚ)AsH   Ã(SÃ2(SÄ (SÅ(S$Å<(S)Æ*(S.Ç(S3È(S8ÌS=ÌS=Ì+TÌ<T)rR  N)rb   rc   rd   re   rX  rL   r[  ra  re  rm  ry  rˆ  rŽ  r’  r–  rœ  r   r¥  r:  r  rÑ  rf   rg   rh   s   @r0   r  r  §  s¯   ø‡ € Ø3Ðò$÷ð ÷
ð 
÷Oð O÷	ð 	÷ð ÷6ð ÷>
ð 
÷=ð =÷Að A÷
ð 
÷"'ð '÷
ð 
÷-ð -÷ Fð F÷PV ö V r2   r  c                   óJ   a € ] tR tRt o R tV 3R lR ltV 3R lR ltRtV tR# )	ÚSeparationExecutionAdapteriô  c                ó0   € R V n         R V n        R V n        R # rE   )Ú_model_nameÚ_modelÚ
_processorrJ   s   &r0   rL   Ú#SeparationExecutionAdapter.__init__õ  s   € Ø'+ˆÔØˆŒØˆŽr2   c                ó    <€ V ^8„  d   QhRS[ /# rO   rQ   )r/   rS   s   "€r0   r1   Ú'SeparationExecutionAdapter.__annotate__ú  s   ø€ ÷ 	,ñ 	,©ñ 	,r2   c                ó  € V P                   V8X  d'   V P                  e   V P                  V P                  3# ^ RIHpHp VP                  V4      V n        VP                  V4      V n        Wn         V P                  V P                  3# )N)ÚSAMAudioÚSAMAudioProcessor)rÖ  r×  rØ  Úmlx_audio.stsrÝ  rÞ  Úfrom_pretrained)rK   rP   rÝ  rÞ  s   &&  r0   Ú_get_resourcesÚ)SeparationExecutionAdapter._get_resourcesú  sl   € Ø×Ñ˜zÔ)¨d¯k©kÒ.EØ—;‘; §¡Ð/Ð/ç=à+×;Ñ;¸JÓGˆŒØ×.Ñ.¨zÓ:ˆŒØ%ÔØ�{‰{˜DŸO™OÐ+Ð+r2   c                ó$   <€ V ^8„  d   QhRS[ RR/# rÛ   rÜ   )r/   rS   s   "€r0   r1   rÛ    s   ø€ ÷ /ñ /Ñ"2ð /°tñ /r2   c           	     ó2  € VP                   pR \        P                  ! 4        RVP                   R2p\        W2P                  VP
                  4        V P                  VP                  4      w  rEV! VP                  .V.R7      p^VP                  ^,          ,          pRVP                  RV/pVP                  VP                  VP                  VP                  VP                  V^2R7      p	\         P"                  ! 4        \$        P&                  ! V	P(                  ^ ,          4      p
\$        P&                  ! V	P*                  ^ ,          4      pVP
                  pR pVP-                  \/        V! W¬4      V! W¼4      VR7      4       \0        P2                  P5                  V4      '       d   \0        P6                  ! V4       TP9                  4        R	#   \0        P2                  P5                  T4      '       d   \0        P6                  ! T4       i i ; i)
z/tmp/separation_rá   z.wav)ÚdescriptionsÚaudiosrÅ   Ú	step_size)ræ  rå  Ú
anchor_idsÚanchor_alignmentÚode_optÚode_decode_chunk_sizec                 óÐ   € \         P                  ! 4       p\        W VR R7       VP                  ^ 4       \        P
                  ! VP                  4       4      P                  R4      # )Úwavr©  úutf-8)rª  r«  rô   ÚseekÚbase64Ú	b64encoder   Údecode)Úaudio_arrayÚsrr­  s   && r0   Úaudio_to_base64Ú>SeparationExecutionAdapter.run_serial.<locals>.audio_to_base64#  sF   € ÜŸš›�Ü˜F°¸EÕBØ—‘˜A”Ü×'Ò'¨¯©«Ó6×=Ñ=¸gÓFÐFr2   )r®   r¯   r°   N)rî   rò   ró   rô   r¾   r°   rá  rP   rÄ   rÆ   rÅ   Úseparate_longræ  rå  rè  ré  r·  r¸  r;   Úarrayr®   r¯   rÿ   r¬   rï   rð   r  r  r  )rK   r¸   rî   r  r…   Ú	processorÚbatchrç  rê  r  Útarget_audioÚresidual_audior°   rõ  s   &&            r0   r  Ú%SeparationExecutionAdapter.run_serial  s¨  € Ø)0¯©ˆØ%¤d§i¢i£k ]°!°G×4FÑ4FÐ3GÀtÐLˆÜ�HŸm™m¨W×-@Ñ-@ÔAð(	$Ø#×2Ñ2°7×3EÑ3EÓFÑˆEÙØ%×1Ñ1Ð2Ø �zôˆEð
 ˜WŸ]™]¨QÕ.Õ/ˆIØ §¡°¸iÐHˆGà×(Ñ(Ø—|‘|Ø"×/Ñ/Ø ×+Ñ+Ø!&×!7Ñ!7ØØ&(ð )ó ˆFô �NŠNÔäŸ8š8 F§M¡M°!Õ$4Ó5ˆLÜŸXšX f§o¡o°aÕ&8Ó9ˆNØ×+Ñ+ˆKòGð ×ÑÜ"Ù*¨<ÓEÙ,¨^ÓIØ +ôôô �w‰w�~‰~˜h×'Ò'Ü—	’	˜(Ô#à×ÑÖøô �w‰w�~‰~˜h×'Ò'Ü—	’	˜(Õ#ð (ús   ÁD7G Ç>H)r×  rÖ  rØ  N)	rb   rc   rd   re   rL   rá  r  rf   rg   rh   s   @r0   rÔ  rÔ  ô  s   ø‡ € ò÷
	,ð 	,÷/ö /r2   rÔ  c                ó$   € V ^8„  d   QhR\         /# r!  )r$   )r/   s   "r0   r1   r1   7  s   € ÷ ñ œoñ r2   c                  óÒ   € \         f[   \        4       p V P                  R\        4       4       V P                  R\	        4       4       V P                  R\        4       4       V s \         # )NÚsttr›  Ú
separation)r{   r$   Úregister_adapterrÙ   r  rÔ  )Úbrokers    r0   Úget_inference_brokerr  7  sX   € äÒÜ Ó"ˆØ×Ñ Ô':Ó'<Ô=Ø×Ñ Ô':Ó'<Ô=Ø×Ñ Ô.HÓ.JÔKØ!ÐÜÐr2   c                ó0   € V ^8„  d   QhR\         R\        /# )r,   Úhandler.   )r%   r'   )r/   s   "r0   r1   r1   B  s   € ÷ <ñ <¬ð <Ô<Pñ <r2   c              ƒ   ór   "  € \         P                  ! V P                  P                  4      G R j  x€L
 #  L5irE   )rG   rÔ   Úresult_queuer3  )r  s   &r0   Ú_next_inference_chunkr	  B  s(   é € Ü×"Ò" 6×#6Ñ#6×#:Ñ#:Ó;×;Ð;Ñ;ùs   ‚.7°5±7c                ó0   € V ^8„  d   QhR\         R\        /# )r,   r  r¸   )r%   r   )r/   s   "r0   r1   r1   F  s   € ÷ ñ ¬Oð Ägñ r2   c                ó¨  "  €   \        V 4      G Rj  x€L
 pVP                  R8X  d   M{VP                  R8X  d   VP                  hVP                  5x € \        P
                  ! ^ 4      G Rj  x€L
  VP                  4       G Rj  x€L
 '       g   K�  V P                  4         V P                  4        R#  L£ LI L3  T P                  4        i ; i5i)TNr;  r4  )r	  Úkindr4  rî   rG   ÚsleepÚis_disconnectedrH  )r  r¸   r  s   && r0   Ú_stream_inference_resultsr  F  sž   é € ðØÜ/°Ó7×7ˆEØ�z‰z˜VÔ#ØØ�z‰z˜WÔ$Ø—k‘kÐ!Ø—-‘-ÓÜ—-’- Ó"×"Ð"Ø×,Ñ,Ó.×.×.Ð.Ø—‘”Øà�‰Žñ 8ñ #Ù.øð 	�‰�üsW   ‚C„B= “B7”AB= Á/B9Á0B= ÂB;ÂB= ÂB= Â%CÂ7B= Â9B= Â;B= Â=CÃCc                ó$   € V ^8„  d   QhR\         /# )r,   r  )r%   )r/   s   "r0   r1   r1   W  s   € ÷ ñ ¬/ñ r2   c              ƒ   ó  "  € R p  \        V 4      G R j  x€L
 pVP                  R8X  d   VV P                  4        # VP                  R8X  d   VP                  hVP                  pKb   LR  T P                  4        i ; i5i)Nr;  r4  )r	  r  rH  r4  rî   )r  r  r  s   &  r0   Ú_await_inference_resultr  W  sk   é € Ø€Fð	ØÜ/°Ó7×7ˆEØ�z‰z˜VÔ#Øð
 	�‰�ð	 �z‰z˜WÔ$Ø—k‘kÐ!Ø—]‘]ŠFñ 8øð 	�‰�üs*   ‚A?†A* •A(–A* ¬A?½,A* Á*A<Á<A?Ú/c               ƒ   ó   "  € R R/# 5i)ÚmessagezMWelcome to the MLX Audio API server! Visit https://localhost:3000 for the UI.rš   rš   r2   r0   Úrootr  e  s   é € ð 	Ðbðð ùs   ‚z
/v1/modelsc               ƒ  óÒ   "  € \         P                  4       G Rj  x€L
 p . pV  F8  pVP                  RVRRR\        \        P                  ! 4       4      RR/4       K:  	  RRR	V/#  LJ5i)
z?
Get list of models - provided in OpenAI API compliant format.
NÚidÚobjectr…   ÚcreatedÚowned_byÚsystemr9   Údata)rË   r`   r¹  r˜   rò   )rF   Úmodels_datar…   s      r0   Úlist_modelsr  l  so   é € ô
 "×6Ñ6Ó8×8€FØ€KÛˆØ×Ñà�eØ˜'Øœ3œtŸyšy›{Ó+Ø˜Hð	ö	
ñ ð �f˜f kÐ2Ð2ñ 9ùs   ‚A'šA%›AA'c                ó$   € V ^8„  d   QhR\         /# rO   rQ   )r/   s   "r0   r1   r1   €  s   € ÷ Vñ V¤ñ Vr2   c              ƒ  óH   "  € \         P                  V 4       RRRRV  R2/# 5i)z¨
Add a new model to the API.

Args:
    model_name (str): The name of the model to add.

Returns:
    dict (dict): A dictionary containing the status of the operation.
ÚstatusÚsuccessr  zModel z added successfullyrÊ   rÌ   s   &r0   Ú	add_modelr$    s.   é € ô ×Ñ˜jÔ)Ø�i ¨f°Z°LÐ@SÐ,TÐUÐUùs   ‚ "c                ó$   € V ^8„  d   QhR\         /# rO   rQ   )r/   s   "r0   r1   r1   �  s   € ÷ Wñ W¤3ñ Wr2   c              ƒ  óÆ   "  € \        V 4      P                  R4      p \        P                  V 4      G Rj  x€L
 pV'       d   \	        ^ÌR7      # \        RRV  R2R7      h L)5i)zà
Remove a model from the API.

Args:
    model_name (str): The name of the model to remove.

Returns:
    Response (str): A 204 No Content response if successful.

Raises:
    HTTPException (str): If the model is not found.
Ú"N)rÒ   rÐ   zModel 'z' not foundrÑ   )r   ÚstriprË   r\   r   r   )rP   Úremoveds   & r0   r\   r\   Ž  sX   é € ô ˜Ó$×*Ñ*¨3Ó/€JÜ"×/Ñ/°
Ó;×;€GßÜ CÔ(Ð(ä¨°g¸j¸\ÈÐ4UÔVÐVñ	 <ùs   ‚3A!µA¶A!ÁA!z/v1/audio/speechc                ó0   € V ^8„  d   QhR\         R\        /# )r,   rî   r¸   )r   r   )r/   s   "r0   r1   r1   ¥  s   € ÷ ñ œmð ´gñ r2   c           
   ƒ  ó@  "  € V P                   '       dj   \        V P                   \        4      '       dJ   \        P                  P                  V P                   4      '       g   \        RRV P                    2R7      h\        V P                  4      G Rj  x€L
  \        4       P                  RV P                  \        V R7      V P                  R0RR	7      V P                  R
7      p\        \        W!4      RV P                    2RRV P                    2/R7      #  L…5i)z>Generate speech audio following the OpenAI text-to-speech API.r/  r±  rÑ   Nr›  )r¸   r…   Trâ   ©Úendpoint_kindrP   rî   Únormalized_kwargsr”   zaudio/zContent-Dispositionzattachment; filename=speech.)Ú
media_typeÚheaders)r�   r4   rR   rï   rð   r  r   r×   r…   r  r*  rµ   rõ   r”   r   r  r“   )rî   r¸   r  s   && r0   Ú
tts_speechr1  ¤  sÿ   é € ð ××ÐœZ¨×(9Ñ(9¼3×?Ò?Ü�w‰w�~‰~˜g×/Ñ/×0Ò0ÜØØ9¸'×:KÑ:KÐ9LÐMôð ô
   §¡Ó
.×.Ð.ä!Ó#×*Ñ*ØØ—=‘=Ü!¨'Ô2Ø!×,Ñ,°g°YÈTÐ,ÓRØ�~‰~ð +ó €Fô Ü! &Ó2Ø˜G×3Ñ3Ð4Ð5à!Ð%AÀ'×BYÑBYÐAZÐ#[ð
ôð ñ /ùs   ‚A!DÁ$2DÂDÂBDz/v1/audio/voicesc                ó:   € V ^8„  d   QhR\         \        ,          /# )r,   r…   ©r
   rR   )r/   s   "r0   r1   r1   Á  s   € ÷ ñ œH¤S�Mñ r2   c              ƒ  ó’  "  € V '       g   \        RRR7      h ^ RIHp V! V R.R7      p\        T4      R,          pTP                  4       '       g	   RRR	T R
. /# \        R TP                  R4       4       4      pRRR	T R
T Uu. uF	  pRTRT/NK  	  up/#   \         d   pRRR	T R
. R\	        T4      /u Rp?# Rp?ii ; iu upi 5i)a]  List available voices for a TTS model.

Resolves the model's HF snapshot directory and enumerates
``voices/*.safetensors`` files (the convention used by Kokoro and
similar voice-pack-based TTS models). Returns an empty ``data`` list
for models that don't ship per-voice packs so callers can fall back
to whatever defaults make sense for that model.
r/  z!model query parameter is requiredrÑ   )Úsnapshot_downloadzvoices/*.safetensors)Úrepo_idÚallow_patternsr  r9   r…   r  r4  Nr€  c              3   ó8   "  € T F  qP                   x € K  	  R # 5irE   )Ústem)rÅ  Úps   & r0   rÆ  Útts_voices.<locals>.<genexpr>Ú  s   é € ÐEÑ$D˜q—F–FÓ$Dùs   ‚z*.safetensorsr  ri  )	r   Úhuggingface_hubr5  rÕ   rR   r   Úis_dirÚsortedÚglob)r…   r5  ÚsnapshotÚeÚ
voices_dirr€  r@   s   &      r0   Ú
tts_voicesrC  À  sã   é € ÷ Ü¨Ð4WÔXÐXðOÝ5á$ØÐ+AÐ*Bô
ˆô �h“ (Õ*€JØ×Ñ×ÒØ˜& '¨5°&¸"Ð=Ð=äÑE J§O¡O°OÔ$DÓEÓE€Fà�&Ø�Ø©vÓ6©v¨!�$˜˜6 1Ó%©vÑ6ðð øô ô OØ˜& '¨5°&¸"¸gÄsÈ1ÃvÐNÕNûðOüò 7ùs@   ‚C™B ªACÂCÂCÂB?Â"B:Â4B?Â5CÂ:B?Â?Cz/v1/audio/transcriptions.Frž   rŸ   r    Úndjsonc                ó$  € V ^8„  d   QhR\         R\        R\        R\        \        ,          R\        R\
        R\        R\
        R	\        R
\        \        ,          R\
        R\        \        ,          R\        R\        R\        \        ,          /# )r,   r¸   Úfiler…   r¢   r—   r–   r£   r¤   r”   r¥   r¦   r§   r“   r¨   r©   )r   r   rR   r
   rY   r˜   r:   )r/   s   "r0   r1   r1   ã  s¿   € ÷ oñ oÜðoä
ðoô ðoô ”s�mð	oô
 ðoô ðoô ðoô ðoô ðoô ”c�]ðoô ðoô ”3�-ðoô ðoô ðoô &¤c�]ñor2   c              ƒ  ó   "  € \        VVVVVVVV	V
VVVR7      pVP                  4       G Rj  x€L
 p\        P                  ! V4      p\	        VRR7      w  ppVP                  4        \        VP                  4      G Rj  x€L
  \        4       P                  RVP                  \        TVP                  ;'       g    RVVR7      VP                  R0R	R
7      VP                  R7      pVR9   EdÕ   RpRp  \        V4      G Rj  x€L
 pVP                  R8X  d   EMVP                  R8X  d   VP                   hVP"                  p\%        V\&        4      '       d   VP)                  RRR7      p\+        V4      P-                  4        FŸ  pVP/                  4       pV'       g   K   \0        P2                  ! V4      p\%        T\6        4      '       d   RT9   g   RT9   d   TpK\  \%        T\6        4      '       g   Kt  RT9   g   K}  TTP9                  R4      ;'       g    R,          pK¡  	  EK8  VP;                  4        Vf   RV/pVR8X  d3   \=        VP9                  R4      ;'       g    RP/                  4       4      # VR8X  d5   \?        RVP9                  R4      ;'       g    RP/                  4       /4      # \?        V4      # \A        \C        VV 4      RR7      #  EL° EL` ELÝ  \4         d     EKl  i ; i  TP;                  4        i ; i5i)a  Transcribe audio using an STT model.

The default ``response_format`` (``ndjson``) preserves mlx-audio's native
``application/x-ndjson`` streaming transport, where each line is a JSON
object emitted by the underlying STT model (text deltas while streaming,
or the full whisper segment payload for batch transcription).

For OpenAI Audio API compatibility, ``response_format`` also accepts:

* ``text`` -- ``text/plain`` body with the final transcript only.
* ``json`` -- ``application/json`` body shaped ``{"text": "..."}``.
* ``verbose_json`` -- ``application/json`` body with the full payload
  from the underlying model (``text``, ``segments``, ``language``,
  ...), passed through unchanged.

See https://platform.openai.com/docs/api-reference/audio/createTranscription
)r…   r¢   r—   r–   r£   r¤   r”   r¥   r¦   r§   r¨   r©   NF©Ú	always_2dr   z	audio.mp3)r¸   r½   r¾   r°   r…   Trâ   r,  r§   r   rß   r;  r4  rî  Úreplace)ÚerrorsÚsegmentsr¢   zapplication/x-ndjson)r/  )r§   r   Úverbose_json)"r�   r   rª  r«  Ú
audio_readÚcloser×   r…   r  r*  r»   r½   rõ   r”   r	  r  r4  rî   r4   Úbytesrò  rR   Ú
splitlinesr(  r   ÚloadsrÕ   r6   r3  rH  r   r   r   r  )r¸   rF  r…   r¢   r—   r–   r£   r¤   r”   r¥   r¦   r§   r“   r¨   r©   rî   r  Útmpr¾   rô  r  Úfullrç   r  ÚlineÚrawr-   s   &&&&&&&&&&&&&&&            r0   Ústt_transcriptionsrW  â  s­  é € ôF #ØØØØØ%Ø'ØØØ+ØØ'Ø 7ô€Gð —‘“×€DÜ
�*Š*�TÓ
€CÜ˜3¨%Ô0�I€Eˆ2Ø‡I�I„Kä
 §¡Ó
.×.Ð.ä!Ó#×*Ñ*ØØ—=‘=Ü(ØØ—]‘]×1Ð1 kØØô	
ð "×,Ñ,°g°YÈTÐ,ÓRØ�~‰~ð +ó €Fð Ð:Õ:Ø#ˆØˆð	ØÜ3°FÓ;×;�Ø—:‘: Ô'ÙØ—:‘: Ô(ØŸ+™+Ð%Ø—}‘}�Ü˜d¤E×*Ò*ØŸ;™; w°y˜;ÓA�DÜ˜t›9×/Ñ/Ö1�CØŸ)™)›+�CßÙ ð!Ü"Ÿjšj¨›o˜ô " #¤t×,Ò,Ø" cÔ)¨Z¸3Ô->à"šÜ# C¬×.Ô.°6¸S¶=Ø# s§w¡w¨v£×'<Ð'<¸"Õ<šô 2ð �M‰MŒOàŠ<Ø˜KÐ(ˆDà˜fÔ$Ü$ d§h¡h¨vÓ&6×&<Ð&<¸"×%CÑ%CÓ%EÓFÐFØ˜fÔ$Ü ¨$¯(©(°6Ó*:×*@Ð*@¸b×)GÑ)GÓ)IÐ JÓKÐKä˜DÓ!Ð!äÜ! &¨'Ó2Ø)ôð òy ò
 /ò( <øô %ô !Û ð!ûð �M‰M�Oüs•   ‚+L­K®ALÂ K Â;LÂ=9LÃ7K9 ÄK#ÄBK9 Æ'K&Æ=;K9 Ç=K9 ÈK9 ÈK9 È/;LÉ+9LÊ%9LË LË#K9 Ë&K6Ë1K9 Ë5K6Ë6K9 Ë9LÌLz/v1/audio/separationsz"mlx-community/sam-audio-large-fp16ÚspeechÚmidpointc          
      óT   € V ^8„  d   QhR\         R\        R\        R\        R\        /# )r,   rF  r…   rÄ   rÅ   rÆ   )r   rR   r˜   )r/   s   "r0   r1   r1   V  s:   € ÷ )1ñ )1Ü
ð)1äð)1ô ð)1ô ð	)1ô
 ñ)1r2   c              ƒ  ó6  "  € V P                  4       G Rj  x€L
 p\        P                  ! V4      p\        VRR7      w  rxVP	                  4        \        4       P                  RV\        VVVVVVR7      RVRVRV/R	7      p	\        V	4      G Rj  x€L
 #  L~ L5i)
aÔ  Separate audio using SAM Audio model.

Args:
    file: Audio file to process
    model: SAM Audio model name (default: mlx-community/sam-audio-large-fp16)
    description: Text description of what to separate (e.g., "speech", "guitar", "drums")
    method: ODE solver method - "midpoint" or "euler" (default: midpoint)
    steps: Number of ODE steps - 2, 4, 8, 16, or 32 (default: 16)

Returns:
    JSON with base64-encoded target and residual audio, plus sample rate
NFrH  r  )rP   r¾   r°   rÄ   rÅ   rÆ   rÄ   rÅ   rÆ   )r-  rP   rî   r.  )	r   rª  r«  rN  rO  r  r*  rÂ   r  )
rF  r…   rÄ   rÅ   rÆ   r  rS  r¾   rô  r  s
   &&&&&     r0   Úaudio_separationsr\  U  s¢   é € ð( —‘“×€DÜ
�*Š*�TÓ
€CÜ˜3¨%Ô0�I€EØ‡I�I„Kä!Ó#×*Ñ*Ø"ØÜ%ØØØØ#ØØô
ð ˜;Ø�fØ�Uð
ð +ó €Fô" )¨Ó0×0Ð0ñ- ñ, 1ùs"   ‚B–B—A9BÂBÂBÂBc                óŠ   € V ^8„  d   QhR\         R\        P                  R\        R\        \
        ,          R\        R\        /# )r,   Ú	websocketró  r°   r¢   Ú
is_partialÚ	streaming)r   r;   r¿   r˜   r
   rR   rY   )r/   s   "r0   r1   r1   ‚  sV   € ÷ C$ñ C$ÜðC$ô —‘ðC$ô ð	C$ô
 ”s�mðC$ô ðC$ô ñC$r2   c              ƒ  óx  "  € R\         P                  ! VP                  4      P                  9   pV'       dÒ   V'       dÊ   VP                  \        P
                  ! V4      RVRR7      pRp	Tp
V Fq  p\        V\        4      '       d   TM\        VR\        V4      4      pWœ,          p	\        VRR4      pV'       d   V
f   Tp
V P                  R	R
R
V/4      G Rj  x€L
  Ks  	  V P                  R	RRV	RRRV
RV/4      G Rj  x€L
  R# R\        P                  ! 4        R2p\        WâV4        VP                  WäRR7      p\        VR4      '       d(   VP                  '       d   \        VP                  4      MRpV P                  RVP                  RVR\        VRV4      RV/4      G Rj  x€L
  \         P"                  P%                  V4      '       d   \         P&                  ! V4       R# R#  EL Lò LH  \         P"                  P%                  T4      '       d   \         P&                  ! T4       i i ; i5i)a´  Handle both streaming and non-streaming model inference over WebSocket.

Streaming models (whose generate() accepts a ``stream`` parameter) receive
the audio as an ``mx.array`` and yield token deltas sent as
``{"type": "delta", "delta": "..."}`` messages, followed by a
``{"type": "complete", ...}`` message.

Non-streaming models fall back to temp-file + batch generate, sending the
legacy ``{"text": ..., "is_partial": ...}`` format.
r”   TF)r”   r¢   r—   rß   r§   r¢   Nr5   ÚdeltaÚcompleterL  r_  z/tmp/realtime_rà   )r¢   r—   )rö   r÷   rø   rù   r·  rø  r4   rR   rþ   Ú	send_jsonrò   rô   rû   rL  r8   r§   rï   rð   r  r  )r^  r  ró  r°   r¢   r_  r`  Úsupports_streamÚresult_iterrç   Údetected_languager  rb  Ú
chunk_langr  r  rL  s   &&&&&&&          r0   Ú_stream_transcriptionri  ‚  s  é € ð& ¤'×"3Ò"3°I×4FÑ4FÓ"G×"RÑ"RÑR€OçŸ9Ø×(Ñ(Ü�HŠH�[Ó!¨$¸È5ð )ó 
ˆð ˆØ$ÐÛ ˆEä# E¬3×/Ò/‘´W¸UÀFÌCÐPUËJÓ5Wð ð Õ ˆKä  ¨
°DÓ9ˆJßÐ/Ò7Ø$.Ð!Ø×%Ñ% v¨w¸ÀÐ&GÓH×HÒHñ !ð ×!Ñ!à˜
Ø˜Ø˜DØÐ-Ø˜jðó
÷ 	
ò 	
ð $¤D§I¢I£K =°Ð5ˆÜ�H¨;Ô7ð	$Ø×'Ñ'¨ÈUÐ'ÓSˆFô ˜6 :×.Ò.°6·?·?°?ô " &§/¡/Ô2àð ð
 ×%Ñ%à˜FŸK™KØ Ø¤¨°
¸HÓ EØ  *ð	ó÷ ð ô �w‰w�~‰~˜h×'Ò'Ü—	’	˜(Ö#ñ (ò= Iñ	
ñ&øô �w‰w�~‰~˜h×'Ò'Ü—	’	˜(Õ#ð (üs\   ‚=H:Á BH:ÃG2Ã&H:ÄG5Ä+H:Ä/6G9 Å&AG9 Æ.G7Æ/G9 Æ3A H:Ç5H:Ç7G9 Ç9>H7È7H:z!/v1/audio/transcriptions/realtimec                ó$   € V ^8„  d   QhR\         /# ©r,   r^  ©r   )r/   s   "r0   r1   r1   É  s   € ÷ dñ d´ñ dr2   c              ƒ  ó6  "  € V P                  4       G Rj  x€L
   V P                  4       G Rj  x€L
 pVP                  RR4      pVP                  RR4      pVP                  RR4      pVP                  RR4      p\        R	V R
V RV RV 24       \        R4       \        P                  V4      p\        R4       \        P                  ! ^4      p^p\        WH,          R,          4      p	\        RV	 RV RV R24       . p
\        VR,          4      p\        VR,          4      p\        VR,          4      p^ p^ p\        P                  ! 4       pRpRpV P                  RRRR/4      G Rj  x€L
  \        R4         V P                  4       G Rj  x€L
 pRT9   Ed9   \        P                  ! TR,          \        P                  R7      p\!        T4      T	,          pRp^ p\#        T4       F`  pTT	,          pTT	,           pTTT p\!        T4      T	8X  g   K,   TP%                  TP'                  4       T4      '       d   RpT^,          pK`  Kb  	  \        P                  ! 4       pT'       dŸ   TP-                  \        P.                  4      R,          pT
P1                  T4       T^,          p^ pTp\!        T
4      T^,          ,          \!        T4      8  d3   \        R T R!T R"\!        T
4       R\!        T
4      T,          R# R$2	4       M&T^,          pT^,          ^ 8X  d   \        R%T R&24       TT,
          pRp Rp!\!        T
4      ^ 8”  d¾   T'       gF   \!        T
4      T8¼  d6   T'       d.   Rp \        R'YÄ,          R# R(\!        T
4      T,          R# R)24       MpTT8¼  d8   \!        T
4      T8¼  d(   Rp!\        R*TR# R+\!        T
4      T,          R# R)24       M2\!        T
4      T8¼  d#   Rp!\        R,\!        T
4      T,          R# R)24       T '       dI   \!        T
4      T8¼  d9   Tp"\        P2                  ! T
RT" 4      p#Rp \5        T TT#TTRTR-7      G Rj  x€L
  T!'       dq   \!        T
4      ^ 8”  d^   \!        T
4      p"\        P2                  ! T
4      p# \5        T TT#TTRTR-7      G Rj  x€L
  . p
Rp\        R0T" RT"T,          R# R124       EKT  EKW  EKZ  R3T9   g   EKd   \<        P>                  ! TR3,          4      p&T&P                  R44      R58X  d   MEKœ   T PC                  4       G Rj  x€L
  R#  EL! EL ELÍ EL«  \         d     K5  i ; i  \(        \*        3 d&   p\        RT 24       RpT^,          p Rp?EK–  Rp?ii ; i EL4  \         dW   p^ RIp$\9        T4      p%T$P;                  4        \        R.T% 24       T P                  R/T%RR//4      G Rj  x€L 
   Rp?ELŽRp?ii ; i ELG  \         dX   p^ RIp$\9        T4      p%T$P;                  4        \        R2T% 24       T P                  R/T%RR//4      G Rj  x€L 
   Rp?EKÕ  Rp?ii ; i  \         d     EKì  i ; i  \@         d     ELb\         dJ   p T P                  R/\9        T4      RR//4      G Rj  x€L 
   Rp?ELš  \         d	      Rp?EL¬i ; iRp?ii ; i EL¤  \         d     R# i ; i   T PC                  4       G Rj  x€L 
  i   \         d     i i ; i; i5i)6z%Realtime transcription via WebSocket.Nr…   z-mlx-community/whisper-large-v3-turbo-asr-fp16r¢   r°   i€>  r`  TzConfiguration received: model=z, language=z, sample_rate=z, streaming=zLoading STT model...zSTT model loaded successfullyiè  zVAD initialized: frame_size=z
 samples (zms at zHz)g      à?g      ø?g      @Fr"  Úreadyr  zReady to transcriberP  ©ÚdtypezVAD error (assuming speech): ç      à@zSpeech detected (r  z frames): buffer z.2fzs)zSilence detected: skipped z chunksz1Processing initial chunk for real-time feedback: zs, total buffer: ÚszProcessing due to silence gap: zs silence, buffer: z#Processing due to max buffer size: )r_  r`  z$Error during initial transcription: r4  zProcessed final chunk: zs), buffer clearedzError during transcription: r§   ÚactionÚstop)"ÚacceptÚreceive_jsonr3  ÚprintrË   r*   Ú	webrtcvadÚVadr˜   rò   rd  ÚreceiverÕ   r;   Ú
frombufferÚint16rÈ  ÚrangeÚ	is_speechÚtobytesr9  ÚOSErrorÚastypeÚfloat32Úextendrø  ri  Ú	tracebackrR   Ú	print_excr   rR  r   rO  )'r^  ÚconfigrP   r¢   r°   r`  r  ÚvadÚvad_frame_duration_msÚvad_frame_sizeÚaudio_bufferÚmin_chunk_sizeÚinitial_chunk_sizeÚmax_chunk_sizeÚsilence_skip_countÚspeech_chunk_countÚlast_speech_timeÚsilence_threshold_secondsÚinitial_chunk_processedr  Úaudio_chunk_int16Ú
num_framesÚ
has_speechÚspeech_framesÚiÚframe_startÚ	frame_endÚframerA  Úcurrent_timeÚaudio_chunk_floatÚtime_since_last_speechÚshould_process_initialÚshould_process_finalÚprocess_sizeró  r„  Ú	error_msgr  s'   &                                      r0   Ústt_realtime_transcriptionsr¢  È  sµ  é € ð ×
Ñ
Ó
×Ðð`à ×-Ñ-Ó/×/ˆØ—Z‘ZØÐDó
ˆ
ð —:‘:˜j¨$Ó/ˆØ—j‘j °Ó6ˆØ—J‘J˜{¨DÓ1ˆ	äØ,¨Z¨L¸ÀHÀ:È^Ð\gÐ[hÐhtÐu~Ðtð  Aô	
ô
 	Ð$Ô%Ü"×-Ñ-¨jÓ9ˆ	ÜÐ-Ô.ô �mŠmØó
ˆð !#ÐÜ˜[Õ@À4ÕGÓHˆÜØ*¨>Ð*:¸*ÐEZÐD[Ð[aÐbmÐanÐnqÐrô	
ð
 ˆÜ˜[¨3Õ.Ó/ˆÜ Ø˜#Õó
Ðô Ø˜#Õó
ˆð ÐØÐÜŸ9š9›;ÐØ$'Ð!Ø"'Ðà×!Ñ! 8¨W°iÐAVÐ"WÓX×XÐXÜÐ#Ô$àðØ )× 1Ñ 1Ó 3×3�ð ˜'Õ!ä$&§M¢M°'¸'Õ2BÌ"Ï(É(Ô$SÐ!ô
 !Ð!2Ó3°~ÕE�
Ø"�
Ø !�ô ˜zÖ*�AØ"# nÕ"4�KØ +¨nÕ <�IØ-¨k¸)ÐD�Eô ˜5“z ^Ö3ð	/Ø"Ÿ}™}¨U¯]©]«_¸k×JÒJØ-1 
Ø -°Õ 2¢ñ  Kñ +ô,  $Ÿyšy›{�ßà(9×(@Ñ(@ÄÇÁÓ(LÈwÕ(VÐ%Ø ×'Ñ'Ð(9Ô:Ø&¨!Õ+Ð&Ø)*Ð&Ø'3Ð$ä˜<Ó(¨K¸!­OÕ<¼sÐCTÓ?UÔUäØ/°¨¸aÀ
¸|ÐK\Ô]`ÐamÓ]nÐ\oÐoyÔz}ð  Kó  {Lð  MXõ  {Xð  Y\ð  z]ð  ]_ð  `ôøð '¨!Õ+Ð&à)¨BÕ.°!Ô3ÜÐ :Ð;MÐ:NÈgÐVÔWð *6Ð8HÕ)HÐ&Ø).Ð&Ø',Ð$ä�|Ó$ qÔ(÷ 4Ü Ó-Ð1CÔCß&à15Ð.ÜØOÐPbÕPnÐorÐOsð  tEô  FIð  JVó  FWð  Xcõ  Fcð  dgð  Ehð  hið  jõð
 /Ð2KÔKÜ Ó-°Ô?à/3Ð,ÜØ=Ð>TÐUXÐ=YÐYlÔmpÐq}Óm~ð  @Kõ  nKð  LOð  mPð  PQð  Rõô ˜\Ó*¨nÔ<Ø/3Ð,ÜØAÄ#ÀlÓBSÐT_ÕB_Ð`cÐAdÐdeÐfô÷
 *¬c°,Ó.?ÐCUÔ.UØ#5�LÜ"$§(¢(¨<¸¸Ð+FÓ"G�KØ.2Ð+ðÜ3Ø%Ø%Ø'Ø'Ø$Ø'+Ø&/ô÷ ð ÷( (¬C°Ó,=ÀÔ,Aä#& |Ó#4�LÜ"$§(¢(¨<Ó"8�KðÜ3Ø%Ø%Ø'Ø'Ø$Ø',Ø&/ô÷ ð ð (*˜Ø27Ð/ÜØ5°l°^À:ÈlÐ[fÕNfÐgjÐMkÐk}Ð~÷ò' -BÒ'ðB ˜7×"ðÜŸ:š: g¨f¥oÓ6�DØ—x‘x Ó)¨VÔ3Øò 4ð	Ø—/‘/Ó#×#Ò#òA ò 0òV 	Yò 4øÜô Úðûô4 !+¬GÐ4ô /ô "Ð$AÀ!ÀÐ"EÔFØ)-˜JØ)¨QÕ.ŸMûð/úòRøô %ô Û(ä$'¨£F˜	Ø!×+Ñ+Ô-ÜÐ DÀYÀKÐPÔQØ'×1Ñ1Ø$ i°¸7ÐCó÷ ÷ ûðúò"øô" %ô Û(ä$'¨£F˜	Ø!×+Ñ+Ô-ÜÐ <¸Y¸KÐHÔIØ'×1Ñ1Ø$ i°¸7ÐCó÷ ÷ ð ûðûô  !ô Ûðûô ô ÚÜô ð	Ø×%Ñ% w´°A³¸À'Ð&JÓK×K×KøÜô 	Þð	þðúò $øÜô 	Úð	ûð	Ø—/‘/Ó#×#Ò#øÜô 	Ùð	ÿsL  ‚\–T7—\œY0 ¯T:°E Y0 Å0T=Å1Y0 ÆU ÆU ÆU ÆA=Y0 È%UÉUÉ"Y0 É1C(Y0 ÍY0 Í2B$Y0 Ð-Y0 ÑV ÑVÑV ÑY0 Ñ'1Y0 ÒW8 Ò.W5Ò/"W8 ÓY0 Ó%3Y Ô[) ÔY0 Ô[ Ô0[Ô1[ Ô5\Ô:Y0 Ô=Y0 Õ U ÕUÕY0 Õ[) ÕUÕY0 ÕVÕ&VÕ?Y0 ÖVÖY0 ÖV ÖW2ÖAW-×!W$×"W-×'Y0 ×-W2×2Y0 ×5W8 ×8YØAYÙYÙ	YÙY0 ÙYÙY0 ÙY-Ù(Y0 Ù,Y-Ù-Y0 Ù0[Ù;[) Ù>[Ú[Ú	!Z6Ú*Z-Ú+Z6Ú0[) Ú6[	Û[Û[) Û[	Û	[Û[Û[) Û[ Û[&Û"\Û%[&Û&\Û)\Û+\Û>\Û?\Ü\Ü\Ü\Ü\Ü\Ü\iÀ]  c                ó:   € V ^8„  d   QhR\         \        ,          /# r!  )r
   r˜   )r/   s   "r0   r1   r1   ·  s   € ÷ ñ ¬´#­ñ r2   c                  ó~   € \         P                  ! R 4      p V '       g   R#  \        V 4      #   \         d     R# i ; i)Ú)MLX_AUDIO_REALTIME_TRANSCRIPTION_DELAY_MSN)rï   rP  r˜   r9  )rV  s    r0   Ú_default_transcription_delay_msr¦  ·  s7   € Ü
�)Š)Ð?Ó
@€CßÙðÜ�3‹xˆøÜô Úðús   ¢
- ­<»<c                óF   € V ^8„  d   QhR\         R\        \        ,          /# )r,   r�   Údelay_ms)r:   r
   r˜   )r/   s   "r0   r1   r1   Á  s   € ÷ 	4ñ 	4´5ð 	4ÄHÌSÅMñ 	4r2   c               ó    € RV/pVe6   \         P                  ! V P                  4      pRVP                  9   d   W#R&   V P                  ! R/ VB # )zkOpen a streaming session, forwarding ``transcription_delay_ms`` only to
models that declare the parameter.
r�   Útranscription_delay_msrš   )rö   r÷   Úcreate_streaming_sessionrù   )r…   r�   r¨  rÍ  Úsigs   &$$  r0   Ú_open_streaming_sessionr­  Á  sS   € ð " ;Ð/€FØÒÜ×Ò × >Ñ >Ó?ˆØ# s§~¡~Ô5Ø/7Ð+Ñ,Ø×)Ò)Ñ3¨FÑ3Ð3r2   c                óp   € V ^8„  d   QhR\         P                  R\        R\        R\         P                  /# )r,   Úpcm16Ú	from_rateÚto_rater.   )r;   r¿   r˜   )r/   s   "r0   r1   r1   Í  s4   € ÷ ?ñ ?Ü�:‰:ð?Ü"%ð?Ü03ð?ä‡Z�Zñ?r2   c                óN  € V P                  \        P                  4      R,          pW8X  g   VP                  ^ 8X  d   V# \	        \        VP                  V,          V,          4      4      pV^8:  d%   VRV P                  \        P                  RR7      # \        P                  ! RRVP                  R\        P                  R7      p\        P                  ! RRVR\        P                  R7      p\        P                  ! WeV4      P                  \        P                  4      # )z‡Linear resample int16 PCM to ``to_rate``.

Returns float32 samples in [-1, 1]. If the rates already match, this is
a plain dtype cast.
rq  NF)Úcopyç        r€   )ÚnumÚendpointrp  )	r�  r;   r‚  Úsizer˜   ÚroundÚlinspaceÚfloat64Úinterp)r¯  r°  r±  r8  Ún_outÚsrc_xÚdst_xs   &&&    r0   Ú_resample_pcm16_to_rater¿  Í  sÍ   € ð �l‰lœ2Ÿ:™:Ó&¨Õ0€GØÔ˜wŸ|™|¨qÔ0ØˆÜ”�g—l‘l WÕ,¨yÕ8Ó9Ó:€EØ�„zØ�v˜ˆ×%Ñ%¤b§j¡j°uÐ%Ó=Ð=Ü�KŠK˜˜S g§l¡l¸UÌ"Ï*É*ÔU€EÜ�KŠK˜˜S e°eÄ2Ç:Á:ÔN€EÜ�9Š9�U 7Ó+×2Ñ2´2·:±:Ó>Ð>r2   c                ó\   € V ^8„  d   QhR\         \        ,          R\         \        ,          /# )r,   Úrequested_modelr.   r3  )r/   s   "r0   r1   r1   à  s"   € ÷ ñ ´(¼3µ-ð ÄHÌSÅMñ r2   c                ó¾   € T ;'       g    RP                  4       pV'       d   V# \        P                  ! R4      ;'       g    RP                  4       pT;'       g    R# )u<  Return the requested model ID, or the server-configured default.

The default is read from ``$MLX_AUDIO_REALTIME_MODEL`` (settable via the
``--realtime-model`` CLI flag). Returns ``None`` when neither the client
nor the server supplies a model â€” the caller is expected to reject the
connection with a clear error.
rß   ÚMLX_AUDIO_REALTIME_MODELN)r(  rï   rP  )rÁ  Ú
normalizedÚ
configureds   &  r0   Ú_resolve_realtime_model_namerÆ  à  sQ   € ð "×'Ð' R×.Ñ.Ó0€JßØÐÜ—)’)Ð6Ó7×=Ð=¸2×DÑDÓF€JØ×Ð˜Ðr2   zmlx-community/silero-vadc                ó$   € V ^8„  d   QhR\         /# r!  rQ   )r/   s   "r0   r1   r1   ó  s   € ÷ -ñ -¤ñ -r2   c                 óz   € \         P                  ! R4      ;'       g    RP                  4       ;'       g    \        # )z±Return the VAD model used for server-side turn detection.

Read at request time from ``$MLX_AUDIO_VAD_MODEL`` (settable via the
``--vad-model`` CLI flag), defaulting to Silero.
ÚMLX_AUDIO_VAD_MODELrß   )rï   rP  r(  Ú_REALTIME_VAD_MODEL_DEFAULTrš   r2   r0   Ú_resolve_vad_model_namerË  ó  s2   € ô 	�	Š	Ð'Ó(×.Ð.¨Bß�eƒg÷-ð -ä,ð-r2   c                ó$   € V ^8„  d   QhR\         /# rh  rQ   )r/   s   "r0   r1   r1   þ  s   € ÷ ñ ¤3ñ r2   c                óf   € \         P                  V 4      pVf   ^ RIHp V! V 4      pV\         V &   V# )zÔLoad and cache a streaming VAD model for server-side turn detection.

Kept behind a module-level indirection so the realtime endpoint can be
exercised with a fake VAD model in tests without hitting Hugging Face.
)Úload)Ú_realtime_vad_modelsr3  Úmlx_audio.vadrÎ  )ri  r…   Úload_vads   &  r0   Ú_load_realtime_vad_modelrÒ  þ  s5   € ô !×$Ñ$ TÓ*€EØ‚}Ý2á˜“ˆØ%*Ô˜TÑ"Ø€Lr2   z/v1/realtimec                ó$   € V ^8„  d   QhR\         /# rk  rl  )r/   s   "r0   r1   r1     s   € ÷ Oñ O¤ñ Or2   c              ƒ  óD  a aaaaaaa a!a"a#a$a%a&a'"  € S P                  4       G Rj  x€L
  R R loR VV 3R llo"R V"3R llpS P                  P                  R4      p\        V4      o S f+   V! R	4      G Rj  x€L
  S P	                  4       G Rj  x€L
  R#  \
        P                  S 4      o\        SR4      '       g0   T! RS : R24      G Rj  x€L
  S P	                  4       G Rj  x€L
  R# Ro%\        4       o&\        SS%S&R7      o#. oRo\        oRo'RpR R lpR<R TTT"T#3R llloTTT"3R lo!R TTTTT!T"T#T%T&3	R llpR\        P                  ! 4       P                  R,           2o$R TT T$T'3R llpS"! RRRT! 4       /4      G Rj  x€L
    S P                  4       G Rj  x€L
 p \         P"                  ! T4      p	T	P                  RR4      p
T
R 8X  EdÚ   T	P                  R4      ;'       g    / pTP                  R!4      ;'       g    / P                  R"4      ;'       g    / pTP                  R#4      ;'       g    / pTP                  R4      ;'       g    TP                  R4      pTP                  R$4      ;'       g    / pTP                  R%4      p\'        T\(        4      '       d
   T^ 8”  d   To\        T4      pT'       dƒ   TS 8w  d|    \
        P                  T4      o\        SR4      '       g   T! RT: R24      G Rj  x€L
  EKƒ  To \*        ;_uu_4       GRj  x€L
  \        SS%S&R7      o#RRR4      GRj  x€L
  . oRoR&T9   dC    \-        TP                  R&4      4      o'S'f   RpM  \3        \5        4       4      p\7        TS'4      pS"! RR(RT! 4       /4      G Rj  x€L
  EK#  T
R)8X  Edð   T	P                  R!R4      pT'       g   EKH  Sf-   Tf)   T! 4       oS"! RR*R+R,SR-R.RR/R0R1R2RR3/.//4      G Rj  x€L
  \8        P:                  ! \<        P>                  ! T4      \8        P@                  R47      p\C        TSS#PD                  4      p\*        ;_uu_4       GRj  x€L
  S#PG                  T4       RRR4      GRj  x€L
  S! ^R57      G Rj  x€L
  TEe   \C        TS\H        4      p\*        ;_uu_4       GRj  x€L
  TPK                  T4      pRRR4      GRj  x€L
  X F®  pTPL                  \N        PP                  J dO   Sf)   T! 4       oS"! RR*R+R,SR-R.RR/R0R1R2RR3/.//4      G Rj  x€L
  S"! RR6R7TPR                  R8S/4      G Rj  x€L
  Ko  S"! RR9R:TPR                  R8S/4      G Rj  x€L
  T! 4       G Rj  x€L
  TPU                  4        K°  	  EK  EK  T
R;8X  g   EK$  Sf)   T! 4       oS"! RR*R+R,SR-R.RR/R0R1R2RR3/.//4      G Rj  x€L
  T! 4       G Rj  x€L
  Tf   EKf  TPU                  4        EKy   ELæ EL– EL�  \         d9   pT! R
T 24      G Rj  x€L 
  S P	                  4       G Rj  x€L 
   Rp?R# Rp?ii ; i EL‹ ELv ELÔ EL½  \         P$                   d    T! R4      G Rj  x€L 
   EKþ  i ; i  \         d!   pT! R
T 24      G Rj  x€L 
   Rp?EK(  Rp?ii ; i ELµ ELœ EL�  + GRj  x€L 
 '       g   i     EL™; i  \.         d'   pT! \1        T4      4      G Rj  x€L 
   Rp?EK‚  Rp?ii ; i  \         d%   pRo'RpT! R'T 24      G Rj  x€L 
   Rp?EK´  Rp?ii ; i EL¡ ELL ELç ELÉ  + GRj  x€L 
 '       g   i     ELá; i ELØ EL® EL�  + GRj  x€L 
 '       g   i     EL¨; i ELa ELD EL% EL ELÌ ELÀ  \V         d     M[\         dO   p^ RI,pTP[                  4         T! \1        T4      4      G Rj  x€L 
   Rp?M  \         d      Rp?Mi ; iRp?ii ; i S P	                  4       G Rj  x€L 
  M  \         d     Mi ; i\\        P^                  ! 4        R#    S P	                  4       G Rj  x€L 
  M  \         d     Mi ; i\\        P^                  ! 4        i ; i5i)=ué  OpenAI Realtime API-compatible WebSocket endpoint.

Works with any STT model whose ``load_model`` result exposes the
streaming-session protocol. A streaming session must provide:
  - ``feed(samples: np.ndarray[float32])``
  - ``close()``
  - ``step(max_decode_tokens: int) -> list[str]``
  - ``done: bool``
  - ``input_sample_rate: int``  (the native rate expected by ``feed``)
Models that support an adjustable transcription-delay / latency knob
should accept ``transcription_delay_ms: Optional[int]`` on
``create_streaming_session``; models without the concept can ignore it.

Client â†’ server events follow OpenAI Realtime (subset):
  ``session.update``, ``input_audio_buffer.append``,
  ``input_audio_buffer.commit``.
Server â†’ client events: ``session.created`` / ``session.updated``,
``conversation.item.added``, ``input_audio_buffer.committed``,
``conversation.item.input_audio_transcription.delta`` /
``.completed``, and ``error``.

Turn detection follows OpenAI's ``turn_detection`` on
``session.audio.input``. With ``{"type": "server_vad"}`` the server runs a
streaming VAD (Silero by default, see ``--vad-model``), emits
``input_audio_buffer.speech_started`` / ``input_audio_buffer.speech_stopped``
and auto-commits each turn â€” the client never sends
``input_audio_buffer.commit``. With ``null`` (the default) the client drives
commits manually. ``semantic_vad`` is not implemented yet.

Model is selected via ``?model=<id>`` or ``session.update.model``;
defaults to ``$MLX_AUDIO_REALTIME_MODEL``.
Nc                ó$   € V ^8„  d   QhR\         /# r!  rQ   )r/   s   "r0   r1   Ú!realtime_ws.<locals>.__annotate__1  s   € ÷ 0ñ 0œ3ñ 0r2   c                  óT   € R \         P                  ! 4       P                  R,           2# )Úevent_ºNé   N©ÚuuidÚuuid4Úhexrš   r2   r0   Ú_new_event_idÚ"realtime_ws.<locals>._new_event_id1  s!   € ØœŸ
š
›×(Ñ(¨Õ-Ð.Ð/Ð/r2   c                ó$   € V ^8„  d   QhR\         /# )r,   rî   ©r6   )r/   s   "r0   r1   rÖ  4  s   € ÷ +ñ +¤$ñ +r2   c              “   ó\   <"  € R S! 4       /V Cp SP                  V 4      G Rj  x€L
  R#  L5i)Úevent_idN)rd  )rî   rß  r^  s   &€€r0   Ú
send_eventÚrealtime_ws.<locals>.send_event4  s+   øé € Ø™}›Ð:°'Ð:ˆØ×!Ñ! 'Ó*×*Ô*ùs   ƒ ,£*¤,c                ó$   € V ^8„  d   QhR\         /# )r,   r  rQ   )r/   s   "r0   r1   rÖ  8  s   € ÷ Kñ K¤#ñ Kr2   c              “   ó@   <"  € S! R RRRV //4      G Rj  x€L
  R#  L5i)r5   r4  r  Nrš   )r  rå  s   &€r0   Ú
send_errorÚrealtime_ws.<locals>.send_error8  s"   øé € Ù˜& '¨7°YÀÐ4HÐIÓJ×JÔJùs   ƒ•–r…   zsno realtime model configured: pass ?model=<id>, set session.update.model, or start the server with --realtime-modelzload failed: r«  zmodel z does not support streamingr´  ©r�   r¨  c                ó$   € V ^8„  d   QhR\         /# r!  rQ   )r/   s   "r0   r1   rÖ  [  s   € ÷ /ñ /œ#ñ /r2   c                  óT   € R \         P                  ! 4       P                  R,           2# )Úitem_rÙ  rÛ  rš   r2   r0   Ú_new_item_idÚ!realtime_ws.<locals>._new_item_id[  s!   € Ø”t—z’z“|×'Ñ'¨Õ,Ð-Ð.Ð.r2   c                ó0   € V ^8„  d   QhR\         R\        /# )r,   Úmax_decode_tokensr.   )r˜   rY   )r/   s   "r0   r1   rÖ  ^  s   € ÷ ñ ¬cð ¼$ñ r2   c              “  ó>  <"  € \         ;_uu_4       GRj  x€L
  SP                  V R7      pRRR4      GRj  x€L
  X F,  pSP                  V4       S! RRRSR^ RV/4      G Rj  x€L
  K.  	  SP                  #  Ld LD  + GRj  x€L 
 '       g   i     L[; i L45i)u0  Run one session.step, ship deltas. Returns session.done.

MLX runs inline on the event-loop thread (not via a worker thread):
MLX streams are thread-bound, so all realtime MLX work â€” the
transcription step and the VAD â€” must share one thread, otherwise you
hit "no Stream(gpu, N) in current thread".
N©rò  r5   z1conversation.item.input_audio_transcription.deltaÚitem_idÚcontent_indexrb  )ÚREALTIME_INFERENCE_LOCKr2  r¹  r;  )rò  Údeltasrb  Úcurrent_item_idÚfull_text_partsrå  Úsessions   &  €€€€r0   Údrain_deltasÚ!realtime_ws.<locals>.drain_deltas^  sŽ   øé € ÷ +×*Ö*Ø—\‘\Ð4E�\ÓFˆF÷ +×*ãˆEØ×"Ñ" 5Ô)ÙàÐOØ˜Ø# QØ˜Uð	ó÷ ò ñ ð �|‰|Ð÷ +×*×*Ô*úñùsS   ƒB–A;—BšA?­B¸A=¹-BÁ&BÁ'BÁ=BÁ?B	ÂBÂ
B	ÂB	Â	Bc            
   “   óf   <"  € R P                  S4      p S! RRRSR^ RV /4      G Rj  x€L
  R#  L5i)rß   r5   z5conversation.item.input_audio_transcription.completedrõ  rö  Ú
transcriptN)Újoin)r§   rù  rú  rå  s    €€€r0   Ú	send_doneÚrealtime_ws.<locals>.send_donet  s@   øé € Ø�w‰w�Ó'ˆÙàÐOØ˜?Ø Ø˜dð	ó
÷ 	
ô 	
ùs   ƒ%1¨/©1c                ó   € V ^8„  d   QhRR/# r-  rš   )r/   s   "r0   r1   rÖ    s   € ÷ ñ  ñ r2   c               “  óø  <	"  € S! RRRS RR/4      G Rj  x€L
  \         ;_uu_4       GRj  x€L
  SP                  4        RRR4      GRj  x€L
  S! ^R7      G Rj  x€L
 '       g   K  S! 4       G Rj  x€L
  \         ;_uu_4       GRj  x€L
  \        SSSR7      oRRR4      GRj  x€L
  . oRo R#  Lž L‰ Lk  + GRj  x€L 
 '       g   i     L‚; i Lx Lc LN L2  + GRj  x€L 
 '       g   i     LI; i5i)zßCommit the current turn: emit ``committed``, drain the remaining
transcription, emit ``completed``, then reopen a fresh session.

Shared by the manual ``input_audio_buffer.commit`` path and the
server-VAD auto-commit path.
r5   zinput_audio_buffer.committedrõ  Úprevious_item_idNrô  rë  )r÷  rO  r­  )	rù  rü  rú  r…   r  rå  rû  r�   rª  s	   €€€€€€€€€r0   Úfinalize_turnÚ"realtime_ws.<locals>.finalize_turn  s¼   øé € ñ àÐ6Ø˜?Ø" Dðó
÷ 	
ð 	
÷ +×*Ö*Ø�M‰MŒO÷ +×*á$°rÔ:×:Ö:ÙÙ‹k×Ðß*×*Ö*Ü-Ø ;Ð9OôˆG÷ +×*ð ˆØŠñ#	
÷ +×*×*Ô*úá:áß*×*×*Ô*üsÌ   ƒC:•B4–C:¬B6­C:°B:ÁC:ÁB8ÁC:ÁCÁ	C:Á(C:Á4CÁ5C:ÂCÂC:ÂCÂC:Â)CÂ*C:Â6C:Â8C:Â:C	Ã CÃ
C	ÃC	Ã	C:ÃC:ÃC:ÃC:ÃC7	Ã$C'Ã%
C7	Ã0C7	Ã2C:Úsess_rÙ  c                ó$   € V ^8„  d   QhR\         /# r!  râ  )r/   s   "r0   r1   rÖ  œ  s   € ÷ 
ñ 
œtñ 
r2   c                  ón   <€ R SRRRRRSRRRRR	R
S /RRS/RS'       d   SP                  4       ///# R///# )r  r  zrealtime.sessionr5   Útranscriptionr…   r¾   r†   r/   z	audio/pcmÚrateÚturn_detectionN)Úto_dict)Úclient_input_raterP   Ú
session_idÚturn_configs   €€€€r0   Ú_session_snapshotÚ&realtime_ws.<locals>._session_snapshotœ  sv   ø€ à�*ØÐ(Ø�OØ�ZØØØ˜v {°FÐ<MÐNØ# g¨zÐ%:Ø$¿{ k×&9Ñ&9Ó&;ððð
ð 	
ð QUððð
ð 	
r2   r5   zsession.createdrû  zinvalid JSONrß   zsession.updater¾   r†   r  r/   r  r  zvad load failed: zsession.updatedzinput_audio_buffer.appendzconversation.item.addedrA   r  r  zrealtime.itemr  ÚroleÚuserÚcontentÚinput_audioro  rô  z!input_audio_buffer.speech_startedÚaudio_start_msrõ  z!input_audio_buffer.speech_stoppedÚaudio_end_mszinput_audio_buffer.commit)é   )0ru  Úquery_paramsr3  rÆ  rO  rË   r*   rÕ   rû   r¦  r­  Ú_REALTIME_DEFAULT_CLIENT_RATErÜ  rÝ  rÞ  Úreceive_textr   rR  ÚJSONDecodeErrorr4   r˜   r÷  r"   r    rR   rÒ  rË  r   r;   r{  rð  Ú	b64decoder|  r¿  Úinput_sample_rateÚfeedr   Úprocessr  r!   ÚSPEECH_STARTEDÚaudio_msÚ
reset_turnr   r„  r…  r·  r¸  )(r^  ré  rÁ  rA  Úturn_detectorrï  r  r  rV  ÚmsgÚmsg_typeÚsession_payloadÚaudio_inputÚtranscription_cfgÚresolved_modelÚfmtÚrequested_rateÚtarget_model_nameÚ	vad_modelÚ	audio_b64r¯  r8  Úvad_samplesÚturn_eventsÚ
turn_eventr„  rß  r  rù  rü  rú  r…   rP   r  rå  rû  r  r�   rª  r  s(   f                         @@@@@@@@@@@@@@r0   Úrealtime_wsr5    sH  ÿþé € ðD ×
Ñ
Ó
×Ðõ0÷+ñ +÷Kð Kð  ×,Ñ,×0Ñ0°Ó9€OÜ-¨oÓ>€JØÒÙðNó
÷ 	
ð 	
ð �o‰oÓ×ÐÙðÜ×)Ñ)¨*Ó5ˆô �5Ð4×5Ò5Ù˜6 *¡Ð/JÐKÓL×LÐLØ�o‰oÓ×ÐÙà€KÜ<Ó>ÐÜ%Ø˜;Ð1Gô€Gð "$€OØ%)€OÜ5ÐØ-1€KØ,0€Mõ/÷õ ÷,	
÷÷ ð ð6 œŸš›×)Ñ)¨#Õ.Ð/Ð0€J÷
ó 
ñ �fÐ/°Ñ<MÓ<OÐPÓ
Q×QÐQðpØØ!×.Ñ.Ó0×0ˆCðÜ—j’j “o�ð
 —w‘w˜v rÓ*ˆHàÐ+Õ+Ø"%§'¡'¨)Ó"4×":Ð":¸�Ø.×2Ñ2°7Ó;×AÐA¸r×FÑFÀwÓO×UÐUÐSU�Ø$/§O¡O°OÓ$D×$JÐ$JÈÐ!Ø!0×!4Ñ!4°WÓ!=÷ "ð "ÐAR×AVÑAVØóB�ð "—o‘o hÓ/×5Ð5°2�Ø!$§¡¨£�Ü˜n¬c×2Ò2°~ÈÔ7IØ(6Ð%Ü$@ÀÓ$PÐ!ß$Ð):¸jÔ)Hð!Ü .× 9Ñ 9Ð:KÓ L˜ô # 5Ð*D×EÒEÙ(Ø$Ð%6Ñ$9Ð9TÐUó÷ ð ò !Ø!2�Jß6×6Ö6Ü"9Ø!Ø(3Ø%;ô#˜÷  7×6ð ')�OØ&*�Oà# {Ô2ð!Ü&:Ø'ŸO™OÐ,<Ó=ó'˜ð #Ò*Ø(,™ð%Ü(@Ü 7Ó 9ó)˜Iô )5°YÀÓ(L˜á ØÐ.°	Ñ;LÓ;NÐOó÷ ó ð Ð8Õ8ØŸG™G G¨RÓ0�	ß Úð #Ò*¨}Ò/DÙ&2£n�OÙ$à"Ð$=Ø"Ø $ oØ (¨/Ø &¨	Ø &¨Ø )¨V°]Ð,CÐ+Dð%ð	ó÷ ð ô Ÿš¤f×&6Ò&6°yÓ&AÌÏÉÔR�Ü1ØÐ,¨g×.GÑ.Gó�÷ 3×2Ö2Ø—L‘L Ô)÷ 3×2ñ #°QÔ7×7Ð7à Ó,Ü"9ØÐ0´/ó#�K÷  7×6Ö6ð '4×&;Ñ&;¸KÓ&H˜÷  7×6ó '2˜
Ø%Ÿ?™?¬m×.JÑ.JÓJØ.Ò6Ù2>³. Ù&0à(.Ð0IØ(.Ø,0°/Ø,4°oØ,2°IØ,2°FØ,5¸ÀÐ8OÐ7Pð1*ð	%&ó'"÷ !"ð !"ñ #-à$*Ð,OØ$4°j×6IÑ6IØ$-¨ð!"ó#÷ ò ñ #-à$*Ð,OØ$2°J×4GÑ4GØ$-¨ð!"ó#÷ ð ñ #0£/×1Ð1Ø)×4Ñ4Ö6ôA '2ò -ðT Ð8×8Ø"Ò*Ù&2£n�OÙ$à"Ð$=Ø"Ø $ oØ (¨/Ø &¨	Ø &¨Ø )¨V°]Ð,CÐ+Dð%ð	ó÷ ð ñ $“o×%Ð%Ø Õ,Ø!×,Ñ,×.ò{ ò	
ò 	 øô ô Ù˜=¨¨Ð,Ó-×-Ñ-Ø�o‰oÓ×ÑÝûðúò 	MÚò| Rò 1øô ×'Ñ'ô Ù  Ó0×0Ñ0Ûðûô* %ô !Ù(¨=¸¸Ð)<Ó=×=Ñ=Þ ûð!úò÷
  7×6×6×6ûô .ô !Ù(¬¨Q«Ó0×0Ñ0Þ ûð!ûô  )ô %Ø*.˜KØ,0˜MÙ",Ð/@ÀÀÐ-DÓ"E×EÑEÞ$ûð	%úòò÷  3×2×2×2úò 8÷  7×6×6×6úò!"òòò 2òò &øô ô ÙÜô Ûà×ÑÔð	ÙœS ›VÓ$×$Ö$øÜô 	Ýð	þðúð	Ø—/‘/Ó#×#Ò#øÜô 	Ùð	úä
�ŠÖøð		Ø—/‘/Ó#×#Ò#øÜô 	Ùð	úä
�ŠÕüs"  ‘b ¥X¦Ab Á8XÁ9b ÂXÂb ÂX Â-"b ÃYÃb Ã'YÃ(B$b ÆY Æb Æ^/ Æ&Y#Æ'^/ Æ,Y& Ç1^/ Ç4^/ È^/ È(^/ É^/ É)^/ ÊA^/ ËZ Ë+"^/ Ì[Ì^/ Ì)[Ì*^/ Ì-[Ì<^/ Í[Í^/ Í[( Í2^/ Í:\ Î ^/ Î-]Î.(^/ Ï.^/ Ð]ÐA'^/ Ñ-]Ñ.^/ Ñ1]Ò^/ Ò]Ò^/ Ò]7Ò ,^/ Ó]:Ó^/ Ó^ Ó"^/ Ó-]=Ó.A^/ Ô<^Ô=^/ Õ^ Õ!^/ Õ>^#Õ?^/ Ö^&Ö"^/ Ö6'^/ ×^)×^/ ×,^,×-^/ ×8^/ Øb Øb Øb ØYØYØ-X0Ø.YÙY	ÙYÙb ÙYÙb Ùb Ù b Ù#^/ Ù& ZÚZ	ÚZÚ^/ ÚZÚ^/ ÚZ?ÚZ:Ú-Z0Ú.Z:Ú3^/ Ú:Z?Ú?^/ Û^/ Û^/ Û[%	Û[Û
[%	Û[%	Û	^/ Û(\Û3\Ü\
Ü\Ü^/ Ü\Ü^/ Ü]Ü']Ü9\<Ü:]Ü?^/ Ý]Ý^/ Ý^/ Ý^/ Ý^/ Ý]4	Ý ]#Ý!
]4	Ý,]4	Ý.
^/ Ý:^/ Ý=^/ Þ ^	Þ^	Þ
^	Þ^	Þ
^/ Þ ^/ Þ#^/ Þ&^/ Þ)^/ Þ,^/ Þ/`Þ:a Þ<`ß`ß`ß_:ß/_2ß0_:ß5a ß:`à`àa à`à`à`àa à`2 à+`.à,`2 à1b à2a à=b à?a á b ábáa6á/a2á0a6á5bá6bâbâbâbâb c                   ó:   a € ] tR tRt o RR ltR tRR ltRtV tR# )	ÚMLXAudioStudioServeri`  c                óx   € Wn         R V n        \        V4      V n        V P                  P	                  RR7       R # )NT)Úexist_ok)Ústart_uiÚ
ui_processr   Úlog_dirÚmkdir)rK   r:  r<  s   &&&r0   rL   ÚMLXAudioStudioServer.__init__a  s.   € Ø ŒØˆŒÜ˜G“}ˆŒØ�‰×Ñ DÐÖ)r2   c                ó’  € \        \        4      P                  R,          p \        P                  ! RR.\        V4      \        P                  \        P                  RR7        \        T P                  R	,          R
4      p\        P                  ! . RO\        T4      T\        P                  R7      T n        \!        RT P                   R24       R#   \         d    \        R4      h\        P                   d   p\        RT4      hRp?ii ; i  \         d    \        R4      h\         d   p\        RT 24      hRp?ii ; i)z%Start UI with logs redirected to fileÚuiÚnpmÚinstallT)ÚcwdÚstdoutÚstderrÚcheckuJ   âœ— Error: 'npm' is not installed or not found in PATH. UI will not start.u!   âœ— Error running 'npm install':
Núui.logÚw)rC  rD  rE  u   âœ“ UI started (logs: z/ui.log)uN   âœ— Error: 'npm' is not installed or not found in PATH. UI server not started.u   âœ— Failed to start UI: )rA  ÚrunÚdev)r   Ú__file__ÚparentÚ
subprocessrI  rR   ÚDEVNULLÚPIPEÚFileNotFoundErrorrÕ   ÚCalledProcessErrorÚopenr<  ÚPopenÚSTDOUTr;  rw  )rK   Úui_pathrA  Úui_logs   &   r0   Ústart_ui_backgroundÚ(MLXAudioStudioServer.start_ui_backgroundg  s$  € ä”x“.×'Ñ'¨$Õ.ˆð	Eä�NŠNØ˜	Ð"Ü˜“LÜ!×)Ñ)Ü!—‘Øõð	<ä˜$Ÿ,™,¨Õ1°3Ó7ˆFÜ(×.Ò.Ú%Ü˜“LØÜ!×(Ñ(ô	ˆDŒOô Ð*¨4¯<©<¨.¸ÐAÖBøô! !ô 	ÜØ\óð ô ×,Ñ,ô 	EÜÐ@À!ÓDÐDûð	Eûô !ô 	ÜØ`óð ô ô 	<ÜÐ6°q°cÐ:Ó;Ð;ûð	<ús=   ¢AC Á%A.D Ã(DÃ>DÃ?DÄDÄEÄ2EÄ3EÅEc           	     ó|  € V P                   '       de   V P                  4        \        P                  ! ^4       \        P
                  ! R4       \        RV RV 24       \        R4       \        R4       M$V'       d   \        RV RV 24       \        R4        \        P                  ! RVVV^R	R
7       V P                  '       d&   V P                  P                  4        \        R4       V P                  R,          pVP                  4       '       d!   VP                  4        \        RV 24       R# R#   T P                  '       d&   T P                  P                  4        \        R4       T P                  R,          pTP                  4       '       d    TP                  4        \        RT 24       i i ; i)r,   zhttp://localhost:3000u"   âœ“ API server starting on http://Ú:u0   âœ“ Studio UI available at http://localhost:3000z"
Press Ctrl+C to stop both serversu'   âœ“ Realtime server starting on http://uA   âœ“ Standard endpoints remain mounted; prefer realtime endpoints.zmlx_audio.server:apprG   )ÚhostÚportÚreloadÚworkersÚloopu   âœ“ UI server stoppedrG  u   âœ“ UI logs deleted from N)r:  rW  rò   r  Ú
webbrowserrR  rw  ÚuvicornrI  r;  Ú	terminater<  r  Úunlink)rK   r[  r\  r]  ÚrealtimeÚui_log_paths   &&&&& r0   Ústart_serverÚ!MLXAudioStudioServer.start_serverŒ  sc  € Ø�=�=ˆ=Ø×$Ñ$Ô&Ü�JŠJ�qŒMÜ�OŠOÐ3Ô4ÜÐ6°t°f¸A¸d¸VÐDÔEÜÐDÔEÜÐ7Õ8ßÜÐ;¸D¸6ÀÀ4À&ÐIÔJÜÐUÔVð	AÜ�KŠKØ&ØØØØØõð ��ˆØ—‘×)Ñ)Ô+ÜÐ-Ô.àŸ,™,¨Õ1ˆKØ×!Ñ!×#Ò#Ø×"Ñ"Ô$ÜÐ1°+°Ð?Ö@ñ $øð ��ˆØ—‘×)Ñ)Ô+ÜÐ-Ô.àŸ,™,¨Õ1ˆKØ×!Ñ!×#Ò#Ø×"Ñ"Ô$ÜÐ1°+°Ð?Õ@ð $ús   ÂD: Ä:A F;Æ F;)r<  r:  r;  N)FÚlogs)Ú	localhosté@  FF)	rb   rc   rd   re   rL   rW  rf  rf   rg   rh   s   @r0   r7  r7  `  s   ø‡ € ô*ò#<÷JAò Ar2   r7  c                  óÜ  € \         P                  ! R R7      p V P                  RRR.RR7       V P                  R\        RR	R
7       V P                  R\        RRR
7       V P                  R\
        RRR
7       V P                  RRRR7       V P                  R\        RRR
7       V P                  R\        RRR
7       V P                  R\        RRR
7       V P                  R\        RRR
7       V P                  RRR R7       V P                  R!\        RR"R
7       V P                  4       pVP                  '       d   VP                  \        P                  R#&   VP                  e'   \        VP                  4      \        P                  R$&   VP                  '       d   VP                  \        P                  R%&   VP                  e'   \        VP                  4      \        P                  R&&   \        \        VP                  4       \!        VP"                  VP$                  R'7      pVP'                  VP(                  VP*                  VP,                  VP.                  R(7       R# ))zMLX Audio API server)rÄ   z--allowed-originsÚ+rm   z List of allowed origins for CORS)ÚnargsÚdefaultÚhelpz--hostri  zHost to run the server on)r5   rn  ro  z--portrj  zPort to run the server onz--reloadFz!Enable auto-reload of the server.z
--start-uiÚ
store_truez,Start the Studio UI alongside the API server)rs  ro  z	--log-dirrh  zDirectory to save server logsz--realtime-modelNzbDefault model for /v1/realtime when the client omits ?model=. Overrides $MLX_AUDIO_REALTIME_MODEL.z!--realtime-transcription-delay-msa  Transcription latency/quality knob for streaming STT models that expose a ``transcription_delay_ms`` parameter (e.g. voxtral_realtime). Lower values reduce latency at the cost of accuracy. When unset, each model uses its own default. Overrides $MLX_AUDIO_REALTIME_TRANSCRIPTION_DELAY_MS.z--vad-modelz™Streaming VAD model used for server-side turn detection on /v1/realtime (server_vad). Overrides $MLX_AUDIO_VAD_MODEL (default: mlx-community/silero-vad).z
--realtimez(Start the server for /v1/realtime usage.z--tts-max-batch-sizezmMaximum compatible TTS speech requests per continuous batch session. Overrides $MLX_AUDIO_TTS_MAX_BATCH_SIZE.rÃ  r¥  rÉ  rN  )r:  r<  )r[  r\  r]  rd  )ÚargparseÚArgumentParserÚadd_argumentrR   r˜   rY   Ú
parse_argsÚrealtime_modelrï   ÚenvironÚrealtime_transcription_delay_msr0  Útts_max_batch_sizerv   rj   rk   r7  r:  r<  rf  r[  r\  r]  rd  )ÚparserÚargsÚclients      r0   Úmainr|  ¬  sn  € Ü×$Ò$Ð1GÔH€FØ
×ÑØØØ�Ø/ð	 ô ð ×ÑØ”s KÐ6Qð ô ð ×ÑØ”s DÐ/Jð ô ð ×ÑØÜØØ0ð	 ô ð ×ÑØØØ;ð ô ð
 ×ÑØÜØØ,ð	 ô ð ×ÑØÜØð3ð ô ð ×ÑØ+ÜØð:ð ô ð ×ÑØÜØð3ð ô 	ð ×ÑØØØ7ð ô ð
 ×ÑØÜØð7ð ô ð ×ÑÓ€DØ××ÐØ15×1DÑ1DŒ�
‰
Ð-Ñ.Ø×+Ñ+Ò7ÜBEØ×0Ñ0óC
Œ�
‰
Ð>Ñ?ð ‡~‡~€~Ø,0¯N©NŒ�
‰
Ð(Ñ)Ø×ÑÒ*Ü58¸×9PÑ9PÓ5QŒ�
‰
Ð1Ñ2äŒs�D×(Ñ(Ô)ä!¨4¯=©=À$Ç,Á,ÔO€FØ
×ÑØ�Y‰YØ�Y‰YØ�{‰{Ø—‘ð	 ö r2   Ú__main__c                óÈ   € V ^8„  d   Qh/ ^ \         9   d   \        \        ,          ;R&   ^\         9   d
   \        ;R&   ^\         9   d   \        \        \
        3,          ;R&   # )r,   r{   rÊ  rÏ  )Ú__conditional_annotations__r
   r$   rR   r   r   )r/   s   "r0   r1   r1      sU   € ÷ ñ ÷h 3Ò 2”(œ?Õ+Ñ 2ñi÷\/ >Ò =œSÑ =ñ]/÷^/ *Ò )”dœ3¤˜8•nÑ )ò_/r2   rE   )T)‹r  Ú__doc__rq  rG   rð  rö   rª  r   rï   rM  rò   rÜ  r`  Ú
contextlibr   Údataclassesr   r   r   Úpathlibr   Útypingr   r   r	   r
   Úurllib.parser   Úmlx.coreÚcorer·  Únumpyr;   ra  rx  Úfastapir   r   r   r   r   r   r   r   r   Úfastapi.middleware.corsr   Úfastapi.responsesr   r   r   Úhuggingface_hub.errorsr   Úpydanticr   Úmlx_audio.audio_ior   rN  r   rô   Úmlx_audio.realtime_vadr   r   r   r    r!   r"   Úmlx_audio.server_inferencer#   r$   r%   r&   r'   Úmlx_audio.tts.continuousr(   r)   Úmlx_audio.utilsr*   r8   rC   rj   rv   rP  Úallowed_origins_envÚsplitr(  Údefault_originsr}   ÚrouterÚlifespan_contextr   r�   r¬   rË   rH   r÷  r{   rµ   r»   rÂ   rÍ   r×   rú   rÙ   r  r  rÔ  r  r	  r  r  r3  r  r  Úpostr$  Údeleter\   r1  rC  rW  r\  ri  r^  r¢  r  r¦  r­  r¿  rÆ  rÊ  rÏ  rË  rÒ  r5  r7  r|  rb   r1   )Úoriginr  s   0@r0   Ú<module>r›     sH  øðöó Û Û Û Û 	Û Û 	Û Û Û Û Ý *ß 7Ñ 7Ý ß ,Ó ,Ý  å Û Û Û ÷
÷ 
õ 
õ 3ß PÑ PÝ :Ý å 1Ý 3÷÷ ÷õ ÷ CÝ &õ÷4,ñ ,ñ. ƒi€õð* —i’iÐ ;Ó<Ð ÷ ð #6×";Ñ";¸CÔ"@ÓAÑ"@˜‡\�\†^Ñ"@ÒAà
ˆð ñ ˆ3�Ô  ð ô$ó ð$ð +€‡
�
Ô ô�Iô ô,2˜9ô 2ô˜ô ñ “€Ø!Ÿ,š,›.Ð Ø.2Ð Ó 2ð ÷ð ó ðð ÷ð ó ðð ÷ð ó ðõ1õð2 'Ð(AÐBÐ ô/Ð3ô /÷dc5ñ c5ôLJ Ð3ô J ôZ
@Ð!:ô @õFõ<õõ"ð ‡�ˆƒñó ðð ‡�ˆÓñ3ó ð3ð$ ‡�ˆ,ÓôVó ðVð ‡�ˆLÓôWó ðWð* ‡�Ð
Óôó ðð6 ‡�Ð	Óöó ððB ‡�Ð
$Ó%ñ ˜C“yÙ�c“Ù" 4›jÙ˜“KÙ˜4“jÙ  ›JÙ ›8Ù˜“;Ù! $›ZÙ! $›ZÙ˜t›*Ù ›>Ù  ›KÙ-1°$«Zöoó &ðoðd ‡�Ð
!Ó"á˜C“yÙÐ:Ó;Ù˜H“~Ù�zÓ"Ù�b“ö)1ó #ð)1÷XC$ðL ‡�Ð2Ó3ôdó 4ðdðV !&Ð õõ	4õ?õ&ð $>Ð Ó =Ø')Ð Ó )õ-õð ‡�ˆ~ÓôOó ðO÷d
IAñ IAòXaðH ˆzÔÙ†Fñ ùòE< Bs   Ä#P