o
    Si}{                     @   s  d 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mZmZmZmZmZ ddlmZ ddlmZ dd	lmZmZ dd
lmZ ddlmZmZ ddlmZmZ ddl m!Z! g dZ"g dZ#g dZ$g dg dg dgZ%de	de	fddZ&dZ'dddddddd d!d"d#d$Z(g d%Z)g d&Z*i d'dd(dd)dd*dd+dd,dd-dd.dd/dd0d1d2dd3d1d4d1d5dd6dd7dd8dd9diZ+G d:d; d;Z,G d<d= d=Z-G d>d? d?Z.G d@dA dAZ/G dBdC dCZ0dDe	dEee. fdFdGZ1dHee. dIe	dJe2dKe/dEeeee f f
dLdMZ3dDe	dKe/fdNdOZ4			1d_dPe	dQee2ee2 f dRe!dSe5dEee2ee2eeef f f f
dTdUZ6				!d`de!dPe!dRe!dQee2ee2 f dVe5f
dWdXZ7	YdadZed[e8d\e8dEefd]d^Z9dS )bu  
Corpus owner: https://clrd.ninjal.ac.jp/csj/en/index.html
Corpus description:
- http://www.lrec-conf.org/proceedings/lrec2000/pdf/262.pdf
- https://isca-speech.org/archive_open/archive_papers/sspr2003/sspr_mmo2.pdf

This script accesses the CSJ/SDB/{core,noncore} directories, and generates
transcripts where each word is formatted as '{surface}+{morph}+{pron}'.

NOTE: Besides the eval1, eval2, eval3, and excluded datasets introduced in
kaldi, this script also creates a separate validation dataset. Recording
sessions chosen for validation are listed in this script.

This script does the following in sequence:-

**MOVE**
0. This stage is skipped if `--transcript-dir` is not provided.
1. Copies each .sdb files from /SDB into its own directory in the designated
  `transcript_dir`, i.e. {transcript_dir}/{spk_id}/{spk_id}.sdb
2. Verifies that the corresponding wav file exists in the /WAV directory, and
   outputs that absolute path into {spk_id}-wav.list
3. Moves the predefined datasets for eval1, eval2, eval3, and excluded, into
   its own dataset directory
4. Touches a .done_mv in `transcript_dir`.
NOTE: If a .done_mv exists already in `transcript_dir`, then this stage is skipped.

**PREPARE MANIFESTS**
1. Parses all .sdb files it can find within `transcript_dir` in disfluent mode.
2. Generates supervisions and recordings manifests for each dataset part.

Differences to kaldi include:-
1. The evaluation datasets do not follow `trans_dir`/eval/eval{i}, but are
   instead saved in the same level as core, noncore, and excluded.
2. A validation dataset is explicitly specified.
3. Utterances with "×" are not removed. You will need to remove them in a
   later stage.
4. Segments are not concatenated, unless an F-tag, D-tag, L-tag, or A-tag
   spans between two segments.
5. Multi-segment M-tags, R-tags, and O-tags are removed, while M-tags,
   R-tags, and O-tags within a segment are retained.

Example structure of SupervisionSegment.custom:-
{
  "raw": (
      "(F_えー)+感動詞+(F_エー) (M_(F_うーん)+感動詞+(M_(F_(W_ウー;ウーン)) "
      "それ+代名詞+ソレ だっ+助動詞/促音便+ダッ たら)+助動詞+タラ) と+助詞/格助詞+ト "
      "いう+動詞/ワア行五段+ユー の+助詞/準体助詞+ノ は+助詞/係助詞+ワ "
      "(F_えー)+感動詞+(F_エー)"
      ),
  "disfluent": "えーうーんそれだったらというのはえー",
  "disfluent_tag": "F,F,M/F,M/F,M/F,M,M,M,M,M,M,,,,,,F,F"
}
NOTE:
1. XX_tag is guaranteed to be the same length as XX. It labels the tag to which each
   character belongs. It is useful for evaluation.
2. The SupervisionSegment.text field is populated with 'disfluent', i.e.
   SupervisionSegment.text == SupervisionSegment.custom['dislfuent'], so that this
   supervision is compatible with other recipes.

The transcript directory, if generated, has this structure:-
{transcript_dir}
 - excluded
   - ...
 - core
   - ...
 - eval1
   - ...
 - eval2
   - ...
 - eval3
   - ...
 - noncore
   - ...
   - A01F0576
     - A01F0576.sdb
     - A01F0576-trans.txt
     - A01F0576-wav.list
   - ...
   - D03M0038
     - D03M0038.sdb
     - D03M0038-L-trans.txt
     - D03M0038-L-wav.list
     - D03M0038-R-trans.txt
     - D03M0038-R-wav.list
 - valid
     - ...

    N)defaultdict)ThreadPoolExecutor)Path)CallableDictListSequenceTupleUnion)tqdm)$validate_recordings_and_supervisions)	RecordingRecordingSet)fix_manifests)manifests_existread_manifests_if_cached)SupervisionSegmentSupervisionSet)Pathlike)eval1eval2eval3excludedvalidcorenoncore)S05M0613R00M0187D01M0019D04M0056D02M0028D03M0017)'A01M0264A01M0377A01M0776A01M0891A03F0109A04M0899A05M0420A07M0318A07M0912A11M0795A12M0983D03F0058R00M0415R01F0101R01F0125R02M0073R03F0108R03F0157S00F0014S00M0793S01F0507S02F0122S02F0362S02M1351S02M1372S03F1199S04F1020S05F0443S07F0853S07F1333S07M0827S08F0717S08F1340S09M0619S10M1090S10M1275S11F0578S11M0864S11M1174)
A01M0110A01M0137A01M0097A04M0123A04M0121A04M0051A03M0156A03M0112A03M0106A05M0011)
A01M0056A03F0072A02M0012A03M0016A06M0064A06F0135A01F0034A01F0063A01F0001A01M0141)
S00M0112S00F0066S00M0213S00F0019S00M0079S01F0105S00F0152S00M0070S00M0008S00F0148
corpus_dir	trans_dirc              
   C   s  |d   rt| d|d  d d S | d dD ]}|jd }|jd d }|| | }|jddd	 | d
 | }|d dkr|| d }|| d }| s\J | d| sgJ | d|| d j|	 dd || d j|	 dd g }	g }
|j
dddD ]+}|s|	| |
| qd|dd v r|	| qd|v sJ ||
| q|| d jd|
dd || d jd|	dd q|| d |  || d }| sJ | d|| d  j|	 dd qtD ]C}t|d!| d"| d#}|D ](}|	 d"^ }}}}td"|d$|g }|jddd	 |||  q|d j  q
ttd%d&D ]N\}}|D ]F}t|d!| d"| d#}|D ]+}|	 d"^ }}}}td"|d'| |g }|jddd	 |||  ql|d j  qZqTtD ]C}t|d!| d"| d#}|D ](}|	 d"^ }}}}td"|d(|g }|jddd	 |||  q|d j  q|d   td) d S )*Nz.done_mvz already created. Delete z to create again.z	MORPH/SDB*/*.sdbTparentsexist_okWAVr   Dz-L.wavz-R.wavz-L.wav cannot be foundz-R.wav cannot be foundz-L-wav.listutf8encodingz-R-wav.list	shift_jis
zL:	   zR:z-R.sdbz-L.sdbz.sdb.wavz.wav cannot be found	-wav.listz*//*r      )startevalr   zTranscripts have been moved.)existslogginginfoglobpartsnamemkdiris_file
write_textas_posix	read_textsplitappendjoinwrite_bytes
read_bytes	_A01M0056listr   renameparentrmdir	enumerate_EVAL_VALIDtouch)rg   rh   	ori_filesvolspk_idnew_dirwav_dirl_wavr_wavL_sdbR_sdblinewavori_file	same_partfilenamei	eval_list r   F/home/ubuntu/.local/lib/python3.10/site-packages/lhotse/recipes/csj.py_create_trans_dir   s   




r    rw      	                     
      )timesurfacenotagpos1cFormcType1pos2cType2otherpronspkid)r   r   r   r   )z<FV>z<VN>z<H>z<Q>u   <笑>u   <咳>u   <息>u   <泣>u   <フロア発話>u   <フロア笑>u   <拍手>u   <デモ>u   <ベル>u   <朗読間違い>u   <雑音>Frp   D2?z?,MORXAr|   A_numKWB   笑   泣   咳Lc                   @   sf   e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZdZdZdZdZdZedddZdd Zdd	 Zd
S )_CSJSDBWord r   g      c           
   	      s  t   |  d} t D ]\}}z| | }W n ty#   d}Y nw t || qtdD ] }tddgddgD ]\}} j	
|| _	 j
|| _q:q/tD ]} j	
|d _	 j
|d _qR j	
td _	 j
td _td	d j	 _	 jd
 _ fddtD }ddd |D  _dD ]
} j
|d _q j
dd _ jd\ _}}	dd |dD \ _ _ jd dkrڈ jd |	dd   _ S )Nrv   r   r   u   んーu   ンーu   んu   ン_z<PL.+>u   ・c                    s   g | ]}t  |qS r   )getattr.0swordr   r   
<listcomp>  s    z)_CSJSDBWord.from_line.<locals>.<listcomp>rz   c                 s   s    | ]}|r|V  qd S Nr   )r   mr   r   r   	<genexpr>      z(_CSJSDBWord.from_line.<locals>.<genexpr>)u   Ａu   １u   ２u   ３u   ４u   　u   ＿r   c                 S   s   g | ]}t |qS r   )floatr   r   r   r   r     s    -r   rp   :)r   stripr   _FIELDSitems
IndexErrorsetattrrangezipr   replacer   _REPLACEMENTSINTERNAL_SEPresubrstrip_MORPHr   morphr   sgidr}   endr   )
r   fr   attrr   crr   	start_endchannelr   r   r   	from_line  s>   z_CSJSDBWord.from_linec                 C   s   | j  d| j d| j S )N+)r   r   r   selfr   r   r   __repr__  s   z_CSJSDBWord.__repr__c                 C   s   t | jp| jS r   )boolr   r   r   r   r   r   __bool__     z_CSJSDBWord.__bool__N)r   )__name__
__module____qualname__r   r   r   r   r   r   r   r   r   r   r   r   r}   r   r   staticmethodr   r   r   r   r   r   r   r   r  s(    ,r   c                   @   sp   e Zd ZU dZeed< ee ed< ee ed< ee ed< eed< dedefd	d
Z	ddede
e fddZdS )_Transcriptr   textshape0shape1shape2tag_endsegments	text_typec           	      C   s   g | _ g | _g | _i | _tt| _t|D ]4\}}t|D ]+\}}t||}|  j	|7  _	t
t|D ]}| j | | j| | j| q3qqg }t| j	D ]\}}|dkr_|| qQ|dkrj|| j| < qQd S N())r  r  r	  r
  r   r   right_offsetr   r   r  r   lenr   pop)	r   r  r  r   r   jwkopen_bracketsr   r   r   __init__  s.   

z_Transcript.__init__Fposreturnc                 C   s   |s| j | | j| | j| fS d}| j| j | | j| f D ]}|| j| k r,|d7 }q| j| j | | j| f | j|  | j | | j| | j| | fS )Nr   r|   )r  r  r	  r  r   )r   r  rightadjustcoordsr   r   r   	use_index  s   & z_Transcript.use_indexN)F)r  r  r  r  str__annotations__r   intr   r  r	   r  r   r   r   r   r    s   
 r  c                   @   st   e Zd ZU eed< eed< eed< eed< edee fddZ	dd	 Z
d
d ZdefddZedefddZdS )_CSJSDBSegmentr  r}   r   r   wordsc                 C   sT   t  }tdd | D |_| d j|_| d j|_| d j d| d j |_|S )Nc                 s   s    | ]}t |V  qd S r   )r  )r   r  r   r   r   r     r   z,_CSJSDBSegment.from_words.<locals>.<genexpr>r   r   )r!  r   r   r  r}   r   r   r   )r"  retr   r   r   
from_words  s   z_CSJSDBSegment.from_wordsc                 C   s   | j S r   r  r   r   r   r   r     s   z_CSJSDBSegment.__repr__c                 C   s*   | j  d| jdd| jdd | j S )Nrv   z09.3f)r   r}   r   r  r   r   r   r   to_line  s   *z_CSJSDBSegment.to_liner  c                 C   s   | j d| j dkS r  )r  countr   r   r   r   verify_line     z_CSJSDBSegment.verify_liner   c                 C   sD   t  }|  d\|_|_|_}t|j|_t|j|_||_|S )Nrv   )r!  r   r   r   r}   r   r   r  )r   r$  r  r   r   r   r     s   z_CSJSDBSegment.from_lineN)r  r  r  r  r  r   r  r   r   r%  r   r'  r   r)  r   r   r   r   r   r!    s   
 r!  c                
   @   s   e Zd ZedZg dZdefddZe	dfde
defd	d
Z	ddedeeeeedf  f fddZdefddZdeeee f fddZdS )CSJSDBParserz( )|([\x00-\x7F]))u   ゼロu   ０u   零u   一u   二u   三u   四u   五u   六u   七u   八u   九u   十u   百u   千u   ．xc                 C   s:   g }| tD ]}| dd }|r|| qt|S )Nr   r   )r   r   r   r   )r   r,  r$  ar   r   r   __default_preprocess  s   

z!CSJSDBParser.__default_preprocessN	decisions
preprocessc                 C   s    || _ |s| j| _d S || _d S r   )r/  !_CSJSDBParser__default_preprocessr0  )r   r/  r0  r   r   r   r  "  s   
zCSJSDBParser.__init__r   Fr  r  .c                    s   |  |}| |d}t|d t|d ksJ ||s%|d t S  s5dd t|d |d D S  fddt|d |d D S )Nr#  stringtagc                 S   s    g | ]\}}|t kr||fqS r   r   r   r  tr   r   r   r   4  s    z&CSJSDBParser.parse.<locals>.<listcomp>c                    s(   g | ]\}}|t kr||fn |fqS r   r4  r5  sepr   r   r   7  s    )r0  _parser  r   r   r   )r   r  r8  	with_tagsprocessed_textr$  r   r7  r   parse)  s   
 
zCSJSDBParser.parsec              
      s   |d }d dg}g g}|t |k r|| } g}|dkr=| ||}|d }|d } s2|d }n fdd|d D }| j|}	|d	kre set| d
| d
| d
  d
| 	 |d ||d dS |d	kr dkr||d r||d d | jv r|d |  |dg |g g \}
}|
||dS |dkr|d |g  nD|dkr|d |g  d vr d7  n-|dkrn(|	r|	drȈ |7  n s|dkr|dv r| n|d  |7  < |d 	| |d7 }|t |k s|d ||d r|d dS g dS )Nr|   r   r  r2  r   r3  c                    s   g | ]	} d |  qS )rz   r   )r   tar3  r   r   r   M      z'CSJSDBParser._parse.<locals>.<listcomp>r  z, r#  )r2  r   r3  r   r   r   ;,r   r   )r   r   r   )
r  r9  	tag_regexsearchprintJPN_NUM_decider   groupextend)r   r  open_bracketr   choiceschoices_tagr   r6  r$  matchesresult
result_tagr   r>  r   r9  <  sd   
$"



.zCSJSDBParser._parsec                 C   s   t |dksJ | j D ]K\}}||krqd}t|tr&|| || f}n!|d d dkr7t|dd  }n|d d dkrGt|dd   |dkrO|  S td| d| td| d	)
Nr|   r#  r   zeval:zexec:zDecision for z cannot be resolved. Got zUnknown tag z encountered.)	r  r/  r   
isinstancer   r~   exec	ExceptionNotImplementedError)r   r3  rJ  rK  r6  decisionr$  r   r   r   rF  u  s"   
zCSJSDBParser._decide)r   F)r  r  r  r   compilerB  rE  r  r1  	DECISIONSr   r   r  r
   r   r	   r<  r9  rF  r   r   r   r   r+    s    

9r+  c                   @   s   e Zd ZU eee  ed< eed< eed< dd ZdefddZd	e	fd
dZ
d	ee	 fddZdd Zedd Zd	ee fddZdd ZdS )_CSJSDBTagSegmentr  surface_open_bracketspron_open_bracketsc                 C   s   g | _ i | _i | _d S r   )r  rW  rX  r   r   r   r   r    s   
z_CSJSDBTagSegment.__init__r   c                 C   s(   | j r| j d | d S |gg| _ d S )Nr#  )r  r   )r   r   r   r   r   r     s   z_CSJSDBTagSegment.appendr  c                 C   s   t jdd | jD dS )Nc                 S   s   g | ]	}|D ]}|qqS r   r   r   r   r  r   r   r   r     r?  z-_CSJSDBTagSegment.flatten.<locals>.<listcomp>r"  )r!  r%  r  r   r   r   r   flatten  r*  z_CSJSDBTagSegment.flattenc                 C   s   dd | j D S )Nc                 S   s   g | ]
}|rt j|d qS )rZ  )r!  r%  r   r   r   r   r     s    z+_CSJSDBTagSegment.split.<locals>.<listcomp>r  r   r   r   r   r     r   z_CSJSDBTagSegment.splitc                 C   s
   | j | S r   r\  )r   r  r   r   r   __getitem__  s   
z_CSJSDBTagSegment.__getitem__c                    s   d dd | jD | }d dd | jD  |  }|s&|s&dS | jfdd|d d d D  | j fd	d|d d d D  d
S )Nr   c                 s        | ]}|D ]}|j V  qqd S r   r   rY  r   r   r   r         z0_CSJSDBTagSegment.is_complete.<locals>.<genexpr>c                 s   r^  r   r   rY  r   r   r   r     r`  Tc                       i | ]	}| |d   qS r|   r   r   iir_  r   r   
<dictcomp>  r?  z1_CSJSDBTagSegment.is_complete.<locals>.<dictcomp>r#  c                    rb  rc  r   rd  ra  r   r   rf    r?  F)r   r  _get_open_bracketsrW  updaterX  )r   rW  rX  r   )r   r   r   is_complete  s   

