
    Ai<"                         d Z ddlZddlmZmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ d	d
lmZmZ  e ed            ZdededefdZdededede
dedefdZdededee   fdZy)u   统一转写流水线服务。

职责概览：
- 对单个音频 chunk 执行 ASR、说话人匹配和时间偏移叠加。
- 提供 HTTP 文件路径下的分段读取能力，供 /transcribe 顺序消费。
    N)DictList)AudioSegment   )split_audio_to_chunks)SpeakerRegistry)transcribe_audio_file   )audio_segment_to_pcm_bytesidentify_speaker_id_from_pcmu   。.!?！？segmentchunk_secondsreturnc                 h   t        j                  dd      5 }| j                  |j                  d       |j                  }d d d        	 t	        |d      	 dd l}|j                  |       S # 1 sw Y   .xY w# t        $ r Y S w xY w# 	 dd l}|j                         w # t        $ r Y w w xY wxY w)NFz.wav)deletesuffixwav)format)fail_on_emptyr   )tempfileNamedTemporaryFileexportnamer	   osremove	Exception)r   r   tmppathr   s        )/app/gzzm/services/transcribe_pipeline.pytranscribe_segmentr       s    		$	$E&	ASsxx.xx 
B$T=N	IIdO 
B	A  				IIdO 		sM   *A/B
 A;/A8;	BB
B1B"!B1"	B.+B1-B..B1
offset_secspeaker_registryspeaker_devicec                 L   t        t        | dd      xs d      }t        t        | dd      xs d      }t        | |      }|j                  d      }|j                  d      xs dj	                         }	|j                  d      xs g }
|j                  d	      xs g }g }t        t        d
            }|st        |       }t        |||||      \  }}|
D ]  }	 t        |j                  dd      xs d      }t        |j                  d|      xs |      }|j                  dd      xs d}|j                  d      }|t        |xr |d   t        v       }|j                  t        ||z   d      t        ||z   d      |t        |      ||t        |d      ndd        n|
D ]  }	 t        |j                  dd      xs d      }t        |j                  d|      xs |      }|j                  dd      xs d}|j                  d      }|t        |xr |d   t        v       }|D cg c]N  }t        |j                  dd      xs d      |dz
  k\  r't        |j                  dd      xs d      |dz   k  r|P }}|st        dt        t        |dz                    }t!        t#        |       t        t        |dz                    }| || }t        |      }t        |||||      \  }} |j                  t        ||z   d      t        ||z   d      |t        |      || t        | d      ndd       g }!g }"|D ][  }|j                  d      xs dxs d}#|"j                  |       t#        |#      dk(  s<|#|v s	|#t        v sI|!j                  |"       g }"] |"r|!j                  |"       t%        |!      D ]  \  }$}%t        |%d   j                  dd      xs d      }&t        |%d   j                  d|&      xs |&      }'dj'                  |%D (cg c]  }(|(j                  dd      xs d c}(      j	                         })|$t#        |!      dz
  k(  }*t        |*xr |      }+t        dt        t        |&dz                    }t!        t#        |       t        t        |'dz                    }||k  r't        d|dz
        }t!        t#        |       |dz         }| || }t        |      }t        |||||      \  }} |j                  t        ||&z   d      t        ||'z   d      |)t        |+      || t        | d      ndd         ||	|t        t#        |             dz  dS # t        $ r d}d}Y kw xY w# t        $ r d}d}Y w xY wc c}w c c}(w )z6Run ASR -> chunk-level speaker matching for one chunk.
frame_ratei>  channelsr
   languagetext time_stampstime_stamps_tokensu   ，,、;；:：-—)	pcm_bytessample_rater&   registrydevicestartg        endsentence_endN   )r0   r1   r(   r2   rlsimgMbP?r   i     (   g     @@)r'   r(   r*   duration_sec)intgetattrr    getstripsetlistr   r   floatr   bool	_SENT_ENDappendroundmaxminlen	enumeratejoin),r   r!   r   r"   r#   r-   r&   transcribedr'   r(   chunk_tstoken_tsenrichedINTERNAL_SPLIT_PUNCTSchunk_pcm_byteschunk_rl	chunk_simsentence
sent_startsent_end	sent_textr2   s_starts_endsentence_end_flagttokens_in_sentencestart_msend_mssub_segsub_pcmrl_subsim_subgroups	cur_grouptxtgigrpg_startg_endxg_textis_lastgrp_sentence_ends,                                               r   process_chunk_pipelinerl   %   s    gg|U;DuEK77J27a8H$Wm<Kz*HOOF#)r002D}-3H 34:HH  %: ;<4W=:%#%!
) !H"8<<#=#DE
 eZ!@!NJO !VR06BI#<<7L##I$L)B-92LMOO":
#:A> h!6:%$($6"2;2G5A.T	 !0 !HWc : AcBhll5':EgF !VR06BI (^ < ($()Qy}	7Q$R!
 ""!Aw,34$F!%%s+2s3ut|C !  " &q#eGdN&;"<=S\3uUT\/B+CD!(624W=">% +%-)# !&zG';Q!?$Z%%7; )(,->(?$4;4GuWa0T	  (*F$&I'uuV}*1r  #s8q=c-B&BcYFVMM), "I ( i($V,CA

7C 8 ?C@c"gkk%9DWE3!G3a!%%"3"9r"93!GHNNPVq1#'(E4E#F q#eGdN&;"<=S\3uUT\/B+CDX%"1hm4H Wx"}=F!(624W=">% +%-)# !&zG';Q!?$Z%%7; &(,-=(>$4;4GuWa0T	1 -s !z c'l+f4	 a   
0  "^ "Hs1   >U4.>V1AVV!4VVVV	file_pathc                 6   t        | |      }g }	 |D ]&  }|j                  t        j                  |             ( 	 |D ]  }	 dd l}|j                  |        |S # t        $ r Y (w xY w# |D ]'  }	 dd l}|j                  |       # t        $ r Y %w xY w w xY w)Nr   )r   rC   r   	from_filer   r   r   )rm   r   chunksoutpr   s         r   split_file_to_segmentsrs      s    "9m<F C
AJJ|--a01  A		!	  J   A		!  sA   +A* A	A'&A'*B1BB	B	BB	B)__doc__r   typingr   r   pydubr   utils.audio_utilsr   utils.speaker_idr   
transcriber	   speaker_matcherr   r   r>   r?   rB   r:   r    r@   strrl   rs        r   <module>r~      s       5 . . U^$%	 S T  ___ _ &	_
 _ 
_Dc # $|BT r}   