
    GJj                        d dl Z d dlZd dlmZmZ d dlmZ d dlmZmZm	Z	m
Z
mZ d dlmZ d dlmZ d dlmZ d dlmZmZmZmZmZmZmZ d dlmZmZmZ d dlm Z m!Z! d d	l"m#Z#m$Z$ d d
l%m&Z&m'Z'm(Z( d dl)m*Z*m+Z+m,Z,m-Z- e G d d             Z.e G d d             Z/e G d d             Z0e G d d             Z1e G d d             Z2e G d d             Z3e G d de1             Z4e G d d             Z5e G d d             Z6e G d d             Z7 G d  d!ejp                        Z9 G d" d#e9      Z: G d$ d%e9      Z; G d& d'e9      Z< G d( d)e:      Z= G d* d+      Z>y),    N)	dataclassfield)Path)CallableDictListOptionalUnion)	tokenizer)AlignedResultAlignedTokenSentenceConfig merge_longest_common_subsequencemerge_longest_contiguoussentences_to_resulttokens_to_sentences)PreprocessArgs
get_logmel
load_audio)ConformerCacheRotatingConformerCache)	ConformerConformerArgs)
AuxCTCArgsConvASRDecoderConvASRDecoderArgs)	JointArgsJointNetworkPredictArgsPredictNetworkc                   8    e Zd ZU eed<   ee   ed<   edz  ed<   y)TDTDecodingArgs
model_type	durationsNgreedy)__name__
__module____qualname__str__annotations__listintdict     _/Users/ahmed/devFolder/claude-voice/.venv/lib/python3.12/site-packages/parakeet_mlx/parakeet.pyr"   r"      s    OCy4Kr/   r"   c                       e Zd ZU edz  ed<   y)RNNTDecodingArgsNr%   r&   r'   r(   r-   r*   r.   r/   r0   r2   r2   "       4Kr/   r2   c                       e Zd ZU edz  ed<   y)CTCDecodingArgsNr%   r3   r.   r/   r0   r6   r6   '   r4   r/   r6   c                   @    e Zd ZU eed<   eed<   eed<   eed<   eed<   y)ParakeetTDTArgspreprocessorencoderdecoderjointdecodingN)	r&   r'   r(   r   r*   r   r   r   r"   r.   r/   r0   r8   r8   ,   s       r/   r8   c                   @    e Zd ZU eed<   eed<   eed<   eed<   eed<   y)ParakeetRNNTArgsr9   r:   r;   r<   r=   N)	r&   r'   r(   r   r*   r   r   r   r2   r.   r/   r0   r?   r?   5   s       r/   r?   c                   6    e Zd ZU eed<   eed<   eed<   eed<   y)ParakeetCTCArgsr9   r:   r;   r=   N)r&   r'   r(   r   r*   r   r   r6   r.   r/   r0   rA   rA   >   s      r/   rA   c                       e Zd ZU eed<   y)ParakeetTDTCTCArgsaux_ctcN)r&   r'   r(   r   r*   r.   r/   r0   rC   rC   F   s    r/   rC   c                       e Zd Zy)GreedyN)r&   r'   r(   r.   r/   r0   rF   rF   L   s    r/   rF   c                   F    e Zd ZU dZeed<   dZeed<   dZeed<   dZ	eed<   y)	Beam   	beam_size      ?length_penaltypatiencegffffff?duration_rewardN)
r&   r'   r(   rJ   r,   r*   rL   floatrM   rN   r.   r/   r0   rH   rH   Q   s*    IsNEHe OU r/   rH   c                   P    e Zd ZU  ee      Zeeef   ed<    ee	      Z
e	ed<   y)DecodingConfig)default_factoryr=   sentenceN)r&   r'   r(   r   rF   r=   r
   rH   r*   r   rS   r.   r/   r0   rQ   rQ   Y   s)    $)&$AHeFDL!A$^DHnDr/   rQ   c                   0    e Zd ZdZdedef fdZedefd       Z	 e
       ddej                  d	e
dee   fd
Zej                    e
       dddddeez  dej&                  d	e
dee   dedee   defdZ	 	 dd e
       ddeeef   ded	e