z_CSJSDBTagSegment.is_completec                 C   s>   g }t |D ]\}}|dkr|| q|dkr|  q|S r  )r   r   r  )r   r  bracketsr   r   r   r   r   rg    s   z$_CSJSDBTagSegment._get_open_bracketsc                 C   s   t | jo| jd S )Nr   )r   r  r   r   r   r   r     s   z_CSJSDBTagSegment.__bool__N)r  r  r  r   r   r  r   r  r   r!  r[  r   r]  propertyri  r   rg  r   r   r   r   r   rV    s   
 

rV  sdbr  c                 C   sp  | j ddd}|d dd dd }t }g }|D ]}|s't }nt|}|s1|r1q|j|kr<|| q|j}|jsI|jg  n|sLnt	|jdkr&t
|d	}t
|d
}|j D ]P\}	}
|
dv r||	\}}}||j|	 d\}}}|| | j}|| | j}|d | ||d d   || | _|d | ||d d   || | _qcd}|j D ]T\}	}
|
dv r||	\}}}||j|	 d\}}}|| | j}|| | j}|d | ||d d   || | _|d | ||d d   || | _qd}q|r||  n||  t }n
||  t }|| q|S )Nrt   rr   ru   r   rv   rw   r   r|   r   r   )r   r   r   TF)r   r   rV  r   r   r   r   ri  r  r  r  rX  r   r  r
  r   rW  r   rH  r[  )rl  linesr   words_until_nowr  r   r   r   r   r  linking_tagl0l1l2r0r1r2l1_pr1_pr   l1_sr1_sr   r   r   _read_one_sdb  sb   





