
    4Aj                        d 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	 ddl
mZmZmZmZmZmZmZmZmZmZ  G d de          ZdS )	zTranscription tool wrapping faster-whisper / WhisperX.

Provides speech-to-text with word-level timestamps and optional speaker
diarization. Falls back gracefully when GPU or diarization dependencies
are not available.
    )annotationsN)Path)AnyOptional)
BaseToolDeterminismExecutionModeResourceProfileRetryPolicyResumeSupport
ToolResultToolStability
ToolStatusToolTierc            	      \   e Zd ZdZdZej        ZdZdZ	e
j        Zej        Zej        ZdgZdZdgZg dZd	d
gddddg ddddddddddddddZd	ddiddiddiddiddZ edddd d!          Z ed"d#g$          Zej        Zg d%Z d&gZ!d'Z"d(d)gZ#d;d,Z$d<d.Z%d=d2Z&d>d4Z'd?d:Z(d'S )@Transcribertranscriberz0.1.0analysiswhisperxzpython:faster_whisperzpip install faster-whisper  # CPU mode
pip install faster-whisper[gpu]  # GPU mode (requires CUDA)
pip install whisperx  # For diarization supportzspeech-to-text)
transcribeword_timestampsdiarizationlanguage_detectionobject
input_pathstringzPath to audio or video file)typedescription)tinybasesmallmediumzlarge-v2zlarge-v3r    )r   enumdefaultz0ISO 639-1 language code, or null for auto-detectbooleanF)r   r$   zDirectory for output files)r   
model_sizelanguagediarize
output_dir)r   required
propertiesr   arraynumber)segmentsr   r'   duration_seconds)r   r+      i   r   i  )	cpu_coresram_mbvram_mbdisk_mbnetwork_required   MemoryError)max_retriesretryable_errors)r   r&   r'   z$writes transcript JSON to output_dirNz*Check transcript text against source audioz(Verify word timestamps align with speechreturnr   c                \    	 dd l }t          j        S # t          $ r t          j        cY S w xY w)Nr   )faster_whisperr   	AVAILABLEImportErrorUNAVAILABLE)selfr<   s     I/app/working/workspaces/default/OpenMontage/tools/analysis/transcriber.py
get_statuszTranscriber.get_statusb   sF    	*!!!!'' 	* 	* 	*))))	*s    ++boolc                2    	 dd l }dS # t          $ r Y dS w xY w)Nr   TF)r   r>   )r@   r   s     rA   _has_diarizationzTranscriber._has_diarizationi   s7    	OOO4 	 	 	55	s    
inputsdict[str, Any]floatc                    dS )z8Rough estimate: ~0.5x real-time on CPU for 'base' model.g      N@ )r@   rF   s     rA   estimate_runtimezTranscriber.estimate_runtimep   s    t    r   c           	     |   t          |d                   }|                    dd          }|                    d          }|                    dd          }t          |                    d|j                            }|                                st	          dd| 	          S |                    d
d
           	 ddlm} n!# t          $ r t	          dd	          cY S w xY wt          j	                    }	 dd l
}	|	j                                        rdnd}
|
dk    rdnd}n# t          $ r d}
d}Y nw xY w |||
|          }|                    t          |          |d
d
          \  }}g }g }|D ]}|j        t!          |j        d          t!          |j        d          |j                                        d}|j        rg }|j        D ]q}|j        t!          |j        d          t!          |j        d          t!          |j        d          d}|                    |           |                    |           r||d<   |                    |           |p|j        }|j        }|r8|                                 r$|                     t          |          ||          }t          j	                    |z
  }|||t!          |d          ||
d}||j         dz  }|                    t?          j         |d          d           t	          d
|t          |          gt!          |d                    S ) Nr   r&   r    r'   r(   Fr)   zInput file not found: )successerrorT)parentsexist_okr   )WhisperModelz@faster-whisper is not installed. Run: pip install faster-whispercudacpufloat16int8)devicecompute_type)r'   r   
vad_filter   )idstartendtext)wordr\   r]   probabilitywords)r.   r   r'   r/   r&   rW   z_transcript.jsonr0   )indentzutf-8)encoding)rN   data	artifactsr/   )!r   getparentexistsr   mkdirr<   rR   r>   timetorchrS   is_availabler   strr[   roundr\   r]   r^   stripra   r_   r`   appendr'   durationrE   _apply_diarizationstem
write_textjsondumps)r@   rF   r   r&   r'   r(   r)   rR   r\   rk   rW   rX   modelsegments_iterinfor.   r   segseg_datara   w
word_entrydetected_languagerq   elapsedresult_dataoutput_paths                              rA   executezTranscriber.executet   s   &.//
ZZf55
::j))**Y..&**\:3DEEFF
  "" 	Ze3XJ3X3XYYYY555	3333333 	 	 	X     	 		"LLL$z6688CVVeF(.&(8(899fLL 	" 	" 	"F!LLL	" Z\RRR $..
OO 	 / 
 
t   	& 	&Cfsy!,,SWa((((	 H y * 7 7A !!&qw!2!2$QUA',Q]A'>'>	" "J LL,,,#**:6666$)!OOH%%%%$5=  	t,,.. 	..J+< H )++% !.) %h 2 2$
 
 !jo#G#G#GGtz+a@@@7SSS;''("7A..	
 
 
 	
s$   ?C C$#C$;+D' 'D87D8
audio_pathrm   r.   
list[dict]r'   c                   	 ddl }|                    |          }|                    |d          \  }}|                    ||||d          }ddl}	|	j                            d          }
|
s|S |                    |
d          } ||          }|                    ||          }|                    d|          S # t          $ r |cY S w xY w)	z4Apply WhisperX diarization to assign speaker labels.r   NrT   )language_coderW   )rW   HF_TOKEN)use_auth_tokenrW   r.   )
r   
load_audioload_align_modelalignosenvironrf   DiarizationPipelineassign_word_speakers	Exception)r@   r   r.   r'   r   audioalign_modelalign_metadataalignedr   hf_tokendiarize_modeldiarize_segmentsresults                 rA   rr   zTranscriber._apply_diarization   s   	OOO ''
33E +3*C*C&u +D + +'K nn+~uU %  G
 IIIz~~j11H  $88' 9  M  -}U33223CWMMF::j(333 	 	 	OOO	s   A.B? 1AB? ?CC)r:   r   )r:   rC   )rF   rG   r:   rH   )rF   rG   r:   r   )r   rm   r.   r   r'   rm   r:   r   ))__name__
__module____qualname__nameversionr   COREtier
capabilityproviderr   EXPERIMENTAL	stabilityr	   SYNCexecution_moder   DETERMINISTICdeterminismdependenciesinstall_instructionsagent_skillscapabilitiesinput_schemaoutput_schemar
   resource_profiler   retry_policyr   
FROM_STARTresume_supportidempotency_key_fieldsside_effectsfallbackuser_visible_verificationrB   rE   rK   r   rr   rJ   rL   rA   r   r      s       DG=DJH*I"'N+K+,L	: 
 %%L  L !N#+<YZZ SSS! 
 "*:lmm )e<<#+<XYY

 

 L" ) &0*!' 2	
 
 M '   ;1OOOL"-NEEE:;LH42!
* * * *      `
 `
 `
 `
D% % % % % %rL   r   )__doc__
__future__r   ru   rj   pathlibr   typingr   r   tools.base_toolr   r   r	   r
   r   r   r   r   r   r   r   rJ   rL   rA   <module>r      s    # " " " " "                                               ^ ^ ^ ^ ^( ^ ^ ^ ^ ^rL   