
    i&                       d Z ddlmZ ddlZddlZddlZddlZddlZddl	m
Z
 ddlZddlmZ ddlmZ  G d d	      Zdd
ZddZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZdddZedk(  r e e             y)z(MLX-only CLI for Demucs stem separation.    )annotationsN)Path)tqdm   )MLX_MODEL_REGISTRYc                  N    e Zd Z	 	 d
dddd	 	 	 	 	 	 	 	 	 ddZddZddZddZy	)_AsyncWriterrescale   F)clipbits_per_sampleas_floatc          	        |dk  rt        d      t        j                  |      | _        d | _        t        |      | _        || _        t        |      | _        t        |      | _
        t        | j                        D cg c]'  }t        j                  | j                  dd|       ) c}| _        | j                  D ]  }|j!                           y c c}w )Nr   zworkers must be > 0maxsizeTzdemucs-writer-targetdaemonname)
ValueErrorqueueQueue_queue_errorint_workers_clip_bits_per_samplebool	_as_floatrange	threadingThread_run_threadsstart)selfr   workersr   r   r   ithreads           h/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/demucs_mlx/separate.py__init__z_AsyncWriter.__init__   s     a<2339>W9U26G
 #O 4h 4==)
) DIId>RSQTAUV)
 mmFLLN $	
s   ,Cc                   ddl m} 	 | j                  j                         }	 |9| j                  j	                          	 || j                  j	                          y y |\  }}} ||||| j
                  | j                  | j                         || j                  j	                          	 # t        $ r}|| _	        Y d }~3d }~ww xY w# || j                  j	                          w w xY w)Nr   )
save_audio)
samplerater   r   r   )
audior.   r   get	task_doner   r   r    BaseExceptionr   )r'   r.   itemwavpathr/   excs          r+   r$   z_AsyncWriter._run*   s    %;;??$D,<KK))+ #KK))+ $ )-%T:)$($9$9!^^ #KK))+'  ! "!" #KK))+ $s/   B. 2B. .	C7C>C CC C*c                p    | j                   | j                   | j                  j                  |||f       y N)r   r   put)r'   r5   r6   r/   s       r+   submitz_AsyncWriter.submitA   s-    ;;"++dJ/0    c                   t        | j                        D ]  }| j                  j                  d         | j                  j	                          | j
                  D ]  }|j	                           | j                  | j                  y r9   )r!   r   r   r:   joinr%   r   )r'   _r*   s      r+   closez_AsyncWriter.closeF   se    t}}%AKKOOD! &mmFKKM $;;"++ #r<   N)   r   )
r   r   r(   r   r   strr   r   r   r   returnNone)r5   z
np.ndarrayr6   r   r/   r   rD   rE   )__name__
__module____qualname__r,   r$   r;   r@    r<   r+   r	   r	      s^     
 ! 
   0,.1
r<   r	   c                     t        t        j                               D ]9  } t        |    j                  dd      }|rt	        |  d|        /t	        |        ; y)Ndescription 	r   )sortedr   keysr1   print)r   descs     r+   _list_modelsrR   O   sT    )..01!$'++M2>TF"TF#$$K 2 r<   c                   dd l m} dd l}|j                  t	        |       |j
                  d      \  }}|j                  }|j                  d   }|j                  }||k7  rl|dk(  r|j                  |dd      }|S |dk(  r(|dkD  r#|j                  |||j                  d   f      }|S ||kD  r|d |d d f   }|S t        d| d| d	      |S )
Nr   float32)srdtyper   T)axiskeepdimsz
Audio has z channels but model expects .)mlx.corecoremlx_audio_ioloadrB   r/   Tshapeaudio_channelsmeanbroadcast_tor   )	r6   modelmxmacaudio_mxrU   r5   src_channelstgt_channelss	            r+   _load_audiori   Y   s    88CI%*:*:)8LLHb
**C99Q<L''L|#1''#A'5C J Q<!#3//#ciil'CDC J L(m|mQ&'C
 J \N*F|nTUV  Jr<   c             #  \  
K   |dk  r#| D ]  }t        |      }|t        |      f  y t        j                  t	        dt        |                  t        j                         
| D cg c]  }t        |       c}d
fd}t        j                  |dd      }|j                          	 	 j                         }|n|\  }}}	|	|	|J ||f (	 
j                          |j                          y c c}w # 
j                          |j                          w xY ww)	Nr   r   r   c                     	 D ]5  } j                         r n#	 t        |       }j                  | |d f       7 j                  d        y # t        $ r}j                  | d |f       Y d }~ 5d }~ww xY w# j                  d        w xY wr9   )is_setri   r3   r:   )r6   r5   r7   donerc   pathsqs      r+   	_producerz)_iter_prefetched_audio.<locals>._producer   s    	;;=%dE2C tS$'(  EE$K % EE4s+,
 EE$Ks3   A: AA: 	A7A2,A: 2A77A: :BTzdemucs-audio-prefetchr   rC   )r   ri   r   r   maxr   r"   Eventr#   r&   r1   setr>   )tracksrc   prefetchtrackr6   rp   r*   r4   r5   r7   rm   rn   ro   s    `        @@@r+   _iter_prefetched_audiorw   n   s!     1}E;DD%000  	[[As8}%A ??D&,-fUT%[f-E  YtBYZF
LLN557D|!ND#s	?"?)O   	
= .: 	
s*   A*D,0D4D,7)D !&D,"D))D,c                   dd l m} ddlm} dt	        |j
                        z   }|