ddfdZ xZS )BaseParakeetz)Base parakeet model for interface purposepreprocess_argsencoder_argsc                 ^    t         |           || _        || _        t	        |      | _        y N)super__init__preprocessor_configencoder_configr   r:   )selfrV   rW   	__class__s      r0   r[   zBaseParakeet.__init__c   s*    #2 * .r/   returnc                     | j                   j                  | j                  j                  z  | j                  j                  z  S rY   )r]   subsampling_factorr\   sample_rate
hop_lengthr^   s    r0   
time_ratiozBaseParakeet.time_ratiok   s@     22&&223&&112	
r/   decoding_configmelrh   c                    t         )a  
        Generate transcription results from the Parakeet model, handling batches and single input.
        Args:
            mel (mx.array):
                Mel-spectrogram input with shape [batch, sequence, mel_dim] for
                batch processing or [sequence, mel_dim] for single input.
            decoding_config (DecodingConfig, optional):
                Configuration object that controls decoding behavior and
                parameters for the generation process. Defaults to DecodingConfig().
        Returns:
            list[AlignedResult]: List of transcription results with aligned tokens
                and sentences, one for each input in the batch.
        )NotImplementedError)r^   ri   rh   s      r0   generatezBaseParakeet.generates   s
      "!r/   Ng      .@)dtyperh   chunk_durationoverlap_durationchunk_callbackpathrm   rn   ro   rp   c                   t        |      }t        || j                  j                  |      }|,t	        || j                        }	| j                  |	|      d   S t        |      | j                  j                  z  }
|
|k  r,t	        || j                        }	| j                  |	|      d   S t        || j                  j                  z        }t        || j                  j                  z        }g }t        dt        |      ||z
        D ]  }t        ||z   t        |            }| ||t        |             ||z
  | j                  j                  k  r n||| }t	        || j                        }| j                  ||      d   }|| j                  j                  z  }|j                  D ]F  }|j                  D ]5  }|xj                  |z  c_        |j                  |j                  z   |_        7 H |r	 t!        ||j                  |      }
|j                  } t'        t)        ||j*                              }|S # t"        $ r t%        ||j                  |      }Y ^w xY w)a?  
        Transcribe an audio file, with optional chunking for long files.
        Args:
            path (Path | str):
                Path to the audio file to be transcribed.
            dtype (mx.Dtype, optional):
                Data type for processing the audio. Defaults to mx.bfloat16.
            chunk_duration (float, optional):
                If provided, splits audio into chunks of this length (in seconds)
                for processing. When None, processes the entire file at once.
                Defaults to None.
            overlap_duration (float, optional):
                Overlap between consecutive chunks in seconds. Only used when
                chunk_duration is specified. Defaults to 15.0.
            chunk_callback (Callable, optional):
                A function to call when each chunk is processed. The callback
                is called with (current_position, total_position) arguments
                to track progress. Defaults to None.
        Returns:
            AlignedResult: Transcription result with aligned tokens and sentences.
        rg   r   )ro   )r   r   r\   rc   r   rl   lenr,   rangeminrd   	sentencestokensstartdurationendr   RuntimeErrorr   r   r   rS   )r^   rq   rm   rh   rn   ro   rp   
audio_path
audio_datari   audio_length_secondschunk_samplesoverlap_samples
all_tokensrx   rz   chunk_audio	chunk_melchunk_resultchunk_offsetrS   tokenresults                          r0   
transcribezBaseParakeet.transcribe   sM   > $Z

D,D,D,P,PRWX
!Z)A)ABC==o=FqII":1I1I1U1UU>1Z)A)ABC==o=FqIINT-E-E-Q-QQR.1I1I1U1UUV
1c*o}/NOEem+S_=C)sC
O4U{T55@@@$U3/K";0H0HII==O=TUVWL 4#;#;#G#GGL(22%__EKK</K %enn <EI - 3
 !9"$++)9"J *00
E PH %
O,D,DE
  $ !A"$++)9"Js   =I!I,+I,Fkeep_original_attentionrh   context_sizer   StreamingParakeetc                "    t        | ||||      S )u  
        Create a StreamingParakeet object for real-time (streaming) inference.
        Args:
            context_size (tuple[int, int], optional):
                A pair (left_context, right_context) for attention context windows.
            depth (int, optional):
                How many encoder layers will carry over their key/value
                cache (i.e. hidden state) exactly across chunks. Because
                we use local (non-causal) attention, the cache is only
                guaranteed to match a full forward pass up through each
                cached layer:
                    • depth=1 (default): only the first encoder layer's
                    cache matches exactly.
                    • depth=2: the first two layers match, and so on.
                    • depth=N (model's total layers): full equivalence to
                    a non-streaming forward pass.
                Setting `depth` larger than the model's total number
                of encoder layers won't have any impacts.
            keep_original_attention (bool, optional):
                Whether to preserve the original attention class
                during streaming inference. Defaults to False. (Will switch to local attention.)
            decoding_config (DecodingConfig, optional):
                Configuration object that controls decoding behavior
                Defaults to DecodingConfig().
        Returns:
            StreamingParakeet: A context manager for streaming inference.
        )rh   r   )r   )r^   r   depthr   rh   s        r0   transcribe_streamzBaseParakeet.transcribe_stream   s!    F !+$;
 	
