
    )i5                       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Zd dlm	Z	 d dl
m
Z
 d dlmZ d dlmZ e	 G d d                      Z ee                                          j        Zed	z  Zed
z  Zd;dZd<dZ	 	 	 d=d>dZd?dZd@d!ZdAd#ZdBd&ZdCd+ZdDd-ZdEd0ZdFd7Z dGd9Z!e"d:k    r e# e!                      dS )H    )annotationsN)	dataclass)datetime)Path)Anyc                  T    e Zd ZU ded<   ded<   ded<   ded<   dZded	<   dZd
ed<   dS )SegmentfloatstartendstrspeakertextNfloat | None
confidence
str | Nonesource)__name__
__module____qualname____annotations__r   r        #scripts/transcribe_with_voice_id.pyr	   r	      sX         LLLJJJLLLIII#J####Fr   r	   z_fw_transcribe.pyz_sb_voice_match.pycmd	list[str]return subprocess.CompletedProcess[str]c           
         t          j        | dd          }|j        dk    r=t          d|j         dd                    |            d|j         d|j                   |S )	NT)capture_outputr   r   zCommand failed (z):  z	
stdout:
z	
stderr:
)
subprocessrun
returncodeRuntimeErrorjoinstdoutstderr)r   results     r   r#   r#      s    ^C4@@@FA(v0 ( (SXXc]] ( (( (( (
 
 	

 Mr   pathr   dict[str, Any]c                x    t          j        t          dddddddt          |           g          j                  S )Nffprobez-verrorz-show_streamsz-show_formatz-ofjson)r/   loadsr#   r   r'   )r*   s    r   r-   r-   *   sK    :D				
 	
   r   
input_pathoutput_pathchannelr   r   r   r   Nonec           	        ddg}|	|d|dgz  }|dt          |           gz  }|t          d||pdz
            }|d|dgz  }|d	k    r|d
dgz  }n|dk    r|d
dgz  }|dddddt          |          gz  }t          |           d S )Nffmpegz-yz-ssz.3f-ig?        z-tleft-afzpan=mono|c0=c0rightzpan=mono|c0=c1z-vnz-ac1z-ar16000)r   maxr#   )r1   r2   r3   r   r   r   durations          r   extract_audior@   ;   s     T
C%~~&&D#j//""C
tSELS122''((&'((	G		'((E5#ugs;/?/?@@CHHHHHr   r
   c                    t          ddddt          |           ddddd	g
          }t          j        d
|j                  }|sdS t          |                    d                    S )Nr6   z-hide_bannerz-nostatsr7   r:   volumedetectz-fnull-z%mean_volume:\s*(-?\d+(?:\.\d+)?)\s*dBg     8   )r#   r   researchr(   r
   group)r*   r)   matchs      r   mean_volume_dbrJ   Q   su    II	
 F I>NNE vQ   r   valueslist[tuple[str, Path]]c                &   g }| D ]}d|vrt          d|           |                    dd          \  }}|                    |                                t	          |                                                                          f           |S )N=zExpected NAME=PATH, got: rE   )
SystemExitsplitappendstripr   
expanduserresolve)rK   pairsvaluenamer*   s        r   parse_name_pathrX   f   s    $&E H He@@@AAA[[a((
ddjjllDJJ$9$9$;$;$C$C$E$EFGGGGLr   list[tuple[str, str]]c                    g }| D ]l}d|vrt          d|           |                    dd          \  }}|                    |                                |                                f           m|S )NrN   zExpected NAME=VALUE, got: rE   )rO   rP   rQ   rR   )rK   rU   rV   rW   	raw_values        r   parse_name_valuer\   p   s    #%E 8 8eA%AABBB++c1--idjjllIOO$5$567777Lr   secondsr   c                    t          |           }t          |d          \  }}t          |d          \  }}|r|dd|dd|dS |dd|dS )Ni  <   02d:)intdivmod)r]   totalhoursremminutessecss         r   	format_tsri   z   sx    LLEt$$JE33OOMGT 7666g666D6666&&&D&&&&r   
audio_pathmodellanguagelist[dict[str, Any]]c           
        t          j        ddd          5 }t          |j                  }d d d            n# 1 swxY w Y   	 t	          t
          j        t          t                    t          |           t          |          d|d|g           t          j
        |                    d                    |                    d	
           S # |                    d	
           w xY w)Nfw_transcript_.jsonFprefixsuffixdelete--model
