
    GJjA              5          d dl Z d dlZd dlmZ d dlmZmZmZmZm	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mZmZmZ d d	lmZ d d
lm Z m!Z!m"Z"  e
jF                  d      Z$	 dxde%de&de'de'fdZ(dede'fdZ)dydede&de'fdZ*dydede&de'fdZ+dedee'ef   fdZ,dedee'ef   fdZ-dede'fdZ.de&fdZ/e$ja                  d      d  ed!      d"d#dd$d%d&d'd(d)d*ddddddd+ddfd,eee    e
jb                  d-dddd.      f   d/ee' e
jd                  d0d12      f   d3ee e
jd                  d45      f   d6ee' e
jd                  d7d82      f   d9ee' e
jd                  d:d;2      f   dee& e
jd                  d<5      f   d=eed>    e
jd                  d?d@2      f   dAee% e
jd                  dBdC2      f   dDee% e
jd                  dEdF2      f   dGee3 e
jd                  dHdI2      f   dJee% e
jd                  dKdL2      f   dMee% e
jd                  dNdO2      f   dPee% e
jd                  dQdR2      f   dSee	e3    e
jd                  dTdUdV2      f   dWee	e%    e
jd                  dXdYdZ2      f   d[ee	e%    e
jd                  d\d]d^2      f   d_ee& e
jd                  d`dadb5      f   dcee& e
jd                  dddedf2      f   dgee& e
jd                  dhdidj2      f   dkee3 e
jd                  dldmdn2      f   doee	e    e
jd                  dpdq2      f   dree	e&    e
jd                  dse/ddtu      f   f,dv       Z4e5dwk(  r e$        yy)z    N)Path)AnyDictListLiteralOptional)bfloat16float32)print)	BarColumnProgressSpinnerColumn
TextColumnTimeElapsedColumn)	Annotated)AlignedResultAlignedSentenceAlignedTokenfrom_pretrained)SentenceConfig)BeamDecodingConfigGreedyT)no_args_is_helpsecondsalways_include_hoursdecimal_markerreturnc                     | dk\  sJ t        | dz        }|dz  }|dz  }|dz  }|dz  }|dz  } |dz  }|s|dkD  r|ddnd}| |dd| d| |d	S )
Nr   g     @@i6 i`  i  02d: 03d)round)r   r   r   millisecondshoursminuteshours_markers          Z/Users/ahmed/devFolder/claude-voice/.venv/lib/python3.12/site-packages/parakeet_mlx/cli.pyformat_timestampr*      s     a<<6)*LI%EILf$GFLe#GEL&:eaieC[?RL.QwsmN3CLQTCUV    resultc                 6    | j                   j                         S )z*Format transcription result as plain text.)textstrip)r,   s    r)   to_txtr0   /   s    ;;r+   Fhighlight_wordsc           
      l   g }d}|ru| j                   D ]d  }t        |j                        D ]H  \  }}t        |j                  d      }t        ||j                  d   k(  r|j
                  n|j                  |dz      j                  d      }d}	t        |j                        D ]m  \  }
}||
k(  rT|	|j                  j                  |j                  j                         d|j                  j                          d      z  }	_|	|j                  z  }	o |	j                          |j                  |        |j                  | d|        |j                  |	       |j                  d       |dz  }K g n| j                   D ]  }t        |j                  d      }t        |j
                  d      }|j                  j                         }	|j                  |        |j                  | d|        |j                  |	       |j                  d       |dz  } d	j                  |      S )
z5
    Format transcription result as an SRT file.
       ,r   r"   z<u>z</u> --> 
	sentences	enumeratetokensr*   startendr.   replacer/   appendjoin)r,   r1   srt_contententry_indexsentenceitoken
start_timeend_timer.   jinner_tokens               r)   to_srtrK   4   s    KK((H%hoo65-ekk#N
+ 33 II!Q/55#&	 &/&@NA{Av 0 0 8 8',,224!+"2"2"8"8":!;4@! 
  0 00 'A 

""k]4""j\xj#AB""4(""2&q 1 7 )6 ((H)(..MJ'SIH==&&(D+0*U8*=>t$r"1K ) 99[!!r+   c           
         ddg}|r^| j                   D ]M  }t        |j                        D ]1  \  }}t        |j                  d      }t        ||j                  d   k(  r|j
                  n|j                  |dz      j                  d      }d}t        |j                        D ]m  \  }	}