r/   ))   r      )r&   r'   r(   __doc__r   r   r[   propertyrO   rf   rQ   mxarrayr+   r   rl   bfloat16r   r)   Dtyper	   r   r   tupler,   boolr   __classcell__r_   s   @r0   rU   rU   `   s*   3/ /m / 
E 
 
 CQBR"88"1?"	m	", ++*8*:*."&-1XSjX xx	X
 (X !X  X !*X 
Xx )3)

 ).*8*:)
CHo)

 "&)
 ()
 
)
r/   rU   c                       e Zd ZdZdef fdZ	 	 	 d e       ddej                  de	ej                     de	e
e	e         de	e
e	eej                  ej                  f            d	ed
ee
e
e      e
e	eej                  ej                  f         f   fdZ	 	 	 d e       ddej                  de	ej                     de	e
e	e         de	e
e	eej                  ej                  f            d	ed
ee
e
e      e
e	eej                  ej                  f         f   fdZ	 	 	 d e       ddej                  de	ej                     de	e
e	e         de	e
e	eej                  ej                  f            d	ed
ee
e
e      e
e	eej                  ej                  f         f   fdZ e       ddej                  ded
e
e   fdZ xZS )ParakeetTDTz(MLX Implementation of Parakeet-TDT Modelargsc                    t         |   |j                  |j                         |j                  j
                  dk(  sJ d       |j                  j                  | _        |j                  j                  | _        |j                  j                  r&|j                  j                  j                  dd       nd | _        t        |j                        | _        t        |j                        | _        y )NtdtzModel must be a TDT modelmax_symbols)rZ   r[   r9   r:   r=   r#   r<   
vocabularyr$   r%   getr   r    r;   r   r^   r   r_   s     r0   r[   zParakeetTDT.__init__  s    **DLL9}}''50M2MM0**//00 }}## MM  $$]D9 	 &dll3!$**-
r/   configfeatureslengths
last_tokenhidden_stater   r`   c                    t        j                  |       |j                  xt        d x\    | j	                  |||||      S  t
        d x\   | j                  |||||      S  	 t        |j                   d      ){Run TDT decoder with features, optional length and decoder state. Outputs list[list[AlignedToken]] and updated hidden stater.   r   z  is not supported in TDT models.)r   evalr=   rF   decode_greedyrH   decode_beamrk   )r^   r   r   r   r   r   s         r0   decodezParakeetTDT.decode  s     	oo))gz< *    ''gz< (    )''GH r/   c                Z  - t        |j                  t              sJ t        |j                  j                  t        | j                        dz         }t        |j                  j                  t        | j                              }t        |j                  j                  |j                  j                  z        }t         G d d             }	|j                  ^}
}}|t        d g|
z        }|t        j                  |g|
z        }|t        d g|
z        }g }g }t        |
      D ]  }|||dz    }t!        ||         }g } |	dd||   ||   dg       g}t        |      |k  r'|r$i }|D ]}  }| j#                  |j$                  !t        j                  |j$                  gg      nd |j&                        \  }\  }}|j)                  |j*                        }|j)                  |j*                        |j)                  |j*                        f}| j-                  |d d |j.                  |j.                  dz   f   |      }|dddd t        | j                        dz   f   |dddt        | j                        dz   d f   }}t1        j2                  |d      t1        j2                  |d      }}t5        j6                  t8        t            t        j:                  ||       | d  j=                               t5        j6                  t8        t            t        j:                  ||       | d  j=                               } }t5        j6                  t8        t>           |j=                               }t5        j6                  t8        t>           |j=                               }|D ]F  }!|!t        | j                        k(  }"| D ]%  }#| j                  |#   }$|$dk7  rdn|j@                  dz   }%| jB                  !|%| jB                  k\  r|j.                  dz   }&d}%n|j.                  |$z   }& |	|jD                  ||!   d|j                  jF                  z
  z  z   ||#   |j                  jF                  z  z   |&|"r|j$                  n|!|"r|j&                  n||%|"r|jH                  nt        |jH                        tK        |!|j.                  | jL                  z  |$| jL                  z  tO        jP                  ||!   ||#   z         tS        jT                  |!g| j                              gz         }'tW        |'      }(|(|v r||(   })tY        |)jD                  |'jD                        }*|*tO        jZ                  tO        jP                  |)jD                  |*z
        tO        jP                  |'jD                  |*z
        z         z   }+|'jD                  |)jD                  kD  r|'||(<   |+||(   _"        !|'||(<   ( I  |j]                  |j_                         D cg c]  }|j.                  |k\  r| c}       ta        |j_                         D cg c]  }|j.                  |k  r| c}d	 d
      d |j                  j                   }t        |      |k  r|r$||z   }|s'|jc                  g        |jc                  ||          |j                  jd                  -tY        |-fd      },|jc                  |,jH                         |jc                  |,j&                          ||fS c c}w c c}w )Nr   c                       e Zd ZU eed<   eed<   ee   ed<   eeej                  ej                  f      ed<   eed<   e
e   ed<   defdZy	)
+ParakeetTDT.decode_beam.<locals>.Hypothesisscorestepr   r   stuck
hypothesisr`   c                 d    t        | j                  t        d | j                  D              f      S )Nc              3   4   K   | ]  }|j                     y wrY   )id).0xs     r0   	<genexpr>zGParakeetTDT.decode_beam.<locals>.Hypothesis.__hash__.<locals>.<genexpr>R  s     .M_qtt_s   )hashr   r   r   re   s    r0   __hash__z4ParakeetTDT.decode_beam.<locals>.Hypothesis.__hash__Q  s%    TYY.MT__.M(NOPPr/   N)r&   r'   r(   rO   r*   r,   r	   r   r   r   r+   r   r   r.   r/   r0   
Hypothesisr   H  sQ    LI %"5288);#<==J\**Q# Qr/   r   g        r   )r   r   r   r   r   r   )r   rx   ry   
confidencetextc                     | j                   S rY   )r   )r   s    r0   <lambda>z)ParakeetTDT.decode_beam.<locals>.<lambda>  s    !''r/   T)keyreversec                 b    | j                   t        dt        | j                              z  z  S )Nr   )r   maxrs   r   )r   rL   s    r0   r   z)ParakeetTDT.decode_beam.<locals>.<lambda>  s'    !''1c!,,/0NB#Dr/   )r   )3
isinstancer=   rH   ru   rJ   rs   r   r$   roundrM   r   shaper+   r   r   rt   r,   r;   r   r   astyperm   r<   r   nnlog_softmaxtypingcastr   argpartitiontolistrO   r   r   r   rN   r   r   rf   mathexpr   r   r   r   logextendvaluessortedappendrL   ).r^   r   r   r   r   r   
beam_tokenbeam_durationmax_candidatesr   BS_resultsresults_hiddenbatchfeaturelengthfinished_hypothesisactive_beam
candidatesr   decoder_outhiddencelldecoder_hidden	joint_outtoken_logitsduration_logitstoken_logprobsduration_logprobstoken_k
duration_kr   is_blankdecisionry   r   r   new_hypotheisr   other_hypothesismaximar   bestrL   s.                                                @r0   r   zParakeetTDT.decode_beam9  s    &//400022C4H14LM
FOO55s4>>7JKv886??;S;SST			Q 		Q 
		Q >>1q
