U YMd`@sBddlZddddddZGdd d Zd d Zed kr>edS) Niiconstant) frame_length hop_lengthpad_modecCst|dt|df}tj|||d}d}|jt|j|g}t|j}|||d8<t|t|g}tjjj |||d} |dkr|d} n|d} t | d| } t dg| j } t dd|| |<| t| } tj t| dddd } t| S) N)mode)shapestridesrT)axiskeepdims)intnppadr tuplelistr lib stride_tricks as_stridedmoveaxisslicendimmeanabssqrt)yrrrpaddingr out_stridesx_shape_trimmed out_shapexw target_axisslicesxpowerr'4D:\so-vits-svc-4.0-Vec768-Layer12\modules\slicer2.pyget_rmss*   r)c@s6eZdZd eeeeeedddZdd Zd d Zd S)SlicerD,sr threshold min_length min_intervalhop_size max_sil_keptcCs||kr|ksntd||ks.td||d}d|d|_t||d|_tt|d|j|_t||d|j|_t||j|_t||d|j|_dS)NzQThe following condition must be satisfied: min_length >= min_interval >= hop_sizezCThe following condition must be satisfied: max_sil_kept >= hop_sizei g4@) ValueErrorr1roundr4minwin_sizer2r3r5)selfr0r1r2r3r4r5r'r'r(__init__*s zSlicer.__init__cCsbt|jdkr:|dd||jt|jd||jfS|||jt|jd||jSdS)Nr r)lenr r4r:)r<waveformbeginendr'r'r( _apply_slice=s,zSlicer._apply_slicec Csxt|jdkr|jdd}n|}|jd|jkr6|gSt||j|jdd}g}d}d}t|D]\}}||j kr|dkrb|}qb|dkrqb|dko||j k} |||j ko|||jk} | s| sd}qb|||j kr"|||d |} |dkr | d| fn| | | f| }n6|||j dkr|||j ||j d } | ||j 7} ||||j d |} |||j |d ||j } |dkr| d| f| }n$| t| | t| | ft| | }nn||||j d |} |||j |d ||j } |dkrF| d| fn| | | f| }d}qb|jd}|dk r|||j krt|||j }|||d |} | | |dft|dkr|gSg}|dddkr| ||d|ddtt|dD].}| ||||d||ddq|dd|krp| |||dd||SdS)Nr r)r )rrrrr)r>r rr2r)r;r4squeeze enumerater1r5r3argminappendr:maxrBrange)r<r?samplesrms_listsil_tags silence_start clip_startirmsis_leading_silenceneed_slice_middlepospos_lpos_r total_frames silence_endchunksr'r'r(rDsv   $  $  ,z Slicer.sliceN)r+r,r-r.r,)__name__ __module__ __qualname__rfloatr=rBrr'r'r'r(r*)s r*c Csddl}ddlm}ddl}ddl}|}|jdtdd|jdtdd|jdtd d d d |jd td ddd |jdtd ddd |jdtd ddd |jdtd ddd | }|j }|dkr|j |j |j}|j|jdd d\}}t||j|j|j|j|jd} | |} |j |s0||t| D]X\} } t| jdkrV| j} ||j |d|j |jj dddd| f| |q8dS)Nr)ArgumentParseraudiozThe audio to be sliced)typehelpz--outz*Output directory of the sliced audio clipsz --db_threshFiz&The dB threshold for silence detection)r^requireddefaultr_z --min_lengthr,zr Twritejoinbasenamersplit) osr\rgrhparserargsrlr]r0slicerrWrNchunkr'r'r(mainsT        r~__main__)numpyrr)r*r~rXr'r'r'r(s $f*