&&
&(rz  r  r   recording_idparserc           	      C   s   t j||d}g }| D ]D}|j|jddd}|sqtt| \}}d|}d|}|t|j	||j
|j|j
 dd||d d	krCd
nd||j||dd
 q||fS )N)r{  r   T)r8  r:  rA  r   Japaneserw   r   MaleFemale)raw	disfluentdisfluent_tag)
idr{  r}   durationr   languagespeakergenderr  custom)r   	from_filer<  r  r   r   r   r   r   r   r}   r   )	r  r   r{  r|  	recordingsupervision_segmentssegmentr  r3  r   r   r   _process_one_recording  s0   


r  c              	   C   s   t | }| j}z!t| j|d   }| j| j d ddd |D  W n! tyI   | jj}| j	d d| d| d	 }|
 sGJ Y nw t||||S )
Nry   z
-trans.txtru   c                 s   s    | ]}|  V  qd S r   )r'  r   r   r   r   r   4  r   z_process_one.<locals>.<genexpr>rw   zWAV/rz   rx   )rz  stemr   r   r   r   r   FileNotFoundErrorr   rm   r   r  )rl  r|  r  spkwavfilepartr   r   r   _process_one.  s   r  transcript_dirdataset_partsmanifest_dirnum_jobsc              
   C   s  |   sJ d|  |st}nt|tr|g}| jdkrdnd}i }|r7t|}|jddd t||dd}tt	}t