+L?hhsQw'Gtfqj)J1XEuuqy1G(F46)%0!-e!4!	-K )*^;46
"-J26,,%00< :#8#8"9!:;!"//	3/K&$ #."4"4W]]"CKgmm4GMM2&N
 !%

:??Z__q5H#H HI;!I
 "!Q+ES-AA-E+E"EF!!Q3t+?!+C+E"EF #2L
 |R8; %6N  IOONZKH!+$fh	  IOO,=~N!.$fh	 (G  &,[[en>S>S>U%VN(.U%6%=%=%?)% ")#(C,@#@(2H'+~~h'?H)1QAJ<L<Lq<PE !% 0 0 <$)T-=-=$='1':()'1'A,6&0&6&6"0"7#$v'F'F#F#H'H #4H"=#)??#B#B#D'D
 &*DL:+@+@RW#+ .8-D-D%3&+#+ ,6+@+@ %))>)>$?(4/42<//.2oo3>5=5O7;xx0>u0E2CH2M1N8. 2;1A1A162.)*'&%& -MF #'}"5C"j03=c? 0 *-$4$:$:M<O<O*" )/$(HH-=-C-Cf-L$M&*hh}/B/BV/K&L%M2" )"
 $1#6#69I9O9O#O6CJsO8=
3 52?
3C )3 ")a #.j $** +5*;*;*=*=J%??f4 #*= % +5*;*;*=*=J%??V3 #*=
 *  .FOO--/ )*^;R #6"C&r"%%l5&9: OO22  'D
 t/%%d&7&78S V &&Es   \#
\(
c                   t        |j                  t              sJ |j                  ^}}}|t	        d g|z        }|t        j                  |g|z        }|t	        d g|z        }g }	t        |      D ]  }
g }||
|
dz    }t        ||
         }d}d}||k  r| j                  ||
   t        j                  ||
   gg      nd ||
         \  }\  }}|j                  |j                        }|j                  |j                        |j                  |j                        f}| j                  |d d ||dz   f   |      }|ddd d d t        | j                        dz   f   }t        t        j                  |            }t        j                   |d      }t        | j                        dz   }t        j"                  |t        j$                  |dz         z  d       }t        j$                  t        j                  ||j                              }t'        d||z  z
        }t        t        j                  |ddd d t        | j                        dz   d f               }|t        | j                        k7  rx|j)                  t+        t        |      || j,                  z  | j.                  |   | j,                  z  |t1        j2                  |g| j                                     |||