--languageutf-8encodingT
missing_ok)tempfileNamedTemporaryFiler   rW   r#   sys
executabler   	FW_HELPERr/   r0   	read_textunlink)rj   rk   rl   handleoutput_jsons        r   transcribe_audior      s   		$,<WUZ	[	[	[ (_e6;''( ( ( ( ( ( ( ( ( ( ( ( ( ( (,IJK  		
 	
 	
 z+///AABBd++++d++++s   9= =A4C C(refsc                    t           j        t          t                    t          |           g}|D ]\  }}|d| d| gz  }t	          j        t          |          j                  S )N--voice-refrN   )r~   r   r   	SB_HELPERr/   r0   r#   r'   )rj   r   r   rW   ref_paths        r   voice_match_clipr      sh     >3y>>3z??
;C 5 5h$333344:c#hho&&&r   windowsdict[str, dict[str, Any]]c                p   t          j        ddd          5 }t          |j                  }d d d            n# 1 swxY w Y   	 |                    t          j        |d          d           t          j        t          t                    t          |           d	t          |          g}|D ]\  }}|d
| d| gz  }t          j        t          |          j                  }d |                    dg           D             |                    d           S # |                    d           w xY w)Nvoice_windows_rp   Frq      indentrw   rx   z--windows-jsonr   rN   c                :    i | ]}t          |d                    |S )id)r   ).0items     r   
<dictcomp>z(voice_match_segments.<locals>.<dictcomp>   s4     
 
 
 T
OOT
 
 
r   resultsTrz   )r|   r}   r   rW   
write_textr/   dumpsr~   r   r   r   r0   r#   r'   getr   )	rj   r   r   r   windows_pathr   rW   r   payloads	            r   voice_match_segmentsr      s   
 
	$
 
 
 )	FK(() ) ) ) ) ) ) ) ) ) ) ) ) ) )-
71 = = =PPPN	NN
OO
 # 	9 	9ND(Md#7#7X#7#788CC*SXX_--
 
Ir22
 
 

 	t,,,,t,,,,s   9= =CD D5output_stemsource_pathmodenotessegmentslist[Segment]c                   |                      d          }|                      d          }t          |          t          j                                        d          ||d |D             d}|                    t          j        |d          d	
           d|j         dd| dd| dg}|D ]}	|	                    d|	            |g dz  }|D ]i}
|
j
        d|
j
        ddnd}|	                    dt          |
j                   d|
j         d| d|
j                    |	                    d           j|                    d                    |                                          dz   d	
           d S )N.transcript.json.transcript.mdr]   )timespecc           	     \    g | ])}|j         |j        |j        |j        |j        |j        d *S )r   r   r   r   r   r   r   )r   segs     r   
<listcomp>z!write_outputs.<locals>.<listcomp>   sO     

 

 

  w;!n* 

 

 

