From ac58218a14ebb5ead3e6a167260ca265239dfee8 Mon Sep 17 00:00:00 2001 From: Taejin Park Date: Mon, 21 Nov 2022 10:55:08 -0800 Subject: [PATCH] Standalone diarization+ASR evaluation script (#5439) * first commit on eval_diar_with_asr.py Signed-off-by: Taejin Park * Add a standalone diarization-ASR evaluation transcript Signed-off-by: Taejin Park * Fixed examples in docstrings Signed-off-by: Taejin Park * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Fixed staticmethod error Signed-off-by: Taejin Park * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Added description on eval modes Signed-off-by: Taejin Park * adding diar_infer_general.yaml Signed-off-by: Taejin Park * fix msdd_model in general yaml file Signed-off-by: Taejin Park * fixed errors in yaml file Signed-off-by: Taejin Park * combine into 1 commit Signed-off-by: Taejin Park * Added description on eval modes Signed-off-by: Taejin Park * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Add MoE support for T5 model (w/o expert parallel) (#5409) * clean Signed-off-by: Abhinav Khattar * kwarg ref Signed-off-by: Abhinav Khattar * fix Signed-off-by: Abhinav Khattar * fix Signed-off-by: Abhinav Khattar * test Signed-off-by: Abhinav Khattar * test Signed-off-by: Abhinav Khattar * test Signed-off-by: Abhinav Khattar * test Signed-off-by: Abhinav Khattar * test Signed-off-by: Abhinav Khattar * test Signed-off-by: Abhinav Khattar * extra args Signed-off-by: Abhinav Khattar * test Signed-off-by: Abhinav Khattar * rm prints Signed-off-by: Abhinav Khattar * style Signed-off-by: Abhinav Khattar * review comments Signed-off-by: Abhinav Khattar * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * review comments Signed-off-by: Abhinav Khattar * review comments Signed-off-by: Abhinav Khattar * fix Signed-off-by: Abhinav Khattar Signed-off-by: Abhinav Khattar Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * Fix args (#5410) (#5416) Signed-off-by: MaximumEntropy Signed-off-by: MaximumEntropy Signed-off-by: MaximumEntropy Co-authored-by: Sandeep Subramanian * Fix for concat map dataset (#5133) * change for concat map dataset * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Exhaust longest dataset * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci Co-authored-by: 1-800-BAD-CODE <> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Oleksii Kuchaiev Co-authored-by: Sandeep Subramanian * Add temporary fix for CUDA issue in Dockerfile (#5421) (#5422) Signed-off-by: Yu Yao Signed-off-by: Yu Yao Signed-off-by: Yu Yao Co-authored-by: yaoyu-33 <54727607+yaoyu-33@users.noreply.github.com> * Fix GPT generation when using sentencepiece tokenizer (#5413) (#5428) * Fix Signed-off-by: MaximumEntropy * Fix Signed-off-by: MaximumEntropy Signed-off-by: MaximumEntropy Co-authored-by: Yi Dong Co-authored-by: Oleksii Kuchaiev Signed-off-by: MaximumEntropy Co-authored-by: Sandeep Subramanian Co-authored-by: Yi Dong Co-authored-by: Oleksii Kuchaiev * Support for finetuning and finetuning inference with .ckpt files & batch size refactoring (#5339) * Initial refactor Signed-off-by: MaximumEntropy * Resolve config before passing to load_from_checkpoint Signed-off-by: MaximumEntropy * Fixes for model parallel and nemo restore Signed-off-by: MaximumEntropy * Fixes for eval Signed-off-by: MaximumEntropy * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Revert config changes Signed-off-by: MaximumEntropy * Refactor Signed-off-by: MaximumEntropy * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Fix typo Signed-off-by: MaximumEntropy * Remove comments Signed-off-by: MaximumEntropy * Minor Signed-off-by: MaximumEntropy * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Fix validation reconfiguration Signed-off-by: MaximumEntropy * Remove old comment Signed-off-by: MaximumEntropy * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Fixes for test_ds Signed-off-by: MaximumEntropy * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci Signed-off-by: MaximumEntropy Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * Revert "Add temporary fix for CUDA issue in Dockerfile (#5421)" (#5431) (#5432) This reverts commit 0718b17a8e1f89ee7e167698d1a5d5acad3f1b2a. Co-authored-by: yaoyu-33 <54727607+yaoyu-33@users.noreply.github.com> * [ITN] fix year date graph, cardinals extension for hundreds (#5435) * wip Signed-off-by: ekmb * add lociko's hundreds extension for cardinals Signed-off-by: ekmb * add optional end Signed-off-by: ekmb * restart ci Signed-off-by: ekmb Signed-off-by: ekmb * update doc in terms of get_label for lang id model (#5366) * reflect PR 5278 ion doc Signed-off-by: fayejf * reflect comment Signed-off-by: fayejf Signed-off-by: fayejf * Revert workaround for T5 that sets number of workers to 0 & sync_batch_comm=False (#5420) (#5433) * Revert workers workaround Signed-off-by: MaximumEntropy * Fix in config Signed-off-by: MaximumEntropy * Fix Signed-off-by: MaximumEntropy Signed-off-by: MaximumEntropy Co-authored-by: Oleksii Kuchaiev Signed-off-by: MaximumEntropy Co-authored-by: Sandeep Subramanian Co-authored-by: Oleksii Kuchaiev * Fixed bug in notebook (#5382) (#5394) Signed-off-by: Virginia Adams Signed-off-by: Virginia Adams Signed-off-by: Virginia Adams Co-authored-by: Virginia Adams <78445382+vadam5@users.noreply.github.com> * Fixing bug in Megatron BERT when loss mask is all zeros (#5424) * Fixing bug when loss mask is fully zero Signed-off-by: Shanmugam Ramasamy <111910568+shanmugamr1992@users.noreply.github.com> * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update megatron_bert_model.py Signed-off-by: Shanmugam Ramasamy <111910568+shanmugamr1992@users.noreply.github.com> * Update dataset_utils.py Signed-off-by: Shanmugam Ramasamy <111910568+shanmugamr1992@users.noreply.github.com> * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update dataset_utils.py Signed-off-by: Shanmugam Ramasamy <111910568+shanmugamr1992@users.noreply.github.com> * Update dataset_utils.py Signed-off-by: Shanmugam Ramasamy <111910568+shanmugamr1992@users.noreply.github.com> Signed-off-by: Shanmugam Ramasamy <111910568+shanmugamr1992@users.noreply.github.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Sandeep Subramanian * Use updated API for overlapping grad sync with pipeline parallelism (#5236) Signed-off-by: Tim Moon Signed-off-by: Tim Moon * support to disable sequence length + 1 input tokens for each sample in MegatronGPT (#5363) * support to disable sequence length + 1 input tokens for MegatronGPT * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci Co-authored-by: Anmol Gupta Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Sandeep Subramanian * [TTS] Create script for processing TTS training audio (#5262) * Create script for processing TTS training audio * Update VAD trimming logic * Remove unused import Signed-off-by: Ryan * [TTS] remove useless logic for set_tokenizer. (#5430) Signed-off-by: Xuesong Yang <1646669+XuesongYang@users.noreply.github.com> * Fix setting up of `ReduceLROnPlateau` learning rate scheduler (#5444) * Fix tests Signed-off-by: PeganovAnton * Add accidentally lost changes Signed-off-by: PeganovAnton Signed-off-by: PeganovAnton * Create codeql.yml (#5445) Signed-off-by: Somshubra Majumdar Signed-off-by: Somshubra Majumdar * Fix for getting tokenizer in character-based ASR models when using tarred dataset (#5442) Signed-off-by: Jonghwan Hyeon Signed-off-by: Jonghwan Hyeon * Combine 5 commits adding diar_infer_general.yaml Signed-off-by: Taejin Park Update codeql.yml Signed-off-by: Somshubra Majumdar Update codeql.yml Signed-off-by: Somshubra Majumdar fix msdd_model in general yaml file Signed-off-by: Taejin Park fixed errors in yaml file Signed-off-by: Taejin Park * moved eval_der function and fixed tqdm options Signed-off-by: Taejin Park * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Changed minor error in docstrings Signed-off-by: Taejin Park * removed score_labels and changed leave=True Signed-off-by: Taejin Park Signed-off-by: Taejin Park Signed-off-by: Abhinav Khattar Signed-off-by: MaximumEntropy Signed-off-by: Yu Yao Signed-off-by: ekmb Signed-off-by: fayejf Signed-off-by: Virginia Adams Signed-off-by: Shanmugam Ramasamy <111910568+shanmugamr1992@users.noreply.github.com> Signed-off-by: Tim Moon Signed-off-by: Ryan Signed-off-by: Xuesong Yang <1646669+XuesongYang@users.noreply.github.com> Signed-off-by: PeganovAnton Signed-off-by: Somshubra Majumdar Signed-off-by: Jonghwan Hyeon Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Abhinav Khattar Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Sandeep Subramanian Co-authored-by: Shane Carroll <50530592+1-800-BAD-CODE@users.noreply.github.com> Co-authored-by: Oleksii Kuchaiev Co-authored-by: yaoyu-33 <54727607+yaoyu-33@users.noreply.github.com> Co-authored-by: Yi Dong Co-authored-by: Evelina <10428420+ekmb@users.noreply.github.com> Co-authored-by: fayejf <36722593+fayejf@users.noreply.github.com> Co-authored-by: Virginia Adams <78445382+vadam5@users.noreply.github.com> Co-authored-by: Shanmugam Ramasamy <111910568+shanmugamr1992@users.noreply.github.com> Co-authored-by: Tim Moon <4406448+timmoon10@users.noreply.github.com> Co-authored-by: anmolgupt <14880251+anmolgupt@users.noreply.github.com> Co-authored-by: Anmol Gupta Co-authored-by: Ryan Langman Co-authored-by: Xuesong Yang <1646669+XuesongYang@users.noreply.github.com> Co-authored-by: PeganovAnton Co-authored-by: Somshubra Majumdar Co-authored-by: Jonghwan Hyeon Signed-off-by: shane carroll --- .../offline_diar_with_asr_infer.py | 29 +- .../conf/inference/diar_infer_general.yaml | 90 + nemo/collections/asr/metrics/der.py | 48 + .../asr/models/clustering_diarizer.py | 4 +- .../asr/parts/utils/diarization_utils.py | 269 ++- .../asr/parts/utils/speaker_utils.py | 2 +- nemo/collections/asr/parts/utils/vad_utils.py | 12 +- scripts/speaker_tasks/eval_diar_with_asr.py | 243 ++ .../ASR_with_SpeakerDiarization.ipynb | 1222 +--------- .../Speaker_Diarization_Inference.ipynb | 2019 +---------------- 10 files changed, 749 insertions(+), 3189 deletions(-) create mode 100644 examples/speaker_tasks/diarization/conf/inference/diar_infer_general.yaml create mode 100644 scripts/speaker_tasks/eval_diar_with_asr.py diff --git a/examples/speaker_tasks/diarization/clustering_diarizer/offline_diar_with_asr_infer.py b/examples/speaker_tasks/diarization/clustering_diarizer/offline_diar_with_asr_infer.py index f1bc7c81c0a8..da9671a2fc43 100644 --- a/examples/speaker_tasks/diarization/clustering_diarizer/offline_diar_with_asr_infer.py +++ b/examples/speaker_tasks/diarization/clustering_diarizer/offline_diar_with_asr_infer.py @@ -64,9 +64,32 @@ def main(cfg): # If RTTM is provided and DER evaluation if diar_score is not None: metric, mapping_dict, _ = diar_score - der_results = asr_diar_offline.gather_eval_results(metric, mapping_dict, trans_info_dict) - wer_results = asr_diar_offline.evaluate(trans_info_dict) - asr_diar_offline.print_errors(der_results, wer_results) + + # Get session-level diarization error rate and speaker counting error + der_results = OfflineDiarWithASR.gather_eval_results( + diar_score=diar_score, + audio_rttm_map_dict=asr_diar_offline.AUDIO_RTTM_MAP, + trans_info_dict=trans_info_dict, + root_path=asr_diar_offline.root_path, + ) + + # Calculate WER and cpWER if reference CTM files exist + wer_results = OfflineDiarWithASR.evaluate( + hyp_trans_info_dict=trans_info_dict, + audio_file_list=asr_diar_offline.audio_file_list, + ref_ctm_file_list=asr_diar_offline.ctm_file_list, + ) + + # Print average DER, WER and cpWER + OfflineDiarWithASR.print_errors(der_results=der_results, wer_results=wer_results) + + # Save detailed session-level evaluation results in `root_path`. + OfflineDiarWithASR.write_session_level_result_in_csv( + der_results=der_results, + wer_results=wer_results, + root_path=asr_diar_offline.root_path, + csv_columns=asr_diar_offline.csv_columns, + ) if __name__ == '__main__': diff --git a/examples/speaker_tasks/diarization/conf/inference/diar_infer_general.yaml b/examples/speaker_tasks/diarization/conf/inference/diar_infer_general.yaml new file mode 100644 index 000000000000..8036e2882b71 --- /dev/null +++ b/examples/speaker_tasks/diarization/conf/inference/diar_infer_general.yaml @@ -0,0 +1,90 @@ +# This YAML file is created for all types of offline speaker diarization inference tasks in `/example/speaker_tasks/diarization` folder. +# The inference parameters for VAD, speaker embedding extractor, clustering module, MSDD module, ASR decoder are all included in this YAML file. +# All the keys under `diarizer` key (`vad`, `speaker_embeddings`, `clustering`, `msdd_model`, `asr`) can be selectively used for its own purpose and also can be ignored if the module is not used. +# The configurations in this YAML file is optimized to show balanced performances on various types of domain. VAD is optimized on multilingual ASR datasets and diarizer is optimized on DIHARD3 development set. +# An example line in an input manifest file (`.json` format): +# {"audio_filepath": "/path/to/audio_file", "offset": 0, "duration": null, "label": "infer", "text": "-", "num_speakers": null, "rttm_filepath": "/path/to/rttm/file", "uem_filepath": "/path/to/uem/file"} +name: &name "ClusterDiarizer" + +num_workers: 1 +sample_rate: 16000 +batch_size: 64 + +diarizer: + manifest_filepath: ??? + out_dir: ??? + oracle_vad: False # If True, uses RTTM files provided in the manifest file to get speech activity (VAD) timestamps + collar: 0.25 # Collar value for scoring + ignore_overlap: True # Consider or ignore overlap segments while scoring + + vad: + model_path: vad_multilingual_marblenet # .nemo local model path or pretrained VAD model name + external_vad_manifest: null # This option is provided to use external vad and provide its speech activity labels for speaker embeddings extraction. Only one of model_path or external_vad_manifest should be set + + parameters: # Tuned by detection error rate (false alarm + miss) on multilingual ASR evaluation datasets + window_length_in_sec: 0.63 # Window length in sec for VAD context input + shift_length_in_sec: 0.08 # Shift length in sec for generate frame level VAD prediction + smoothing: False # False or type of smoothing method (eg: median) + overlap: 0.5 # Overlap ratio for overlapped mean/median smoothing filter + onset: 0.5 # Onset threshold for detecting the beginning and end of a speech + offset: 0.3 # Offset threshold for detecting the end of a speech + pad_onset: 0.2 # Adding durations before each speech segment + pad_offset: 0.2 # Adding durations after each speech segment + min_duration_on: 0.5 # Threshold for small non_speech deletion + min_duration_off: 0.5 # Threshold for short speech segment deletion + filter_speech_first: True + + speaker_embeddings: + model_path: titanet_large # .nemo local model path or pretrained model name (titanet_large, ecapa_tdnn or speakerverification_speakernet) + parameters: + window_length_in_sec: [1.9,1.2,0.5] # Window length(s) in sec (floating-point number). either a number or a list. ex) 1.5 or [1.5,1.0,0.5] + shift_length_in_sec: [0.95,0.6,0.25] # Shift length(s) in sec (floating-point number). either a number or a list. ex) 0.75 or [0.75,0.5,0.25] + multiscale_weights: [1,1,1] # Weight for each scale. should be null (for single scale) or a list matched with window/shift scale count. ex) [0.33,0.33,0.33] + save_embeddings: True # If True, save speaker embeddings in pickle format. This should be True if clustering result is used for other models, such as `msdd_model`. + + clustering: + parameters: + oracle_num_speakers: False # If True, use num of speakers value provided in manifest file. + max_num_speakers: 8 # Max number of speakers for each recording. If an oracle number of speakers is passed, this value is ignored. + enhanced_count_thres: 80 # If the number of segments is lower than this number, enhanced speaker counting is activated. + max_rp_threshold: 0.25 # Determines the range of p-value search: 0 < p <= max_rp_threshold. + sparse_search_volume: 10 # The higher the number, the more values will be examined with more time. + maj_vote_spk_count: False # If True, take a majority vote on multiple p-values to estimate the number of speakers. + + msdd_model: + model_path: null # .nemo local model path or pretrained model name for multiscale diarization decoder (MSDD) + parameters: + use_speaker_model_from_ckpt: True # If True, use speaker embedding model in checkpoint. If False, the provided speaker embedding model in config will be used. + infer_batch_size: 25 # Batch size for MSDD inference. + sigmoid_threshold: [0.7] # Sigmoid threshold for generating binarized speaker labels. The smaller the more generous on detecting overlaps. + seq_eval_mode: False # If True, use oracle number of speaker and evaluate F1 score for the given speaker sequences. Default is False. + split_infer: True # If True, break the input audio clip to short sequences and calculate cluster average embeddings for inference. + diar_window_length: 50 # The length of split short sequence when split_infer is True. + overlap_infer_spk_limit: 5 # If the estimated number of speakers are larger than this number, overlap speech is not estimated. + + asr: + model_path: null # Provide NGC cloud ASR model name. stt_en_conformer_ctc_* models are recommended for diarization purposes. + parameters: + asr_based_vad: False # if True, speech segmentation for diarization is based on word-timestamps from ASR inference. + asr_based_vad_threshold: 1.0 # Threshold (in sec) that caps the gap between two words when generating VAD timestamps using ASR based VAD. + asr_batch_size: null # Batch size can be dependent on each ASR model. Default batch sizes are applied if set to null. + decoder_delay_in_sec: null # Native decoder delay. null is recommended to use the default values for each ASR model. + word_ts_anchor_offset: null # Offset to set a reference point from the start of the word. Recommended range of values is [-0.05 0.2]. + word_ts_anchor_pos: "start" # Select which part of the word timestamp we want to use. The options are: 'start', 'end', 'mid'. + fix_word_ts_with_VAD: False # Fix the word timestamp using VAD output. You must provide a VAD model to use this feature. + colored_text: False # If True, use colored text to distinguish speakers in the output transcript. + print_time: True # If True, the start and end time of each speaker turn is printed in the output transcript. + break_lines: False # If True, the output transcript breaks the line to fix the line width (default is 90 chars) + + ctc_decoder_parameters: # Optional beam search decoder (pyctcdecode) + pretrained_language_model: null # KenLM model file: .arpa model file or .bin binary file. + beam_width: 32 + alpha: 0.5 + beta: 2.5 + + realigning_lm_parameters: # Experimental feature + arpa_language_model: null # Provide a KenLM language model in .arpa format. + min_number_of_words: 3 # Min number of words for the left context. + max_number_of_words: 10 # Max number of words for the right context. + logprob_diff_threshold: 1.2 # The threshold for the difference between two log probability values from two hypotheses. + diff --git a/nemo/collections/asr/metrics/der.py b/nemo/collections/asr/metrics/der.py index 000f05f10d11..78553032bc01 100644 --- a/nemo/collections/asr/metrics/der.py +++ b/nemo/collections/asr/metrics/der.py @@ -108,6 +108,54 @@ def score_labels( return None +def evaluate_der(audio_rttm_map_dict, all_reference, all_hypothesis, diar_eval_mode='all'): + """ + Evaluate with a selected diarization evaluation scheme + + AUDIO_RTTM_MAP (dict): + Dictionary containing information provided from manifestpath + all_reference (list[uniq_name,annotation]): + reference annotations for score calculation + all_hypothesis (list[uniq_name,annotation]): + hypothesis annotations for score calculation + diar_eval_mode (str): + Diarization evaluation modes + + diar_eval_mode == "full": + DIHARD challenge style evaluation, the most strict way of evaluating diarization + (collar, ignore_overlap) = (0.0, False) + diar_eval_mode == "fair": + Evaluation setup used in VoxSRC challenge + (collar, ignore_overlap) = (0.25, False) + diar_eval_mode == "forgiving": + Traditional evaluation setup + (collar, ignore_overlap) = (0.25, True) + diar_eval_mode == "all": + Compute all three modes (default) + """ + eval_settings = [] + if diar_eval_mode == "full": + eval_settings = [(0.0, False)] + elif diar_eval_mode == "fair": + eval_settings = [(0.25, False)] + elif diar_eval_mode == "forgiving": + eval_settings = [(0.25, True)] + elif diar_eval_mode == "all": + eval_settings = [(0.0, False), (0.25, False), (0.25, True)] + else: + raise ValueError("`diar_eval_mode` variable contains an unsupported value") + + for collar, ignore_overlap in eval_settings: + diar_score = score_labels( + AUDIO_RTTM_MAP=audio_rttm_map_dict, + all_reference=all_reference, + all_hypothesis=all_hypothesis, + collar=collar, + ignore_overlap=ignore_overlap, + ) + return diar_score + + def calculate_session_cpWER_bruteforce(spk_hypothesis: List[str], spk_reference: List[str]) -> Tuple[float, str, str]: """ Calculate cpWER with actual permutations in brute-force way when LSA algorithm cannot deliver the correct result. diff --git a/nemo/collections/asr/models/clustering_diarizer.py b/nemo/collections/asr/models/clustering_diarizer.py index a7c6b2e5a1f9..5b690f65e649 100644 --- a/nemo/collections/asr/models/clustering_diarizer.py +++ b/nemo/collections/asr/models/clustering_diarizer.py @@ -213,7 +213,7 @@ def _run_vad(self, manifest_file): data.append(get_uniqname_from_filepath(file)) status = get_vad_stream_status(data) - for i, test_batch in enumerate(tqdm(self._vad_model.test_dataloader(), desc='vad', leave=False)): + for i, test_batch in enumerate(tqdm(self._vad_model.test_dataloader(), desc='vad', leave=True)): test_batch = [x.to(self._device) for x in test_batch] with autocast(): log_probs = self._vad_model(input_signal=test_batch[0], input_signal_length=test_batch[1]) @@ -342,7 +342,7 @@ def _extract_embeddings(self, manifest_file: str, scale_idx: int, num_scales: in all_embs = torch.empty([0]) for test_batch in tqdm( - self._speaker_model.test_dataloader(), desc=f'[{scale_idx}/{num_scales}] extract embeddings', leave=False + self._speaker_model.test_dataloader(), desc=f'[{scale_idx+1}/{num_scales}] extract embeddings', leave=True ): test_batch = [x.to(self._device) for x in test_batch] audio_signal, audio_signal_len, labels, slices = test_batch diff --git a/nemo/collections/asr/parts/utils/diarization_utils.py b/nemo/collections/asr/parts/utils/diarization_utils.py index 19a8c2fe4632..f0b951eb89d3 100644 --- a/nemo/collections/asr/parts/utils/diarization_utils.py +++ b/nemo/collections/asr/parts/utils/diarization_utils.py @@ -187,6 +187,78 @@ def convert_word_dict_seq_to_ctm( return ctm_lines +def get_total_result_dict( + der_results: Dict[str, Dict[str, float]], wer_results: Dict[str, Dict[str, float]], csv_columns: List[str], +): + """ + Merge WER results and DER results into a single dictionary variable. + + Args: + der_results (dict): + Dictionary containing FA, MISS, CER and DER values for both aggregated amount and + each session. + wer_results (dict): + Dictionary containing session-by-session WER and cpWER. `wer_results` only + exists when CTM files are provided. + + Returns: + total_result_dict (dict): + Dictionary containing both DER and WER results. This dictionary contains unique-IDs of + each session and `total` key that includes average (cp)WER and DER/CER/Miss/FA values. + """ + total_result_dict = {} + for uniq_id in der_results.keys(): + if uniq_id == 'total': + continue + total_result_dict[uniq_id] = {x: "-" for x in csv_columns} + total_result_dict[uniq_id]["uniq_id"] = uniq_id + if uniq_id in der_results: + total_result_dict[uniq_id].update(der_results[uniq_id]) + if uniq_id in wer_results: + total_result_dict[uniq_id].update(wer_results[uniq_id]) + total_result_jsons = list(total_result_dict.values()) + return total_result_jsons + + +def get_audacity_label(word: str, stt_sec: float, end_sec: float, speaker: str) -> str: + """ + Get a string formatted line for Audacity label. + + Args: + word (str): + A decoded word + stt_sec (float): + Start timestamp of the word + end_sec (float): + End timestamp of the word + + Returns: + speaker (str): + Speaker label in string type + """ + spk = speaker.split('_')[-1] + return f'{stt_sec}\t{end_sec}\t[{spk}] {word}' + + +def get_num_of_spk_from_labels(labels: List[str]) -> int: + """ + Count the number of speakers in a segment label list. + Args: + labels (list): + List containing segment start and end timestamp and speaker labels. + + Example: + >>> labels = ["15.25 21.82 speaker_0", "21.18 29.51 speaker_1", ... ] + + Returns: + n_spk (int): + The number of speakers in the list `labels` + + """ + spk_set = [x.split(' ')[-1].strip() for x in labels] + return len(set(spk_set)) + + class OfflineDiarWithASR: """ A class designed for performing ASR and diarization together. @@ -248,7 +320,12 @@ def __init__(self, cfg_diarizer): self.make_file_lists() - self.color_palette = { + self.color_palette = self.get_color_palette() + self.csv_columns = self.get_csv_columns() + + @staticmethod + def get_color_palette() -> Dict[str, str]: + return { 'speaker_0': '\033[1;32m', 'speaker_1': '\033[1;34m', 'speaker_2': '\033[1;30m', @@ -262,7 +339,9 @@ def __init__(self, cfg_diarizer): 'white': '\033[0;37m', } - self.csv_columns = [ + @staticmethod + def get_csv_columns() -> List[str]: + return [ 'uniq_id', 'DER', 'CER', @@ -347,15 +426,20 @@ def _save_VAD_labels_list(self, word_ts_dict: Dict[str, Dict[str, List[float]]]) """ self.VAD_RTTM_MAP = {} for idx, (uniq_id, word_timestamps) in enumerate(word_ts_dict.items()): - speech_labels_float = self._get_speech_labels_from_decoded_prediction(word_timestamps) - speech_labels = self._get_str_speech_labels(speech_labels_float) + speech_labels_float = self.get_speech_labels_from_decoded_prediction( + word_timestamps, self.nonspeech_threshold + ) + speech_labels = self.get_str_speech_labels(speech_labels_float) output_path = os.path.join(self.root_path, 'pred_rttms') if not os.path.exists(output_path): os.makedirs(output_path) filename = labels_to_rttmfile(speech_labels, uniq_id, output_path) self.VAD_RTTM_MAP[uniq_id] = {'audio_filepath': self.audio_file_list[idx], 'rttm_filepath': filename} - def _get_speech_labels_from_decoded_prediction(self, input_word_ts: List[float]) -> List[float]: + @staticmethod + def get_speech_labels_from_decoded_prediction( + input_word_ts: List[float], nonspeech_threshold: float, + ) -> List[float]: """ Extract speech labels from the ASR output (decoded predictions) @@ -375,7 +459,7 @@ def _get_speech_labels_from_decoded_prediction(self, input_word_ts: List[float]) count = len(word_ts) - 1 while count > 0: if len(word_ts) > 1: - if word_ts[count][0] - word_ts[count - 1][1] <= self.nonspeech_threshold: + if word_ts[count][0] - word_ts[count - 1][1] <= nonspeech_threshold: trangeB = word_ts.pop(count) trangeA = word_ts.pop(count - 1) word_ts.insert(count - 1, [trangeA[0], trangeB[1]]) @@ -445,8 +529,13 @@ def _get_frame_level_VAD(self, vad_processing_dir, smoothing_type=False): frame_vad_float_list.append(float(line.strip())) self.frame_VAD[uniq_id] = frame_vad_float_list + @staticmethod def gather_eval_results( - self, metric, mapping_dict: Dict[str, str], trans_info_dict: Dict[str, Dict[str, float]], decimals: int = 4 + diar_score, + audio_rttm_map_dict: Dict[str, Dict[str, str]], + trans_info_dict: Dict[str, Dict[str, float]], + root_path: str, + decimals: int = 4, ) -> Dict[str, Dict[str, float]]: """ Gather diarization evaluation results from pyannote DiarizationErrorRate metric object. @@ -466,22 +555,22 @@ def gather_eval_results( der_results (dict): Dictionary containing scores for each audio file along with aggregated results """ + metric, mapping_dict, _ = diar_score results = metric.results_ der_results = {} count_correct_spk_counting = 0 for result in results: key, score = result - pred_rttm = os.path.join(self.root_path, 'pred_rttms', key + '.rttm') + if 'hyp_rttm_filepath' in audio_rttm_map_dict[key]: + pred_rttm = audio_rttm_map_dict[key]['hyp_rttm_filepath'] + else: + pred_rttm = os.path.join(root_path, 'pred_rttms', key + '.rttm') pred_labels = rttm_to_labels(pred_rttm) - ref_rttm = self.AUDIO_RTTM_MAP[key]['rttm_filepath'] + ref_rttm = audio_rttm_map_dict[key]['rttm_filepath'] ref_labels = rttm_to_labels(ref_rttm) - ref_n_spk = self.get_num_of_spk_from_labels(ref_labels) - est_n_spk = self.get_num_of_spk_from_labels(pred_labels) - - if self.cfg_diarizer['oracle_vad']: - score['missed detection'] = 0 - score['false alarm'] = 0 + ref_n_spk = get_num_of_spk_from_labels(ref_labels) + est_n_spk = get_num_of_spk_from_labels(pred_labels) _DER, _CER, _FA, _MISS = ( (score['confusion'] + score['false alarm'] + score['missed detection']) / score['total'], @@ -783,7 +872,7 @@ def _make_json_output( sentences, terms_list = [], [] sentence = {'speaker': speaker, 'start_time': start_point, 'end_time': end_point, 'text': ''} - n_spk = self.get_num_of_spk_from_labels(diar_labels) + n_spk = get_num_of_spk_from_labels(diar_labels) logging.info(f"Creating results for Session: {uniq_id} n_spk: {n_spk} ") session_trans_dict = self._init_session_trans_dict(uniq_id=uniq_id, n_spk=n_spk) gecko_dict = self._init_session_gecko_dict() @@ -817,7 +906,7 @@ def _make_json_output( # add current word to sentence sentence['text'] += word.strip() + ' ' - audacity_label_words.append(self.get_audacity_label(word, stt_sec, end_sec, speaker)) + audacity_label_words.append(get_audacity_label(word, stt_sec, end_sec, speaker)) prev_speaker = speaker session_trans_dict['words'] = word_dict_seq_list @@ -831,8 +920,7 @@ def _make_json_output( session_trans_dict['transcription'] = ' '.join(word_seq_list) # add sentences to transcription information dict session_trans_dict['sentences'] = sentences - - self.write_and_log(uniq_id, session_trans_dict, audacity_label_words, gecko_dict, sentences) + self._write_and_log(uniq_id, session_trans_dict, audacity_label_words, gecko_dict, sentences) return session_trans_dict def _get_realignment_ranges(self, k: int, word_seq_len: int) -> Tuple[int, int]: @@ -950,14 +1038,28 @@ def realign_words_with_lm(self, word_dict_seq_list: List[Dict[str, float]]) -> L realigned_list.append(line_dict) return realigned_list - def evaluate(self, trans_info_dict: Dict[str, Dict[str, float]]) -> Dict[str, Dict[str, float]]: + @staticmethod + def evaluate( + audio_file_list: List[str], + hyp_trans_info_dict: Dict[str, Dict[str, float]], + hyp_ctm_file_list: List[str] = None, + ref_ctm_file_list: List[str] = None, + ) -> Dict[str, Dict[str, float]]: """ Evaluate the result transcripts based on the provided CTM file. WER and cpWER are calculated to assess the performance of ASR system and diarization at the same time. Args: - trans_info_dict (dict): - Dictionary containing overall results of diarization and ASR inference from all sessions. + audio_file_list (list): + List containing file path to the input audio files. + hyp_trans_info_dict (dict): + Dictionary containing the hypothesis transcriptions for all sessions. + hyp_ctm_file_list (list): + List containing file paths of the hypothesis transcriptions in CTM format for all sessions. + ref_ctm_file_list (list): + List containing file paths of the reference transcriptions in CTM format for all sessions. + + Note: Either `hyp_trans_info_dict` or `hyp_ctm_file_list` should be provided. Returns: wer_results (dict): @@ -965,15 +1067,30 @@ def evaluate(self, trans_info_dict: Dict[str, Dict[str, float]]) -> Dict[str, Di """ wer_results = {} - if self.ctm_exists: + if ref_ctm_file_list is not None: spk_hypotheses, spk_references = [], [] mix_hypotheses, mix_references = [], [] WER_values, uniq_id_list = [], [] - for (audio_file_path, ctm_file_path) in zip(self.audio_file_list, self.ctm_file_list): + for k, (audio_file_path, ctm_file_path) in enumerate(zip(audio_file_list, ref_ctm_file_list)): uniq_id = get_uniqname_from_filepath(audio_file_path) uniq_id_list.append(uniq_id) - spk_hypothesis, mix_hypothesis = convert_word_dict_seq_to_text(trans_info_dict[uniq_id]['words']) + if uniq_id != get_uniqname_from_filepath(ctm_file_path): + raise ValueError("audio_file_list has mismatch in uniq_id with ctm_file_path") + + # Either hypothesis CTM file or hyp_trans_info_dict should be provided + if hyp_ctm_file_list is not None: + if uniq_id == get_uniqname_from_filepath(hyp_ctm_file_list[k]): + spk_hypothesis, mix_hypothesis = convert_ctm_to_text(hyp_ctm_file_list[k]) + else: + raise ValueError("Hypothesis CTM files are provided but uniq_id is mismatched") + elif hyp_trans_info_dict is not None and uniq_id in hyp_trans_info_dict: + spk_hypothesis, mix_hypothesis = convert_word_dict_seq_to_text( + hyp_trans_info_dict[uniq_id]['words'] + ) + else: + raise ValueError("Hypothesis information is not provided in the correct format.") + spk_reference, mix_reference = convert_ctm_to_text(ctm_file_path) spk_hypotheses.append(spk_hypothesis) @@ -999,7 +1116,8 @@ def evaluate(self, trans_info_dict: Dict[str, Dict[str, float]]) -> Dict[str, Di return wer_results - def _get_str_speech_labels(self, speech_labels_float: List[List[float]]) -> List[str]: + @staticmethod + def get_str_speech_labels(speech_labels_float: List[List[float]]) -> List[str]: """ Convert floating point speech labels list to a list containing string values. @@ -1014,8 +1132,13 @@ def _get_str_speech_labels(self, speech_labels_float: List[List[float]]) -> List speech_labels.append("{:.3f} {:.3f} speech".format(start, end)) return speech_labels + @staticmethod def write_session_level_result_in_csv( - self, der_results: Dict[str, Dict[str, float]], wer_results: Dict[str, Dict[str, float]] + der_results: Dict[str, Dict[str, float]], + wer_results: Dict[str, Dict[str, float]], + root_path: str, + csv_columns: List[str], + csv_file_name: str = "ctm_eval.csv", ): """ This function is for development use when a CTM file is provided. @@ -1026,50 +1149,19 @@ def write_session_level_result_in_csv( Dictionary containing session-by-session results of ASR and diarization in terms of WER and cpWER. """ - target_path = f"{self.root_path}/pred_rttms/ctm_eval.csv" - logging.info(f"Writing {target_path}") - total_result_jsons = self.get_total_result_dict(der_results, wer_results) + target_path = f"{root_path}/pred_rttms" + os.makedirs(target_path, exist_ok=True) + logging.info(f"Writing {target_path}/{csv_file_name}") + total_result_jsons = get_total_result_dict(der_results, wer_results, csv_columns) try: - with open(target_path, 'w') as csvfile: - writer = csv.DictWriter(csvfile, fieldnames=self.csv_columns) + with open(f"{target_path}/{csv_file_name}", 'w') as csvfile: + writer = csv.DictWriter(csvfile, fieldnames=csv_columns) writer.writeheader() for data in total_result_jsons: writer.writerow(data) except IOError: logging.info("I/O error has occurred while writing a csv file.") - def get_total_result_dict( - self, der_results: Dict[str, Dict[str, float]], wer_results: Dict[str, Dict[str, float]] - ): - """ - Merge WER results and DER results into a single dictionary variable. - - Args: - der_results (dict): - Dictionary containing FA, MISS, CER and DER values for both aggregated amount and - each session. - wer_results (dict): - Dictionary containing session-by-session WER and cpWER. `wer_results` only - exists when CTM files are provided. - - Returns: - total_result_dict (dict): - Dictionary containing both DER and WER results. This dictionary contains unique-IDs of - each session and `total` key that includes average (cp)WER and DER/CER/Miss/FA values. - """ - total_result_dict = {} - for uniq_id in der_results.keys(): - if uniq_id == 'total': - continue - total_result_dict[uniq_id] = {x: "-" for x in self.csv_columns} - total_result_dict[uniq_id]["uniq_id"] = uniq_id - if uniq_id in der_results: - total_result_dict[uniq_id].update(der_results[uniq_id]) - if uniq_id in wer_results: - total_result_dict[uniq_id].update(wer_results[uniq_id]) - total_result_jsons = list(total_result_dict.values()) - return total_result_jsons - def _break_lines(self, string_out: str, max_chars_in_line: int = 90) -> str: """ Break the lines in the transcript. @@ -1102,7 +1194,7 @@ def _break_lines(self, string_out: str, max_chars_in_line: int = 90) -> str: return_string_out = '\n'.join(return_string_out) return return_string_out - def write_and_log( + def _write_and_log( self, uniq_id: str, session_trans_dict: Dict[str, Dict[str, float]], @@ -1131,13 +1223,16 @@ def write_and_log( string_out = self._break_lines(string_out) session_trans_dict["status"] = "success" + ctm_lines_list = convert_word_dict_seq_to_ctm(session_trans_dict['words']) dump_json_to_file(f'{self.root_path}/pred_rttms/{uniq_id}.json', session_trans_dict) dump_json_to_file(f'{self.root_path}/pred_rttms/{uniq_id}_gecko.json', gecko_dict) + write_txt(f'{self.root_path}/pred_rttms/{uniq_id}.ctm', '\n'.join(ctm_lines_list)) write_txt(f'{self.root_path}/pred_rttms/{uniq_id}.txt', string_out.strip()) write_txt(f'{self.root_path}/pred_rttms/{uniq_id}.w.label', '\n'.join(audacity_label_words)) - def print_errors(self, der_results: Dict[str, Dict[str, float]], wer_results: Dict[str, Dict[str, float]]): + @staticmethod + def print_errors(der_results: Dict[str, Dict[str, float]], wer_results: Dict[str, Dict[str, float]]): """ Print a slew of error metrics for ASR and Diarization. @@ -1154,7 +1249,7 @@ def print_errors(self, der_results: Dict[str, Dict[str, float]], wer_results: Di \nMISS : {der_results['total']['MISS']:.4f} \ \nCER : {der_results['total']['CER']:.4f} \ \nSpk. counting acc. : {der_results['total']['spk_counting_acc']:.4f}" - if self.ctm_exists: + if wer_results is not None and len(wer_results) > 0: logging.info( DER_info + f"\ncpWER : {wer_results['total']['average_cpWER']:.4f} \ @@ -1162,7 +1257,6 @@ def print_errors(self, der_results: Dict[str, Dict[str, float]], wer_results: Di ) else: logging.info(DER_info) - self.write_session_level_result_in_csv(der_results, wer_results) def print_sentences(self, sentences: List[Dict[str, float]]): """ @@ -1210,42 +1304,3 @@ def print_sentences(self, sentences: List[Dict[str, float]]): string_out += f'{color}{time_str}{speaker}: {text}\n' return string_out - - @staticmethod - def get_audacity_label(word: str, stt_sec: float, end_sec: float, speaker: str) -> str: - """ - Get a string formatted line for Audacity label. - - Args: - word (str): - A decoded word - stt_sec (float): - Start timestamp of the word - end_sec (float): - End timestamp of the word - - Returns: - speaker (str): - Speaker label in string type - """ - spk = speaker.split('_')[-1] - return f'{stt_sec}\t{end_sec}\t[{spk}] {word}' - - @staticmethod - def get_num_of_spk_from_labels(labels: List[str]) -> int: - """ - Count the number of speakers in a segment label list. - Args: - labels (list): - List containing segment start and end timestamp and speaker labels. - - Example: - >>> labels = ["15.25 21.82 speaker_0", "21.18 29.51 speaker_1", ... ] - - Returns: - n_spk (int): - The number of speakers in the list `labels` - - """ - spk_set = [x.split(' ')[-1].strip() for x in labels] - return len(set(spk_set)) diff --git a/nemo/collections/asr/parts/utils/speaker_utils.py b/nemo/collections/asr/parts/utils/speaker_utils.py index cae43d779f5e..f5cb7bce60b7 100644 --- a/nemo/collections/asr/parts/utils/speaker_utils.py +++ b/nemo/collections/asr/parts/utils/speaker_utils.py @@ -435,7 +435,7 @@ def perform_clustering(embs_and_timestamps, AUDIO_RTTM_MAP, out_rttm_dir, cluste speaker_clustering = torch.jit.script(speaker_clustering) torch.jit.save(speaker_clustering, 'speaker_clustering_script.pt') - for uniq_id, audio_rttm_values in tqdm(AUDIO_RTTM_MAP.items(), desc='clustering', leave=False): + for uniq_id, audio_rttm_values in tqdm(AUDIO_RTTM_MAP.items(), desc='clustering', leave=True): uniq_embs_and_timestamps = embs_and_timestamps[uniq_id] if clustering_params.oracle_num_speakers: diff --git a/nemo/collections/asr/parts/utils/vad_utils.py b/nemo/collections/asr/parts/utils/vad_utils.py index 0def54871c63..f3e64472d21d 100644 --- a/nemo/collections/asr/parts/utils/vad_utils.py +++ b/nemo/collections/asr/parts/utils/vad_utils.py @@ -87,13 +87,13 @@ def prepare_manifest(config: dict) -> str: p.imap(write_vad_infer_manifest_star, inputs), total=len(input_list), desc='splitting manifest', - leave=False, + leave=True, ) ) else: results = [ write_vad_infer_manifest(input_el, args_func) - for input_el in tqdm(input_list, desc='splitting manifest', leave=False) + for input_el in tqdm(input_list, desc='splitting manifest', leave=True) ] if os.path.exists(manifest_vad_input): @@ -282,12 +282,12 @@ def generate_overlap_vad_seq( p.imap(generate_overlap_vad_seq_per_file_star, inputs), total=len(frame_filepathlist), desc='generating preds', - leave=False, + leave=True, ) ) else: - for frame_filepath in tqdm(frame_filepathlist, desc='generating preds', leave=False): + for frame_filepath in tqdm(frame_filepathlist, desc='generating preds', leave=True): generate_overlap_vad_seq_per_file(frame_filepath, per_args) return overlap_out_dir @@ -731,12 +731,12 @@ def generate_vad_segment_table( p.imap(generate_vad_segment_table_per_file_star, inputs), total=len(vad_pred_filepath_list), desc='creating speech segments', - leave=False, + leave=True, ) ) else: - for vad_pred_filepath in tqdm(vad_pred_filepath_list, desc='creating speech segments', leave=False): + for vad_pred_filepath in tqdm(vad_pred_filepath_list, desc='creating speech segments', leave=True): generate_vad_segment_table_per_file(vad_pred_filepath, per_args) return table_out_dir diff --git a/scripts/speaker_tasks/eval_diar_with_asr.py b/scripts/speaker_tasks/eval_diar_with_asr.py new file mode 100644 index 000000000000..9fc651e953cd --- /dev/null +++ b/scripts/speaker_tasks/eval_diar_with_asr.py @@ -0,0 +1,243 @@ +# Copyright (c) 2020, NVIDIA CORPORATION. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import argparse +import json +import os + +from nemo.collections.asr.metrics.der import evaluate_der +from nemo.collections.asr.parts.utils.diarization_utils import OfflineDiarWithASR +from nemo.collections.asr.parts.utils.manifest_utils import read_file +from nemo.collections.asr.parts.utils.speaker_utils import ( + get_uniqname_from_filepath, + labels_to_pyannote_object, + rttm_to_labels, +) + + +""" +Evaluation script for diarization with ASR. +Calculates Diarization Error Rate (DER) with RTTM files and WER and cpWER with CTM files. +In the output ctm_eval.csv file in the output folder, +session-level DER, WER, cpWER and speaker counting accuracies are evaluated. + +- Evaluation mode + +diar_eval_mode == "full": + DIHARD challenge style evaluation, the most strict way of evaluating diarization + (collar, ignore_overlap) = (0.0, False) +diar_eval_mode == "fair": + Evaluation setup used in VoxSRC challenge + (collar, ignore_overlap) = (0.25, False) +diar_eval_mode == "forgiving": + Traditional evaluation setup + (collar, ignore_overlap) = (0.25, True) +diar_eval_mode == "all": + Compute all three modes (default) + + +Use CTM files to calculate WER and cpWER +``` +python eval_diar_with_asr.py \ + --hyp_rttm_list="/path/to/hypothesis_rttm_filepaths.list" \ + --ref_rttm_list="/path/to/reference_rttm_filepaths.list" \ + --hyp_ctm_list="/path/to/hypothesis_ctm_filepaths.list" \ + --ref_ctm_list="/path/to/reference_ctm_filepaths.list" \ + --root_path="/path/to/output/directory" +``` + +Use .json files to calculate WER and cpWER +``` +python eval_diar_with_asr.py \ + --hyp_rttm_list="/path/to/hypothesis_rttm_filepaths.list" \ + --ref_rttm_list="/path/to/reference_rttm_filepaths.list" \ + --hyp_json_list="/path/to/hypothesis_json_filepaths.list" \ + --ref_ctm_list="/path/to/reference_ctm_filepaths.list" \ + --root_path="/path/to/output/directory" +``` + +Only use RTTMs to calculate DER +``` +python eval_diar_with_asr.py \ + --hyp_rttm_list="/path/to/hypothesis_rttm_filepaths.list" \ + --ref_rttm_list="/path/to/reference_rttm_filepaths.list" \ + --root_path="/path/to/output/directory" +``` + +""" + + +def get_pyannote_objs_from_rttms(rttm_file_path_list): + """Generate PyAnnote objects from RTTM file list + """ + pyannote_obj_list = [] + for rttm_file in rttm_file_path_list: + rttm_file = rttm_file.strip() + if rttm_file is not None and os.path.exists(rttm_file): + uniq_id = get_uniqname_from_filepath(rttm_file) + ref_labels = rttm_to_labels(rttm_file) + reference = labels_to_pyannote_object(ref_labels, uniq_name=uniq_id) + pyannote_obj_list.append([uniq_id, reference]) + return pyannote_obj_list + + +def make_meta_dict(hyp_rttm_list, ref_rttm_list): + """Create a temporary `audio_rttm_map_dict` for evaluation + """ + meta_dict = {} + for k, rttm_file in enumerate(ref_rttm_list): + uniq_id = get_uniqname_from_filepath(rttm_file) + meta_dict[uniq_id] = {"rttm_filepath": rttm_file.strip()} + if hyp_rttm_list is not None: + hyp_rttm_file = hyp_rttm_list[k] + meta_dict[uniq_id].update({"hyp_rttm_filepath": hyp_rttm_file.strip()}) + return meta_dict + + +def make_trans_info_dict(hyp_json_list_path): + """Create `trans_info_dict` from the `.json` files + """ + trans_info_dict = {} + for json_file in hyp_json_list_path: + json_file = json_file.strip() + with open(json_file) as jsf: + json_data = json.load(jsf) + uniq_id = get_uniqname_from_filepath(json_file) + trans_info_dict[uniq_id] = json_data + return trans_info_dict + + +def read_file_path(list_path): + """Read file path and strip to remove line change symbol + """ + return sorted([x.strip() for x in read_file(list_path)]) + + +def main( + hyp_rttm_list_path: str, + ref_rttm_list_path: str, + hyp_ctm_list_path: str, + ref_ctm_list_path: str, + hyp_json_list_path: str, + diar_eval_mode: str = "all", + root_path: str = "./", +): + + # Read filepath list files + hyp_rttm_list = read_file_path(hyp_rttm_list_path) if hyp_rttm_list_path else None + ref_rttm_list = read_file_path(ref_rttm_list_path) if ref_rttm_list_path else None + hyp_ctm_list = read_file_path(hyp_ctm_list_path) if hyp_ctm_list_path else None + ref_ctm_list = read_file_path(ref_ctm_list_path) if ref_ctm_list_path else None + hyp_json_list = read_file_path(hyp_json_list_path) if hyp_json_list_path else None + + audio_rttm_map_dict = make_meta_dict(hyp_rttm_list, ref_rttm_list) + + trans_info_dict = make_trans_info_dict(hyp_json_list) if hyp_json_list else None + + all_hypothesis = get_pyannote_objs_from_rttms(hyp_rttm_list) + all_reference = get_pyannote_objs_from_rttms(ref_rttm_list) + + diar_score = evaluate_der( + audio_rttm_map_dict=audio_rttm_map_dict, + all_reference=all_reference, + all_hypothesis=all_hypothesis, + diar_eval_mode=diar_eval_mode, + ) + + # Get session-level diarization error rate and speaker counting error + der_results = OfflineDiarWithASR.gather_eval_results( + diar_score=diar_score, + audio_rttm_map_dict=audio_rttm_map_dict, + trans_info_dict=trans_info_dict, + root_path=root_path, + ) + + if ref_ctm_list is not None: + # Calculate WER and cpWER if reference CTM files exist + if hyp_ctm_list is not None: + wer_results = OfflineDiarWithASR.evaluate( + audio_file_list=hyp_rttm_list, + hyp_trans_info_dict=None, + hyp_ctm_file_list=hyp_ctm_list, + ref_ctm_file_list=ref_ctm_list, + ) + elif hyp_json_list is not None: + wer_results = OfflineDiarWithASR.evaluate( + audio_file_list=hyp_rttm_list, + hyp_trans_info_dict=trans_info_dict, + hyp_ctm_file_list=None, + ref_ctm_file_list=ref_ctm_list, + ) + else: + raise ValueError("Hypothesis information is not provided in the correct format.") + else: + wer_results = {} + + # Print average DER, WER and cpWER + OfflineDiarWithASR.print_errors(der_results=der_results, wer_results=wer_results) + + # Save detailed session-level evaluation results in `root_path`. + OfflineDiarWithASR.write_session_level_result_in_csv( + der_results=der_results, + wer_results=wer_results, + root_path=root_path, + csv_columns=OfflineDiarWithASR.get_csv_columns(), + ) + return None + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument( + "--hyp_rttm_list", help="path to the filelist of hypothesis RTTM files", type=str, required=True, default=None + ) + parser.add_argument( + "--ref_rttm_list", help="path to the filelist of reference RTTM files", type=str, required=True, default=None + ) + parser.add_argument( + "--hyp_ctm_list", help="path to the filelist of hypothesis CTM files", type=str, required=False, default=None + ) + parser.add_argument( + "--ref_ctm_list", help="path to the filelist of reference CTM files", type=str, required=False, default=None + ) + parser.add_argument( + "--hyp_json_list", + help="(Optional) path to the filelist of hypothesis JSON files", + type=str, + required=False, + default=None, + ) + parser.add_argument( + "--diar_eval_mode", + help='evaluation mode: "all", "full", "fair", "forgiving"', + type=str, + required=False, + default="all", + ) + parser.add_argument( + "--root_path", help='directory for saving result files', type=str, required=False, default="./" + ) + + args = parser.parse_args() + + main( + args.hyp_rttm_list, + args.ref_rttm_list, + args.hyp_ctm_list, + args.ref_ctm_list, + args.hyp_json_list, + args.diar_eval_mode, + args.root_path, + ) diff --git a/tutorials/speaker_tasks/ASR_with_SpeakerDiarization.ipynb b/tutorials/speaker_tasks/ASR_with_SpeakerDiarization.ipynb index 70e1c3b60fd7..08d41c9736a2 100644 --- a/tutorials/speaker_tasks/ASR_with_SpeakerDiarization.ipynb +++ b/tutorials/speaker_tasks/ASR_with_SpeakerDiarization.ipynb @@ -69,24 +69,9 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/taejinp/anaconda3/lib/python3.9/site-packages/pkg_resources/__init__.py:123: PkgResourcesDeprecationWarning: 4.0.0-unsupported is an invalid version and will not be supported in a future release\n", - " warnings.warn(\n", - "/home/taejinp/anaconda3/lib/python3.9/site-packages/pkg_resources/__init__.py:123: PkgResourcesDeprecationWarning: 4.0.0-unsupported is an invalid version and will not be supported in a future release\n", - " warnings.warn(\n", - "[NeMo W 2022-11-10 16:20:15 optimizers:55] Apex was not found. Using the lamb or fused_adam optimizer will error out.\n", - "[NeMo W 2022-11-10 16:20:27 nemo_logging:349] /home/taejinp/anaconda3/lib/python3.9/site-packages/torch/jit/annotations.py:296: UserWarning: TorchScript will treat type annotations of Tensor dtype-specific subtypes as if they are normal Tensors. dtype constraints are not enforced in compilation either.\n", - " warnings.warn(\"TorchScript will treat type annotations of Tensor \"\n", - " \n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "import nemo.collections.asr as nemo_asr\n", "import numpy as np\n", @@ -112,35 +97,9 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Input audio file list: \n", - " ['/home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/data/an4_diarize_test.wav']\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - " \n", - " " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "ROOT = os.getcwd()\n", "data_dir = os.path.join(ROOT,'data')\n", @@ -168,7 +127,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -211,22 +170,9 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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nDlz+OxnP8trr73GwYMHeeGFFzjzzDNDjz8aBCdwwYFhOi+88ELGz8aNGwfA8ccfz/z587Me30hWWVnJs88+223Y/v37efXVV5k4cSLl5eVArKVG8l/4S1Io8KEPfajf6/fMM89k165dVFdXs3btWhoaGvjlL39JW1sbv/nNb7jlllv0P8uyu+++m8OHDyf+t4GPfexj7Nq1a1it78rKSpqbm4d1kqalpYW2tjbuuOMOzj33XO6///5uJ6ojYRlExqJt27axcuVK7rvvPm677Tba2tr4wx/+oESTiMgwotvoJLSuri4uvPDCRNLngQce6DVJkG8TJkzg1VdfTftZSUlJ6KTR7t27WbZsGa+//nq/5l9QUMCvfvUrHfjE7d69m6VLl/Z521U606dP5/bbbx9WJ9LDRXl5OX/+85/7PV5JSQkHDhxgypQprFu3js2bN+uEegQ4+eSTueuuu1i0aBHnnHMOr7zyCqWlpTQ1Nen/JyIiIiJDLtNtdEW9jPDRsBN3960DDUxGjvnz53PrrbeyefNmWltbWbJkSej+XTKprq5m3759rFmzhubmZtra2mhvb+fgwYNUVFTw1FNPUVBQQGFhYb+TFEGiKbnvn6KiIg4ePMh73vOe0NNZvHgx48aN61eyqaCggJ/97GdKNCVZvHgxt912G6tXr2b//v1p6xQXF2NmvP7668ydO5dZs2ZRWlrKlVdeqURTBu973/vYvn172s/MDHdnypQpHH300dxzzz1AbD0fOHCAmpoabr/9diUpRpB9+/YBsdaAmzdvzm8wIiIiIiIZZEw2AR8JOQ0HlGwag0499VROPfVUvvnNb4buABpirVRKSkrSdoB99dVXc/XVVyfet7S0cNlllyWSRb21VpowYQKTJ0/uEUtyJ9MHDx6koaGBL37xi6HjBRg/fjwvvfRS6Pof/vCHx9ztcmEsXryYSCTCySefzCOPPEJRURH/+Z//ybe//W3MjCuvvJKKigquueYa1q9fryRICJdeeimvvvoq1113HYcOHUoMDxJNAM8//zzFxcVArG+aK664gq985Sts3bpV63iE+e53v8v69ev71b+WiIiIiMhQy5hscvd5QxmIjBxNTU2UlZUlkgEtLS287W1v4/HHH0/Uqa2t5aWXXmLz5s1cddVVzJgxgzvvvJNvfetb/Wrt88tf/hKI9TVTUVHBY489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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "display_waveform(signal)" ] @@ -241,110 +187,9 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "name: ClusterDiarizer\n", - "num_workers: 1\n", - "sample_rate: 16000\n", - "batch_size: 64\n", - "diarizer:\n", - " manifest_filepath: ???\n", - " out_dir: ???\n", - " oracle_vad: false\n", - " collar: 0.25\n", - " ignore_overlap: true\n", - " vad:\n", - " model_path: vad_multilingual_marblenet\n", - " external_vad_manifest: null\n", - " parameters:\n", - " window_length_in_sec: 0.63\n", - " shift_length_in_sec: 0.01\n", - " smoothing: false\n", - " overlap: 0.5\n", - " onset: 0.9\n", - " offset: 0.5\n", - " pad_onset: 0\n", - " pad_offset: 0\n", - " min_duration_on: 0\n", - " min_duration_off: 0.6\n", - " filter_speech_first: true\n", - " speaker_embeddings:\n", - " model_path: titanet_large\n", - " parameters:\n", - " window_length_in_sec:\n", - " - 3.0\n", - " - 2.5\n", - " - 2.0\n", - " - 1.5\n", - " - 1.0\n", - " - 0.5\n", - " shift_length_in_sec:\n", - " - 1.5\n", - " - 1.25\n", - " - 1.0\n", - " - 0.75\n", - " - 0.5\n", - " - 0.25\n", - " multiscale_weights:\n", - " - 1\n", - " - 1\n", - " - 1\n", - " - 1\n", - " - 1\n", - " - 1\n", - " save_embeddings: true\n", - " clustering:\n", - " parameters:\n", - " oracle_num_speakers: false\n", - " max_num_speakers: 8\n", - " enhanced_count_thres: 80\n", - " max_rp_threshold: 0.25\n", - " sparse_search_volume: 30\n", - " maj_vote_spk_count: false\n", - " msdd_model:\n", - " model_path: null\n", - " parameters:\n", - " use_speaker_model_from_ckpt: true\n", - " infer_batch_size: 25\n", - " sigmoid_threshold:\n", - " - 0.7\n", - " seq_eval_mode: false\n", - " split_infer: true\n", - " diar_window_length: 50\n", - " overlap_infer_spk_limit: 5\n", - " asr:\n", - " model_path: stt_en_conformer_ctc_large\n", - " parameters:\n", - " asr_based_vad: false\n", - " asr_based_vad_threshold: 1.0\n", - " asr_batch_size: null\n", - " lenient_overlap_WDER: true\n", - " decoder_delay_in_sec: null\n", - " word_ts_anchor_offset: null\n", - " word_ts_anchor_pos: start\n", - " fix_word_ts_with_VAD: false\n", - " colored_text: false\n", - " print_time: true\n", - " break_lines: false\n", - " ctc_decoder_parameters:\n", - " pretrained_language_model: null\n", - " beam_width: 32\n", - " alpha: 0.5\n", - " beta: 2.5\n", - " realigning_lm_parameters:\n", - " arpa_language_model: null\n", - " min_number_of_words: 3\n", - " max_number_of_words: 10\n", - " logprob_diff_threshold: 1.2\n", - "\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "from omegaconf import OmegaConf\n", "import shutil\n", @@ -389,17 +234,9 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{\"audio_filepath\": \"/home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/data/an4_diarize_test.wav\", \"offset\": 0, \"duration\": null, \"label\": \"infer\", \"text\": \"-\", \"num_speakers\": null, \"rttm_filepath\": null, \"uem_filepath\": null}\r\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# Create a manifest file for input with below format. \n", "# {\"audio_filepath\": \"/path/to/audio_file\", \"offset\": 0, \"duration\": null, \"label\": \"infer\", \"text\": \"-\", \n", @@ -432,7 +269,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -467,126 +304,9 @@ }, { "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:20:28 speaker_utils:92] Number of files to diarize: 1\n", - "[NeMo I 2022-11-10 16:20:28 cloud:56] Found existing object /home/taejinp/.cache/torch/NeMo/NeMo_1.13.0rc0/stt_en_conformer_ctc_large/afb212c5bcf904e326b5e5751e7c7465/stt_en_conformer_ctc_large.nemo.\n", - "[NeMo I 2022-11-10 16:20:28 cloud:62] Re-using file from: /home/taejinp/.cache/torch/NeMo/NeMo_1.13.0rc0/stt_en_conformer_ctc_large/afb212c5bcf904e326b5e5751e7c7465/stt_en_conformer_ctc_large.nemo\n", - "[NeMo I 2022-11-10 16:20:28 common:911] Instantiating model from pre-trained checkpoint\n", - "[NeMo I 2022-11-10 16:20:29 mixins:170] Tokenizer SentencePieceTokenizer initialized with 128 tokens\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[NeMo W 2022-11-10 16:20:29 modelPT:142] If you intend to do training or fine-tuning, please call the ModelPT.setup_training_data() method and provide a valid configuration file to setup the train data loader.\n", - " Train config : \n", - " manifest_filepath:\n", - " - - /data2/nemo_asr/nemo_asr_set_3.0/bucket1/tarred_audio_manifest.json\n", - " - - /data2/nemo_asr/nemo_asr_set_3.0/bucket2/tarred_audio_manifest.json\n", - " - - /data2/nemo_asr/nemo_asr_set_3.0/bucket3/tarred_audio_manifest.json\n", - " - - /data2/nemo_asr/nemo_asr_set_3.0/bucket4/tarred_audio_manifest.json\n", - " - - /data2/nemo_asr/nemo_asr_set_3.0/bucket5/tarred_audio_manifest.json\n", - " - - /data2/nemo_asr/nemo_asr_set_3.0/bucket6/tarred_audio_manifest.json\n", - " - - /data2/nemo_asr/nemo_asr_set_3.0/bucket7/tarred_audio_manifest.json\n", - " - - /data2/nemo_asr/nemo_asr_set_3.0/bucket8/tarred_audio_manifest.json\n", - " sample_rate: 16000\n", - " batch_size: 1\n", - " shuffle: true\n", - " num_workers: 4\n", - " pin_memory: true\n", - " use_start_end_token: false\n", - " trim_silence: false\n", - " max_duration: 20.0\n", - " min_duration: 0.1\n", - " is_tarred: true\n", - " tarred_audio_filepaths:\n", - " - - /data2/nemo_asr/nemo_asr_set_3.0/bucket1/audio__OP_0..8191_CL_.tar\n", - " - - /data2/nemo_asr/nemo_asr_set_3.0/bucket2/audio__OP_0..8191_CL_.tar\n", - " - - /data2/nemo_asr/nemo_asr_set_3.0/bucket3/audio__OP_0..8191_CL_.tar\n", - " - - /data2/nemo_asr/nemo_asr_set_3.0/bucket4/audio__OP_0..8191_CL_.tar\n", - " - - /data2/nemo_asr/nemo_asr_set_3.0/bucket5/audio__OP_0..8191_CL_.tar\n", - " - - /data2/nemo_asr/nemo_asr_set_3.0/bucket6/audio__OP_0..8191_CL_.tar\n", - " - - /data2/nemo_asr/nemo_asr_set_3.0/bucket7/audio__OP_0..8191_CL_.tar\n", - " - - /data2/nemo_asr/nemo_asr_set_3.0/bucket8/audio__OP_0..8191_CL_.tar\n", - " shuffle_n: 2048\n", - " bucketing_strategy: synced_randomized\n", - " bucketing_batch_size:\n", - " - 34\n", - " - 30\n", - " - 26\n", - " - 22\n", - " - 18\n", - " - 16\n", - " - 12\n", - " - 8\n", - " \n", - "[NeMo W 2022-11-10 16:20:29 modelPT:149] If you intend to do validation, please call the ModelPT.setup_validation_data() or ModelPT.setup_multiple_validation_data() method and provide a valid configuration file to setup the validation data loader(s). \n", - " Validation config : \n", - " manifest_filepath:\n", - " - /manifests/librispeech/librivox-dev-other.json\n", - " - /manifests/librispeech/librivox-dev-clean.json\n", - " - /manifests/librispeech/librivox-test-other.json\n", - " - /manifests/librispeech/librivox-test-clean.json\n", - " sample_rate: 16000\n", - " batch_size: 32\n", - " shuffle: false\n", - " num_workers: 8\n", - " pin_memory: true\n", - " use_start_end_token: false\n", - " \n", - "[NeMo W 2022-11-10 16:20:29 modelPT:155] Please call the ModelPT.setup_test_data() or ModelPT.setup_multiple_test_data() method and provide a valid configuration file to setup the test data loader(s).\n", - " Test config : \n", - " manifest_filepath:\n", - " - /manifests/librispeech/librivox-dev-other.json\n", - " - /manifests/librispeech/librivox-dev-clean.json\n", - " - /manifests/librispeech/librivox-test-other.json\n", - " - /manifests/librispeech/librivox-test-clean.json\n", - " sample_rate: 16000\n", - " batch_size: 32\n", - " shuffle: false\n", - " num_workers: 8\n", - " pin_memory: true\n", - " use_start_end_token: false\n", - " \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:20:29 features:225] PADDING: 0\n", - "[NeMo I 2022-11-10 16:20:33 save_restore_connector:243] Model EncDecCTCModelBPE was successfully restored from /home/taejinp/.cache/torch/NeMo/NeMo_1.13.0rc0/stt_en_conformer_ctc_large/afb212c5bcf904e326b5e5751e7c7465/stt_en_conformer_ctc_large.nemo.\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[NeMo W 2022-11-10 16:20:33 decoder_timestamps_utils:66] `ctc_decode` was set to True. Note that this is ignored.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:20:33 features:225] PADDING: 0\n", - "[NeMo I 2022-11-10 16:20:33 features:225] PADDING: 0\n", - "[NeMo I 2022-11-10 16:20:33 decoder_timestamps_utils:640] Running ASR model stt_en_conformer_ctc_large\n", - "[NeMo I 2022-11-10 16:20:33 decoder_timestamps_utils:644] [1/1] FrameBatchASR: /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/data/an4_diarize_test.wav\n", - "Decoded word output dictionary: \n", - " ['eleven', 'twenty', 'seven', 'fifty', 'seven', 'october', 'twenty', 'fourth', 'nineteen', 'seventy']\n", - "Word-level timestamps dictionary: \n", - " [[0.36, 0.68], [0.92, 1.28], [1.4, 1.64], [1.92, 2.28], [2.36, 2.6], [3.08, 3.52], [3.6, 3.84], [3.88, 4.12], [4.4, 4.72], [4.84, 5.16]]\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "from nemo.collections.asr.parts.utils.decoder_timestamps_utils import ASRDecoderTimeStamps\n", "asr_decoder_ts = ASRDecoderTimeStamps(cfg.diarizer)\n", @@ -606,17 +326,9 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:20:35 speaker_utils:92] Number of files to diarize: 1\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "from nemo.collections.asr.parts.utils.diarization_utils import OfflineDiarWithASR\n", "asr_diar_offline = OfflineDiarWithASR(cfg.diarizer)\n", @@ -646,321 +358,9 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:20:35 clustering_diarizer:129] Loading pretrained vad_multilingual_marblenet model from NGC\n", - "[NeMo I 2022-11-10 16:20:35 cloud:56] Found existing object /home/taejinp/.cache/torch/NeMo/NeMo_1.13.0rc0/vad_multilingual_marblenet/670f425c7f186060b7a7268ba6dfacb2/vad_multilingual_marblenet.nemo.\n", - "[NeMo I 2022-11-10 16:20:35 cloud:62] Re-using file from: /home/taejinp/.cache/torch/NeMo/NeMo_1.13.0rc0/vad_multilingual_marblenet/670f425c7f186060b7a7268ba6dfacb2/vad_multilingual_marblenet.nemo\n", - "[NeMo I 2022-11-10 16:20:35 common:911] Instantiating model from pre-trained checkpoint\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[NeMo W 2022-11-10 16:20:35 modelPT:142] If you intend to do training or fine-tuning, please call the ModelPT.setup_training_data() method and provide a valid configuration file to setup the train data loader.\n", - " Train config : \n", - " manifest_filepath: /manifests/ami_train_0.63.json,/manifests/freesound_background_train.json,/manifests/freesound_laughter_train.json,/manifests/fisher_2004_background.json,/manifests/fisher_2004_speech_sampled.json,/manifests/google_train_manifest.json,/manifests/icsi_all_0.63.json,/manifests/musan_freesound_train.json,/manifests/musan_music_train.json,/manifests/musan_soundbible_train.json,/manifests/mandarin_train_sample.json,/manifests/german_train_sample.json,/manifests/spanish_train_sample.json,/manifests/french_train_sample.json,/manifests/russian_train_sample.json\n", - " sample_rate: 16000\n", - " labels:\n", - " - background\n", - " - speech\n", - " batch_size: 256\n", - " shuffle: true\n", - " is_tarred: false\n", - " tarred_audio_filepaths: null\n", - " tarred_shard_strategy: scatter\n", - " augmentor:\n", - " shift:\n", - " prob: 0.5\n", - " min_shift_ms: -10.0\n", - " max_shift_ms: 10.0\n", - " white_noise:\n", - " prob: 0.5\n", - " min_level: -90\n", - " max_level: -46\n", - " norm: true\n", - " noise:\n", - " prob: 0.5\n", - " manifest_path: /manifests/noise_0_1_musan_fs.json\n", - " min_snr_db: 0\n", - " max_snr_db: 30\n", - " max_gain_db: 300.0\n", - " norm: true\n", - " gain:\n", - " prob: 0.5\n", - " min_gain_dbfs: -10.0\n", - " max_gain_dbfs: 10.0\n", - " norm: true\n", - " num_workers: 16\n", - " pin_memory: true\n", - " \n", - "[NeMo W 2022-11-10 16:20:35 modelPT:149] If you intend to do validation, please call the ModelPT.setup_validation_data() or ModelPT.setup_multiple_validation_data() method and provide a valid configuration file to setup the validation data loader(s). \n", - " Validation config : \n", - " manifest_filepath: /manifests/ami_dev_0.63.json,/manifests/freesound_background_dev.json,/manifests/freesound_laughter_dev.json,/manifests/ch120_moved_0.63.json,/manifests/fisher_2005_500_speech_sampled.json,/manifests/google_dev_manifest.json,/manifests/musan_music_dev.json,/manifests/mandarin_dev.json,/manifests/german_dev.json,/manifests/spanish_dev.json,/manifests/french_dev.json,/manifests/russian_dev.json\n", - " sample_rate: 16000\n", - " labels:\n", - " - background\n", - " - speech\n", - " batch_size: 256\n", - " shuffle: false\n", - " val_loss_idx: 0\n", - " num_workers: 16\n", - " pin_memory: true\n", - " \n", - "[NeMo W 2022-11-10 16:20:35 modelPT:155] Please call the ModelPT.setup_test_data() or ModelPT.setup_multiple_test_data() method and provide a valid configuration file to setup the test data loader(s).\n", - " Test config : \n", - " manifest_filepath: null\n", - " sample_rate: 16000\n", - " labels:\n", - " - background\n", - " - speech\n", - " batch_size: 128\n", - " shuffle: false\n", - " test_loss_idx: 0\n", - " \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:20:35 features:225] PADDING: 16\n", - "[NeMo I 2022-11-10 16:20:35 save_restore_connector:243] Model EncDecClassificationModel was successfully restored from /home/taejinp/.cache/torch/NeMo/NeMo_1.13.0rc0/vad_multilingual_marblenet/670f425c7f186060b7a7268ba6dfacb2/vad_multilingual_marblenet.nemo.\n", - "[NeMo I 2022-11-10 16:20:35 clustering_diarizer:156] Loading pretrained titanet_large model from NGC\n", - "[NeMo I 2022-11-10 16:20:35 cloud:56] Found existing object /home/taejinp/.cache/torch/NeMo/NeMo_1.13.0rc0/titanet-l/492c0ab8416139171dc18c21879a9e45/titanet-l.nemo.\n", - "[NeMo I 2022-11-10 16:20:35 cloud:62] Re-using file from: /home/taejinp/.cache/torch/NeMo/NeMo_1.13.0rc0/titanet-l/492c0ab8416139171dc18c21879a9e45/titanet-l.nemo\n", - "[NeMo I 2022-11-10 16:20:35 common:911] Instantiating model from pre-trained checkpoint\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[NeMo W 2022-11-10 16:20:36 modelPT:142] If you intend to do training or fine-tuning, please call the ModelPT.setup_training_data() method and provide a valid configuration file to setup the train data loader.\n", - " Train config : \n", - " manifest_filepath: /manifests/combined_fisher_swbd_voxceleb12_librispeech/train.json\n", - " sample_rate: 16000\n", - " labels: null\n", - " batch_size: 64\n", - " shuffle: true\n", - " time_length: 3\n", - " is_tarred: false\n", - " tarred_audio_filepaths: null\n", - " tarred_shard_strategy: scatter\n", - " augmentor:\n", - " noise:\n", - " manifest_path: /manifests/noise/rir_noise_manifest.json\n", - " prob: 0.5\n", - " min_snr_db: 0\n", - " max_snr_db: 15\n", - " speed:\n", - " prob: 0.5\n", - " sr: 16000\n", - " resample_type: kaiser_fast\n", - " min_speed_rate: 0.95\n", - " max_speed_rate: 1.05\n", - " num_workers: 15\n", - " pin_memory: true\n", - " \n", - "[NeMo W 2022-11-10 16:20:36 modelPT:149] If you intend to do validation, please call the ModelPT.setup_validation_data() or ModelPT.setup_multiple_validation_data() method and provide a valid configuration file to setup the validation data loader(s). \n", - " Validation config : \n", - " manifest_filepath: /manifests/combined_fisher_swbd_voxceleb12_librispeech/dev.json\n", - " sample_rate: 16000\n", - " labels: null\n", - " batch_size: 128\n", - " shuffle: false\n", - " time_length: 3\n", - " num_workers: 15\n", - " pin_memory: true\n", - " \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:20:36 label_models:126] Setting angular: true/false in decoder is deprecated and will be removed in 1.13 version, use specific loss with _target_\n", - "[NeMo I 2022-11-10 16:20:36 features:225] PADDING: 16\n", - "[NeMo I 2022-11-10 16:20:37 save_restore_connector:243] Model EncDecSpeakerLabelModel was successfully restored from /home/taejinp/.cache/torch/NeMo/NeMo_1.13.0rc0/titanet-l/492c0ab8416139171dc18c21879a9e45/titanet-l.nemo.\n", - "[NeMo I 2022-11-10 16:20:37 speaker_utils:92] Number of files to diarize: 1\n", - "[NeMo I 2022-11-10 16:20:37 clustering_diarizer:303] Split long audio file to avoid CUDA memory issue\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:20:38 vad_utils:100] The prepared manifest file exists. Overwriting!\n", - "[NeMo I 2022-11-10 16:20:38 classification_models:247] Perform streaming frame-level VAD\n", - "[NeMo I 2022-11-10 16:20:38 collections:296] Filtered duration for loading collection is 0.000000.\n", - "[NeMo I 2022-11-10 16:20:38 collections:300] # 1 files loaded accounting to # 1 labels\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:20:38 clustering_diarizer:258] Converting frame level prediction to speech/no-speech segment in start and end times format.\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:20:38 clustering_diarizer:281] Subsegmentation for embedding extraction: scale0, /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/data/speaker_outputs/subsegments_scale0.json\n", - "[NeMo I 2022-11-10 16:20:38 clustering_diarizer:336] Extracting embeddings for Diarization\n", - "[NeMo I 2022-11-10 16:20:38 collections:296] Filtered duration for loading collection is 0.000000.\n", - "[NeMo I 2022-11-10 16:20:38 collections:300] # 3 files loaded accounting to # 1 labels\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:20:38 clustering_diarizer:380] Saved embedding files to /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/data/speaker_outputs/embeddings\n", - "[NeMo I 2022-11-10 16:20:38 clustering_diarizer:281] Subsegmentation for embedding extraction: scale1, /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/data/speaker_outputs/subsegments_scale1.json\n", - "[NeMo I 2022-11-10 16:20:38 clustering_diarizer:336] Extracting embeddings for Diarization\n", - "[NeMo I 2022-11-10 16:20:38 collections:296] Filtered duration for loading collection is 0.000000.\n", - "[NeMo I 2022-11-10 16:20:38 collections:300] # 4 files loaded accounting to # 1 labels\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:20:39 clustering_diarizer:380] Saved embedding files to /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/data/speaker_outputs/embeddings\n", - "[NeMo I 2022-11-10 16:20:39 clustering_diarizer:281] Subsegmentation for embedding extraction: scale2, /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/data/speaker_outputs/subsegments_scale2.json\n", - "[NeMo I 2022-11-10 16:20:39 clustering_diarizer:336] Extracting embeddings for Diarization\n", - "[NeMo I 2022-11-10 16:20:39 collections:296] Filtered duration for loading collection is 0.000000.\n", - "[NeMo I 2022-11-10 16:20:39 collections:300] # 5 files loaded accounting to # 1 labels\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:20:39 clustering_diarizer:380] Saved embedding files to /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/data/speaker_outputs/embeddings\n", - "[NeMo I 2022-11-10 16:20:39 clustering_diarizer:281] Subsegmentation for embedding extraction: scale3, /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/data/speaker_outputs/subsegments_scale3.json\n", - "[NeMo I 2022-11-10 16:20:39 clustering_diarizer:336] Extracting embeddings for Diarization\n", - "[NeMo I 2022-11-10 16:20:39 collections:296] Filtered duration for loading collection is 0.000000.\n", - "[NeMo I 2022-11-10 16:20:39 collections:300] # 6 files loaded accounting to # 1 labels\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:20:39 clustering_diarizer:380] Saved embedding files to /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/data/speaker_outputs/embeddings\n", - "[NeMo I 2022-11-10 16:20:39 clustering_diarizer:281] Subsegmentation for embedding extraction: scale4, /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/data/speaker_outputs/subsegments_scale4.json\n", - "[NeMo I 2022-11-10 16:20:39 clustering_diarizer:336] Extracting embeddings for Diarization\n", - "[NeMo I 2022-11-10 16:20:39 collections:296] Filtered duration for loading collection is 0.000000.\n", - "[NeMo I 2022-11-10 16:20:39 collections:300] # 10 files loaded accounting to # 1 labels\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:20:39 clustering_diarizer:380] Saved embedding files to /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/data/speaker_outputs/embeddings\n", - "[NeMo I 2022-11-10 16:20:39 clustering_diarizer:281] Subsegmentation for embedding extraction: scale5, /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/data/speaker_outputs/subsegments_scale5.json\n", - "[NeMo I 2022-11-10 16:20:39 clustering_diarizer:336] Extracting embeddings for Diarization\n", - "[NeMo I 2022-11-10 16:20:39 collections:296] Filtered duration for loading collection is 0.000000.\n", - "[NeMo I 2022-11-10 16:20:39 collections:300] # 20 files loaded accounting to # 1 labels\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:20:40 clustering_diarizer:380] Saved embedding files to /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/data/speaker_outputs/embeddings\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[NeMo W 2022-11-10 16:20:42 der:105] Check if each ground truth RTTMs were present in the provided manifest file. Skipping calculation of Diariazation Error Rate\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:20:42 clustering_diarizer:455] Outputs are saved in /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/data directory\n", - "Diarization hypothesis output: \n", - " ['0.07 2.695 speaker_0', '2.695 5.199999999999999 speaker_1']\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "diar_hyp, diar_score = asr_diar_offline.run_diarization(cfg, word_ts_hyp)\n", "print(\"Diarization hypothesis output: \\n\", diar_hyp['an4_diarize_test'])" @@ -975,47 +375,9 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[ 'SPEAKER an4_diarize_test 1 0.070 2.625 speaker_0 ',\n", - " 'SPEAKER an4_diarize_test 1 2.695 2.505 speaker_1 ']\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - " \n", - " " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "def read_file(path_to_file):\n", " with open(path_to_file) as f:\n", @@ -1046,18 +408,9 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:20:43 diarization_utils:787] Creating results for Session: an4_diarize_test n_spk: 2 \n", - "[NeMo I 2022-11-10 16:20:43 diarization_utils:660] Diarization with ASR output files are saved in: /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/data/pred_rttms\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "trans_info_dict = asr_diar_offline.get_transcript_with_speaker_labels(diar_hyp, word_hyp, word_ts_hyp)" ] @@ -1071,18 +424,9 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[ '[00:00.07 - 00:02.60] speaker_0: eleven twenty seven fifty seven',\n", - " '[00:03.08 - 00:05.16] speaker_1: october twenty fourth nineteen seventy']\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "transcription_path_to_file = f\"{data_dir}/pred_rttms/an4_diarize_test.txt\"\n", "transcript = read_file(transcription_path_to_file)\n", @@ -1100,99 +444,9 @@ }, { "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[ '{',\n", - " ' \"status\": \"success\",',\n", - " ' \"session_id\": \"an4_diarize_test\",',\n", - " ' \"transcription\": \"eleven twenty seven fifty seven october twenty '\n", - " 'fourth nineteen seventy\",',\n", - " ' \"speaker_count\": 2,',\n", - " ' \"words\": [',\n", - " ' {',\n", - " ' \"word\": \"eleven\",',\n", - " ' \"start_time\": 0.36,',\n", - " ' \"end_time\": 0.68,',\n", - " ' \"speaker\": \"speaker_0\"',\n", - " ' },',\n", - " ' {',\n", - " ' \"word\": \"twenty\",',\n", - " ' \"start_time\": 0.92,',\n", - " ' \"end_time\": 1.28,',\n", - " ' \"speaker\": \"speaker_0\"',\n", - " ' },',\n", - " ' {',\n", - " ' \"word\": \"seven\",',\n", - " ' \"start_time\": 1.4,',\n", - " ' \"end_time\": 1.64,',\n", - " ' \"speaker\": \"speaker_0\"',\n", - " ' },',\n", - " ' {',\n", - " ' \"word\": \"fifty\",',\n", - " ' \"start_time\": 1.92,',\n", - " ' \"end_time\": 2.28,',\n", - " ' \"speaker\": \"speaker_0\"',\n", - " ' },',\n", - " ' {',\n", - " ' \"word\": \"seven\",',\n", - " ' \"start_time\": 2.36,',\n", - " ' \"end_time\": 2.6,',\n", - " ' \"speaker\": \"speaker_0\"',\n", - " ' },',\n", - " ' {',\n", - " ' \"word\": \"october\",',\n", - " ' \"start_time\": 3.08,',\n", - " ' \"end_time\": 3.52,',\n", - " ' \"speaker\": \"speaker_1\"',\n", - " ' },',\n", - " ' {',\n", - " ' \"word\": \"twenty\",',\n", - " ' \"start_time\": 3.6,',\n", - " ' \"end_time\": 3.84,',\n", - " ' \"speaker\": \"speaker_1\"',\n", - " ' },',\n", - " ' {',\n", - " ' \"word\": \"fourth\",',\n", - " ' \"start_time\": 3.88,',\n", - " ' \"end_time\": 4.12,',\n", - " ' \"speaker\": \"speaker_1\"',\n", - " ' },',\n", - " ' {',\n", - " ' \"word\": \"nineteen\",',\n", - " ' \"start_time\": 4.4,',\n", - " ' \"end_time\": 4.72,',\n", - " ' \"speaker\": \"speaker_1\"',\n", - " ' },',\n", - " ' {',\n", - " ' \"word\": \"seventy\",',\n", - " ' \"start_time\": 4.84,',\n", - " ' \"end_time\": 5.16,',\n", - " ' \"speaker\": \"speaker_1\"',\n", - " ' }',\n", - " ' ],',\n", - " ' \"sentences\": [',\n", - " ' {',\n", - " ' \"speaker\": \"speaker_0\",',\n", - " ' \"start_time\": \"0.07\",',\n", - " ' \"end_time\": 2.6,',\n", - " ' \"text\": \"eleven twenty seven fifty seven\"',\n", - " ' },',\n", - " ' {',\n", - " ' \"speaker\": \"speaker_1\",',\n", - " ' \"start_time\": 3.08,',\n", - " ' \"end_time\": 5.16,',\n", - " ' \"text\": \"october twenty fourth nineteen seventy\"',\n", - " ' }',\n", - " ' ]',\n", - " '}']\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "transcription_path_to_file = f\"{data_dir}/pred_rttms/an4_diarize_test.json\"\n", "json_contents = read_file(transcription_path_to_file)\n", @@ -1227,7 +481,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1259,20 +513,11 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": { "scrolled": true }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "word_seq_lists:\n", - " [{'word': 'eleven', 'start_time': 0.36, 'end_time': 0.68, 'speaker': 'speaker_0'}, {'word': 'twenty', 'start_time': 0.92, 'end_time': 1.28, 'speaker': 'speaker_0'}, {'word': 'seven', 'start_time': 1.4, 'end_time': 1.64, 'speaker': 'speaker_0'}, {'word': 'fifty', 'start_time': 1.92, 'end_time': 2.28, 'speaker': 'speaker_0'}, {'word': 'seven', 'start_time': 2.36, 'end_time': 2.6, 'speaker': 'speaker_0'}, {'word': 'october', 'start_time': 3.08, 'end_time': 3.52, 'speaker': 'speaker_1'}, {'word': 'twenty', 'start_time': 3.6, 'end_time': 3.84, 'speaker': 'speaker_1'}, {'word': 'fourth', 'start_time': 3.88, 'end_time': 4.12, 'speaker': 'speaker_1'}, {'word': 'nineteen', 'start_time': 4.4, 'end_time': 4.72, 'speaker': 'speaker_1'}, {'word': 'seventy', 'start_time': 4.84, 'end_time': 5.16, 'speaker': 'speaker_1'}]\n" - ] - } - ], + "outputs": [], "source": [ "from nemo.collections.asr.parts.utils.speaker_utils import get_uniqname_from_filepath\n", "\n", @@ -1301,7 +546,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1327,7 +572,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1351,21 +596,9 @@ }, { "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "spk_hypothesis: ['eleven twenty seven fifty seven', 'october twenty fourth nineteen seventy']\n", - "mix_hypothesis: eleven twenty seven fifty seven october twenty fourth nineteen seventy\n", - "\n", - "spk_reference: ['eleven twenty seven fifty seven', 'october twenty fourth nineteen seventy']\n", - "mix_reference: eleven twenty seven fifty seven october twenty fourth nineteen seventy\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "from nemo.collections.asr.metrics.der import concat_perm_word_error_rate\n", "from nemo.collections.asr.metrics.wer import word_error_rate\n", @@ -1396,20 +629,9 @@ }, { "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "cpWER: 0.0\n", - "WER: 0.0\n", - "concat_hyp: eleven twenty seven fifty seven october twenty fourth nineteen seventy\n", - "concat_ref: eleven twenty seven fifty seven october twenty fourth nineteen seventy\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "from nemo.collections.asr.metrics.der import concat_perm_word_error_rate \n", "from nemo.collections.asr.metrics.wer import word_error_rate\n", @@ -1434,23 +656,9 @@ }, { "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "spk_hypothesis: ['eleven twenty seven fifty seven', 'october twenty fourth nineteen seventy']\n", - "mix_hypothesis: eleven twenty seven fifty seven october twenty fourth nineteen seventy\n", - "\n", - "spk_reference: ['eleven twenty seven fifty seven', 'october twenty fourth nineteen seventy']\n", - "mix_reference: eleven twenty seven fifty seven october twenty fourth nineteen seventy\n", - "cpWER: 0.0\n", - "WER: 0.0\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "from nemo.collections.asr.parts.utils.diarization_utils import convert_word_dict_seq_to_text\n", "\n", @@ -1499,18 +707,9 @@ }, { "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{\"audio_filepath\": \"/home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/data/an4_diarize_test.wav\", \"offset\": 0, \"duration\": null, \"label\": \"infer\", \"text\": \"-\", \"num_speakers\": 2, \"rttm_filepath\": null, \"ctm_filepath\": \"/home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/data/an4_diarize_test.ctm\", \"uem_filepath\": null}\n", - "[NeMo I 2022-11-10 16:20:43 speaker_utils:92] Number of files to diarize: 1\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# Create a new manifest file for input with the reference CTM file. \n", "meta = {\n", @@ -1545,23 +744,15 @@ }, { "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:20:43 diarization_utils:787] Creating results for Session: an4_diarize_test n_spk: 2 \n", - "[NeMo I 2022-11-10 16:20:43 diarization_utils:660] Diarization with ASR output files are saved in: /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/data/pred_rttms\n", - "cpWER: 0.0\n", - "WER: 0.0\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ + "from nemo.collections.asr.parts.utils.diarization_utils import OfflineDiarWithASR\n", "trans_info_dict = asr_diar_offline.get_transcript_with_speaker_labels(diar_hyp, word_hyp, word_ts_hyp)\n", - "session_result_dict = asr_diar_offline.evaluate(trans_info_dict)\n", + "session_result_dict = OfflineDiarWithASR.evaluate(hyp_trans_info_dict=trans_info_dict,\n", + " audio_file_list=asr_diar_offline.audio_file_list,\n", + " ref_ctm_file_list=asr_diar_offline.ctm_file_list)\n", "session_result_dict['an4_diarize_test']\n", "\n", "print(\"cpWER:\", session_result_dict['an4_diarize_test']['cpWER'])\n", @@ -1580,25 +771,9 @@ }, { "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied: pyctcdecode in /home/taejinp/anaconda3/lib/python3.9/site-packages (0.4.0)\n", - "Requirement already satisfied: pygtrie<3.0,>=2.1 in /home/taejinp/anaconda3/lib/python3.9/site-packages (from pyctcdecode) (2.5.0)\n", - "Requirement already satisfied: hypothesis<7,>=6.14 in /home/taejinp/anaconda3/lib/python3.9/site-packages (from pyctcdecode) (6.56.3)\n", - "Requirement already satisfied: numpy<2.0.0,>=1.15.0 in /home/taejinp/anaconda3/lib/python3.9/site-packages (from pyctcdecode) (1.21.1)\n", - "Requirement already satisfied: exceptiongroup>=1.0.0rc8 in /home/taejinp/anaconda3/lib/python3.9/site-packages (from hypothesis<7,>=6.14->pyctcdecode) (1.0.0rc9)\n", - "Requirement already satisfied: sortedcontainers<3.0.0,>=2.1.0 in /home/taejinp/anaconda3/lib/python3.9/site-packages (from hypothesis<7,>=6.14->pyctcdecode) (2.4.0)\n", - "Requirement already satisfied: attrs>=19.2.0 in /home/taejinp/anaconda3/lib/python3.9/site-packages (from hypothesis<7,>=6.14->pyctcdecode) (21.2.0)\n", - "Collecting https://github.com/kpu/kenlm/archive/master.zip\n", - " Using cached https://github.com/kpu/kenlm/archive/master.zip\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "!pip install pyctcdecode\n", "!pip install https://github.com/kpu/kenlm/archive/master.zip" @@ -1613,17 +788,9 @@ }, { "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "100% [........................................................................] 99823907 / 99823907" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "import gzip\n", "import shutil\n", @@ -1647,7 +814,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1664,133 +831,9 @@ }, { "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:21:04 speaker_utils:92] Number of files to diarize: 1\n", - "[NeMo I 2022-11-10 16:21:04 cloud:56] Found existing object /home/taejinp/.cache/torch/NeMo/NeMo_1.13.0rc0/stt_en_conformer_ctc_large/afb212c5bcf904e326b5e5751e7c7465/stt_en_conformer_ctc_large.nemo.\n", - "[NeMo I 2022-11-10 16:21:04 cloud:62] Re-using file from: /home/taejinp/.cache/torch/NeMo/NeMo_1.13.0rc0/stt_en_conformer_ctc_large/afb212c5bcf904e326b5e5751e7c7465/stt_en_conformer_ctc_large.nemo\n", - "[NeMo I 2022-11-10 16:21:04 common:911] Instantiating model from pre-trained checkpoint\n", - "[NeMo I 2022-11-10 16:21:05 mixins:170] Tokenizer SentencePieceTokenizer initialized with 128 tokens\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[NeMo W 2022-11-10 16:21:05 modelPT:142] If you intend to do training or fine-tuning, please call the ModelPT.setup_training_data() method and provide a valid configuration file to setup the train data loader.\n", - " Train config : \n", - " manifest_filepath:\n", - " - - /data2/nemo_asr/nemo_asr_set_3.0/bucket1/tarred_audio_manifest.json\n", - " - - /data2/nemo_asr/nemo_asr_set_3.0/bucket2/tarred_audio_manifest.json\n", - " - - /data2/nemo_asr/nemo_asr_set_3.0/bucket3/tarred_audio_manifest.json\n", - " - - /data2/nemo_asr/nemo_asr_set_3.0/bucket4/tarred_audio_manifest.json\n", - " - - /data2/nemo_asr/nemo_asr_set_3.0/bucket5/tarred_audio_manifest.json\n", - " - - /data2/nemo_asr/nemo_asr_set_3.0/bucket6/tarred_audio_manifest.json\n", - " - - /data2/nemo_asr/nemo_asr_set_3.0/bucket7/tarred_audio_manifest.json\n", - " - - /data2/nemo_asr/nemo_asr_set_3.0/bucket8/tarred_audio_manifest.json\n", - " sample_rate: 16000\n", - " batch_size: 1\n", - " shuffle: true\n", - " num_workers: 4\n", - " pin_memory: true\n", - " use_start_end_token: false\n", - " trim_silence: false\n", - " max_duration: 20.0\n", - " min_duration: 0.1\n", - " is_tarred: true\n", - " tarred_audio_filepaths:\n", - " - - /data2/nemo_asr/nemo_asr_set_3.0/bucket1/audio__OP_0..8191_CL_.tar\n", - " - - /data2/nemo_asr/nemo_asr_set_3.0/bucket2/audio__OP_0..8191_CL_.tar\n", - " - - /data2/nemo_asr/nemo_asr_set_3.0/bucket3/audio__OP_0..8191_CL_.tar\n", - " - - /data2/nemo_asr/nemo_asr_set_3.0/bucket4/audio__OP_0..8191_CL_.tar\n", - " - - /data2/nemo_asr/nemo_asr_set_3.0/bucket5/audio__OP_0..8191_CL_.tar\n", - " - - /data2/nemo_asr/nemo_asr_set_3.0/bucket6/audio__OP_0..8191_CL_.tar\n", - " - - /data2/nemo_asr/nemo_asr_set_3.0/bucket7/audio__OP_0..8191_CL_.tar\n", - " - - /data2/nemo_asr/nemo_asr_set_3.0/bucket8/audio__OP_0..8191_CL_.tar\n", - " shuffle_n: 2048\n", - " bucketing_strategy: synced_randomized\n", - " bucketing_batch_size:\n", - " - 34\n", - " - 30\n", - " - 26\n", - " - 22\n", - " - 18\n", - " - 16\n", - " - 12\n", - " - 8\n", - " \n", - "[NeMo W 2022-11-10 16:21:05 modelPT:149] If you intend to do validation, please call the ModelPT.setup_validation_data() or ModelPT.setup_multiple_validation_data() method and provide a valid configuration file to setup the validation data loader(s). \n", - " Validation config : \n", - " manifest_filepath:\n", - " - /manifests/librispeech/librivox-dev-other.json\n", - " - /manifests/librispeech/librivox-dev-clean.json\n", - " - /manifests/librispeech/librivox-test-other.json\n", - " - /manifests/librispeech/librivox-test-clean.json\n", - " sample_rate: 16000\n", - " batch_size: 32\n", - " shuffle: false\n", - " num_workers: 8\n", - " pin_memory: true\n", - " use_start_end_token: false\n", - " \n", - "[NeMo W 2022-11-10 16:21:05 modelPT:155] Please call the ModelPT.setup_test_data() or ModelPT.setup_multiple_test_data() method and provide a valid configuration file to setup the test data loader(s).\n", - " Test config : \n", - " manifest_filepath:\n", - " - /manifests/librispeech/librivox-dev-other.json\n", - " - /manifests/librispeech/librivox-dev-clean.json\n", - " - /manifests/librispeech/librivox-test-other.json\n", - " - /manifests/librispeech/librivox-test-clean.json\n", - " sample_rate: 16000\n", - " batch_size: 32\n", - " shuffle: false\n", - " num_workers: 8\n", - " pin_memory: true\n", - " use_start_end_token: false\n", - " \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:21:05 features:225] PADDING: 0\n", - "[NeMo I 2022-11-10 16:21:07 save_restore_connector:243] Model EncDecCTCModelBPE was successfully restored from /home/taejinp/.cache/torch/NeMo/NeMo_1.13.0rc0/stt_en_conformer_ctc_large/afb212c5bcf904e326b5e5751e7c7465/stt_en_conformer_ctc_large.nemo.\n", - "[NeMo I 2022-11-10 16:21:07 decoder_timestamps_utils:380] Loading language model : /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/data/4gram_big.arpa\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Loading the LM will be faster if you build a binary file.\n", - "Reading /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/data/4gram_big.arpa\n", - "----5---10---15---20---25---30---35---40---45---50---55---60---65---70---75---80---85---90---95--100\n", - "****************************************************************************************************\n", - "Unigrams and labels don't seem to agree.\n", - "[NeMo W 2022-11-10 16:21:14 decoder_timestamps_utils:66] `ctc_decode` was set to True. Note that this is ignored.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:21:14 features:225] PADDING: 0\n", - "[NeMo I 2022-11-10 16:21:14 features:225] PADDING: 0\n", - "[NeMo I 2022-11-10 16:21:14 decoder_timestamps_utils:640] Running ASR model stt_en_conformer_ctc_large\n", - "[NeMo I 2022-11-10 16:21:14 decoder_timestamps_utils:644] [1/1] FrameBatchASR: /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/data/an4_diarize_test.wav\n", - "[NeMo I 2022-11-10 16:21:14 decoder_timestamps_utils:656] Running beam-search decoder with LM /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/data/4gram_big.arpa\n", - "Decoded word output dictionary: \n", - " ['eleven', 'twenty', 'seven', 'fifty', 'seven', 'october', 'twenty', 'four', 'nineteen', 'seventy']\n", - "Word-level timestamps dictionary: \n", - " [[0.27, 0.59], [0.83, 1.19], [1.31, 1.55], [1.83, 2.19], [2.27, 2.51], [2.99, 3.43], [3.51, 3.75], [3.79, 3.95], [4.27, 4.67], [4.75, 5.07]]\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "import importlib\n", "import nemo.collections.asr.parts.utils.decoder_timestamps_utils as decoder_timestamps_utils\n", @@ -1832,17 +875,9 @@ }, { "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied: arpa in /home/taejinp/anaconda3/lib/python3.9/site-packages (0.1.0b4)\r\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "!pip install arpa" ] @@ -1859,17 +894,9 @@ }, { "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:21:18 speaker_utils:92] Number of files to diarize: 1\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "arpa_model_path = os.path.join(data_dir, '4gram_big.arpa')\n", "cfg.diarizer.asr.realigning_lm_parameters.arpa_language_model = arpa_model_path\n", @@ -1893,103 +920,20 @@ }, { "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:21:18 diarization_utils:308] Loading LM for realigning: /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/data/4gram_big.arpa\n", - "[NeMo I 2022-11-10 16:22:12 diarization_utils:787] Creating results for Session: an4_diarize_test n_spk: 2 \n", - "[NeMo I 2022-11-10 16:22:12 diarization_utils:660] Diarization with ASR output files are saved in: /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/data/pred_rttms\n" - ] - }, - { - "data": { - "text/plain": [ - "{'an4_diarize_test': OrderedDict([('status', 'success'),\n", - " ('session_id', 'an4_diarize_test'),\n", - " ('transcription',\n", - " 'eleven twenty seven fifty seven october twenty four nineteen seventy'),\n", - " ('speaker_count', 2),\n", - " ('words',\n", - " [{'word': 'eleven',\n", - " 'start_time': 0.27,\n", - " 'end_time': 0.59,\n", - " 'speaker': 'speaker_0'},\n", - " {'word': 'twenty',\n", - " 'start_time': 0.83,\n", - " 'end_time': 1.19,\n", - " 'speaker': 'speaker_0'},\n", - " {'word': 'seven',\n", - " 'start_time': 1.31,\n", - " 'end_time': 1.55,\n", - " 'speaker': 'speaker_0'},\n", - " {'word': 'fifty',\n", - " 'start_time': 1.83,\n", - " 'end_time': 2.19,\n", - " 'speaker': 'speaker_0'},\n", - " {'word': 'seven',\n", - " 'start_time': 2.27,\n", - " 'end_time': 2.51,\n", - " 'speaker': 'speaker_0'},\n", - " {'word': 'october',\n", - " 'start_time': 2.99,\n", - " 'end_time': 3.43,\n", - " 'speaker': 'speaker_1'},\n", - " {'word': 'twenty',\n", - " 'start_time': 3.51,\n", - " 'end_time': 3.75,\n", - " 'speaker': 'speaker_1'},\n", - " {'word': 'four',\n", - " 'start_time': 3.79,\n", - " 'end_time': 3.95,\n", - " 'speaker': 'speaker_1'},\n", - " {'word': 'nineteen',\n", - " 'start_time': 4.27,\n", - " 'end_time': 4.67,\n", - " 'speaker': 'speaker_1'},\n", - " {'word': 'seventy',\n", - " 'start_time': 4.75,\n", - " 'end_time': 5.07,\n", - " 'speaker': 'speaker_1'}]),\n", - " ('sentences',\n", - " [{'speaker': 'speaker_0',\n", - " 'start_time': '0.07',\n", - " 'end_time': 2.51,\n", - " 'text': 'eleven twenty seven fifty seven'},\n", - " {'speaker': 'speaker_1',\n", - " 'start_time': 2.99,\n", - " 'end_time': 5.07,\n", - " 'text': 'october twenty four nineteen seventy'}])])}" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "asr_diar_offline.get_transcript_with_speaker_labels(diar_hyp, word_hyp, word_ts_hyp)" ] }, { "cell_type": "code", - "execution_count": 32, + "execution_count": null, "metadata": { "scrolled": true }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[ '[00:00.07 - 00:02.51] speaker_0: eleven twenty seven fifty seven',\n", - " '[00:02.99 - 00:05.07] speaker_1: october twenty four nineteen seventy']\n" - ] - } - ], + "outputs": [], "source": [ "transcription_path_to_file = f\"{data_dir}/pred_rttms/an4_diarize_test.txt\"\n", "transcript = read_file(transcription_path_to_file)\n", diff --git a/tutorials/speaker_tasks/Speaker_Diarization_Inference.ipynb b/tutorials/speaker_tasks/Speaker_Diarization_Inference.ipynb index dfaed8090931..64ceb49d7d64 100644 --- a/tutorials/speaker_tasks/Speaker_Diarization_Inference.ipynb +++ b/tutorials/speaker_tasks/Speaker_Diarization_Inference.ipynb @@ -210,7 +210,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -238,40 +238,9 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " " - ], - "text/plain": [ - "" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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HCWrjDExlfzUjgHUdVxVCjlHM1/fooYi+RIsK1euDMtxjDG88MILPP/882E5njens9QForKT4cpOjrw9+uijPPzww47aGmN45pln+Prrr32uD/XwTk/z588P6v4WLlzIE088weOPP87KlSspKCio00VfnfzvDz74YBgisbz99tvuv72TSr7cf//9vPrqq37Xv/LKK+W+td++fXu5BJznxZGvCQRCkbD79ttvKSws5I8//qj0on/VqlUhncVQ1T3+Jg9wIlTvmQ888ECVtw1mknnp0qUVri8pKakwUZ6Xl+e+bz3PS7Zs2cKXX37pvj1nzhyeeuqpiJ3HRdNnX2FhIY899hgPPfQQjzzySI3pffTMM88wderUgLc7dOhQWBPO+/btY9y4cUGZGCiaRNNzWCmntDCJcqvoIqYmeu+998pN1xqsnieh8Mcff4TtWJE8sSkuLg76tzuub+H82bJlS6Un1C6eJ9VOEgAuCxcu9NlzL5i1RCqafnjXrl0hOxE5ePAgH3zwAQ8//DCvvvpqjTkxjpRQdrWv7mO8bds2vzV7/A3XCTQB57R+RlW89957PP300xUm999//32ef/55XnnlFfcwyOzsbPLz83V4q6qyQIbQ+xLJiT5CqbLk9PLly32eXxYVFfHf//6XJ5980nEP3ry8PF5//fWQvsfURI8//jjPPPNMmVklo011Ez+HDx8mJycnSNFUzDVhyG+//RaW44XTs88+G3W98Ywx+ppWfjlOVonlTBF5XEQmiEhbe/mJItIidCGqUDPGsHnz5lr5TfSKFSvcyYJAiqpGwrx586Kui26oEmjPPfdc2BMen3zyid8eGSUlJRQUFLBjxw7uv/9+93J/Mf7xxx8+h+W9/PLLZe6z3bt3k5ubW73APbzwwgt+L7ZfeOGFoB2nItu3b+fxxx9n0qRJ7NmzJyzHDKeSkhKMMbz99tsVTgNdkfvvv7/SYaTBsmnTpoC3eeedd3jxxRf9rnea2I2kDz74gPnz55epZZOfn19mWJRnnbcXX3yRRx55hBdeeIHdu3ezfPlyZsyYod80K1VNTs5bfNWc2r9/f5XPeR599NEqbVcd0f5ekZOTE7VfyObk5ARcN9Hbvn37yhRlD4e1a9cGbehmsFU1ubN3796Azhu2bt3qTt4FmzGGr776ijfffJNHH32Ur7/+ml9++YXp06frF0vK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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "import IPython\n", "import matplotlib.pyplot as plt\n", @@ -303,24 +272,9 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/taejinp/anaconda3/lib/python3.9/site-packages/pkg_resources/__init__.py:123: PkgResourcesDeprecationWarning: 4.0.0-unsupported is an invalid version and will not be supported in a future release\n", - " warnings.warn(\n", - "/home/taejinp/anaconda3/lib/python3.9/site-packages/pkg_resources/__init__.py:123: PkgResourcesDeprecationWarning: 4.0.0-unsupported is an invalid version and will not be supported in a future release\n", - " warnings.warn(\n", - "[NeMo W 2022-11-10 16:14:22 optimizers:55] Apex was not found. Using the lamb or fused_adam optimizer will error out.\n", - "[NeMo W 2022-11-10 16:14:22 nemo_logging:349] /home/taejinp/anaconda3/lib/python3.9/site-packages/torch/jit/annotations.py:296: UserWarning: TorchScript will treat type annotations of Tensor dtype-specific subtypes as if they are normal Tensors. dtype constraints are not enforced in compilation either.\n", - " warnings.warn(\"TorchScript will treat type annotations of Tensor \"\n", - " \n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "from nemo.collections.asr.parts.utils.speaker_utils import rttm_to_labels, labels_to_pyannote_object" ] @@ -334,18 +288,9 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SPEAKER an4 1 0.298981 2.47133 A \r\n", - "SPEAKER an4 1 3.163901 1.98311 B \r\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# view the sample rttm file\n", "!cat {an4_rttm}" @@ -353,28 +298,9 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['0.299 2.77 A', '3.164 5.147 B']\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "labels = rttm_to_labels(an4_rttm)\n", "reference = labels_to_pyannote_object(labels)\n", @@ -410,17 +336,9 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{\"audio_filepath\": \"/home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/data/an4_diarize_test.wav\", \"offset\": 0, \"duration\": null, \"label\": \"infer\", \"text\": \"-\", \"num_speakers\": 2, \"rttm_filepath\": \"/home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/data/an4_diarize_test.rttm\", \"uem_filepath\": null}\r\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# Create a manifest for input with below format. \n", "# {'audio_filepath': /path/to/audio_file, 'offset': 0, 'duration':None, 'label': 'infer', 'text': '-', \n", @@ -474,107 +392,9 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "name: ClusterDiarizer\n", - "num_workers: 4\n", - "sample_rate: 16000\n", - "batch_size: 64\n", - "diarizer:\n", - " manifest_filepath: ???\n", - " out_dir: ???\n", - " oracle_vad: false\n", - " collar: 0.25\n", - " ignore_overlap: true\n", - " vad:\n", - " model_path: ???\n", - " external_vad_manifest: null\n", - " parameters:\n", - " window_length_in_sec: 0.15\n", - " shift_length_in_sec: 0.01\n", - " smoothing: median\n", - " overlap: 0.5\n", - " onset: 0.1\n", - " offset: 0.1\n", - " pad_onset: 0.1\n", - " pad_offset: 0\n", - " min_duration_on: 0\n", - " min_duration_off: 0.2\n", - " filter_speech_first: true\n", - " speaker_embeddings:\n", - " model_path: titanet_large\n", - " parameters:\n", - " window_length_in_sec:\n", - " - 1.5\n", - " - 1.25\n", - " - 1.0\n", - " - 0.75\n", - " - 0.5\n", - " shift_length_in_sec:\n", - " - 0.75\n", - " - 0.625\n", - " - 0.5\n", - " - 0.375\n", - " - 0.25\n", - " multiscale_weights:\n", - " - 1\n", - " - 1\n", - " - 1\n", - " - 1\n", - " - 1\n", - " save_embeddings: true\n", - " clustering:\n", - " parameters:\n", - " oracle_num_speakers: false\n", - " max_num_speakers: 8\n", - " enhanced_count_thres: 80\n", - " max_rp_threshold: 0.25\n", - " sparse_search_volume: 30\n", - " maj_vote_spk_count: false\n", - " msdd_model:\n", - " model_path: ???\n", - " parameters:\n", - " use_speaker_model_from_ckpt: true\n", - " infer_batch_size: 25\n", - " sigmoid_threshold:\n", - " - 0.7\n", - " seq_eval_mode: false\n", - " split_infer: true\n", - " diar_window_length: 50\n", - " overlap_infer_spk_limit: 5\n", - " asr:\n", - " model_path: ???\n", - " parameters:\n", - " asr_based_vad: false\n", - " asr_based_vad_threshold: 0.05\n", - " asr_batch_size: null\n", - " lenient_overlap_WDER: true\n", - " decoder_delay_in_sec: null\n", - " word_ts_anchor_offset: null\n", - " word_ts_anchor_pos: start\n", - " fix_word_ts_with_VAD: false\n", - " colored_text: false\n", - " print_time: true\n", - " break_lines: false\n", - " ctc_decoder_parameters:\n", - " pretrained_language_model: null\n", - " beam_width: 32\n", - " alpha: 0.5\n", - " beta: 2.5\n", - " realigning_lm_parameters:\n", - " arpa_language_model: null\n", - " min_number_of_words: 3\n", - " max_number_of_words: 10\n", - " logprob_diff_threshold: 1.2\n", - "\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "from omegaconf import OmegaConf\n", "MODEL_CONFIG = os.path.join(data_dir,'diar_infer_telephonic.yaml')\n", @@ -597,7 +417,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -628,93 +448,9 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[NeMo W 2022-11-10 16:14:23 model_utils:422] Skipped conversion for config/subconfig:\n", - " {'model_path': '???', 'external_vad_manifest': None, 'parameters': {'window_length_in_sec': 0.15, 'shift_length_in_sec': 0.01, 'smoothing': 'median', 'overlap': 0.5, 'onset': 0.1, 'offset': 0.1, 'pad_onset': 0.1, 'pad_offset': 0, 'min_duration_on': 0, 'min_duration_off': 0.2, 'filter_speech_first': True}}\n", - " Reason: Missing mandatory value: diarizer.vad.model_path\n", - " full_key: diarizer.vad.model_path\n", - " object_type=dict.\n", - "[NeMo W 2022-11-10 16:14:23 model_utils:422] Skipped conversion for config/subconfig:\n", - " {'model_path': '???', 'parameters': {'use_speaker_model_from_ckpt': True, 'infer_batch_size': 25, 'sigmoid_threshold': [0.7], 'seq_eval_mode': False, 'split_infer': True, 'diar_window_length': 50, 'overlap_infer_spk_limit': 5}}\n", - " Reason: Missing mandatory value: diarizer.msdd_model.model_path\n", - " full_key: diarizer.msdd_model.model_path\n", - " object_type=dict.\n", - "[NeMo W 2022-11-10 16:14:23 model_utils:422] Skipped conversion for config/subconfig:\n", - " {'model_path': '???', 'parameters': {'asr_based_vad': False, 'asr_based_vad_threshold': 0.05, 'asr_batch_size': None, 'lenient_overlap_WDER': True, 'decoder_delay_in_sec': None, 'word_ts_anchor_offset': None, 'word_ts_anchor_pos': 'start', 'fix_word_ts_with_VAD': False, 'colored_text': False, 'print_time': True, 'break_lines': False}, 'ctc_decoder_parameters': {'pretrained_language_model': None, 'beam_width': 32, 'alpha': 0.5, 'beta': 2.5}, 'realigning_lm_parameters': {'arpa_language_model': None, 'min_number_of_words': 3, 'max_number_of_words': 10, 'logprob_diff_threshold': 1.2}}\n", - " Reason: Missing mandatory value: diarizer.asr.model_path\n", - " full_key: diarizer.asr.model_path\n", - " object_type=dict.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:23 clustering_diarizer:156] Loading pretrained titanet_large model from NGC\n", - "[NeMo I 2022-11-10 16:14:23 cloud:56] Found existing object /home/taejinp/.cache/torch/NeMo/NeMo_1.13.0rc0/titanet-l/492c0ab8416139171dc18c21879a9e45/titanet-l.nemo.\n", - "[NeMo I 2022-11-10 16:14:23 cloud:62] Re-using file from: /home/taejinp/.cache/torch/NeMo/NeMo_1.13.0rc0/titanet-l/492c0ab8416139171dc18c21879a9e45/titanet-l.nemo\n", - "[NeMo I 2022-11-10 16:14:23 common:911] Instantiating model from pre-trained checkpoint\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[NeMo W 2022-11-10 16:14:24 modelPT:142] If you intend to do training or fine-tuning, please call the ModelPT.setup_training_data() method and provide a valid configuration file to setup the train data loader.\n", - " Train config : \n", - " manifest_filepath: /manifests/combined_fisher_swbd_voxceleb12_librispeech/train.json\n", - " sample_rate: 16000\n", - " labels: null\n", - " batch_size: 64\n", - " shuffle: true\n", - " time_length: 3\n", - " is_tarred: false\n", - " tarred_audio_filepaths: null\n", - " tarred_shard_strategy: scatter\n", - " augmentor:\n", - " noise:\n", - " manifest_path: /manifests/noise/rir_noise_manifest.json\n", - " prob: 0.5\n", - " min_snr_db: 0\n", - " max_snr_db: 15\n", - " speed:\n", - " prob: 0.5\n", - " sr: 16000\n", - " resample_type: kaiser_fast\n", - " min_speed_rate: 0.95\n", - " max_speed_rate: 1.05\n", - " num_workers: 15\n", - " pin_memory: true\n", - " \n", - "[NeMo W 2022-11-10 16:14:24 modelPT:149] If you intend to do validation, please call the ModelPT.setup_validation_data() or ModelPT.setup_multiple_validation_data() method and provide a valid configuration file to setup the validation data loader(s). \n", - " Validation config : \n", - " manifest_filepath: /manifests/combined_fisher_swbd_voxceleb12_librispeech/dev.json\n", - " sample_rate: 16000\n", - " labels: null\n", - " batch_size: 128\n", - " shuffle: false\n", - " time_length: 3\n", - " num_workers: 15\n", - " pin_memory: true\n", - " \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:24 label_models:126] Setting angular: true/false in decoder is deprecated and will be removed in 1.13 version, use specific loss with _target_\n", - "[NeMo I 2022-11-10 16:14:24 features:225] PADDING: 16\n", - "[NeMo I 2022-11-10 16:14:27 save_restore_connector:243] Model EncDecSpeakerLabelModel was successfully restored from /home/taejinp/.cache/torch/NeMo/NeMo_1.13.0rc0/titanet-l/492c0ab8416139171dc18c21879a9e45/titanet-l.nemo.\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "from nemo.collections.asr.models import ClusteringDiarizer\n", "oracle_vad_clusdiar_model = ClusteringDiarizer(cfg=config)" @@ -722,137 +458,9 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:27 speaker_utils:92] Number of files to diarize: 1\n", - "[NeMo I 2022-11-10 16:14:27 clustering_diarizer:281] Subsegmentation for embedding extraction: scale0, /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/oracle_vad/speaker_outputs/subsegments_scale0.json\n", - "[NeMo I 2022-11-10 16:14:27 clustering_diarizer:336] Extracting embeddings for Diarization\n", - "[NeMo I 2022-11-10 16:14:27 collections:296] Filtered duration for loading collection is 0.000000.\n", - "[NeMo I 2022-11-10 16:14:27 collections:300] # 5 files loaded accounting to # 1 labels\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:29 clustering_diarizer:380] Saved embedding files to /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/oracle_vad/speaker_outputs/embeddings\n", - "[NeMo I 2022-11-10 16:14:29 clustering_diarizer:281] Subsegmentation for embedding extraction: scale1, /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/oracle_vad/speaker_outputs/subsegments_scale1.json\n", - "[NeMo I 2022-11-10 16:14:29 clustering_diarizer:336] Extracting embeddings for Diarization\n", - "[NeMo I 2022-11-10 16:14:29 collections:296] Filtered duration for loading collection is 0.000000.\n", - "[NeMo I 2022-11-10 16:14:29 collections:300] # 6 files loaded accounting to # 1 labels\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:29 clustering_diarizer:380] Saved embedding files to /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/oracle_vad/speaker_outputs/embeddings\n", - "[NeMo I 2022-11-10 16:14:29 clustering_diarizer:281] Subsegmentation for embedding extraction: scale2, /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/oracle_vad/speaker_outputs/subsegments_scale2.json\n", - "[NeMo I 2022-11-10 16:14:29 clustering_diarizer:336] Extracting embeddings for Diarization\n", - "[NeMo I 2022-11-10 16:14:29 collections:296] Filtered duration for loading collection is 0.000000.\n", - "[NeMo I 2022-11-10 16:14:29 collections:300] # 7 files loaded accounting to # 1 labels\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:30 clustering_diarizer:380] Saved embedding files to /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/oracle_vad/speaker_outputs/embeddings\n", - "[NeMo I 2022-11-10 16:14:30 clustering_diarizer:281] Subsegmentation for embedding extraction: scale3, /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/oracle_vad/speaker_outputs/subsegments_scale3.json\n", - "[NeMo I 2022-11-10 16:14:30 clustering_diarizer:336] Extracting embeddings for Diarization\n", - "[NeMo I 2022-11-10 16:14:30 collections:296] Filtered duration for loading collection is 0.000000.\n", - "[NeMo I 2022-11-10 16:14:30 collections:300] # 11 files loaded accounting to # 1 labels\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:30 clustering_diarizer:380] Saved embedding files to /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/oracle_vad/speaker_outputs/embeddings\n", - "[NeMo I 2022-11-10 16:14:30 clustering_diarizer:281] Subsegmentation for embedding extraction: scale4, /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/oracle_vad/speaker_outputs/subsegments_scale4.json\n", - "[NeMo I 2022-11-10 16:14:30 clustering_diarizer:336] Extracting embeddings for Diarization\n", - "[NeMo I 2022-11-10 16:14:30 collections:296] Filtered duration for loading collection is 0.000000.\n", - "[NeMo I 2022-11-10 16:14:30 collections:300] # 37 files loaded accounting to # 1 labels\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:31 clustering_diarizer:380] Saved embedding files to /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/oracle_vad/speaker_outputs/embeddings\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[NeMo W 2022-11-10 16:14:33 nemo_logging:349] /home/taejinp/anaconda3/lib/python3.9/site-packages/pyannote/metrics/utils.py:200: UserWarning: 'uem' was approximated by the union of 'reference' and 'hypothesis' extents.\n", - " warnings.warn(\n", - " \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:33 der:96] Cumulative Results for collar 0.25 sec and ignore_overlap True: \n", - " FA: 0.0000\t MISS 0.0000\t Diarization ER: 0.0000\t, Confusion ER:0.0000\n", - "[NeMo I 2022-11-10 16:14:33 clustering_diarizer:455] Outputs are saved in /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/oracle_vad directory\n" - ] - }, - { - "data": { - "text/plain": [ - "(,\n", - " {'an4_diarize_test': {'speaker_0': 'B', 'speaker_1': 'A'}},\n", - " (0.0, 0.0, 0.0, 0.0))" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# And lets diarize\n", "oracle_vad_clusdiar_model.diarize()" @@ -867,18 +475,9 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SPEAKER an4_diarize_test 1 0.299 2.471 speaker_1 \r\n", - "SPEAKER an4_diarize_test 1 3.164 1.983 speaker_0 \r\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "!cat {output_dir}/pred_rttms/an4_diarize_test.rttm" ] @@ -903,7 +502,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -913,76 +512,9 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:33 msdd_models:1081] Loading pretrained diar_msdd_telephonic model from NGC\n", - "[NeMo I 2022-11-10 16:14:33 cloud:56] Found existing object /home/taejinp/.cache/torch/NeMo/NeMo_1.13.0rc0/diar_msdd_telephonic/9c319f27168dc4980b8ba9a4ddd711bc/diar_msdd_telephonic.nemo.\n", - "[NeMo I 2022-11-10 16:14:33 cloud:62] Re-using file from: /home/taejinp/.cache/torch/NeMo/NeMo_1.13.0rc0/diar_msdd_telephonic/9c319f27168dc4980b8ba9a4ddd711bc/diar_msdd_telephonic.nemo\n", - "[NeMo I 2022-11-10 16:14:33 common:911] Instantiating model from pre-trained checkpoint\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[NeMo W 2022-11-10 16:14:34 modelPT:142] If you intend to do training or fine-tuning, please call the ModelPT.setup_training_data() method and provide a valid configuration file to setup the train data loader.\n", - " Train config : \n", - " manifest_filepath: null\n", - " emb_dir: null\n", - " sample_rate: 16000\n", - " num_spks: 2\n", - " soft_label_thres: 0.5\n", - " labels: null\n", - " batch_size: 15\n", - " emb_batch_size: 0\n", - " shuffle: true\n", - " \n", - "[NeMo W 2022-11-10 16:14:34 modelPT:149] If you intend to do validation, please call the ModelPT.setup_validation_data() or ModelPT.setup_multiple_validation_data() method and provide a valid configuration file to setup the validation data loader(s). \n", - " Validation config : \n", - " manifest_filepath: null\n", - " emb_dir: null\n", - " sample_rate: 16000\n", - " num_spks: 2\n", - " soft_label_thres: 0.5\n", - " labels: null\n", - " batch_size: 15\n", - " emb_batch_size: 0\n", - " shuffle: false\n", - " \n", - "[NeMo W 2022-11-10 16:14:34 modelPT:155] Please call the ModelPT.setup_test_data() or ModelPT.setup_multiple_test_data() method and provide a valid configuration file to setup the test data loader(s).\n", - " Test config : \n", - " manifest_filepath: null\n", - " emb_dir: null\n", - " sample_rate: 16000\n", - " num_spks: 2\n", - " soft_label_thres: 0.5\n", - " labels: null\n", - " batch_size: 15\n", - " emb_batch_size: 0\n", - " shuffle: false\n", - " seq_eval_mode: false\n", - " \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:34 features:225] PADDING: 16\n", - "[NeMo I 2022-11-10 16:14:34 label_models:126] Setting angular: true/false in decoder is deprecated and will be removed in 1.13 version, use specific loss with _target_\n", - "[NeMo I 2022-11-10 16:14:34 features:225] PADDING: 16\n", - "[NeMo I 2022-11-10 16:14:35 save_restore_connector:243] Model EncDecDiarLabelModel was successfully restored from /home/taejinp/.cache/torch/NeMo/NeMo_1.13.0rc0/diar_msdd_telephonic/9c319f27168dc4980b8ba9a4ddd711bc/diar_msdd_telephonic.nemo.\n", - "[NeMo I 2022-11-10 16:14:35 label_models:126] Setting angular: true/false in decoder is deprecated and will be removed in 1.13 version, use specific loss with _target_\n", - "[NeMo I 2022-11-10 16:14:35 features:225] PADDING: 16\n", - "[NeMo I 2022-11-10 16:14:35 speaker_utils:92] Number of files to diarize: 1\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "from nemo.collections.asr.models.msdd_models import NeuralDiarizer\n", "oracle_vad_msdd_model = NeuralDiarizer(cfg=config)" @@ -1003,234 +535,9 @@ }, { "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[NeMo W 2022-11-10 16:14:35 model_utils:422] Skipped conversion for config/subconfig:\n", - " {'model_path': '???', 'external_vad_manifest': None, 'parameters': {'window_length_in_sec': 0.15, 'shift_length_in_sec': 0.01, 'smoothing': 'median', 'overlap': 0.5, 'onset': 0.1, 'offset': 0.1, 'pad_onset': 0.1, 'pad_offset': 0, 'min_duration_on': 0, 'min_duration_off': 0.2, 'filter_speech_first': True}}\n", - " Reason: Missing mandatory value: diarizer.vad.model_path\n", - " full_key: diarizer.vad.model_path\n", - " object_type=dict.\n", - "[NeMo W 2022-11-10 16:14:35 model_utils:422] Skipped conversion for config/subconfig:\n", - " {'model_path': '???', 'parameters': {'asr_based_vad': False, 'asr_based_vad_threshold': 0.05, 'asr_batch_size': None, 'lenient_overlap_WDER': True, 'decoder_delay_in_sec': None, 'word_ts_anchor_offset': None, 'word_ts_anchor_pos': 'start', 'fix_word_ts_with_VAD': False, 'colored_text': False, 'print_time': True, 'break_lines': False}, 'ctc_decoder_parameters': {'pretrained_language_model': None, 'beam_width': 32, 'alpha': 0.5, 'beta': 2.5}, 'realigning_lm_parameters': {'arpa_language_model': None, 'min_number_of_words': 3, 'max_number_of_words': 10, 'logprob_diff_threshold': 1.2}}\n", - " Reason: Missing mandatory value: diarizer.asr.model_path\n", - " full_key: diarizer.asr.model_path\n", - " object_type=dict.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:35 msdd_models:855] Multiscale Weights: [1, 1, 1, 1, 1]\n", - "[NeMo I 2022-11-10 16:14:35 msdd_models:856] Clustering Parameters: {\n", - " \"oracle_num_speakers\": false,\n", - " \"max_num_speakers\": 8,\n", - " \"enhanced_count_thres\": 80,\n", - " \"max_rp_threshold\": 0.25,\n", - " \"sparse_search_volume\": 30,\n", - " \"maj_vote_spk_count\": false\n", - " }\n", - "[NeMo I 2022-11-10 16:14:35 speaker_utils:92] Number of files to diarize: 1\n", - "[NeMo I 2022-11-10 16:14:35 clustering_diarizer:281] Subsegmentation for embedding extraction: scale0, /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/oracle_vad/speaker_outputs/subsegments_scale0.json\n", - "[NeMo I 2022-11-10 16:14:35 clustering_diarizer:336] Extracting embeddings for Diarization\n", - "[NeMo I 2022-11-10 16:14:35 collections:296] Filtered duration for loading collection is 0.000000.\n", - "[NeMo I 2022-11-10 16:14:35 collections:300] # 5 files loaded accounting to # 1 labels\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:36 clustering_diarizer:380] Saved embedding files to /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/oracle_vad/speaker_outputs/embeddings\n", - "[NeMo I 2022-11-10 16:14:36 clustering_diarizer:281] Subsegmentation for embedding extraction: scale1, /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/oracle_vad/speaker_outputs/subsegments_scale1.json\n", - "[NeMo I 2022-11-10 16:14:36 clustering_diarizer:336] Extracting embeddings for Diarization\n", - "[NeMo I 2022-11-10 16:14:36 collections:296] Filtered duration for loading collection is 0.000000.\n", - "[NeMo I 2022-11-10 16:14:36 collections:300] # 6 files loaded accounting to # 1 labels\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:36 clustering_diarizer:380] Saved embedding files to /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/oracle_vad/speaker_outputs/embeddings\n", - "[NeMo I 2022-11-10 16:14:36 clustering_diarizer:281] Subsegmentation for embedding extraction: scale2, /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/oracle_vad/speaker_outputs/subsegments_scale2.json\n", - "[NeMo I 2022-11-10 16:14:36 clustering_diarizer:336] Extracting embeddings for Diarization\n", - "[NeMo I 2022-11-10 16:14:36 collections:296] Filtered duration for loading collection is 0.000000.\n", - "[NeMo I 2022-11-10 16:14:36 collections:300] # 7 files loaded accounting to # 1 labels\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:36 clustering_diarizer:380] Saved embedding files to /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/oracle_vad/speaker_outputs/embeddings\n", - "[NeMo I 2022-11-10 16:14:36 clustering_diarizer:281] Subsegmentation for embedding extraction: scale3, /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/oracle_vad/speaker_outputs/subsegments_scale3.json\n", - "[NeMo I 2022-11-10 16:14:36 clustering_diarizer:336] Extracting embeddings for Diarization\n", - "[NeMo I 2022-11-10 16:14:36 collections:296] Filtered duration for loading collection is 0.000000.\n", - "[NeMo I 2022-11-10 16:14:36 collections:300] # 11 files loaded accounting to # 1 labels\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:37 clustering_diarizer:380] Saved embedding files to /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/oracle_vad/speaker_outputs/embeddings\n", - "[NeMo I 2022-11-10 16:14:37 clustering_diarizer:281] Subsegmentation for embedding extraction: scale4, /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/oracle_vad/speaker_outputs/subsegments_scale4.json\n", - "[NeMo I 2022-11-10 16:14:37 clustering_diarizer:336] Extracting embeddings for Diarization\n", - "[NeMo I 2022-11-10 16:14:37 collections:296] Filtered duration for loading collection is 0.000000.\n", - "[NeMo I 2022-11-10 16:14:37 collections:300] # 37 files loaded accounting to # 1 labels\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:37 clustering_diarizer:380] Saved embedding files to /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/oracle_vad/speaker_outputs/embeddings\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:41 der:96] Cumulative Results for collar 0.25 sec and ignore_overlap True: \n", - " FA: 0.0000\t MISS 0.0000\t Diarization ER: 0.0000\t, Confusion ER:0.0000\n", - "[NeMo I 2022-11-10 16:14:41 clustering_diarizer:455] Outputs are saved in /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/oracle_vad directory\n", - "[NeMo I 2022-11-10 16:14:41 msdd_models:951] Loading embedding pickle file of scale:0 at /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/oracle_vad/speaker_outputs/embeddings/subsegments_scale0_embeddings.pkl\n", - "[NeMo I 2022-11-10 16:14:41 msdd_models:951] Loading embedding pickle file of scale:1 at /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/oracle_vad/speaker_outputs/embeddings/subsegments_scale1_embeddings.pkl\n", - "[NeMo I 2022-11-10 16:14:41 msdd_models:951] Loading embedding pickle file of scale:2 at /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/oracle_vad/speaker_outputs/embeddings/subsegments_scale2_embeddings.pkl\n", - "[NeMo I 2022-11-10 16:14:41 msdd_models:951] Loading embedding pickle file of scale:3 at /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/oracle_vad/speaker_outputs/embeddings/subsegments_scale3_embeddings.pkl\n", - "[NeMo I 2022-11-10 16:14:41 msdd_models:951] Loading embedding pickle file of scale:4 at /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/oracle_vad/speaker_outputs/embeddings/subsegments_scale4_embeddings.pkl\n", - "[NeMo I 2022-11-10 16:14:41 msdd_models:929] Loading cluster label file from /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/oracle_vad/speaker_outputs/subsegments_scale4_cluster.label\n", - "[NeMo I 2022-11-10 16:14:41 collections:611] Filtered duration for loading collection is 0.000000.\n", - "[NeMo I 2022-11-10 16:14:41 collections:614] Total 1 session files loaded accounting to # 1 audio clips\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " 0%| | 0/1 [00:00,\n", - " {'an4_diarize_test': {'speaker_0': 'B', 'speaker_1': 'A'}},\n", - " (0.0, 0.0, 0.0, 0.0)),\n", - " (,\n", - " {'an4_diarize_test': {'speaker_0': 'B', 'speaker_1': 'A'}},\n", - " (0.0, 0.0, 0.0, 0.0)),\n", - " (,\n", - " {'an4_diarize_test': {'speaker_0': 'B', 'speaker_1': 'A'}},\n", - " (0.0017961383026493304,\n", - " 0.0,\n", - " 0.0015716210148181671,\n", - " 0.00022451728783116318))],\n", - " [(,\n", - " {'an4_diarize_test': {'speaker_0': 'B', 'speaker_1': 'A'}},\n", - " (0.0, 0.0, 0.0, 0.0)),\n", - " (,\n", - " {'an4_diarize_test': {'speaker_0': 'B', 'speaker_1': 'A'}},\n", - " (0.0, 0.0, 0.0, 0.0)),\n", - " (,\n", - " {'an4_diarize_test': {'speaker_0': 'B', 'speaker_1': 'A'}},\n", - " (0.0017961383026493304,\n", - " 0.0,\n", - " 0.0015716210148181671,\n", - " 0.00022451728783116318))]]" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "oracle_vad_msdd_model.diarize()" ] @@ -1244,18 +551,9 @@ }, { "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SPEAKER an4_diarize_test 1 0.300 2.470 speaker_1 \r\n", - "SPEAKER an4_diarize_test 1 3.160 1.990 speaker_0 \r\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "!cat {output_dir}/pred_ovl_rttms/an4_diarize_test.rttm" ] @@ -1276,28 +574,9 @@ }, { "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Clustering Diarizer Result\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(\"Clustering Diarizer Result\")\n", "pred_labels_clus = rttm_to_labels(f'{output_dir}/pred_rttms/an4_diarize_test.rttm')\n", @@ -1307,28 +586,9 @@ }, { "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Neural Diarizer Result\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(\"Neural Diarizer Result\")\n", "pred_labels_neural = rttm_to_labels(f'{output_dir}/pred_ovl_rttms/an4_diarize_test.rttm')\n", @@ -1338,30 +598,11 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "metadata": { "scrolled": true }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Ground-truth Speaker Label\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "print(\"Ground-truth Speaker Label\")\n", "reference" @@ -1391,108 +632,9 @@ }, { "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "name: ClusterDiarizer\n", - "num_workers: 4\n", - "sample_rate: 16000\n", - "batch_size: 64\n", - "diarizer:\n", - " manifest_filepath: data/input_manifest.json\n", - " out_dir: /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/oracle_vad\n", - " oracle_vad: true\n", - " collar: 0.25\n", - " ignore_overlap: true\n", - " vad:\n", - " model_path: ???\n", - " external_vad_manifest: null\n", - " parameters:\n", - " window_length_in_sec: 0.15\n", - " shift_length_in_sec: 0.01\n", - " smoothing: median\n", - " overlap: 0.5\n", - " onset: 0.1\n", - " offset: 0.1\n", - " pad_onset: 0.1\n", - " pad_offset: 0\n", - " min_duration_on: 0\n", - " min_duration_off: 0.2\n", - " filter_speech_first: true\n", - " speaker_embeddings:\n", - " model_path: titanet_large\n", - " parameters:\n", - " window_length_in_sec:\n", - " - 1.5\n", - " - 1.25\n", - " - 1.0\n", - " - 0.75\n", - " - 0.5\n", - " shift_length_in_sec:\n", - " - 0.75\n", - " - 0.625\n", - " - 0.5\n", - " - 0.375\n", - " - 0.1\n", - " multiscale_weights:\n", - " - 1\n", - " - 1\n", - " - 1\n", - " - 1\n", - " - 1\n", - " save_embeddings: true\n", - " clustering:\n", - " parameters:\n", - " oracle_num_speakers: false\n", - " max_num_speakers: 8\n", - " enhanced_count_thres: 80\n", - " max_rp_threshold: 0.25\n", - " sparse_search_volume: 30\n", - " maj_vote_spk_count: false\n", - " msdd_model:\n", - " model_path: diar_msdd_telephonic\n", - " parameters:\n", - " use_speaker_model_from_ckpt: true\n", - " infer_batch_size: 25\n", - " sigmoid_threshold:\n", - " - 0.7\n", - " - 1.0\n", - " seq_eval_mode: false\n", - " split_infer: true\n", - " diar_window_length: 50\n", - " overlap_infer_spk_limit: 5\n", - " asr:\n", - " model_path: ???\n", - " parameters:\n", - " asr_based_vad: false\n", - " asr_based_vad_threshold: 0.05\n", - " asr_batch_size: null\n", - " lenient_overlap_WDER: true\n", - " decoder_delay_in_sec: null\n", - " word_ts_anchor_offset: null\n", - " word_ts_anchor_pos: start\n", - " fix_word_ts_with_VAD: false\n", - " colored_text: false\n", - " print_time: true\n", - " break_lines: false\n", - " ctc_decoder_parameters:\n", - " pretrained_language_model: null\n", - " beam_width: 32\n", - " alpha: 0.5\n", - " beta: 2.5\n", - " realigning_lm_parameters:\n", - " arpa_language_model: null\n", - " min_number_of_words: 3\n", - " max_number_of_words: 10\n", - " logprob_diff_threshold: 1.2\n", - "\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(OmegaConf.to_yaml(config))" ] @@ -1514,7 +656,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1537,7 +679,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1574,162 +716,9 @@ }, { "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[NeMo W 2022-11-10 16:14:42 model_utils:422] Skipped conversion for config/subconfig:\n", - " {'model_path': '???', 'parameters': {'asr_based_vad': False, 'asr_based_vad_threshold': 0.05, 'asr_batch_size': None, 'lenient_overlap_WDER': True, 'decoder_delay_in_sec': None, 'word_ts_anchor_offset': None, 'word_ts_anchor_pos': 'start', 'fix_word_ts_with_VAD': False, 'colored_text': False, 'print_time': True, 'break_lines': False}, 'ctc_decoder_parameters': {'pretrained_language_model': None, 'beam_width': 32, 'alpha': 0.5, 'beta': 2.5}, 'realigning_lm_parameters': {'arpa_language_model': None, 'min_number_of_words': 3, 'max_number_of_words': 10, 'logprob_diff_threshold': 1.2}}\n", - " Reason: Missing mandatory value: diarizer.asr.model_path\n", - " full_key: diarizer.asr.model_path\n", - " object_type=dict.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:42 clustering_diarizer:129] Loading pretrained vad_multilingual_marblenet model from NGC\n", - "[NeMo I 2022-11-10 16:14:42 cloud:56] Found existing object /home/taejinp/.cache/torch/NeMo/NeMo_1.13.0rc0/vad_multilingual_marblenet/670f425c7f186060b7a7268ba6dfacb2/vad_multilingual_marblenet.nemo.\n", - "[NeMo I 2022-11-10 16:14:42 cloud:62] Re-using file from: /home/taejinp/.cache/torch/NeMo/NeMo_1.13.0rc0/vad_multilingual_marblenet/670f425c7f186060b7a7268ba6dfacb2/vad_multilingual_marblenet.nemo\n", - "[NeMo I 2022-11-10 16:14:42 common:911] Instantiating model from pre-trained checkpoint\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[NeMo W 2022-11-10 16:14:42 modelPT:142] If you intend to do training or fine-tuning, please call the ModelPT.setup_training_data() method and provide a valid configuration file to setup the train data loader.\n", - " Train config : \n", - " manifest_filepath: /manifests/ami_train_0.63.json,/manifests/freesound_background_train.json,/manifests/freesound_laughter_train.json,/manifests/fisher_2004_background.json,/manifests/fisher_2004_speech_sampled.json,/manifests/google_train_manifest.json,/manifests/icsi_all_0.63.json,/manifests/musan_freesound_train.json,/manifests/musan_music_train.json,/manifests/musan_soundbible_train.json,/manifests/mandarin_train_sample.json,/manifests/german_train_sample.json,/manifests/spanish_train_sample.json,/manifests/french_train_sample.json,/manifests/russian_train_sample.json\n", - " sample_rate: 16000\n", - " labels:\n", - " - background\n", - " - speech\n", - " batch_size: 256\n", - " shuffle: true\n", - " is_tarred: false\n", - " tarred_audio_filepaths: null\n", - " tarred_shard_strategy: scatter\n", - " augmentor:\n", - " shift:\n", - " prob: 0.5\n", - " min_shift_ms: -10.0\n", - " max_shift_ms: 10.0\n", - " white_noise:\n", - " prob: 0.5\n", - " min_level: -90\n", - " max_level: -46\n", - " norm: true\n", - " noise:\n", - " prob: 0.5\n", - " manifest_path: /manifests/noise_0_1_musan_fs.json\n", - " min_snr_db: 0\n", - " max_snr_db: 30\n", - " max_gain_db: 300.0\n", - " norm: true\n", - " gain:\n", - " prob: 0.5\n", - " min_gain_dbfs: -10.0\n", - " max_gain_dbfs: 10.0\n", - " norm: true\n", - " num_workers: 16\n", - " pin_memory: true\n", - " \n", - "[NeMo W 2022-11-10 16:14:42 modelPT:149] If you intend to do validation, please call the ModelPT.setup_validation_data() or ModelPT.setup_multiple_validation_data() method and provide a valid configuration file to setup the validation data loader(s). \n", - " Validation config : \n", - " manifest_filepath: /manifests/ami_dev_0.63.json,/manifests/freesound_background_dev.json,/manifests/freesound_laughter_dev.json,/manifests/ch120_moved_0.63.json,/manifests/fisher_2005_500_speech_sampled.json,/manifests/google_dev_manifest.json,/manifests/musan_music_dev.json,/manifests/mandarin_dev.json,/manifests/german_dev.json,/manifests/spanish_dev.json,/manifests/french_dev.json,/manifests/russian_dev.json\n", - " sample_rate: 16000\n", - " labels:\n", - " - background\n", - " - speech\n", - " batch_size: 256\n", - " shuffle: false\n", - " val_loss_idx: 0\n", - " num_workers: 16\n", - " pin_memory: true\n", - " \n", - "[NeMo W 2022-11-10 16:14:42 modelPT:155] Please call the ModelPT.setup_test_data() or ModelPT.setup_multiple_test_data() method and provide a valid configuration file to setup the test data loader(s).\n", - " Test config : \n", - " manifest_filepath: null\n", - " sample_rate: 16000\n", - " labels:\n", - " - background\n", - " - speech\n", - " batch_size: 128\n", - " shuffle: false\n", - " test_loss_idx: 0\n", - " \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:42 features:225] PADDING: 16\n", - "[NeMo I 2022-11-10 16:14:42 save_restore_connector:243] Model EncDecClassificationModel was successfully restored from /home/taejinp/.cache/torch/NeMo/NeMo_1.13.0rc0/vad_multilingual_marblenet/670f425c7f186060b7a7268ba6dfacb2/vad_multilingual_marblenet.nemo.\n", - "[NeMo I 2022-11-10 16:14:42 clustering_diarizer:156] Loading pretrained titanet_large model from NGC\n", - "[NeMo I 2022-11-10 16:14:42 cloud:56] Found existing object /home/taejinp/.cache/torch/NeMo/NeMo_1.13.0rc0/titanet-l/492c0ab8416139171dc18c21879a9e45/titanet-l.nemo.\n", - "[NeMo I 2022-11-10 16:14:42 cloud:62] Re-using file from: /home/taejinp/.cache/torch/NeMo/NeMo_1.13.0rc0/titanet-l/492c0ab8416139171dc18c21879a9e45/titanet-l.nemo\n", - "[NeMo I 2022-11-10 16:14:42 common:911] Instantiating model from pre-trained checkpoint\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[NeMo W 2022-11-10 16:14:43 modelPT:142] If you intend to do training or fine-tuning, please call the ModelPT.setup_training_data() method and provide a valid configuration file to setup the train data loader.\n", - " Train config : \n", - " manifest_filepath: /manifests/combined_fisher_swbd_voxceleb12_librispeech/train.json\n", - " sample_rate: 16000\n", - " labels: null\n", - " batch_size: 64\n", - " shuffle: true\n", - " time_length: 3\n", - " is_tarred: false\n", - " tarred_audio_filepaths: null\n", - " tarred_shard_strategy: scatter\n", - " augmentor:\n", - " noise:\n", - " manifest_path: /manifests/noise/rir_noise_manifest.json\n", - " prob: 0.5\n", - " min_snr_db: 0\n", - " max_snr_db: 15\n", - " speed:\n", - " prob: 0.5\n", - " sr: 16000\n", - " resample_type: kaiser_fast\n", - " min_speed_rate: 0.95\n", - " max_speed_rate: 1.05\n", - " num_workers: 15\n", - " pin_memory: true\n", - " \n", - "[NeMo W 2022-11-10 16:14:43 modelPT:149] If you intend to do validation, please call the ModelPT.setup_validation_data() or ModelPT.setup_multiple_validation_data() method and provide a valid configuration file to setup the validation data loader(s). \n", - " Validation config : \n", - " manifest_filepath: /manifests/combined_fisher_swbd_voxceleb12_librispeech/dev.json\n", - " sample_rate: 16000\n", - " labels: null\n", - " batch_size: 128\n", - " shuffle: false\n", - " time_length: 3\n", - " num_workers: 15\n", - " pin_memory: true\n", - " \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:43 label_models:126] Setting angular: true/false in decoder is deprecated and will be removed in 1.13 version, use specific loss with _target_\n", - "[NeMo I 2022-11-10 16:14:43 features:225] PADDING: 16\n", - "[NeMo I 2022-11-10 16:14:44 save_restore_connector:243] Model EncDecSpeakerLabelModel was successfully restored from /home/taejinp/.cache/torch/NeMo/NeMo_1.13.0rc0/titanet-l/492c0ab8416139171dc18c21879a9e45/titanet-l.nemo.\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "from nemo.collections.asr.models import ClusteringDiarizer\n", "sd_model = ClusteringDiarizer(cfg=config)" @@ -1744,209 +733,9 @@ }, { "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:44 speaker_utils:92] Number of files to diarize: 1\n", - "[NeMo I 2022-11-10 16:14:44 clustering_diarizer:303] Split long audio file to avoid CUDA memory issue\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:45 vad_utils:100] The prepared manifest file exists. Overwriting!\n", - "[NeMo I 2022-11-10 16:14:45 classification_models:247] Perform streaming frame-level VAD\n", - "[NeMo I 2022-11-10 16:14:45 collections:296] Filtered duration for loading collection is 0.000000.\n", - "[NeMo I 2022-11-10 16:14:45 collections:300] # 1 files loaded accounting to # 1 labels\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:45 clustering_diarizer:246] Generating predictions with overlapping input segments\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:45 clustering_diarizer:258] Converting frame level prediction to speech/no-speech segment in start and end times format.\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:45 clustering_diarizer:281] Subsegmentation for embedding extraction: scale0, /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/outputs/speaker_outputs/subsegments_scale0.json\n", - "[NeMo I 2022-11-10 16:14:45 clustering_diarizer:336] Extracting embeddings for Diarization\n", - "[NeMo I 2022-11-10 16:14:45 collections:296] Filtered duration for loading collection is 0.000000.\n", - "[NeMo I 2022-11-10 16:14:45 collections:300] # 5 files loaded accounting to # 1 labels\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:45 clustering_diarizer:380] Saved embedding files to /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/outputs/speaker_outputs/embeddings\n", - "[NeMo I 2022-11-10 16:14:45 clustering_diarizer:281] Subsegmentation for embedding extraction: scale1, /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/outputs/speaker_outputs/subsegments_scale1.json\n", - "[NeMo I 2022-11-10 16:14:45 clustering_diarizer:336] Extracting embeddings for Diarization\n", - "[NeMo I 2022-11-10 16:14:45 collections:296] Filtered duration for loading collection is 0.000000.\n", - "[NeMo I 2022-11-10 16:14:45 collections:300] # 7 files loaded accounting to # 1 labels\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:46 clustering_diarizer:380] Saved embedding files to /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/outputs/speaker_outputs/embeddings\n", - "[NeMo I 2022-11-10 16:14:46 clustering_diarizer:281] Subsegmentation for embedding extraction: scale2, /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/outputs/speaker_outputs/subsegments_scale2.json\n", - "[NeMo I 2022-11-10 16:14:46 clustering_diarizer:336] Extracting embeddings for Diarization\n", - "[NeMo I 2022-11-10 16:14:46 collections:296] Filtered duration for loading collection is 0.000000.\n", - "[NeMo I 2022-11-10 16:14:46 collections:300] # 8 files loaded accounting to # 1 labels\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:46 clustering_diarizer:380] Saved embedding files to /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/outputs/speaker_outputs/embeddings\n", - "[NeMo I 2022-11-10 16:14:46 clustering_diarizer:281] Subsegmentation for embedding extraction: scale3, /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/outputs/speaker_outputs/subsegments_scale3.json\n", - "[NeMo I 2022-11-10 16:14:46 clustering_diarizer:336] Extracting embeddings for Diarization\n", - "[NeMo I 2022-11-10 16:14:46 collections:296] Filtered duration for loading collection is 0.000000.\n", - "[NeMo I 2022-11-10 16:14:46 collections:300] # 11 files loaded accounting to # 1 labels\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:46 clustering_diarizer:380] Saved embedding files to /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/outputs/speaker_outputs/embeddings\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\r" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:46 clustering_diarizer:281] Subsegmentation for embedding extraction: scale4, /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/outputs/speaker_outputs/subsegments_scale4.json\n", - "[NeMo I 2022-11-10 16:14:46 clustering_diarizer:336] Extracting embeddings for Diarization\n", - "[NeMo I 2022-11-10 16:14:46 collections:296] Filtered duration for loading collection is 0.000000.\n", - "[NeMo I 2022-11-10 16:14:46 collections:300] # 38 files loaded accounting to # 1 labels\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:46 clustering_diarizer:380] Saved embedding files to /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/outputs/speaker_outputs/embeddings\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[NeMo W 2022-11-10 16:14:48 nemo_logging:349] /home/taejinp/anaconda3/lib/python3.9/site-packages/pyannote/metrics/utils.py:200: UserWarning: 'uem' was approximated by the union of 'reference' and 'hypothesis' extents.\n", - " warnings.warn(\n", - " \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:48 der:96] Cumulative Results for collar 0.25 sec and ignore_overlap True: \n", - " FA: 0.0000\t MISS 0.0000\t Diarization ER: 0.0000\t, Confusion ER:0.0000\n", - "[NeMo I 2022-11-10 16:14:48 clustering_diarizer:455] Outputs are saved in /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/outputs directory\n" - ] - }, - { - "data": { - "text/plain": [ - "(,\n", - " {'an4_diarize_test': {'speaker_0': 'B', 'speaker_1': 'A'}},\n", - " (0.0, 0.0, 0.0, 0.0))" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "sd_model.diarize()" ] @@ -1971,40 +760,9 @@ }, { "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "VAD params:window_length_in_sec: 0.15\n", - "shift_length_in_sec: 0.01\n", - "smoothing: median\n", - "overlap: 0.5\n", - "onset: 0.8\n", - "offset: 0.6\n", - "pad_onset: 0.1\n", - "pad_offset: -0.05\n", - "min_duration_on: 0\n", - "min_duration_off: 0.2\n", - "filter_speech_first: 1.0\n", - "\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# VAD predicted time stamps\n", "# you can also use single threshold(=onset=offset) for binarization and plot here\n", @@ -2034,18 +792,9 @@ }, { "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SPEAKER an4_diarize_test 1 0.300 2.540 speaker_1 \r\n", - "SPEAKER an4_diarize_test 1 3.180 1.970 speaker_0 \r\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "!cat {output_dir}/pred_rttms/an4_diarize_test.rttm" ] @@ -2066,76 +815,9 @@ }, { "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:50 msdd_models:1081] Loading pretrained diar_msdd_telephonic model from NGC\n", - "[NeMo I 2022-11-10 16:14:50 cloud:56] Found existing object /home/taejinp/.cache/torch/NeMo/NeMo_1.13.0rc0/diar_msdd_telephonic/9c319f27168dc4980b8ba9a4ddd711bc/diar_msdd_telephonic.nemo.\n", - "[NeMo I 2022-11-10 16:14:50 cloud:62] Re-using file from: /home/taejinp/.cache/torch/NeMo/NeMo_1.13.0rc0/diar_msdd_telephonic/9c319f27168dc4980b8ba9a4ddd711bc/diar_msdd_telephonic.nemo\n", - "[NeMo I 2022-11-10 16:14:50 common:911] Instantiating model from pre-trained checkpoint\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[NeMo W 2022-11-10 16:14:50 modelPT:142] If you intend to do training or fine-tuning, please call the ModelPT.setup_training_data() method and provide a valid configuration file to setup the train data loader.\n", - " Train config : \n", - " manifest_filepath: null\n", - " emb_dir: null\n", - " sample_rate: 16000\n", - " num_spks: 2\n", - " soft_label_thres: 0.5\n", - " labels: null\n", - " batch_size: 15\n", - " emb_batch_size: 0\n", - " shuffle: true\n", - " \n", - "[NeMo W 2022-11-10 16:14:50 modelPT:149] If you intend to do validation, please call the ModelPT.setup_validation_data() or ModelPT.setup_multiple_validation_data() method and provide a valid configuration file to setup the validation data loader(s). \n", - " Validation config : \n", - " manifest_filepath: null\n", - " emb_dir: null\n", - " sample_rate: 16000\n", - " num_spks: 2\n", - " soft_label_thres: 0.5\n", - " labels: null\n", - " batch_size: 15\n", - " emb_batch_size: 0\n", - " shuffle: false\n", - " \n", - "[NeMo W 2022-11-10 16:14:50 modelPT:155] Please call the ModelPT.setup_test_data() or ModelPT.setup_multiple_test_data() method and provide a valid configuration file to setup the test data loader(s).\n", - " Test config : \n", - " manifest_filepath: null\n", - " emb_dir: null\n", - " sample_rate: 16000\n", - " num_spks: 2\n", - " soft_label_thres: 0.5\n", - " labels: null\n", - " batch_size: 15\n", - " emb_batch_size: 0\n", - " shuffle: false\n", - " seq_eval_mode: false\n", - " \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:50 features:225] PADDING: 16\n", - "[NeMo I 2022-11-10 16:14:50 label_models:126] Setting angular: true/false in decoder is deprecated and will be removed in 1.13 version, use specific loss with _target_\n", - "[NeMo I 2022-11-10 16:14:50 features:225] PADDING: 16\n", - "[NeMo I 2022-11-10 16:14:51 save_restore_connector:243] Model EncDecDiarLabelModel was successfully restored from /home/taejinp/.cache/torch/NeMo/NeMo_1.13.0rc0/diar_msdd_telephonic/9c319f27168dc4980b8ba9a4ddd711bc/diar_msdd_telephonic.nemo.\n", - "[NeMo I 2022-11-10 16:14:51 label_models:126] Setting angular: true/false in decoder is deprecated and will be removed in 1.13 version, use specific loss with _target_\n", - "[NeMo I 2022-11-10 16:14:51 features:225] PADDING: 16\n", - "[NeMo I 2022-11-10 16:14:52 speaker_utils:92] Number of files to diarize: 1\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "config.diarizer.msdd_model.model_path = 'diar_msdd_telephonic' # Telephonic speaker diarization model \n", "config.diarizer.msdd_model.parameters.sigmoid_threshold = [0.7, 1.0] # Evaluate with T=0.7 and T=1.0\n", @@ -2144,362 +826,9 @@ }, { "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[NeMo W 2022-11-10 16:14:52 model_utils:422] Skipped conversion for config/subconfig:\n", - " {'model_path': '???', 'parameters': {'asr_based_vad': False, 'asr_based_vad_threshold': 0.05, 'asr_batch_size': None, 'lenient_overlap_WDER': True, 'decoder_delay_in_sec': None, 'word_ts_anchor_offset': None, 'word_ts_anchor_pos': 'start', 'fix_word_ts_with_VAD': False, 'colored_text': False, 'print_time': True, 'break_lines': False}, 'ctc_decoder_parameters': {'pretrained_language_model': None, 'beam_width': 32, 'alpha': 0.5, 'beta': 2.5}, 'realigning_lm_parameters': {'arpa_language_model': None, 'min_number_of_words': 3, 'max_number_of_words': 10, 'logprob_diff_threshold': 1.2}}\n", - " Reason: Missing mandatory value: diarizer.asr.model_path\n", - " full_key: diarizer.asr.model_path\n", - " object_type=dict.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:52 clustering_diarizer:129] Loading pretrained vad_multilingual_marblenet model from NGC\n", - "[NeMo I 2022-11-10 16:14:52 cloud:56] Found existing object /home/taejinp/.cache/torch/NeMo/NeMo_1.13.0rc0/vad_multilingual_marblenet/670f425c7f186060b7a7268ba6dfacb2/vad_multilingual_marblenet.nemo.\n", - "[NeMo I 2022-11-10 16:14:52 cloud:62] Re-using file from: /home/taejinp/.cache/torch/NeMo/NeMo_1.13.0rc0/vad_multilingual_marblenet/670f425c7f186060b7a7268ba6dfacb2/vad_multilingual_marblenet.nemo\n", - "[NeMo I 2022-11-10 16:14:52 common:911] Instantiating model from pre-trained checkpoint\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[NeMo W 2022-11-10 16:14:52 modelPT:142] If you intend to do training or fine-tuning, please call the ModelPT.setup_training_data() method and provide a valid configuration file to setup the train data loader.\n", - " Train config : \n", - " manifest_filepath: /manifests/ami_train_0.63.json,/manifests/freesound_background_train.json,/manifests/freesound_laughter_train.json,/manifests/fisher_2004_background.json,/manifests/fisher_2004_speech_sampled.json,/manifests/google_train_manifest.json,/manifests/icsi_all_0.63.json,/manifests/musan_freesound_train.json,/manifests/musan_music_train.json,/manifests/musan_soundbible_train.json,/manifests/mandarin_train_sample.json,/manifests/german_train_sample.json,/manifests/spanish_train_sample.json,/manifests/french_train_sample.json,/manifests/russian_train_sample.json\n", - " sample_rate: 16000\n", - " labels:\n", - " - background\n", - " - speech\n", - " batch_size: 256\n", - " shuffle: true\n", - " is_tarred: false\n", - " tarred_audio_filepaths: null\n", - " tarred_shard_strategy: scatter\n", - " augmentor:\n", - " shift:\n", - " prob: 0.5\n", - " min_shift_ms: -10.0\n", - " max_shift_ms: 10.0\n", - " white_noise:\n", - " prob: 0.5\n", - " min_level: -90\n", - " max_level: -46\n", - " norm: true\n", - " noise:\n", - " prob: 0.5\n", - " manifest_path: /manifests/noise_0_1_musan_fs.json\n", - " min_snr_db: 0\n", - " max_snr_db: 30\n", - " max_gain_db: 300.0\n", - " norm: true\n", - " gain:\n", - " prob: 0.5\n", - " min_gain_dbfs: -10.0\n", - " max_gain_dbfs: 10.0\n", - " norm: true\n", - " num_workers: 16\n", - " pin_memory: true\n", - " \n", - "[NeMo W 2022-11-10 16:14:52 modelPT:149] If you intend to do validation, please call the ModelPT.setup_validation_data() or ModelPT.setup_multiple_validation_data() method and provide a valid configuration file to setup the validation data loader(s). \n", - " Validation config : \n", - " manifest_filepath: /manifests/ami_dev_0.63.json,/manifests/freesound_background_dev.json,/manifests/freesound_laughter_dev.json,/manifests/ch120_moved_0.63.json,/manifests/fisher_2005_500_speech_sampled.json,/manifests/google_dev_manifest.json,/manifests/musan_music_dev.json,/manifests/mandarin_dev.json,/manifests/german_dev.json,/manifests/spanish_dev.json,/manifests/french_dev.json,/manifests/russian_dev.json\n", - " sample_rate: 16000\n", - " labels:\n", - " - background\n", - " - speech\n", - " batch_size: 256\n", - " shuffle: false\n", - " val_loss_idx: 0\n", - " num_workers: 16\n", - " pin_memory: true\n", - " \n", - "[NeMo W 2022-11-10 16:14:52 modelPT:155] Please call the ModelPT.setup_test_data() or ModelPT.setup_multiple_test_data() method and provide a valid configuration file to setup the test data loader(s).\n", - " Test config : \n", - " manifest_filepath: null\n", - " sample_rate: 16000\n", - " labels:\n", - " - background\n", - " - speech\n", - " batch_size: 128\n", - " shuffle: false\n", - " test_loss_idx: 0\n", - " \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:52 features:225] PADDING: 16\n", - "[NeMo I 2022-11-10 16:14:52 save_restore_connector:243] Model EncDecClassificationModel was successfully restored from /home/taejinp/.cache/torch/NeMo/NeMo_1.13.0rc0/vad_multilingual_marblenet/670f425c7f186060b7a7268ba6dfacb2/vad_multilingual_marblenet.nemo.\n", - "[NeMo I 2022-11-10 16:14:52 msdd_models:855] Multiscale Weights: [1, 1, 1, 1, 1]\n", - "[NeMo I 2022-11-10 16:14:52 msdd_models:856] Clustering Parameters: {\n", - " \"oracle_num_speakers\": false,\n", - " \"max_num_speakers\": 8,\n", - " \"enhanced_count_thres\": 80,\n", - " \"max_rp_threshold\": 0.25,\n", - " \"sparse_search_volume\": 30,\n", - " \"maj_vote_spk_count\": false\n", - " }\n", - "[NeMo I 2022-11-10 16:14:52 speaker_utils:92] Number of files to diarize: 1\n", - "[NeMo I 2022-11-10 16:14:52 clustering_diarizer:303] Split long audio file to avoid CUDA memory issue\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:53 vad_utils:100] The prepared manifest file exists. Overwriting!\n", - "[NeMo I 2022-11-10 16:14:53 classification_models:247] Perform streaming frame-level VAD\n", - "[NeMo I 2022-11-10 16:14:53 collections:296] Filtered duration for loading collection is 0.000000.\n", - "[NeMo I 2022-11-10 16:14:53 collections:300] # 1 files loaded accounting to # 1 labels\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:53 clustering_diarizer:246] Generating predictions with overlapping input segments\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:53 clustering_diarizer:258] Converting frame level prediction to speech/no-speech segment in start and end times format.\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:53 clustering_diarizer:281] Subsegmentation for embedding extraction: scale0, /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/outputs/speaker_outputs/subsegments_scale0.json\n", - "[NeMo I 2022-11-10 16:14:53 clustering_diarizer:336] Extracting embeddings for Diarization\n", - "[NeMo I 2022-11-10 16:14:53 collections:296] Filtered duration for loading collection is 0.000000.\n", - "[NeMo I 2022-11-10 16:14:53 collections:300] # 5 files loaded accounting to # 1 labels\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:53 clustering_diarizer:380] Saved embedding files to /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/outputs/speaker_outputs/embeddings\n", - "[NeMo I 2022-11-10 16:14:53 clustering_diarizer:281] Subsegmentation for embedding extraction: scale1, /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/outputs/speaker_outputs/subsegments_scale1.json\n", - "[NeMo I 2022-11-10 16:14:53 clustering_diarizer:336] Extracting embeddings for Diarization\n", - "[NeMo I 2022-11-10 16:14:53 collections:296] Filtered duration for loading collection is 0.000000.\n", - "[NeMo I 2022-11-10 16:14:53 collections:300] # 7 files loaded accounting to # 1 labels\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:54 clustering_diarizer:380] Saved embedding files to /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/outputs/speaker_outputs/embeddings\n", - "[NeMo I 2022-11-10 16:14:54 clustering_diarizer:281] Subsegmentation for embedding extraction: scale2, /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/outputs/speaker_outputs/subsegments_scale2.json\n", - "[NeMo I 2022-11-10 16:14:54 clustering_diarizer:336] Extracting embeddings for Diarization\n", - "[NeMo I 2022-11-10 16:14:54 collections:296] Filtered duration for loading collection is 0.000000.\n", - "[NeMo I 2022-11-10 16:14:54 collections:300] # 8 files loaded accounting to # 1 labels\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:54 clustering_diarizer:380] Saved embedding files to /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/outputs/speaker_outputs/embeddings\n", - "[NeMo I 2022-11-10 16:14:54 clustering_diarizer:281] Subsegmentation for embedding extraction: scale3, /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/outputs/speaker_outputs/subsegments_scale3.json\n", - "[NeMo I 2022-11-10 16:14:54 clustering_diarizer:336] Extracting embeddings for Diarization\n", - "[NeMo I 2022-11-10 16:14:54 collections:296] Filtered duration for loading collection is 0.000000.\n", - "[NeMo I 2022-11-10 16:14:54 collections:300] # 11 files loaded accounting to # 1 labels\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:54 clustering_diarizer:380] Saved embedding files to /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/outputs/speaker_outputs/embeddings\n", - "[NeMo I 2022-11-10 16:14:54 clustering_diarizer:281] Subsegmentation for embedding extraction: scale4, /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/outputs/speaker_outputs/subsegments_scale4.json\n", - "[NeMo I 2022-11-10 16:14:54 clustering_diarizer:336] Extracting embeddings for Diarization\n", - "[NeMo I 2022-11-10 16:14:54 collections:296] Filtered duration for loading collection is 0.000000.\n", - "[NeMo I 2022-11-10 16:14:54 collections:300] # 38 files loaded accounting to # 1 labels\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:54 clustering_diarizer:380] Saved embedding files to /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/outputs/speaker_outputs/embeddings\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[NeMo W 2022-11-10 16:14:55 nemo_logging:349] /home/taejinp/anaconda3/lib/python3.9/site-packages/pyannote/metrics/utils.py:200: UserWarning: 'uem' was approximated by the union of 'reference' and 'hypothesis' extents.\n", - " warnings.warn(\n", - " \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:55 der:96] Cumulative Results for collar 0.25 sec and ignore_overlap True: \n", - " FA: 0.0000\t MISS 0.0000\t Diarization ER: 0.0000\t, Confusion ER:0.0000\n", - "[NeMo I 2022-11-10 16:14:55 clustering_diarizer:455] Outputs are saved in /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/outputs directory\n", - "[NeMo I 2022-11-10 16:14:55 msdd_models:951] Loading embedding pickle file of scale:0 at /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/outputs/speaker_outputs/embeddings/subsegments_scale0_embeddings.pkl\n", - "[NeMo I 2022-11-10 16:14:55 msdd_models:951] Loading embedding pickle file of scale:1 at /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/outputs/speaker_outputs/embeddings/subsegments_scale1_embeddings.pkl\n", - "[NeMo I 2022-11-10 16:14:55 msdd_models:951] Loading embedding pickle file of scale:2 at /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/outputs/speaker_outputs/embeddings/subsegments_scale2_embeddings.pkl\n", - "[NeMo I 2022-11-10 16:14:55 msdd_models:951] Loading embedding pickle file of scale:3 at /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/outputs/speaker_outputs/embeddings/subsegments_scale3_embeddings.pkl\n", - "[NeMo I 2022-11-10 16:14:55 msdd_models:951] Loading embedding pickle file of scale:4 at /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/outputs/speaker_outputs/embeddings/subsegments_scale4_embeddings.pkl\n", - "[NeMo I 2022-11-10 16:14:55 msdd_models:929] Loading cluster label file from /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/outputs/speaker_outputs/subsegments_scale4_cluster.label\n", - "[NeMo I 2022-11-10 16:14:55 collections:611] Filtered duration for loading collection is 0.000000.\n", - "[NeMo I 2022-11-10 16:14:55 collections:614] Total 1 session files loaded accounting to # 1 audio clips\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00, 131.58it/s]" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:14:55 msdd_models:1393] [Threshold: 0.7000] [use_clus_as_main=False] [diar_window=50]\n", - "[NeMo I 2022-11-10 16:14:55 speaker_utils:92] Number of files to diarize: 1\n", - "[NeMo I 2022-11-10 16:14:55 der:96] Cumulative Results for collar 0.25 sec and ignore_overlap True: \n", - " FA: 0.0000\t MISS 0.0000\t Diarization ER: 0.0000\t, Confusion ER:0.0000\n", - "[NeMo I 2022-11-10 16:14:55 speaker_utils:92] Number of files to diarize: 1\n", - "[NeMo I 2022-11-10 16:14:55 der:96] Cumulative Results for collar 0.25 sec and ignore_overlap False: \n", - " FA: 0.0000\t MISS 0.0000\t Diarization ER: 0.0000\t, Confusion ER:0.0000\n", - "[NeMo I 2022-11-10 16:14:55 speaker_utils:92] Number of files to diarize: 1\n", - "[NeMo I 2022-11-10 16:14:55 der:96] Cumulative Results for collar 0.0 sec and ignore_overlap False: \n", - " FA: 0.0164\t MISS 0.0038\t Diarization ER: 0.0202\t, Confusion ER:0.0000\n", - "[NeMo I 2022-11-10 16:14:55 msdd_models:1414] \n", - " \n", - "[NeMo I 2022-11-10 16:14:55 msdd_models:1393] [Threshold: 1.0000] [use_clus_as_main=False] [diar_window=50]\n", - "[NeMo I 2022-11-10 16:14:55 speaker_utils:92] Number of files to diarize: 1\n", - "[NeMo I 2022-11-10 16:14:55 der:96] Cumulative Results for collar 0.25 sec and ignore_overlap True: \n", - " FA: 0.0000\t MISS 0.0000\t Diarization ER: 0.0000\t, Confusion ER:0.0000\n", - "[NeMo I 2022-11-10 16:14:55 speaker_utils:92] Number of files to diarize: 1\n", - "[NeMo I 2022-11-10 16:14:55 der:96] Cumulative Results for collar 0.25 sec and ignore_overlap False: \n", - " FA: 0.0000\t MISS 0.0000\t Diarization ER: 0.0000\t, Confusion ER:0.0000\n", - "[NeMo I 2022-11-10 16:14:55 speaker_utils:92] Number of files to diarize: 1\n", - "[NeMo I 2022-11-10 16:14:55 der:96] Cumulative Results for collar 0.0 sec and ignore_overlap False: \n", - " FA: 0.0164\t MISS 0.0038\t Diarization ER: 0.0202\t, Confusion ER:0.0000\n", - "[NeMo I 2022-11-10 16:14:55 msdd_models:1414] \n", - " \n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\n" - ] - }, - { - "data": { - "text/plain": [ - "[[(,\n", - " {'an4_diarize_test': {'speaker_0': 'B', 'speaker_1': 'A'}},\n", - " (0.0, 0.0, 0.0, 0.0)),\n", - " (,\n", - " {'an4_diarize_test': {'speaker_0': 'B', 'speaker_1': 'A'}},\n", - " (0.0, 0.0, 0.0, 0.0)),\n", - " (,\n", - " {'an4_diarize_test': {'speaker_0': 'B', 'speaker_1': 'A'}},\n", - " (0.02020655590480466, 0.0, 0.016389762011674885, 0.003816793893129774))],\n", - " [(,\n", - " {'an4_diarize_test': {'speaker_0': 'B', 'speaker_1': 'A'}},\n", - " (0.0, 0.0, 0.0, 0.0)),\n", - " (,\n", - " {'an4_diarize_test': {'speaker_0': 'B', 'speaker_1': 'A'}},\n", - " (0.0, 0.0, 0.0, 0.0)),\n", - " (,\n", - " {'an4_diarize_test': {'speaker_0': 'B', 'speaker_1': 'A'}},\n", - " (0.02020655590480466, 0.0, 0.016389762011674885, 0.003816793893129774))]]" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "system_vad_msdd_model.diarize()" ] @@ -2513,18 +842,9 @@ }, { "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SPEAKER an4_diarize_test 1 0.300 2.540 speaker_1 \r\n", - "SPEAKER an4_diarize_test 1 3.180 1.970 speaker_0 \r\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "!cat {output_dir}/pred_ovl_rttms/an4_diarize_test.rttm" ] @@ -2545,28 +865,9 @@ }, { "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Clustering Diarizer Result (RTTM format)\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(\"Clustering Diarizer Result (RTTM format)\")\n", "pred_labels_clus = rttm_to_labels(f'{output_dir}/pred_rttms/an4_diarize_test.rttm')\n", @@ -2576,28 +877,9 @@ }, { "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Neural Diarizer Result (RTTM format)\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(\"Neural Diarizer Result (RTTM format)\")\n", "pred_labels_neural = rttm_to_labels(f'{output_dir}/pred_ovl_rttms/an4_diarize_test.rttm')\n", @@ -2607,28 +889,9 @@ }, { "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Ground-truth Speaker Label (RTTM format)\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(\"Ground-truth Speaker Label (RTTM format)\")\n", "reference" @@ -2650,31 +913,9 @@ }, { "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[NeMo W 2022-11-10 16:14:55 model_utils:422] Skipped conversion for config/subconfig:\n", - " {'model_path': '???', 'external_vad_manifest': None, 'parameters': {'window_length_in_sec': 0.15, 'shift_length_in_sec': 0.01, 'smoothing': 'median', 'overlap': 0.5, 'onset': 0.1, 'offset': 0.1, 'pad_onset': 0.1, 'pad_offset': 0, 'min_duration_on': 0, 'min_duration_off': 0.2, 'filter_speech_first': True}}\n", - " Reason: Missing mandatory value: diarizer.vad.model_path\n", - " full_key: diarizer.vad.model_path\n", - " object_type=dict.\n", - "[NeMo W 2022-11-10 16:14:55 model_utils:422] Skipped conversion for config/subconfig:\n", - " {'model_path': '???', 'parameters': {'use_speaker_model_from_ckpt': True, 'infer_batch_size': 25, 'sigmoid_threshold': [0.7], 'seq_eval_mode': False, 'split_infer': True, 'diar_window_length': 50, 'overlap_infer_spk_limit': 5}}\n", - " Reason: Missing mandatory value: diarizer.msdd_model.model_path\n", - " full_key: diarizer.msdd_model.model_path\n", - " object_type=dict.\n", - "[NeMo W 2022-11-10 16:14:55 model_utils:422] Skipped conversion for config/subconfig:\n", - " {'model_path': '???', 'parameters': {'asr_based_vad': False, 'asr_based_vad_threshold': 0.05, 'asr_batch_size': None, 'lenient_overlap_WDER': True, 'decoder_delay_in_sec': None, 'word_ts_anchor_offset': None, 'word_ts_anchor_pos': 'start', 'fix_word_ts_with_VAD': False, 'colored_text': False, 'print_time': True, 'break_lines': False}, 'ctc_decoder_parameters': {'pretrained_language_model': None, 'beam_width': 32, 'alpha': 0.5, 'beta': 2.5}, 'realigning_lm_parameters': {'arpa_language_model': None, 'min_number_of_words': 3, 'max_number_of_words': 10, 'logprob_diff_threshold': 1.2}}\n", - " Reason: Missing mandatory value: diarizer.asr.model_path\n", - " full_key: diarizer.asr.model_path\n", - " object_type=dict.\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "oracle_vad_clusdiar_model.save_to(os.path.join(output_dir,'clustering_diarizer.nemo'))" ] @@ -2688,98 +929,14 @@ }, { "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:15:02 clustering_diarizer:523] Model ClusteringDiarizer does not contain a VAD model. A VAD model or manifest file withspeech segments need for diarization with this model\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[NeMo W 2022-11-10 16:15:02 model_utils:422] Skipped conversion for config/subconfig:\n", - " {'model_path': '???', 'external_vad_manifest': None, 'parameters': {'window_length_in_sec': 0.15, 'shift_length_in_sec': 0.01, 'smoothing': 'median', 'overlap': 0.5, 'onset': 0.1, 'offset': 0.1, 'pad_onset': 0.1, 'pad_offset': 0, 'min_duration_on': 0, 'min_duration_off': 0.2, 'filter_speech_first': True}}\n", - " Reason: Missing mandatory value: diarizer.vad.model_path\n", - " full_key: diarizer.vad.model_path\n", - " object_type=dict.\n", - "[NeMo W 2022-11-10 16:15:02 model_utils:422] Skipped conversion for config/subconfig:\n", - " {'model_path': '???', 'parameters': {'use_speaker_model_from_ckpt': True, 'infer_batch_size': 25, 'sigmoid_threshold': [0.7], 'seq_eval_mode': False, 'split_infer': True, 'diar_window_length': 50, 'overlap_infer_spk_limit': 5}}\n", - " Reason: Missing mandatory value: diarizer.msdd_model.model_path\n", - " full_key: diarizer.msdd_model.model_path\n", - " object_type=dict.\n", - "[NeMo W 2022-11-10 16:15:02 model_utils:422] Skipped conversion for config/subconfig:\n", - " {'model_path': '???', 'parameters': {'asr_based_vad': False, 'asr_based_vad_threshold': 0.05, 'asr_batch_size': None, 'lenient_overlap_WDER': True, 'decoder_delay_in_sec': None, 'word_ts_anchor_offset': None, 'word_ts_anchor_pos': 'start', 'fix_word_ts_with_VAD': False, 'colored_text': False, 'print_time': True, 'break_lines': False}, 'ctc_decoder_parameters': {'pretrained_language_model': None, 'beam_width': 32, 'alpha': 0.5, 'beta': 2.5}, 'realigning_lm_parameters': {'arpa_language_model': None, 'min_number_of_words': 3, 'max_number_of_words': 10, 'logprob_diff_threshold': 1.2}}\n", - " Reason: Missing mandatory value: diarizer.asr.model_path\n", - " full_key: diarizer.asr.model_path\n", - " object_type=dict.\n", - "[NeMo W 2022-11-10 16:15:02 modelPT:142] If you intend to do training or fine-tuning, please call the ModelPT.setup_training_data() method and provide a valid configuration file to setup the train data loader.\n", - " Train config : \n", - " manifest_filepath: /manifests/combined_fisher_swbd_voxceleb12_librispeech/train.json\n", - " sample_rate: 16000\n", - " labels: null\n", - " batch_size: 64\n", - " shuffle: true\n", - " time_length: 3\n", - " is_tarred: false\n", - " tarred_audio_filepaths: null\n", - " tarred_shard_strategy: scatter\n", - " augmentor:\n", - " noise:\n", - " manifest_path: /manifests/noise/rir_noise_manifest.json\n", - " prob: 0.5\n", - " min_snr_db: 0\n", - " max_snr_db: 15\n", - " speed:\n", - " prob: 0.5\n", - " sr: 16000\n", - " resample_type: kaiser_fast\n", - " min_speed_rate: 0.95\n", - " max_speed_rate: 1.05\n", - " num_workers: 15\n", - " pin_memory: true\n", - " \n", - "[NeMo W 2022-11-10 16:15:02 modelPT:149] If you intend to do validation, please call the ModelPT.setup_validation_data() or ModelPT.setup_multiple_validation_data() method and provide a valid configuration file to setup the validation data loader(s). \n", - " Validation config : \n", - " manifest_filepath: /manifests/combined_fisher_swbd_voxceleb12_librispeech/dev.json\n", - " sample_rate: 16000\n", - " labels: null\n", - " batch_size: 128\n", - " shuffle: false\n", - " time_length: 3\n", - " num_workers: 15\n", - " pin_memory: true\n", - " \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2022-11-10 16:15:02 label_models:126] Setting angular: true/false in decoder is deprecated and will be removed in 1.13 version, use specific loss with _target_\n", - "[NeMo I 2022-11-10 16:15:02 features:225] PADDING: 16\n", - "[NeMo I 2022-11-10 16:15:03 save_restore_connector:243] Model EncDecSpeakerLabelModel was successfully restored from /tmp/tmpbimcm66m/speaker_model.nemo.\n", - "[NeMo I 2022-11-10 16:15:03 clustering_diarizer:146] Speaker Model restored locally from /tmp/tmpbimcm66m/speaker_model.nemo\n", - "[NeMo I 2022-11-10 16:15:03 clustering_diarizer:533] Model ClusteringDiarizer was successfully restored from /home/taejinp/projects/add_cpwer/NeMo/tutorials/speaker_tasks/outputs/clustering_diarizer.nemo.\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "del oracle_vad_clusdiar_model\n", "import nemo.collections.asr as nemo_asr\n", "restored_model = nemo_asr.models.ClusteringDiarizer.restore_from(os.path.join(output_dir,'clustering_diarizer.nemo'))" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": {