<   |||
<   || j.                  t        |         z  }|dz  }| j.                  t        |         dk7  rd}n"| j4                  | j4                  |k  r|dz  }d}||k  r|	j)                  |        |	|fS )	Nr   r   r   axis绽|=rm   rK   rx   ry   r   r   )r   r=   rF   r   r+   r   r   rt   r,   r;   r   rm   r<   rs   r   argmaxsoftmaxsumr   rO   r   r   rf   r$   r   r   r   )r^   r   r   r   r   r   r   r   r   r   r   r   r   r   r   new_symbolsr   r   r   r   r   r   
pred_tokentoken_probs
vocab_sizeentropymax_entropyr   r   s                                r0   r   zParakeetTDT.decode_greedy  sV    &//6222>>1q
+L?hhsQw'Gtfqj)J1XEJuuqy1G(FDK-.2ll!%(4 HHz%0123 '	/+^fd *00?MM'--0KK." !JJwq$//A'BKP	  )Aq2LC4H14L2L)LM <!89
 !jjB? 1A5
66+{U7J0K"KRTUU ffRXXj@Q@Q%RS"3'K*?#@A
IIi1aT__1E1I1K(KLM
 T__!55%%$
O"&"8%)^^H%=%O'1!*!1!1:,!P )3Ju%*8L's8}55 q >>#h-0A5"#K''38H8HK8W	&'q -t NN:&G J $$r/   rg   ri   rh   c          	      D   t        |j                        dk(  rt        j                  |d      }| j	                  |      \  }}t        j
                  ||       | j                  |||      \  }}|D cg c]!  }t        t        ||j                              # c}S c c}w N   r   r   
rs   r   r   expand_dimsr:   r   r   r   r   rS   r^   ri   rh   r   r   r   r   r   s           r0   rl   zParakeetTDT.generatel       syy>Q..a(C LL-'
'"KK'/KJ	 %	
 %
  #J0H0HI %	
 	
 
   4&BNNN)r&   r'   r(   r   r8   r[   rQ   r   r   r	   r+   r,   r   r   r   r   r   r   rl   r   r   s   @r0   r   r     s   2._ .& '+48LP "0!1(( "((# T(3-01	
 tHU288RXX3E-F$GHI  
tD&'huRXXrxx=O7P.Q)RR	S: '+48LPS' "0!1S'((S' "((#S' T(3-01	S'
 tHU288RXX3E-F$GHIS' S' 
tD&'huRXXrxx=O7P.Q)RR	SS'p '+48LP\% "0!1\%((\% "((#\% T(3-01	\%
 tHU288RXX3E-F$GHI\% \% 
tD&'huRXXrxx=O7P.Q)RR	S\%~ CQBR
88
1?
	m	
r/   r   c                   v    e Zd ZdZdef fdZ	 	 	 d e       ddej                  de	ej                     de	e
e	e         de	e
e	eej                  ej                  f            d	ed
ee
e
e      e
e	eej                  ej                  f         f   fdZ e       ddej                  ded
e
e   fdZ xZS )ParakeetRNNTz)MLX Implementation of Parakeet-RNNT Modelr   c                 r   t         |   |j                  |j                         |j                  j
                  | _        |j                  j                  r&|j                  j                  j                  dd       nd | _	        t        |j                        | _        t        |j                        | _        y )Nr   )rZ   r[   r9   r:   r<   r   r=   r%   r   r   r    r;   r   r   s     r0   r[   zParakeetRNNT.__init__  s    **DLL9**// }}## MM  $$]D9 	 &dll3!$**-
r/   r   r   r   r   r   r   r`   c                   t        |j                  t              sJ d       |j                  ^}}}|t	        dg|z        }|t        j                  |g|z        }|t	        dg|z        }g }	t        |      D ]`  }
g }||
|
dz    }t        ||
         }d}d}||k  r*| j                  ||
   t        j                  ||
   gg      nd||
         \  }\  }}|j                  |j                        }|j                  |j                        |j                  |j                        f}| j                  |dd||dz   f   |      }|d   }t        t        j                  |            }t        j                  |d      }t        | j                         dz   }t        j"                  |t        j$                  |dz         z  d       }t        j$                  t        j                  ||j                  	            }t'        d