|}t|d	d
D ]}g }	td|  t||ddrctd| d qF| | d| D ]}
|	|t|
| qmg }g }t|	dddD ]}| }|sJ |\}}|| || qt|}t|}t||\}}t|| |r||d| d  ||d| d  ||d||< qFW d   |S 1 sw   Y  |S )a  
    Returns the manifests which consist of the Recordings and Supervisions.
    When all the manifests are available in the ``output_dir``, it will
    simply read and return them.

    :param transcript_dir: Path, the path to the .sdb transcripts.
    :param dataset_parts: string or sequence of strings representing
        dataset part names, e.g. 'eval1', 'core', 'eval2'. This defaults to the
        full dataset - core, noncore, eval1, eval2, and eval3.
    :param manifest_dir: Pathlike, the path where to write the manifests.
    :param num_jobs: int, to be passed to ThreadPoolExecutor.
    :return: a Dict whose key is the dataset part, and the value is Dicts
        with the keys 'recordings' and 'supervisions'.
    z&No such directory for transcript_dir: SDBz*.sdbri   Trl   csj)r  
output_dirprefixzDataset parts)desczProcessing CSJ subset: )r  r  r  zCSJ subset: z already prepared - skipping.rz   
ProcessingF)r  leavecsj_supervisions_z	.jsonl.gzcsj_recordings_)
recordingssupervisionsN)is_dir_FULL_DATA_PARTSrO  r  r   r   r   r   r+  rU  r   r   r   r   r   r   r   submitr  rM  rH  r   from_recordingsr   from_segmentsr   r   to_file)r  r  r  r  glob_pattern	manifestsr|  exr  futuresrl  r  r  futurerM  r  r  recording_setsupervision_setr   r   r   prepare_manifests=  sn   






