o
    ij                     @   s   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 Zdd Zdd	 Zd
d ZedddddZdd Zdd Zdd Zdd ZdddZG dd dZdS )    )print_functionN)	lru_cachec                 C   s$   t j| sdS tj| g dddS )zload segments file as arrayN))uttobject)recr   )stf)etr      )dtypendmin)ospathexistsnploadtxt)segments_file r   W/home/ubuntu/.local/lib/python3.10/site-packages/funasr/models/eend/utils/kaldi_data.pyload_segments   s   r   c                 C   sP   i }t j| s
d S t| D ]}|  \}}}}|t|t|f||< q|S N)r   r   r   openstripsplitfloatr   retliner   r   r   r	   r   r   r   load_segments_hash   s   r   c                 C   sh   i }t j| s
d S t| D ]#}|  \}}}}||vr"g ||< || |t|t|d q|S )N)r   r   r	   )r   r   r   r   r   r   appendr   r   r   r   r   load_segments_rechash&   s    r    c                 C       dd t | D }dd |D S )z)return dictionary { rec: wav_rxfilename }c                 S      g | ]
}|  d dqS Nr
   r   r   .0r   r   r   r   
<listcomp>4       z load_wav_scp.<locals>.<listcomp>c                 S      i | ]	}|d  |d qS r   r
   r   r&   xr   r   r   
<dictcomp>5       z load_wav_scp.<locals>.<dictcomp>r   )wav_scp_filelinesr   r   r   load_wav_scp2      r2   r
   )maxsizec                 C   s   |  dr+tj| dd dtjd}tjt|j	 dd\}}||| }||fS | dkrCtjt
jdd\}}||| }||fS tj| ||d	\}}||fS )
a	  This function reads audio file and return data in numpy.float32 array.
    "lru_cache" holds recently loaded audio so that can be called
    many times on the same audio file.
    OPTIMIZE: controls lru_cache size for random access,
    considering memory size
    |NT)shellstdoutfloat32)r   -)startstop)endswith
subprocessPopenPIPEsfloadioBytesIOr8   readsysstdin)wav_rxfilenamer;   endpdata
samplerater   r   r   load_wav8   s   
	rM   c                 C   r!   )z#returns dictionary { uttid: spkid }c                 S   r"   r#   r$   r%   r   r   r   r'   S   r(   z load_utt2spk.<locals>.<listcomp>c                 S   r)   r*   r   r+   r   r   r   r-   T   r.   z load_utt2spk.<locals>.<dictcomp>r/   )utt2spk_filer1   r   r   r   load_utt2spkQ   r3   rO   c                 C   0   t j| sdS dd t| D }dd |D S )z,returns dictionary { spkid: list of uttids }Nc                 S   s   g | ]}|   qS r   r$   r%   r   r   r   r'   [   s    z load_spk2utt.<locals>.<listcomp>c                 S   s   i | ]}|d  |dd qS )r   r
   Nr   r+   r   r   r   r-   \       z load_spk2utt.<locals>.<dictcomp>r   r   r   r   )spk2utt_filer1   r   r   r   load_spk2uttW      rT   c                 C   rP   )z&returns dictionary { recid: duration }Nc                 S   r"   r#   r$   r%   r   r   r   r'   c   r(   z!load_reco2dur.<locals>.<listcomp>c                 S   s   i | ]}|d  t |d qS r*   )r   r+   r   r   r   r-   d   rQ   z!load_reco2dur.<locals>.<dictcomp>rR   )reco2dur_filer1   r   r   r   load_reco2dur_   rU   rW   c                 C   s"   |  dr| | d S d| |S )zThis function returns preprocessed wav_rxfilename
    Args:
        wav_rxfilename: input
        process: command which can be connected via pipe,
                use stdin and stdout
    Returns:
        wav_rxfilename: output piped command
    r5   zcat {} | {} |)r=   format)rH   processr   r   r   process_wavg   s   
	rZ   c           	      c   s    |dur;|D ]1}| |d  }t |\}}t|d | t}t|d | t}|d ||| fV  qdS | D ]}t | | \}}||fV  q=dS )zThis function returns generator of segmented audio as
    (utterance id, numpy.float32 array)
    TODO?: sampling rate is not converted.
    Nr   r   r	   r   )rM   r   rintastypeint)	wavssegmentssegwavrK   rL   	st_sample	et_sampler   r   r   r   extract_segmentsx   s   	rd   c                   @   s   e Zd Zdd ZdddZdS )	KaldiDatac                 C   sx   || _ ttj| j d| _ttj| j d| _ttj| j d| _	t
tj| j d| _ttj| j d| _d S )Nr_   utt2spkzwav.scpreco2durspk2utt)data_dirr    r   r   joinr_   rO   rf   r2   r^   rW   rg   rT   rh   )selfri   r   r   r   __init__   s   zKaldiData.__init__r   Nc                 C   s   t | j| ||\}}||fS r   )rM   r^   )rk   recidr;   rI   rK   rater   r   r   rM      s   zKaldiData.load_wavr   N)__name__
__module____qualname__rl   rM   r   r   r   r   re      s    re   ro   r   )
__future__r   r   rF   numpyr   r>   librosarA   rC   	functoolsr   r   r   r    r2   rM   rO   rT   rW   rZ   rd   re   r   r   r   r   <module>   s(   