||z  z
        }|t        | j                         k7  r|j)                  t+        t        |      || j,                  z  d| j,                  z  |t/        j0                  |g| j                                      |||
<   |||
<   |dz  }| j2                  | j2                  |k  r|dz  }d}n|dz  }d}||k  r*|	j)                  |       c |	|fS )r   z6Only greedy decoding is supported for RNNT decoder nowNr   r   )r   r   r   r   r   r   rK   r   )r   r=   rF   r   r+   r   r   rt   r,   r;   r   rm   r<   r   r  rs   r   r  r   rO   r   r   rf   r   r   r   )r^   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r   r   r   r   r  r  r  r  r  r   s                               r0   r   zParakeetRNNT.decode  s    &//62 	
D	
2 >>1q
+L?hhsQw'Gtfqj)J1XEJuuqy1G(FDK-.2ll!%(4 HHz%0123 '	/+^fd *00?MM'--0KK." !JJwq$//A'BKP	  ) <!89
 !jjB? 1A5
66+{U7J0K"KRTUU ffRXXj@Q@Q%RS"3'K*?#@A
 T__!55%%$
O"&"8%&%8'1!*!1!1:,!P )3Ju%*8L'  1$K''38H8HK8W	&'AID"#Kc -f NN:&y | $$r/   rg   ri   rh   c          	      D   t        |j                        dk(  rt        j                  |d      }| j	                  |      \  }}t        j
                  ||       | j                  |||      \  }}|D cg c]!  }t        t        ||j                              # c}S c c}w r
  r  r  s           r0   rl   zParakeetRNNT.generate  r  r  r  )r&   r'   r(   r   r?   r[   rQ   r   r   r	   r+   r,   r   r   r   r   rl   r   r   s   @r0   r  r    s   3.- .  '+48LPX% "0!1X%((X% "((#X% T(3-01	X%
 tHU288RXX3E-F$GHIX% X% 
tD&'huRXXrxx=O7P.Q)RR	SX%v CQBR
88
1?
	m	
r/   r  c                        e Zd ZdZdef fdZ e       ddej                  dej                  dede	e	e
      fd	Z e       d
dej                  dede	e   fdZ xZS )ParakeetCTCz(MLX Implementation of Parakeet-CTC Modelr   c                     t         |   |j                  |j                         |j                  j
                  | _        t        |j                        | _        y rY   )rZ   r[   r9   r:   r;   r   r   r   s     r0   r[   zParakeetCTC.__init__  s=    **DLL9,,11%dll3r/   r   r   r   r   r`   c                   |j                   ^}}}| j                  |      }t        j                  ||       g }t	        |      D ]  }	t        ||	         }
||	d|
f   }t        j                  |d      }t        j                  |      }g }g }d}t        |      D ]d  \  }}t        |      }|t        | j                        k(  r+||k(  r1|dk7  r|d   d   | j                  z  }|| j                  z  }||z
  }|d   d   }|}||| }t        | j                        dz   }t        j                  |t        j                  |dz         z  d       }t        j                  |      }t        j                  t        j                  ||j                               }t#        d||z  z
        }|j%                  t'        ||||t)        j*                  |g| j                        	             |j%                  |df       |}g |dk7  r|
dz
  }t	        |
dz
  |d   d   d      D ]*  }t        ||         t        | j                        k7  s(|} n |d   d   | j,                  j.                  z  | j0                  j2                  z  | j0                  j4                  z  }|dz   | j,                  j.                  z  | j0                  j2                  z  | j0                  j4                  z  }||z
  }|d   d   }|dz   }||| }t        | j                        dz   }t        j                  |t        j                  |dz         z  d       }t        j                  |      }t        j                  t        j                  ||j                               }t#        d||z  z
        }|j%                  t'        ||||t)        j*                  |g| j                        	             |j%                  |        |S )
zLRun CTC decoder with features and lengths. Outputs list[list[AlignedToken]].Nr   r   r   r   r   r   rK   r   )r   r;   r   r   rt   r,   r   r   	enumeraters   r   rf   r  r   meanr   rm   rO   r   r   r   r   r]   rb   r\   rc   rd   ) r^   r   r   r   r   r   r   logitsr   r   r   predictionsbest_tokensprobsr   token_boundaries
prev_tokenttoken_id	token_idxtoken_start_timetoken_end_timetoken_durationtoken_start_frametoken_end_framer  r  	entropiesavg_entropyr  r   last_non_blanks                                    r0   r   zParakeetCTC.decode  s    >>1qh'
 1XE(F 0K))Ka8K FF;'EJ!J(58M	DOO 44
*#'7';A'>'P$%&%8N%36F%FN )9(<Q(?%&'O"'(9/"JK "%T__!5!9J!##bff[5-@&AA" !I #%'')"4K"$&&*KDUDU)V"WK!&skK.G'H!IJ%%$&"2%3'1!*!1!1:,!P !''D	2&
S  6V R!'!vz+;B+?+BBGA;q>*c$//.BB)* H %R(+))<<=..::; ..99: ! $a'))<<=..::; ..99:  "02B!B %5R$8$;!"01"4#$5oF 1A5
VVK"&&u9L2M$MTVWW	 ggi0 ffRXXj@Q@Q%RS"3+*C#DE
!! ".!/#-&--zlDOOL NN:&G J r/   rg   ri   rh   c          	         t        |j                        dk(  rt        j                  |d      }| j	                  |      \  }}| j                  |||      }|D cg c]!  }t        t        ||j                              # c}S c c}w r
  )	rs   r   r   r  r:   r   r   r   rS   )r^   ri   rh   r   r   r   r   s          r0   rl   zParakeetCTC.generate{  s     syy>Q..a(C LL-'XwG %	
 %
  #J0H0HI %	
 	
 
s   &B)r&   r'   r(   r   rA   r[   rQ   r   r   r+   r   r   r   rl   r   r   s   @r0   r  r    s    24_ 4 "0!1s((s s
 s 
d< 	!sl CQBR
88
1?
	m	
r/   r  c                   (     e Zd ZdZdef fdZ xZS )ParakeetTDTCTCzMLX Implementation of Parakeet-TDT-CTC Model

    Has ConvASRDecoder decoder in `.ctc_decoder` but `.generate` uses TDT decoder all the times (Please open an issue if you need CTC decoder use-case!)r   c                 l    t         |   |       t        |j                  j                        | _        y rY   )rZ   r[   r   rD   r;   ctc_decoderr   s     r0   r[   zParakeetTDTCTC.__init__  s'    )$,,*>*>?r/   )r&   r'   r(   r   rC   r[   r   r   s   @r0   r0  r0    s    \@/ @ @r/   r0  c                      e Zd ZU ded<   ee   ed<   ej                  ed<   eej                     ed<   dZ	ee
ej                  ej                  f      ed<   dZee   ed<   ee   ed	<   ee   ed
<   e
eef   ed<   eed<   eed<   dZeed<   	 dd e       dddde
eef   dedededdfdZd Zd Zed        Zed        Zedefd       Zdej                  ddfdZy)r   rU   modelcacheaudio_buffer
mel_bufferNr   r   finalized_tokensdraft_tokensr   r   rh   Fr   r   r`   c                f   || _         || _        || _        || _        || _        t        t        |j                  j                              D cg c]#  }t        | j                  | j                        % c}| _        t        j                  g       | _        d | _        g | _        g | _        y c c}w )N)cache_drop_size)r   r   rh   r   r4  rt   rs   r:   layersr   	keep_size	drop_sizer5  r   r   r6  r7  r8  r9  )r^   r4  r   r   r   rh   r   s          r0   r[   zStreamingParakeet.__init__  s     )
.'>$
 3u}}3345
