o
    4ѹg                  
   @   s   d Z ddlZddlmZ ddlZddlZddlZddl	m
  mZ ddlm  mZ ddlm
Z
 ddlmZ defddZd	eejef fd
dZd!dedefddZdd Zdededejdejdef
ddZdd Zdd Zd"ddZdd  ZdS )#zH Some implementations are adapted from https://github.com/yuyq96/D-TDNN
    N)Union)nn)Fileaudioc                 C   s   d}t t| D ]W}| | }|d |d ksJ dt|d tjs&J dt|d d t|d d  |d jd ksAJ d|dkrU|d | |d  d ksUJ d||d |d  7 }q|S )Nr      z$modelscope error: Wrong time stamps.   z"modelscope error: Wrong data type.>  zFmodelscope error: audio data in list is inconsistent with time length.)rangelen
isinstancenpndarrayintshape)r   Z	audio_duriseg r   ^/Users/admin/.pyenv/versions/3.10.0/lib/python3.10/site-packages/funasr/utils/speaker_utils.pycheck_audio_list   s   , r   inputsc                 C   s   g }t t| D ]s}t| | trAt| | }tjt	|dd\}}t|j
dkr3|d d df }t|d}|d}n5t| | tjrrt| | j
dksVJ d| | }|jdv rg|d d}n|d}t|}ntd	|| q|S )
NZfloat32)dtyper   r   r   z.modelscope error: Input array should be [N, T])Zint16Zint32Zint64i   zOmodelscope error: The input type is restricted to audio address and nump array.)r	   r
   r   strr   readsfloadioBytesIOr   torchZ
from_numpy	unsqueezeZsqueezer   r   r   Zastype
ValueErrorappend)r   outputr   Z
file_bytesdatafsr   r   r   sv_preprocess"   s*   

r$   r   vad_segmentsreturnc                    s@   ddd  fdd}g }t | D ]\}}||| q|S )Ng      ?g      ?)seg_dur	seg_shiftc           
         s   | d }| d }t  d  }t  d  }d}g }td|jd |D ]G}t|| |jd }||kr8 |S |}td|| }||| }	|	jd |k r\t|	d||	jd  fd}	|| | | | |	g q%|S )Nr   r   r'   r(   Zconstant)r   r	   r   minmaxr   padr    )
Zseg_dataZseg_str"   Z	chunk_lenZchunk_shiftZlast_chunk_edZseg_resZchunk_stZchunk_edZ
chunk_dataconfigr#   r   r   	seg_chunkB   s$   "zsv_chunk.<locals>.seg_chunk)	enumerateextend)r%   r#   r.   Zsegsr   sr   r,   r   sv_chunk<   s   r2   c                 C   sR   g }| D ]}t j|ddd}||jddd }||d qt|}|S )Nr   P   )Znum_mel_binsT)ZdimZkeepdim)KaldiZfbankr   meanr    r   cat)r   featuresaufeaturer   r   r   extract_feature\   s   
r:   segmentslabels
embeddingsc           
      C   s   t | t |ks
J t|}g }tt | D ]}|| | d | | d || g qt|}g }t| d D ]}|||k d}|| q9t|}dd }tdt |D ]/}|||d  d || d r|| d ||d  d  d }	|	|| d< |	||d  d< qZt	|}|S )Nr   r   c                 S   s   | |d krdS dS )Ng-C6?TFr   )t1t2r   r   r   is_overlappedx   s   z"postprocess.<locals>.is_overlappedr   )
r
   correct_labelsr	   r    merge_sequer*   r5   r   stacksmooth)
r;   r%   r<   r=   distribute_resr   Zspk_embsZspk_embr@   pr   r   r   postprocessf   s(   &
 rG   c                 C   sF   d}i }g }| D ]}||vr|||< |d7 }| ||  qt|S )Nr   r   )r    r   array)r<   Z	labels_idZid2idZ
new_labelsr   r   r   r   rA      s   
rA   c                 C   sv   | d g}t dt| D ],}| | d |d d ks&| | d |d d kr.|| |  q| | d |d d< q|S )Nr   r   r   )r	   r
   r    )rE   resr   r   r   r   rB      s   
0rB   r   c                 C   s$  t t| D ]}t| | d d| | d< t| | d d| | d< | | d | | d  |k r|dkrA| |d  d | | d< q|t| d krV| |d  d | | d< q| | d | |d  d  | |d  d | | d  kr| |d  d | | d< q| |d  d | | d< qt| } | S )Nr   r   r   )r	   r
   roundrB   )rJ   Zmindurr   r   r   r   rD      s   8rD   c                 C   s   g }| D ]F}|d d d }|d d d }d}d}|D ]$}|\}	}
}|	d }	|
d }
t t||
t ||	 d}||kr@|}|}q||d< || q|S )NZts_listr   rI   r   i  spk)r*   r)   r    )Zsentence_listZsd_time_listZsd_sentence_listdZsentence_startZsentence_endZsentence_spkZmax_overlapZsd_timeZspk_stZspk_edrL   overlapr   r   r   distribute_spk   s$   
rO   )r   )r   )__doc__r   typingr   Zlibrosar   Znumpyr   r   Ztorch.nn.functionalr   Z
functionalFZtorchaudio.compliance.kaldiZ
complianceZkaldir4   Zfunasr.utils.modelscope_filer   listr   r   r$   r2   r:   rG   rA   rB   rD   rO   r   r   r   r   <module>   s:    

$

