
    hJJj*                     H   d dl Z d dlmZ d dlmZmZ d dlmZ d dl	Z	d dl
Zd dlmZ ddlmZmZmZ ddlmZ erddlmZ d	ej,                  d
efdZ e	j2                  d      dej,                  fd       Z e	j2                  dd      d	ej,                  fd       Zd	ej,                  dej,                  fdZe G d d             Zddddddedee   dej<                  deded edee   fd!Z d"ee   d#e!d$e!fd%Z"d&d'd(d)ee#   dddedej<                  ded*e!d+e!d,efd-Z$y).    N)	dataclass)TYPE_CHECKINGList)signal   )
HOP_LENGTHSAMPLE_RATETOKENS_PER_SECOND)	Tokenizer)Whisperxfilter_widthc                 b   |dz  }| j                   d   |k  r| S | j                  x}dk  r
| ddddf   } |dkD  r|dz  dk(  sJ d       t        j                  | dd||ffd	      } t	        j
                  | j                  t        j                        dd|f
      d|| f   }|dk  r|d   }|S )zMApply a median filter of width `filter_width` along the last dimension of `x`   Nr   r   z&`filter_width` should be an odd numberr   r   reflect)mode)kernel_size.)shapendimnppadr   medfiltastypefloat32)r   r   	pad_widthr   results        \/Users/ahmed/devFolder/claude-voice/.venv/lib/python3.12/site-packages/mlx_whisper/timing.pymedian_filterr       s    !Iwwr{i1dD!m 	q\A-20/02 	q66Iy#9:KA ^^AHHRZZ0q!\>RSY	z!!F qyM    T)nopythontracec                    | j                   d   dz
  }| j                   d   dz
  }d| dd d f<   d| d d df<   g }|dkD  s|dkD  re|j                  |dz
  |dz
  f       | ||f   dk(  r|dz  }|dz  }n+| ||f   dk(  r|dz  }n| ||f   dk(  r|dz  }nt        d      |dkD  r_|dkD  ret        j                  |      }|d d dd d f   j
                  S )Nr   r   r   zUnexpected trace[i, j]r   )r   append
ValueErrorr   arrayT)r#   ijr   s       r   	backtracer+   /   s   AAAAE!Q$KE!Q$KF
a%1q5q1ua!en%A;!FAFA1a4[AFA1a4[AFA566 a%1q5 XXfF$B$'?r!   )r"   parallelc                 &   | j                   \  }}t        j                  |dz   |dz   ft        j                        t        j                  z  }t        j                  |dz   |dz   ft        j                         }d|d<   t        d|dz         D ]u  }t        d|dz         D ]a  }||dz
  |dz
  f   }||dz
  |f   }|||dz
  f   }	||k  r
||	k  r|d}}
n||k  r
||	k  r|d}}
n|	d}}
| |dz
  |dz
  f   |
z   |||f<   ||||f<   c w t        |      S )Nr   )dtyper   r   r   )r   r   onesr   infranger+   )r   NMcostr#   r*   r)   c0c1c2cts               r   dtw_cpur:   H   s5   77DAq77AE1q5>4rvv=DWWa!eQU^2::66EDJ1a!e_q!a%Aa!eQUl#Ba!eQhBaQhBBw2711bR"W11111q5!a%<1,DAJE!Q$K !   Ur!   returnc                     t        |       S )N)r:   )r   s    r   dtwr=   b   s    1:r!   c                   F    e Zd ZU eed<   ee   ed<   eed<   eed<   eed<   y)
WordTimingwordtokensstartendprobabilityN)__name__
__module____qualname__str__annotations__r   intfloat r!   r   r?   r?   g   s!    
IIL	Jr!   r?      g      ?)medfilt_widthqk_scalemodelr   	tokenizertext_tokensmel
num_framesrN   rO   c                *   t        |      dk(  rg S t        j                  g |j                  |j                  ||j
                        }| j                  |d d d f   |d d d f         \  }}	|d   t        |j                        dd |j
                  f   }