||	k(  rT||
j                  j                  |
j                  j                         d|
j                  j                          d      z  }_||
j                  z  }o |j                         }|j                  | d	|        |j                  |       |j                  d       4 P n| j                   D ]  }t        |j                  d      }t        |j
                  d      }|j                  j                         }|j                  | d	|        |j                  |       |j                  d        d
j                  |      S )z4
    Format transcription result as a VTT file.
    WEBVTTr"   .r5   r6   r3   z<b>z</b>r7   r8   r9   )r,   r1   vtt_contentrD   rE   rF   rG   rH   	text_linerI   rJ   s              r)   to_vttrQ   d   s    R.K((H%hoo65-ekk#N
+ 33 II!Q/55#&	 	&/&@NA{Av![%5%5%=%=',,224!+"2"2"8"8":!;4@& 	
 "[%5%55	 'A &OO-	""j\xj#AB""9-""2&- 7 )2 ((H)(..MJ'SIH ++-I*U8*=>y)r" ) 99[!!r+   rF   c                     | j                   t        | j                  d      t        | j                  d      t        | j                  d      t        | j
                  d      dS )N   )r.   r=   r>   duration
confidence)r.   r$   r=   r>   rT   rU   )rF   s    r)   _aligned_token_to_dictrV      sM    

u{{A&UYY"%..!,E,,a0 r+   rD   c                    | j                   t        | j                  d      t        | j                  d      t        | j                  d      t        | j
                  d      | j                  D cg c]  }t        |       c}dS c c}w )NrS   )r.   r=   r>   rT   rU   r<   )r.   r$   r=   r>   rT   rU   r<   rV   )rD   rF   s     r)   _aligned_sentence_to_dictrX      sq    x~~q)X\\1%(++Q/H//3>FooNoU)%0oN  Os   .Bc                     | j                   | j                  D cg c]  }t        |       c}d}t        j                  |dd      S c c}w )N)r.   r:      F)indentensure_ascii)r.   r:   rX   jsondumps)r,   rD   output_dicts      r)   to_jsonr`      sN    @F@P@P
@PH%h/@P
K ::k!%@@	
s   A	doc                     | sy 	 dd l }|j                  j                  d      }t	        d|        t        j                  d      # j                  j                  $ r d}Y @w xY w)Nr   zparakeet-mlxdevzparakeet-mlx )importlib.metadatametadataversionPackageNotFoundErrorr   typerExit)ra   	importlibrf   s      r)   show_versionrk      sg    !$$,,^< 
M'
#$
**Q-	 22 s   A A%$A%
transcribez"mlx-community/parakeet-tdt-0.6b-v3rN   srtz
{filename}greedyx         g9v?g      @gq=
ףp?   audioszFiles to transcribe)helpexists	file_okaydir_okayreadablemodelz'Hugging Face repository of model to usePARAKEET_MODEL)rt   envvar
output_dirz Directory to save transcriptions)rt   output_formatz2Format for output files (txt, srt, vtt, json, all)PARAKEET_OUTPUT_FORMAToutput_templatezHTemplate for output filenames, e.g. '{parent}/{filename}_{date}_{index}'PARAKEET_OUTPUT_TEMPLATEz8Underline/timestamp each word as it is spoken in srt/vttdecoding)rn   beamzDecoding method to usePARAKEET_DECODINGchunk_durationzCChunking duration in seconds for long audio, 0 to disable chunking.PARAKEET_CHUNK_DURATIONoverlap_durationz-Overlap duration in seconds if using chunkingPARAKEET_OVERLAP_DURATION	beam_sizez)Beam size (only used while beam decoding)PARAKEET_BEAM_SIZElength_penaltyzFLength penalty in beam. 0.0 to disable (only used while beam decoding)PARAKEET_LENGTH_PENALTYpatiencez@Patience in beam. 1.0 to disable (only used while beam decoding)PARAKEET_PATIENCEduration_rewardzFrom 0.0 to 1.0, < 0.5 to favor token logprobs more, > 0.5 to favor duration logprobs more. (only used while beam decoding in TDT)PARAKEET_DURATION_REWARD	max_wordsz--max-wordszMax words per sentencePARAKEET_MAX_WORDSsilence_gapz--silence-gapzSplit at silence gaps (seconds)PARAKEET_SILENCE_GAPmax_durationz--max-durationzMax sentence duration (seconds)PARAKEET_MAX_DURATIONverbosez	--verbosez-vz$Print out process and debug messagesfp32z--fp32/--bf16zUse FP32 precisionPARAKEET_FP32local_attentionz"--local-attention/--full-attentionzFUse local attention (reduces intermediate memory usage for long audio)PARAKEET_LOCAL_ATTENTIONlocal_attention_context_sizez--local-attention-context-sizezDLocal attention context size (Only applies if using local attention)PARAKEET_LOCAL_ATTENTION_CTX	cache_dirzYDirectory for HuggingFace model cache. If not specified, uses HF's default cache locationPARAKEET_CACHE_DIRrf   z	--versionzShow the package version)callbackis_eagerrt   c                 @
  -./0 |rt        d| d       	 t        ||st        nt        |      }|r|j                  j                  d||f       |rt        d       	 |j                  dd       |r=t        d|j                          d       t        d| d       |dv rrt        d       t        fdfdt        d}g }|dk(  rt        |j                               }nK||v r|g}nCt        d| dt        |j                               dgz    d       t        j                  d	      t        |       0|rt        d0 d       t!        |dk(  rt#        |	|
||      n	t%               t'        |||            }|rt        d |       t)        t+               t-        d!      t/               t-        d"      t1               d#      5 ..j3                  d$0%      /t5        |       D ]  \  -}|r#t        d&-dz    d'0 d(|j6                   d       n!.j9                  /d)|j6                   d*+       	 |j;                  ||st        nt        |d,k7  r|nd
|-./0fd-|.      }|r|j<                  D ]u  }|j>                  |j@                  |jB                  |jD                  f\  }}} }!d/|!d0d1}"d2tG        |       d3tG        |       d4|" d5| jI                          }#t        |#       w |jJ                  }$|$tM        |jN                        tP        jP                  jS                         jU                  d6      tM        -dz         d7}% |jV                  dEi |%}&|D ]  }'||'   }( |(|      })tY        |& d8|'       }*|*j[                         r|*}+n||*z  }+	 t]        |+d9d:;      5 },|,j_                  |)       d
d
d
       |r-t        d<|'ja                          d=|+jc                                  	 .j9                  /0-dz   @       ! 	 d