5 #4>>4>>R5


 HHRL "
s   (B.c                 ~    | j                   s0| j                  j                  j                  d| j                         | S )Nrel_pos_local_attn)r   r4  r:   set_attention_modelr   re   s    r0   	__enter__zStreamingParakeet.__enter__  s5    ++JJ22$d&7&7 r/   c                     | j                   s%| j                  j                  j                  d       | `| `t        j                          y )Nrel_pos)r   r4  r:   rA  r6  r5  r   clear_cache)r^   exc_typeexc_valexc_tbs       r0   __exit__zStreamingParakeet.__exit__  s=    ++JJ22 J
r/   c                      | j                   d   S )z=Indicates how many encoded feature frames to keep in KV cacher   )r   re   s    r0   r=  zStreamingParakeet.keep_size  s       ##r/   c                 :    | j                   d   | j                  z  S )z1Indicates how many encoded feature frames to dropr   )r   r   re   s    r0   r>  zStreamingParakeet.drop_size  s       #djj00r/   c                     t        t        | j                  | j                  z   | j                  j
                              S )zTranscription result)r   r   r8  r9  rh   rS   re   s    r0   r   zStreamingParakeet.result  s;     #%%(9(994;O;O;X;X
 	
r/   audioc           	      	   t        j                  | j                  |gd      | _        t        | j                  dt	        | j                        | j
                  j                  j                  z  | j
                  j                  j                  z   | j
                  j                        }| j                  || _        n(t        j                  | j                  |gd      | _        | j                  |j                  d   | j
                  j                  j                  z  d | _        | j
                  j                  | j                  ddd| j                  j                  d   | j
                  j                  j                  z  | j
                  j                  j                  z  f   | j                        \  }}t        j                  ||       t        |d         }| j                  j                  d   || j
                  j                  j                  z  z
  }| j                  dd| j                   | j
                  j                  j                  z  |z    df   | _        t#        d|| j                   z
        }t%        | j
                  t&              st%        | j
                  t(              r*| j
                  j+                  |t        j,                  |g      | j.                  g| j0                  g| j2                        \  }}	|	d   | _        t	        |d         dkD  r|d   d   j4                  nd| _        | j
                  j+                  |dd|df   t        j,                  |dd|df   j                  d   g      | j.                  g| j0                  g| j2                        \  }
}| j6                  j9                  |d          |
d   | _        yt%        | j
                  t<              r| j
                  j+                  |t        j,                  |g      | j2                        }| j
                  j+                  |dd|df   t        j,                  |dd|df   j                  d   g      | j2                        }