t        j                  |
dd      }t        j                  |t        j                  |      d d d f   d      j                  d      }t        j                  |      }t        j                  | j                  j                         D cg c]  \  }}|	|   d|f    c}}      }|d d d d d |dz  f   }t        j                  ||z  dd	      }|j                  t        j                        }t        j                   |dd
      }t        j"                  |ddd      j%                         }||z
  |z  }t'        t        j                  |      |      }|j!                  d      }|t        |j                        d }t)        |       \  }}|j+                  ||j
                  gz         \  }}t        |      dk  rg S t        j,                  t        j.                  |d d D cg c]  }t        |       c}      d      }t        j,                  t        j0                  |      dd      j                  t2              }||   t4        z  }||d d    }||dd     }t7        |d d |dd        D cg c]  \  }}t        j                   |||        }}}t7        |||||      D  !"#cg c]  \  } }}!}"}#t9        | ||!|"|#       c}#}"}!}} S c c}}w c c}w c c}}w c c}#}"}!}} w )Nr   Tr   )preciseaxisr   )rX   r   )rX   rW   )rX   keepdims)rX   rY   ddof)r   r   )constant_values)lenmxr'   sot_sequenceno_timestampseotforward_with_cross_qksoftmaxtake_along_axissqueezer   stackalignment_headstolistr   r   meanvarsqrtr    r=   split_to_word_tokensr   cumsumdiffboolr
   zipr?   )$rP   rQ   rR   rS   rT   rN   rO   rA   logitscross_qksampled_logitstoken_probstext_token_probs_l_hweightsrh   stdmatrixtext_indicestime_indiceswordsword_tokensr9   word_boundariesjumps
jump_timesstart_times	end_timesr)   r*   word_probabilitiesr@   rB   rC   rD   s$                                       r   find_alignmentr   p   s    ;1	XX	
##	
##	
 	
 MM		
F 223tQw<aQFHAYs9#9#9:R?9==PQN**^TCK))RXXk*1d73!gaj  xx 01 hh+0+@+@+G+G+IJ+IR"ae	+IJG a-jAo--.Gjj8+"dCGnnRZZ(G777d3D
&&rDq
9
>
>
@C~$GBHHW-}=G\\q\!FC	../"5F!$fWL,"77y}}o8UVE;
;1 	ffRYYCR8H'I8H1A8H'IJFSOFF277<(&!DKKDQEe$'88J_Sb12K?12./I ,oab.ABBDAq 	 1%&B   69;Y8J6
6
1D&%k 	4[96
 C 	K, (J
s   4M;
N"NN	alignment	prependedappendedc                    t        |       dz
  }t        |       dz
  }|dk\  r| |   }| |   }|j                  j                  d      rg|j                  j                         |v rK|j                  |j                  z   |_        |j                  |j                  z   |_        d|_        g |_        n|}|dz  }|dk\  rd}d}|t        |       k  r| |   }| |   }|j                  j                  d      sY|j                  |v rK|j                  |j                  z   |_        |j                  |j                  z   |_        d|_        g |_        n|}|dz  }|t        |       k  ry y )Nr   r   r     )r\   r@   
startswithstriprA   endswith)r   r   r   r)   r*   previous	followings          r   merge_punctuationsr      sI   IAIA
q&Q<aL	==##C(X]]-@-@-Bi-O%]]Y^^;IN'1A1AAIHM HOA	Q q& 	
A	A
c)n
Q<aL	}}%%c*y~~/I$MMINN:HM&oo	0@0@@HOIN!IA	Q c)n
r!   u   "'“¿([{-u   "'.。,，!！?？:：”)]}、)prepend_punctuationsappend_punctuationssegmentsr   r   last_speech_timestampc                 p   t        |       dk(  ry | D 	
cg c]%  }	|	d   D 
cg c]  }
|
|j                  k  s|
 c}