d
d
       t        dA|je                  dB       dC|j                          dD       y
# t        $ r,}t        d| d|        t        j                  d	      d
}~ww xY w# t        $ r,}t        d| d|        t        j                  d	      d
}~ww xY w# 1 sw Y   xY w# t        $ r}t        d>|+ d|        Y d
}~d
}~ww xY w# t        $ r}t        d?| d|        Y d
}~d
}~ww xY w# 1 sw Y   xY w)Fz;
    Transcribe audio files using Parakeet MLX models.
    zLoading model: [bold cyan]z[/bold cyan]...)dtyper   rel_pos_local_attnz)[green]Model loaded successfully.[/green]z[bold red]Error loading model z:[/bold red] r3   )codeNT)parentsexist_okz*[bold red]Error creating output directory zOutput directory: [bold cyan]z[/bold cyan]zOutput format(s): [bold cyan])rm   vttallz/Highlight words: [bold cyan]Enabled[/bold cyan]c                     t        |       S N)r1   )rK   rr1   s    r)   <lambda>ztranscribe.<locals>.<lambda>y      ?Cr+   c                     t        |       S r   )rQ   r   s    r)   r   ztranscribe.<locals>.<lambda>z  r   r+   )txtrm   r   r]   r   z([bold red]Error: Invalid output format 'z'. Choose from z.[/bold red]zTranscribing z file(s)...r   )r   r   r   r   )r   r   r   )r   rD   zDecoding config being used:z([progress.description]{task.description}z-[progress.percentage]{task.percentage:>3.0f}%)	transientzTranscribing...)totalz