| j6                  j9                  |d          |
d   | _        yt?        d      )	zKTakes portion of audio and transcribe it.

        `audio` must be 1D arrayr   r   Nr   )r5  r   r   z.This model does not support real-time decoding) r   concatr6  r   rs   r4  r\   rd   r7  r   r:   r]   rb   r5  r   r,   r>  r   r   r   r  r   r   r   r   rh   r   r8  r   r9  r  rk   )r^   rM  ri   r   r   r   leftoverfinalized_lengthr8  finalized_stater9  r   s               r0   	add_audiozStreamingParakeet.add_audio  sb   
 II!! 
 ))*zz55@@Ajj44??@ JJ**	
 ??"!DO ii#(>QGDO --YYq\DJJ::EEEH
 !JJ..OOOO))!,zz00CCDjj//BBC ** / 

' 	'"WQZ ??((+TZZ..AAA
 //!:!:!M!MMPXX 
 q&4>>"9:djj+.*TZZ2V04

0A0A*+,!$$%++ 1B 1-o #2!"4D.12B12E.F.J #B'**PT O #jj//,--. $4$5!56<<Q?
 !$$%++ 0 
OL! !!(()9!)<= ,QD

K0#zz00"(($4#56t?S?S  1    ::,,,--. $4$5!56<<Q?
 ++ - L !!(()9!)<= ,QD%&VWWr/   )r   )r&   r'   r(   r*   r   r   r   r   r	   r   r   r   r,   r+   r   rQ   r   r   r[   rB  rI  r   r=  r>  r   r   rS  r.   r/   r0   r   r     s[   (("":>NHU288RXX#567> $J$<((|$$S/!J##$)T) 	 ).*8*: CHo 	 "& ( 
2 $ $ 1 1 
 
 
lXrxx lXD lXr/   r   )?r   r   dataclassesr   r   pathlibr   r   r   r   r	   r
   mlx.corecorer   mlx.nnr   parakeet_mlxr   parakeet_mlx.alignmentr   r   r   r   r   r   r   parakeet_mlx.audior   r   r   parakeet_mlx.cacher   r   parakeet_mlx.conformerr   r   parakeet_mlx.ctcr   r   r   parakeet_mlx.rnntr   r   r   r    r"   r2   r6   r8   r?   rA   rC   rF   rH   rQ   ModulerU   r   r  r  r0  r   r.   r/   r0   <module>ra     s     (  8 8   "   F E E ; K K R R                     
 	 	 	 ! ! ! E E Eh
299 h
Xp
, p
fz
< z
zN
, N
b@[ @zX zXr/   