rt        || j                  dd      nd }	 |
rt        d|         |d	   }||j                  d       |
rt        d
        |||||||||	|
	      }|j                  |       ||j                  d       || j                  z  }|j                  dd       |j
                  D cg c]
  }|| dz   }}||j                  d       t        j                  |d         }t        |      D ]\  \  }}t        j                   ||   t        j"                        }|j%                  |||j&                         |
sOt        d|        ^ ||j                  dt	        |      z          ||j)                          y y c c}w # ||j)                          w w xY w)Nr   r   )apply_modelrA   stepF)totalrQ   unitleavezLoading audio: )N.zRunning MLX separation...)shiftsseedsplitoverlapsegment
batch_sizeprogressT)parentsexist_okz.wav)rV   )r/   zWrote: )rZ   r[   	apply_mlxry   lensourcesr   r   rP   updateevalstemmkdirnpasarray	enumerateascontiguousarrayrT   r;   r/   r@   )r6   r5   rc   out_dirr~   r   r   r   r   r   verbosewriterrd   ry   total_stepsstagemix	estimates	track_outs
stem_pathsstemsstem_idx	stem_pathr   s                            r+   _separate_oner      s    &c%--((KQXD{uM^bE(OD6*+)nLLO-.!

	 		LLOdii'	t46;mmDmiQCt*,m
DLLO 

9Q<(#,Z#8Hi''hrzzJDMM$	e6F6FMG	{+,	 $9
 LLS_,-KKM  E KKM s&   BF; F6,BF; 3/F; 6F; ;Gc                L   t        j                  dd      }|j                  ddd       |j                  dd	d
d       |j                  dddd       |j                  dt        d d       |j                  dt        dd       |j                  dt        dd       |j                  dt        d d       |j                  ddt        dd       |j                  d t        dd!       |j                  d"t        d#d$       |j                  d%d&d'(       |j                  d)d&d*(       |j                  d+d,d&d-(       |j                  |       }|j                  r
t               S |j                  s |j                  t        j                         y#|j                  d.k  rt        d/      d0t        |j                        cxk  rd1k  st        d2       t        d2      |j                  #t        |j                        d.k  rt        d3      |j                   d.k  rt        d4      |j"                  d.k  rt        d5      |j$                  d.k  rt        d6      |j&                  t(        vrGd7j+                  t-        t)        j.                                     }t        d8|j&                   d9|       |j0                  rt3        d:|j&                          dd;lm}  ||j&                        }t9        |d<      r|j;                          t=        |j>                        }tA        tC        d|j"                  d=z        |j"                  >      }	 tE        tG        |j                  ||j$                  ?      tI        |j                        d@dAB      D ]c  \  }}	tK        ||	|||j                  |jL                  |j                  |j                  |jN                   |j                   |j0                  |C       e 	 |jQ                          y.# |jQ                          w xY w)DNz
demucs-mlxzMLX-only Demucs stem separation)progrK   rt   *zAudio files to separate)nargshelpz-nz--namehtdemucsz
Model name)defaultr   z-oz--out	separatedzOutput directoryz	--segmentzSegment length in seconds)typer   r   z	--overlapg      ?zOverlap ratioz--shiftsr   zNumber of random shiftsz--seedz)Optional RNG seed for reproducible shiftsz-bz--batch-size   zBatch size for inferencez--write-workersz)Number of concurrent audio writer threadsz--prefetch-tracks   z#Number of prefetched decoded tracksz
--no-split
store_truezDisable chunked inference)actionr   z--list-modelszList available modelsz-vz	--verbosezVerbose loggingr   z--shifts must be >= 0g        g      ?z--overlap must be in [0, 1)z--segment must be > 0z--batch-size must be > 0z--write-workers must be > 0z--prefetch-tracks must be >= 0z, zUnknown model 'z'. Available: zLoading MLX model: )get_mlx_modelr   rA   )r   r(   )ru   Tracksrv   )r{   rQ   r|   )r~   r   r   r   r   r   r   r   ))argparseArgumentParseradd_argumentfloatr   
parse_argslist_modelsrR   rt   
print_helpsysstderrr~   
SystemExitr   r   r   write_workersprefetch_tracksr   r   r>   rN   rO   r   rP   model_converterr   hasattrr   r   outr	   rq   r   rw   r   r   r   no_splitr@   )
argvparserargsknownr   rc   r   r   r6   r5   s
             r+   mainr      s   $$5F 2KL
h
N
g{AST
%D_`
%OT

a>WX
8	   n3Hbc
)QH  J
+#qB  D
\@[\
CZ[
k,EVWT"D~;;#**%{{Q0115&,,677 -677||E$,,$71$<011!344Q677a9::yy**		&!3!8!8!:;<?499+^E7KLL||#DII;/0.$))$Euf

488nG#a););a)?"@$J\J\]F"4;;@T@TUdkk"	
ID# {{YY--'??
* 	 	s   B(P P#__main__)rD   r   )r6   r   )rt   ztp.Sequence[str]ru   r   rD   z tp.Iterator[tuple[Path, tp.Any]])r6   r   r   r   r~   r   r   ztp.Optional[int]r   r   r   ztp.Optional[float]r   r   r   r   r   r   r   r	   rD   rE   r9   )r   ztp.Optional[tp.Sequence[str]]rD   r   )__doc__
__future__r   r   r   r   r"   typingtppathlibr   numpyr   r   mlx_registryr   r	   rR   ri   rw   r   r   rF   r   rI   r<   r+   <module>r      s    . "   
      ,< <|*.. 	.
 &.`<
< 	<
 < < <  < < < < < 
<~Tl z
TV
 r<   