' }}	}
t        t        j                  j                  |            }t        |||||fi |}t        j                  |D cg c]  }|j                  |j                  z
   c}      }||j                            }t        |      dkD  rt        j                  |      nd}t        dt        |            }|dz  }t        |      dkD  rd}t        dt        |            D ]  }||   j                  ||   j                  z
  |kD  s&||   j                   |v r||   j                  |z   ||   _	        R||dz
     j                   |v sg||   j                  |z
  ||   _
         t#        |||       | d   d   t$        z  t&        z  }d}t)        | |      D ]D  \  }	}d}g }|t        |      k  r|t        |      k  r||   }|j                   ri|j+                  t-        |j                   t/        ||j                  z   d      t/        ||j                  z   d      t        |j0                        	             |t        |j2                        z  }|dz  }|t        |      k  r|t        |      k  rt        |      dkD  rV|d   d
   |z
  |dz  kD  r|d   d
   |d   d   z
  |kD  s%t        |      dkD  r|d   d
   |d   d   z
  |dz  kD  rkt        |      dkD  rB|d   d
   |d   d   z
  |kD  r.t5        |d   d
   dz  |d   d
   |z
        }|x|d   d
<   |d   d<   t5        d|d   d
   |z
        |d   d<   |	d   |d   d
   k  r:|	d   dz
  |d   d   kD  r)t5        dt        |d   d
   |z
  |	d               |d   d<   n|d   d   |	d<   |	d
   |d   d   kD  r0|	d
   dz   |d   d
   k  rt5        |d   d   |z   |	d
         |d   d
<   n|d   d
   |	d
<   |	d
   }||	d<   G y c c}
w c c}
}	w c c}w )Nr   rA   g        gffffff?r   u   .。!！?？r   seek)r@   rB   rC   rD   rC      rB   g      ?r   r|   )r\   r`   list	itertoolschainfrom_iterabler   r   r'   rC   rB   nonzeromedianminrK   r1   r@   r   r   r	   ro   r%   dictroundrD   rA   max)r   rP   rQ   rS   rT   r   r   r   kwargssegmenttokentext_tokens_per_segmentrR   r   r9   word_durationsmedian_durationmax_durationsentence_end_marksr)   time_offset
word_indexsaved_tokensr|   timingboundarys                             r   add_word_timestampsr      s    8}  G $H-G-51F-G  
 y445LMNKuic:XQWXIXX	B	1quuqww	BCN#N$:$:$<=N36~3F3Jbii/PSO#u_56O"Q&L >Q+q#i.)A|)A,"4"44|CQ<$$(::'0|'9'9L'HIaL$q1u%**.@@)21)9)9L)HIaL& * y"68KL1+f%
2[@KJ #H.E F3y>)lS=M.Mz*F{{#[[#K&,,$>B!+

":A>$)&*<*<$=	 C..L!OJ 3y>)lS=M.M$ u:> Qx!6619LLa%(7"33lBJNa%(7*;;lQ>NN JNa%(7*;;lJ"58E?Q#6a,8VWH:BBE!HUOeAhw&7$'58E?\+I$Ja!  58E?2G$s*U1Xg->>$'s58E?_<gg>NO%a! $)8G#4  r7!33ENS(59U+;;#&"Ig&8'%.$b	%  "'r5!1$+EN! A !G; 	H Cs    P-P(P(P- P3(P-)%r   dataclassesr   typingr   r   mlx.corecorer]   numbanumpyr   scipyr   audior   r	   r
   rQ   r   rP   r   ndarrayrJ   r    jitr+   r:   r=   r?   r'   rK   r   rH   r   r   r   rL   r!   r   <module>r      s    ! &     = =  RZZ s 8 DRZZ  0 D4(rzz  )22:: "** 
    GGG cG 
	G
 G G G 
*GT$z"2 s c R !/Am!4jm! m! 	m!
 
m! m! m! m! !m!r!   