%%r  njc                 C   sv   t | } |  s
J |r"t |}|jddd td t| | n| d d }td |s3ddg}t||||d	S )
NTrl   z$Creating transcript directories now.MORPHr  zVPreparing manifests without saving transcripts. Only core and noncore can be created. r   r   )r  r  r  r  )r   r  r   r   r   r   r  )rg   r  r  r  r  r   r   r   prepare_csj  s&   
r          r  gapmaxlenc           	         s  g }t | } g }| D ]i}d|jd v r|r|| g }q|s&|| q|j|d jkr7|| |g}q|j|d j |krJ|| |g}q|j|d j |kro|d  jt||j|d j 7  _|| |g}q|| q|r||| g }|D ]\}|d }|d j|j |_|jD ]9  dkrd	 fdd|D |j < qd v rd		 fd
d|D |j < qd	 fdd|D |j < qd	dd |D |_
|| qt|S )a  Concatenates supervisions according to the permissible gap and maximum length
    of an utterance. This function is not called in this script, but is provided as
    a utility function for users to concatenate supervisions themselves.

    Args:
        supervisions (SupervisionSet): The list of `SupervisionSegments` to concatenate.
        gap (float): Maximum length of permissible silence in an utterance.
        maxlen (float): Maximum length of one utterance.
        max_extend_right (float, optional): Since the immediate right context is silence,
        optionally extends the supervision to include some silence on the right. Included
        for endpointing training. Defaults to 0.0.

    Returns:
        SupervisionSet: Concatenated supervisions
       ×r  r   r#  r   c                 3       | ]}|j   V  qd S r   r  r   spr  r   r   r         z*concat_csj_supervisions.<locals>.<genexpr>_tagrA  c                 3   r  r   r  r  r  r   r   r     r  r   c                 3   r  r   r  r  r  r   r   r     r  c                 s   s    | ]}|j V  qd S r   r&  r  r   r   r   r     s    )copydeepcopyr  r   r  r   r}   r  minr   r  r   r  )	r  r  r  max_extend_rightgrouped_supervisionstmp_splong_sp0r$  long_spr   r  r   concat_csj_supervisions  sN   






   
r  )NNr|   )NNNr   )r  ):__doc__r  r   r   collectionsr   concurrent.futures.threadr   pathlibr   typingr   r   r   r   r	   r
   	tqdm.autor   lhotser   lhotse.audior   r   	lhotse.qar   lhotse.recipes.utilsr   r   lhotse.supervisionr   r   lhotse.utilsr   r  r   r   r   r   r   r   r   r   rU  r   r  r!  r+  rV  rz  r  r  r  r   r  r  r   r  r   r   r   r   <module>   s
  Y 	-+W	
E+" 
:E
"
U
"