Processing file /z: [bold cyan]zProcessing [cyan]z
[/cyan]...)descriptionr   c                 >    j                  |z  |z  | z         S )Nr   	completed)update)currentfullrE   progresstasktotal_filess     r)   r   ztranscribe.<locals>.<lambda>  s)    K$$6$(WBT :I :r+   )r   r   r   chunk_callbackdecoding_configz [dim](confidence: z.2%z)[/dim]z[blue][r7   z][/blue] z%Y%m%d)filenameparentdateindexrN   wzutf-8)encodingz[green]Saved z
:[/green] z$[bold red]Error writing output file z"[bold red]Error transcribing file r   z
[bold green]zmlx-community/z8 transcription complete.[/bold green] Outputs saved in 'z'. )3r   r   r	   r
   encoderset_attention_model	Exceptionrh   ri   mkdirresolver0   r`   listkeyslenr   r   r   r   r   r   r   r   r   add_taskr;   namer   rl   r:   r=   r>   r.   rU   r*   r/   stemstrr   datetimenowstrftimeformatr   is_absoluteopenwriteupperabsoluteremoveprefix)1rs   ry   r|   r}   r   r1   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rf   loaded_modele
formattersformats_to_generater   
audio_pathr,   rD   r=   r>   r.   confconf_strlinebase_filenametemplate_varsoutput_basenamefmt	formatteroutput_contentoutput_filenameoutput_filepathfrE   r   r   r   s1        `                                       @@@@r)   rl   rl      s   | *5'AB!&7i
   44$-/KL =>
!5
 -j.@.@.B-C<PQ-m_LIJ11oCD CC	J ":??#45	*	$,o6}o_UYZdZiZiZkUlpuovUvTw  xD  E	
 jja  f+Kk]+67$ v )+	
 X[|
O +_=	=>BC
 
  !2+ F&v.MAz(Qq]:??J[[gh (9*//9J*&U   8Y(4(?(?*.(G5Cq5H>d%5$ %4 )@ 	) $*$4$4$NN$LL$MM$//	2.sD$ &9c
'#J!()9%)@(AGWX[G\F]]efneoopquq{q{q}p~d %5 !+ -!*"3"34$--113<<XF QZ	! #9/"8"8"I="I.C *3I%.v%6N&*o->au+E&FO&224*9*4*F
!/3IQGGN3 J"!"/		}JG_G_GaFb c /0 OODq1uOEI /
` 

++,<=>>v  xB  xJ  xJ  xL  wM  MO  	PM  !.ug]1#FGjja  !  !::,mTUSVWXjja  !` JI % B?BSS`ab`cd 
  Y::,mTUSVWXXYW
 
s   AQ  Q? A,T:ES+S(R7	:7S1S+3T	Q<'Q77Q<?	R4'R//R47S <S	S(	S#	S+#S(	(S++	T4TTTTT__main__)Tr4   )F)6r   r]   pathlibr   typingr   r   r   r   r   rh   mlx.corer	   r
   richr   rich.progressr   r   r   r   r   typing_extensionsr   parakeet_mlxr   r   r   r   parakeet_mlx.alignmentr   parakeet_mlx.parakeetr   r   r   Typerappfloatboolr   r*   r0   rK   rQ   rV   rX   r`   rk   commandArgumentOptionintrl   __name__r   r+   r)   <module>r     s      5 5  &   ( V V 1 > >ekk$'
 NQ*.GJ*= S 
-"= -"4 -"C -"`("= ("4 ("C ("V, 4S>  DcN AM Ac AT  \" 	- 	S	 	 	 	 	 	 	 	
 	 	 	 	 	 	 	 	 	 	 	 	qtT
&	
		t :CS	
	t" lell BCC#t( E+	
	)t6 [-	
	7tD TU	WEtL  !)&	
	MtZ V,	
	[th  @.	
	itv <'	
	wtD Y,	
	EtR S&	
	St`  V-	
	atn )'	
	ot~ 2)	
	tN 2*	
	Ot^ [$-ST	V_tf "6	
	gtr 0Y-	
	stB #,,W1	
	#CtR l'	
	St` !+		
	at tn	 zE r+   