r   )r   
created_atr   r   r   r   r   rw   rx   u   # Transcript —  z- Source: ``z	- Mode: `z- Note: )r   z---r   z (.2f)[z] **z**z: 
)with_suffixr   r   now	isoformatr   r/   r   rW   rQ   r   ri   r   r   r   r&   rstrip)r   r   r   r   r   	json_pathmd_pathr   linesnoter   scores               r   write_outputsr      s    ''(:;;I%%&677G k""lnn..	.BB

 

  

 

 

 G" GA666III 	/K,..
$k$$$D	E  ( (&&&''''	___E  .1n.H*S^*****bU39--UU3;UU%UU38UUVVVRtyy''..0047'JJJJJr   rb   c                    t          j        d          } |                     dd           |                     dd           |                     dd	d
           |                     ddd           |                     ddd           |                     ddg d           |                     ddg d           |                     dt          dd           |                     dt          dd           |                                 }t          |j                                                                                  }|	                                st          d |           t          	                                st          d!t                     |j        r0t          	                                st          d!t                     |j        r8t          |j                                                                                  n|                    d"          }t!          |j                  }d# t#          |j                  D             }t'          |          }d$ |                    d%g           D             }|st          d&|           |d'         }t+          |                    d(d)                    }	t          |                    d*i                               d+          p|                    d+          pd,          }
g }g }d-}t-          j        d./          5 }t          |          }|d0z  }t1          ||           |j        r|	d1k    rd2}|d3z  |d4z  d5}|                                D ]\  }}t1          |||6           |                                D ]\  }}t7          |          }||j        k     r|                    | d7|d8d9           =|                    ||                                          }d }|r||vrt?          ||          }t          |d:                   |j         k    rItC          |d;                   }t          |d:                   }|                    | d<| d=|d>           n/|                    | d?t          |d:                   d>d@           tE          ||j#        |j$                  D ]c}|                    tK          t          |dA                   t          |dB                   |tC          |dC                   ||D                     dn"tE          ||j#        |j$                  }i }|r,|r*dE tM          |          D             }tO          |||          }tM          |          D ]\  }}dF}d }|                    tC          |                    }|r9t          |d:                   }|}||j         k    rtC          |d;                   ndG}|                    tK          t          |dA                   t          |dB                   |tC          |dC                   |d-D                     |s|                    dH           n/|
d'k    r)|dI         j(        |
d1z   k    r|                    dJ           d d d            n# 1 swxY w Y   |)                    dK L           tU          |||||           tW          dM|                    dN                      tW          dM|                    dO                      |r&tW          dP           |D ]}tW          dQ|            d'S )RNzATranscribe media files and optionally label speakers by voice ID.)descriptioninputzPath to input media file)helpz--output-stemz-Output stem path; defaults next to input fileru   zsmall.enz-faster-whisper model name (default: small.en))defaultr   rv   enz-Language code for transcription (default: en)z--split-stereo
store_truezDSplit stereo channels and transcribe each audible channel separately)actionr   z--channel-labelrQ   z3Channel label mapping like left=Karl or right=Sarah)r   r   r   r   z4Reference voice clip mapping like Karl=refs/karl.wavz--voice-thresholdg?z8Cosine similarity threshold for voice ID (default: 0.45))typer   r   z--silence-threshold-dbg     Kz@Treat channels below this mean dB level as silent (default: -55)zInput file not found: zMissing helper: r   c                    i | ]\  }}||	S r   r   )r   rW   labels      r   r   zmain.<locals>.<dictcomp>,  s    ZZZkdEdEZZZr   c                D    g | ]}|                     d           dk    |S )
codec_typeaudio)r   )r   streams     r   r   zmain.<locals>.<listcomp>/  s9       ::l##w.. 	...r   streamszNo audio stream found in r   channelsrE   formatr?   r8   mono	voice_id_)rr   zmono.wavr   split_stereozleft.wavz	right.wav)r9   r;   )r3   z channel treated as silent (z.1fz dB mean volume)
best_score	best_namez channel matched z at r   z+ channel did not clear voice-ID threshold (r   r   r   r   r   c                    g | ]>\  }}t          |          t          |d                    t          |d                   d?S )r   r   )r   r   r   )r   r
   )r   indexr   s      r   r   zmain.<locals>.<listcomp>w  s\        $t	 "%jj!&tG}!5!5$T%[11   r   SpeakerUnknownz No transcript segments produced.z<Transcript timestamps extend beyond reported media duration.c                *    | j         | j        | j        fS )N)r   r   r   )r   s    r   <lambda>zmain.<locals>.<lambda>  s    DJ$,#G r   )keyzWrote r   r   zNotes:z- ),argparseArgumentParseradd_argumentr
   
parse_argsr   r   rS   rT   existsrO   r   	voice_refr   r   r   rX   r\   channel_labelr-   r   rb   r|   TemporaryDirectoryr@   r   itemsrJ   silence_threshold_dbrQ   titler   voice_thresholdr   r   rk   rl   r	   	enumerater   r   sortr   print)parserargsr1   r   r   channel_labelsstream_infoaudio_streamsaudio_streamr   r?   r   r   r   tmpdir_nametmpdirmono_wavchannel_wavschannel_namewav_path
channel_dbr   r   rI   r   transcript_itemsmatchesr   r   r   r   s                                  r   mainr      s	   $W  F &@AAA
<     <    
 <    
 S    
 B	     C	     G	      O	     Ddj!!,,..6688J @>*>>??? 97I77888~ 9i..00 97I77888 	(T))++33555##B'' 
 4>**DZZ5EdFX5Y5YZZZN*%%K !ooi44  M
  CAZAABBB #L<##J2233H"%%))*55 	J''	 H E HD		$K	8	8	8 XYKk""J&j(+++ N	Q!D++- L +7*<*<*>*> J J&hj(LIIIII*6*<*<*>*> ! !&h+H55
 999LL'eeZeeee   (,,\<;M;M;O;OPP!
 L>>,Xt<<EU<011T5III"%eK&8"9"9%*5+>%?%?
+[[g[[:[[[    +yyX]^cdp^qXrXryyyy   -Xtz4=QQ 
 
DOO"'W"6"6 %d5k 2 2$+!$T&\!2!2'1#/  	 	 	 	
/!F  0$*dmTT13G 	H( 	H  (11A'B'B   /xwGG()9::  t#!
CJJ// !%"566E!&J !D$888 E+.///& 
 #DM22!$u+.. ' f..#-%  	 	 	 	  	YLL;<<<<\\hrl.A==LLWXXXqXY XY XY XY XY XY XY XY XY XY XY XY XY XY XYt MMGGMHHH+z4AAA	
>;**+;<<
>
>???	
@;**+=>>
@
@AAA h 	 	D+t++1s   /N Z;;Z?Z?__main__)r   r   r   r   )r*   r   r   r+   )NNN)r1   r   r2   r   r3   r   r   r   r   r   r   r4   )r*   r   r   r
   )rK   r   r   rL   )rK   r   r   rY   )r]   r
   r   r   )rj   r   rk   r   rl   r   r   rm   )rj   r   r   rL   r   r+   )rj   r   r   rL   r   rm   r   r   )r   r   r   r   r   r   r   r   r   r   r   r4   )r   rb   )$
__future__r   r   r/   rF   r"   r~   r|   dataclassesr   r   pathlibr   typingr   r	   __file__rT   parent
SCRIPT_DIRr   r   r#   r-   r@   rJ   rX   r\   ri   r   r   r   r   r   r   rO   r   r   r   <module>r     s5   " " " " " "   				     



  ! ! ! ! ! !                           T(^^##%%,
,,	--	      (     ,! ! ! !*      ' ' ' ', , , ,*' ' ' '- - - -:*K *K *K *KZy y y yx z
*TTVV

 r   