From 0796199735d1de752b3cbf5e5acebe161c825495 Mon Sep 17 00:00:00 2001 From: Neal Vaidya Date: Tue, 27 Feb 2024 22:43:51 -0500 Subject: [PATCH] Formatting changes for new docs system (#8525) Signed-off-by: Neal Vaidya --- docs/source/asr/api.rst | 2 - docs/source/asr/asr_all.bib | 108 +++++----- docs/source/asr/asr_language_modeling.rst | 186 +++++++++--------- docs/source/asr/configs.rst | 14 +- docs/source/asr/datasets.rst | 20 +- .../asr/images/conf-ensembles-overview.png | Bin 0 -> 134089 bytes docs/source/asr/intro.rst | 21 +- docs/source/asr/models.rst | 70 ++++--- docs/source/asr/results.rst | 20 +- docs/source/asr/scores.rst | 104 +++++----- 10 files changed, 271 insertions(+), 274 deletions(-) create mode 100644 docs/source/asr/images/conf-ensembles-overview.png diff --git a/docs/source/asr/api.rst b/docs/source/asr/api.rst index f74f67326bc5..a5b3369177b9 100644 --- a/docs/source/asr/api.rst +++ b/docs/source/asr/api.rst @@ -326,5 +326,3 @@ Adapter Strategies :member-order: bysource :undoc-members: adapter_module_names ------ - diff --git a/docs/source/asr/asr_all.bib b/docs/source/asr/asr_all.bib index 01c765f68f37..17caa233013e 100644 --- a/docs/source/asr/asr_all.bib +++ b/docs/source/asr/asr_all.bib @@ -28,17 +28,17 @@ @article{luong17 year = {2017}, } -@INPROCEEDINGS{LaurentSeqWiseBN, -author={C. {Laurent} and G. {Pereyra} and P. {Brakel} and Y. {Zhang} and Y. {Bengio}}, -booktitle={2016 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP)}, -title={Batch normalized recurrent neural networks}, -year={2016}, -volume={}, -number={}, -pages={2657-2661}, -keywords={feedforward neural nets;learning (artificial intelligence);recurrent neural nets;speech recognition;batch normalized recurrent neural networks;RNN;sequential data;long-term dependency learning;convergence rate improvement;intermediate representation normalization;feedforward neural networks;speech recognition task;language modeling;training criterion;Training;Recurrent neural networks;Convergence;Speech recognition;Computer architecture;Speech;batch normalization;RNN;LSTM;optimization}, -doi={10.1109/ICASSP.2016.7472159}, -ISSN={2379-190X}, +@INPROCEEDINGS{LaurentSeqWiseBN, +author={C. {Laurent} and G. {Pereyra} and P. {Brakel} and Y. {Zhang} and Y. {Bengio}}, +booktitle={2016 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP)}, +title={Batch normalized recurrent neural networks}, +year={2016}, +volume={}, +number={}, +pages={2657-2661}, +keywords={feedforward neural nets;learning (artificial intelligence);recurrent neural nets;speech recognition;batch normalized recurrent neural networks;RNN;sequential data;long-term dependency learning;convergence rate improvement;intermediate representation normalization;feedforward neural networks;speech recognition task;language modeling;training criterion;Training;Recurrent neural networks;Convergence;Speech recognition;Computer architecture;Speech;batch normalization;RNN;LSTM;optimization}, +doi={10.1109/ICASSP.2016.7472159}, +ISSN={2379-190X}, month={March},} @article{graves2005, @@ -112,7 +112,7 @@ @article{NVTuring @misc{Rygaard2015, title = {Using Synthesized Speech to Improve Speech Recognition for Low-Resource Languages}, - author = {Luise Valentin Rygaard}, + author = {Luise Valentin Rygaard}, howpublished = {\url{https://parasol.tamu.edu/dreu2015/Rygaard/report.pdf}}, year = {2015}, } @@ -156,7 +156,7 @@ @book{Bengio1996 Title = {Neural Networks for Speech and Sequence Recognition}, Year = {1996} } - + @article{Bengio1992, title={Global optimization of a neural network-hidden Markov model hybrid}, author={Bengio, Y., and De Mori, R., and Flammia, G., and Kompe, R. }, @@ -359,7 +359,7 @@ @inproceedings{DeepSpeech2 url = {http://dl.acm.org/citation.cfm?id=3045390.3045410}, acmid = {3045410}, publisher = {JMLR.org}, -} +} @inproceedings{prabhavalkar2017comparison, title={A comparison of sequence-to-sequence models for speech recognition}, @@ -572,7 +572,7 @@ @incollection{Salimans2016WeightNorm title = {Weight Normalization: A Simple Reparameterization to Accelerate Training of Deep Neural Networks}, author = {Salimans, Tim and Kingma, Durk P}, booktitle = {Advances in Neural Information Processing Systems 29}, - editor = {D. D. Lee and M. Sugiyama and U. V. Luxburg and I. Guyon and R. Garnett}, + editor = {D. D. Lee and M. Sugiyama and U. V. Luxburg and I. Guyon and R. Garnett}, pages = {901--909}, year = {2016}, publisher = {Curran Associates, Inc.}, @@ -581,7 +581,7 @@ @incollection{Salimans2016WeightNorm @article{wu2016google, title={Google's neural machine translation system: Bridging the gap between human and machine translation}, - author={Wu, Yonghui and Schuster, Mike and Chen, Zhifeng and Le, Quoc V and Norouzi, Mohammad and Macherey, Zolfgang and Krikun, Maxim and Cao, Yuan and Gao, Qin and Macherey, Klaus and others}, + author={Wu, Yonghui and Schuster, Mike and Chen, Zhifeng and Le, Quoc V and Norouzi, Mohammad and Macherey, Zolfgang and Krikun, Maxim and Cao, Yuan and Gao, Qin and Macherey, Klaus and others}, journal={arXiv preprint arXiv:1609.08144}, year={2016} } @@ -638,7 +638,7 @@ @inproceedings{Dauphin2017GLU url = {http://dl.acm.org/citation.cfm?id=3305381.3305478}, acmid = {3305478}, publisher = {JMLR.org}, -} +} @incollection{Oord2016PixelCNN, title = {Conditional Image Generation with PixelCNN Decoders}, @@ -698,17 +698,17 @@ @inproceedings{Saon+2016 pages={7--11} } -@INPROCEEDINGS{Sercu-2016, -author={T. {Sercu} and C. {Puhrsch} and B. {Kingsbury} and Y. {LeCun}}, -booktitle={2016 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP)}, -title={Very deep multilingual convolutional neural networks for LVCSR}, -year={2016}, -volume={}, -number={}, -pages={4955-4959}, -keywords={natural language processing;neural nets;speech recognition;very deep multilingual convolutional neural networks;LVCSR;CNN;large vocabulary continuous speech recognition systems;word error rate;Training;Context;Hidden Markov models;Neural networks;Computer architecture;Kernel;Training data;Convolutional Networks;Multilingual;Acoustic Modeling;Speech Recognition;Neural Networks}, -doi={10.1109/ICASSP.2016.7472620}, -ISSN={2379-190X}, +@INPROCEEDINGS{Sercu-2016, +author={T. {Sercu} and C. {Puhrsch} and B. {Kingsbury} and Y. {LeCun}}, +booktitle={2016 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP)}, +title={Very deep multilingual convolutional neural networks for LVCSR}, +year={2016}, +volume={}, +number={}, +pages={4955-4959}, +keywords={natural language processing;neural nets;speech recognition;very deep multilingual convolutional neural networks;LVCSR;CNN;large vocabulary continuous speech recognition systems;word error rate;Training;Context;Hidden Markov models;Neural networks;Computer architecture;Kernel;Training data;Convolutional Networks;Multilingual;Acoustic Modeling;Speech Recognition;Neural Networks}, +doi={10.1109/ICASSP.2016.7472620}, +ISSN={2379-190X}, month={March},} @@ -722,17 +722,17 @@ @inproceedings{Sercu+2016 pages={3429--3433} } -@INPROCEEDINGS{Xiong-2018, -author={W. {Xiong} and L. {Wu} and F. {Alleva} and J. {Droppo} and X. {Huang} and A. {Stolcke}}, -booktitle={2018 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP)}, -title={The Microsoft 2017 Conversational Speech Recognition System}, -year={2018}, -volume={}, -number={}, -pages={5934-5938}, -keywords={convolution;feedforward neural nets;natural language processing;speaker recognition;speech processing;language model rescoring step;senone level;switchboard domains;character-based LSTM language models;NIST 2000 switchboard test set;frame level;word-level voting;acoustic model posteriors;dialog session aware LSTM language models;CNN-BLSTM acoustic model;Microsoft 2017 conversational speech recognition system;Acoustics;Error analysis;Training;Speech recognition;Switches;Computational modeling;Context modeling;Conversational speech recognition;CNN;LACE;BLSTM;LSTM-LM;system combination;human parity}, -doi={10.1109/ICASSP.2018.8461870}, -ISSN={2379-190X}, +@INPROCEEDINGS{Xiong-2018, +author={W. {Xiong} and L. {Wu} and F. {Alleva} and J. {Droppo} and X. {Huang} and A. {Stolcke}}, +booktitle={2018 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP)}, +title={The Microsoft 2017 Conversational Speech Recognition System}, +year={2018}, +volume={}, +number={}, +pages={5934-5938}, +keywords={convolution;feedforward neural nets;natural language processing;speaker recognition;speech processing;language model rescoring step;senone level;switchboard domains;character-based LSTM language models;NIST 2000 switchboard test set;frame level;word-level voting;acoustic model posteriors;dialog session aware LSTM language models;CNN-BLSTM acoustic model;Microsoft 2017 conversational speech recognition system;Acoustics;Error analysis;Training;Speech recognition;Switches;Computational modeling;Context modeling;Conversational speech recognition;CNN;LACE;BLSTM;LSTM-LM;system combination;human parity}, +doi={10.1109/ICASSP.2018.8461870}, +ISSN={2379-190X}, month={April},} @inproceedings{zeyer2018improved, @@ -862,17 +862,17 @@ @inproceedings{Weng2018 url={http://dx.doi.org/10.21437/Interspeech.2018-1030} } -@INPROCEEDINGS{Battenberg2017, -author={E. {Battenberg} and J. {Chen} and R. {Child} and A. {Coates} and Y. G. Y. {Li} and H. {Liu} and S. {Satheesh} and A. {Sriram} and Z. {Zhu}}, -booktitle={2017 IEEE Automatic Speech Recognition and Understanding Workshop (ASRU)}, -title={Exploring neural transducers for end-to-end speech recognition}, -year={2017}, -volume={}, -number={}, -pages={206-213}, -keywords={recurrent neural nets;speech recognition;Hub500 benchmark;CTC models;speech recognition pipeline;RNN-Transducer models;language model;Seq2Seq models;end-to-end speech recognition;neural transducers;Decoding;Hidden Markov models;Transducers;Task analysis;Speech;Mathematical model;Neural networks}, -doi={10.1109/ASRU.2017.8268937}, -ISSN={}, +@INPROCEEDINGS{Battenberg2017, +author={E. {Battenberg} and J. {Chen} and R. {Child} and A. {Coates} and Y. G. Y. {Li} and H. {Liu} and S. {Satheesh} and A. {Sriram} and Z. {Zhu}}, +booktitle={2017 IEEE Automatic Speech Recognition and Understanding Workshop (ASRU)}, +title={Exploring neural transducers for end-to-end speech recognition}, +year={2017}, +volume={}, +number={}, +pages={206-213}, +keywords={recurrent neural nets;speech recognition;Hub500 benchmark;CTC models;speech recognition pipeline;RNN-Transducer models;language model;Seq2Seq models;end-to-end speech recognition;neural transducers;Decoding;Hidden Markov models;Transducers;Task analysis;Speech;Mathematical model;Neural networks}, +doi={10.1109/ASRU.2017.8268937}, +ISSN={}, month={Dec}, } @@ -973,14 +973,6 @@ @article{Dawalatabad_2021 month={Aug} } -@article{park2022multi, - title = {Multi-scale Speaker Diarization with Dynamic Scale Weighting}, - author = {Park, Tae Jin and Koluguri, Nithin Rao and Balam, Jagadeesh and Ginsburg, Boris}, - journal = {https://arxiv.org/abs/2203.15974}, - year = {2022} -} - - @inproceedings{he2019streaming, title={Streaming end-to-end speech recognition for mobile devices}, author={He, Yanzhang and Sainath, Tara N and Prabhavalkar, Rohit and McGraw, Ian and Alvarez, Raziel and Zhao, Ding and Rybach, David and Kannan, Anjuli and Wu, Yonghui and Pang, Ruoming and others}, diff --git a/docs/source/asr/asr_language_modeling.rst b/docs/source/asr/asr_language_modeling.rst index 432160cc12e0..fc3b9c26effc 100644 --- a/docs/source/asr/asr_language_modeling.rst +++ b/docs/source/asr/asr_language_modeling.rst @@ -21,8 +21,8 @@ best candidates. The beam search decoders in NeMo support language models traine `https://github.com/kpu/kenlm `__). The beam search decoders and KenLM library are not installed by default in NeMo, and you need to install them to be able to use beam search decoding and N-gram LM. -Please refer to `scripts/asr_language_modeling/ngram_lm/install_beamsearch_decoders.sh `__ -on how to install them. Alternatively, you can build Docker image +Please refer to `scripts/asr_language_modeling/ngram_lm/install_beamsearch_decoders.sh `__ +on how to install them. Alternatively, you can build Docker image `scripts/installers/Dockerfile.ngramtools `__ with all the necessary dependencies. NeMo supports both character-based and BPE-based models for N-gram LMs. An N-gram LM can be used with beam search @@ -76,27 +76,27 @@ it is stored at the path specified by `kenlm_model_file`. The following is the list of the arguments for the training script: -+------------------+----------+-------------+-------------------------------------------------------------------------------------------------+ -| **Argument** | **Type** | **Default** | **Description** | -+------------------+----------+-------------+-------------------------------------------------------------------------------------------------+ -| nemo_model_file | str | Required | The path to `.nemo` file of the ASR model, or name of a pretrained NeMo model to extract a tokenizer. | -+------------------+----------+-------------+-------------------------------------------------------------------------------------------------+ -| train_paths | List[str] | Required | List of training files or folders. Files can be a plain text file or ".json" manifest or ".json.gz". | -+------------------+----------+-------------+-------------------------------------------------------------------------------------------------+ -| kenlm_model_file | str | Required | The path to store the KenLM binary model file. | -+------------------+----------+-------------+-------------------------------------------------------------------------------------------------+ -| kenlm_bin_path | str | Required | The path to the bin folder of KenLM. It is a folder named `bin` under where KenLM is installed. | -+------------------+----------+-------------+-------------------------------------------------------------------------------------------------+ -| ngram_length** | int | Required | Specifies order of N-gram LM. | -+------------------+----------+-------------+-------------------------------------------------------------------------------------------------+ ++------------------+----------+-------------+--------------------------------------------------------------------------------------------------------------------------------+ +| **Argument** | **Type** | **Default** | **Description** | ++------------------+----------+-------------+--------------------------------------------------------------------------------------------------------------------------------+ +| nemo_model_file | str | Required | The path to `.nemo` file of the ASR model, or name of a pretrained NeMo model to extract a tokenizer. | ++------------------+----------+-------------+--------------------------------------------------------------------------------------------------------------------------------+ +| train_paths | List[str] | Required | List of training files or folders. Files can be a plain text file or ".json" manifest or ".json.gz". | ++------------------+----------+-------------+--------------------------------------------------------------------------------------------------------------------------------+ +| kenlm_model_file | str | Required | The path to store the KenLM binary model file. | ++------------------+----------+-------------+--------------------------------------------------------------------------------------------------------------------------------+ +| kenlm_bin_path | str | Required | The path to the bin folder of KenLM. It is a folder named `bin` under where KenLM is installed. | ++------------------+----------+-------------+--------------------------------------------------------------------------------------------------------------------------------+ +| ngram_length** | int | Required | Specifies order of N-gram LM. | ++------------------+----------+-------------+--------------------------------------------------------------------------------------------------------------------------------+ | ngram_prune | List[int] | [0] | List of thresholds to prune N-grams. Example: [0,0,1]. See Pruning section on the https://kheafield.com/code/kenlm/estimation | -+------------------+----------+-------------+-------------------------------------------------------------------------------------------------+ -| cache_path | str | "" | Cache path to save tokenized files. | -+------------------+----------+-------------+-------------------------------------------------------------------------------------------------+ -| preserve_arpa | bool | ``False`` | Whether to preserve the intermediate ARPA file after construction of the BIN file. | -+------------------+----------+-------------+-------------------------------------------------------------------------------------------------+ -| verbose | int | 1 | Verbose level. | -+------------------+----------+-------------+-------------------------------------------------------------------------------------------------+ ++------------------+----------+-------------+--------------------------------------------------------------------------------------------------------------------------------+ +| cache_path | str | "" | Cache path to save tokenized files. | ++------------------+----------+-------------+--------------------------------------------------------------------------------------------------------------------------------+ +| preserve_arpa | bool | ``False`` | Whether to preserve the intermediate ARPA file after construction of the BIN file. | ++------------------+----------+-------------+--------------------------------------------------------------------------------------------------------------------------------+ +| verbose | int | 1 | Verbose level. | ++------------------+----------+-------------+--------------------------------------------------------------------------------------------------------------------------------+ ** Note: Recommend to use 6 as the order of the N-gram model for BPE-based models. Higher orders may need the re-compilation of KenLM to support it. @@ -146,50 +146,50 @@ can get skipped. The following is the list of the important arguments for the evaluation script: -+---------------------+----------+------------------+-------------------------------------------------------------------------+ -| **Argument** | **Type** | **Default** | **Description** | -+---------------------+----------+------------------+-------------------------------------------------------------------------+ -| nemo_model_file | str | Required | The path of the `.nemo` file of the ASR model to extract the tokenizer. | -+---------------------+----------+------------------+-------------------------------------------------------------------------+ -| input_manifest | str | Required | Path to the training file, it can be a text file or JSON manifest. | -+---------------------+----------+------------------+-------------------------------------------------------------------------+ -| kenlm_model_file | str | Required | The path to store the KenLM binary model file. | -+---------------------+----------+------------------+-------------------------------------------------------------------------+ -| preds_output_folder | str | None | The path to an optional folder to store the predictions. | -+---------------------+----------+------------------+-------------------------------------------------------------------------+ -| probs_cache_file | str | None | The cache file for storing the outputs of the model. | -+---------------------+----------+------------------+-------------------------------------------------------------------------+ -| acoustic_batch_size | int | 16 | The batch size to calculate log probabilities. | -+---------------------+----------+------------------+-------------------------------------------------------------------------+ -| use_amp | bool | False | Whether to use AMP if available to calculate log probabilities. | -+---------------------+----------+------------------+-------------------------------------------------------------------------+ -| device | str | cuda | The device to load the model onto to calculate log probabilities. | -| | | | It can `cpu`, `cuda`, `cuda:0`, `cuda:1`, ... | -+---------------------+----------+------------------+-------------------------------------------------------------------------+ -| decoding_mode | str | beamsearch_ngram | The decoding scheme to be used for evaluation. | -+---------------------+----------+------------------+-------------------------------------------------------------------------+ -| beam_width | float | Required | List of the width or list of the widths of the beam search decoding. | -+---------------------+----------+------------------+-------------------------------------------------------------------------+ -| beam_alpha | float | Required | List of the alpha parameter for the beam search decoding. | -+---------------------+----------+------------------+-------------------------------------------------------------------------+ -| beam_beta | float | Required | List of the beta parameter for the beam search decoding. | -+---------------------+----------+------------------+-------------------------------------------------------------------------+ -| beam_batch_size | int | 128 | The batch size to be used for beam search decoding. | -| | | | Larger batch size can be a little faster, but uses larger memory. | -+---------------------+----------+------------------+-------------------------------------------------------------------------+ -| decoding_strategy | str | beam | String argument for type of decoding strategy for the model. | -+---------------------+----------+------------------+-------------------------------------------------------------------------+ -| decoding | Dict | BeamCTC | Subdict of beam search configs. Values found via | -| | Config | InferConfig | python eval_beamsearch_ngram.py --help | -+---------------------+----------+------------------+-------------------------------------------------------------------------+ -| text_processing.do_lowercase | bool | ``False`` | Whether to make the training text all lower case. | -+---------------------+----------+------------------+-------------------------------------------------------------------------+ -| text_processing.punctuation_marks | str | "" | String with punctuation marks to process. Example: ".\,?" | -+---------------------+----------+------------------+-------------------------------------------------------------------------+ -| text_processing.rm_punctuation | bool | ``False``| Whether to remove punctuation marks from text. | -+---------------------+----------+------------------+-------------------------------------------------------------------------+ -| text_processing.separate_punctuation | bool |``True``| Whether to separate punctuation with the previous word by space. | -+---------------------+----------+------------------+-------------------------------------------------------------------------+ ++--------------------------------------+----------+------------------+-------------------------------------------------------------------------+ +| **Argument** | **Type** | **Default** | **Description** | ++--------------------------------------+----------+------------------+-------------------------------------------------------------------------+ +| nemo_model_file | str | Required | The path of the `.nemo` file of the ASR model to extract the tokenizer. | ++--------------------------------------+----------+------------------+-------------------------------------------------------------------------+ +| input_manifest | str | Required | Path to the training file, it can be a text file or JSON manifest. | ++--------------------------------------+----------+------------------+-------------------------------------------------------------------------+ +| kenlm_model_file | str | Required | The path to store the KenLM binary model file. | ++--------------------------------------+----------+------------------+-------------------------------------------------------------------------+ +| preds_output_folder | str | None | The path to an optional folder to store the predictions. | ++--------------------------------------+----------+------------------+-------------------------------------------------------------------------+ +| probs_cache_file | str | None | The cache file for storing the outputs of the model. | ++--------------------------------------+----------+------------------+-------------------------------------------------------------------------+ +| acoustic_batch_size | int | 16 | The batch size to calculate log probabilities. | ++--------------------------------------+----------+------------------+-------------------------------------------------------------------------+ +| use_amp | bool | False | Whether to use AMP if available to calculate log probabilities. | ++--------------------------------------+----------+------------------+-------------------------------------------------------------------------+ +| device | str | cuda | The device to load the model onto to calculate log probabilities. | +| | | | It can `cpu`, `cuda`, `cuda:0`, `cuda:1`, ... | ++--------------------------------------+----------+------------------+-------------------------------------------------------------------------+ +| decoding_mode | str | beamsearch_ngram | The decoding scheme to be used for evaluation. | ++--------------------------------------+----------+------------------+-------------------------------------------------------------------------+ +| beam_width | float | Required | List of the width or list of the widths of the beam search decoding. | ++--------------------------------------+----------+------------------+-------------------------------------------------------------------------+ +| beam_alpha | float | Required | List of the alpha parameter for the beam search decoding. | ++--------------------------------------+----------+------------------+-------------------------------------------------------------------------+ +| beam_beta | float | Required | List of the beta parameter for the beam search decoding. | ++--------------------------------------+----------+------------------+-------------------------------------------------------------------------+ +| beam_batch_size | int | 128 | The batch size to be used for beam search decoding. | +| | | | Larger batch size can be a little faster, but uses larger memory. | ++--------------------------------------+----------+------------------+-------------------------------------------------------------------------+ +| decoding_strategy | str | beam | String argument for type of decoding strategy for the model. | ++--------------------------------------+----------+------------------+-------------------------------------------------------------------------+ +| decoding | Dict | BeamCTC | Subdict of beam search configs. Values found via | +| | Config | InferConfig | python eval_beamsearch_ngram.py --help | ++--------------------------------------+----------+------------------+-------------------------------------------------------------------------+ +| text_processing.do_lowercase | bool | ``False`` | Whether to make the training text all lower case. | ++--------------------------------------+----------+------------------+-------------------------------------------------------------------------+ +| text_processing.punctuation_marks | str | "" | String with punctuation marks to process. Example: ".\,?" | ++--------------------------------------+----------+------------------+-------------------------------------------------------------------------+ +| text_processing.rm_punctuation | bool | ``False`` | Whether to remove punctuation marks from text. | ++--------------------------------------+----------+------------------+-------------------------------------------------------------------------+ +| text_processing.separate_punctuation | bool | ``True`` | Whether to separate punctuation with the previous word by space. | ++--------------------------------------+----------+------------------+-------------------------------------------------------------------------+ Width of the beam search (`--beam_width`) specifies the number of top candidates/predictions the beam search decoder would search for. Larger beams result in more accurate but slower predictions. @@ -316,7 +316,7 @@ The similar script to evaluate an RNNT/HAT model with beam search decoding and N maes_expansion_gamma=[] \ hat_subtract_ilm= \ hat_ilm_weight=[] \ - + .. _neural_rescoring: @@ -478,10 +478,10 @@ Combine N-gram Language Models Before combining N-gram LMs install required OpenGrm NGram library using `scripts/installers/install_opengrm.sh `__. Alternatively, you can use Docker image `scripts/installers/Dockerfile.ngramtools `__ with all the necessary dependencies. -To combine two N-gram language models, you can use the script ngram_merge.py located at +To combine two N-gram language models, you can use the script ngram_merge.py located at `scripts/asr_language_modeling/ngram_lm/ngram_merge.py `__. -This script interpolate two ARPA N-gram language models and creates a KenLM binary file that can be used with the beam search decoders on top of ASR models. +This script interpolate two ARPA N-gram language models and creates a KenLM binary file that can be used with the beam search decoders on top of ASR models. You can specify weights (`--alpha` and `--beta`) for each of the models (`--ngram_a` and `--ngram_b`) correspondingly: `alpha` * `ngram_a` + `beta` * `ngram_b`. This script supports both character level and BPE level encodings and models which are detected automatically from the type of the model. @@ -520,28 +520,28 @@ You can use the `--force` flag to discard the cache and recalculate everything f The following is the list of the arguments for the opengrm script: -+----------------------+--------+------------------+-------------------------------------------------------------------------+ -| **Argument** |**Type**| **Default** | **Description** | -+----------------------+--------+------------------+-------------------------------------------------------------------------+ -| kenlm_bin_path | str | Required | The path to the bin folder of KenLM library. It is a folder named `bin` under where KenLM is installed. | -+----------------------+--------+------------------+-------------------------------------------------------------------------+ ++----------------------+--------+------------------+-----------------------------------------------------------------------------------------------------------------+ +| **Argument** |**Type**| **Default** | **Description** | ++----------------------+--------+------------------+-----------------------------------------------------------------------------------------------------------------+ +| kenlm_bin_path | str | Required | The path to the bin folder of KenLM library. It is a folder named `bin` under where KenLM is installed. | ++----------------------+--------+------------------+-----------------------------------------------------------------------------------------------------------------+ | ngram_bin_path | str | Required | The path to the bin folder of OpenGrm Ngram. It is a folder named `bin` under where OpenGrm Ngram is installed. | -+----------------------+--------+------------------+-------------------------------------------------------------------------+ -| arpa_a | str | Required | Path to the ARPA N-gram model file A | -+----------------------+--------+------------------+-------------------------------------------------------------------------+ -| alpha | float | Required | Weight of N-gram model A | -+----------------------+--------+------------------+-------------------------------------------------------------------------+ -| arpa_b | int | Required | Path to the ARPA N-gram model file B | -+----------------------+--------+------------------+-------------------------------------------------------------------------+ -| beta | float | Required | Weight of N-gram model B | -+----------------------+--------+------------------+-------------------------------------------------------------------------+ -| out_path | str | Required | Path for writing temporary and resulting files. | -+----------------------+--------+------------------+-------------------------------------------------------------------------+ -| test_file | str | None | Path to test file to count perplexity if provided. | -+----------------------+--------+------------------+-------------------------------------------------------------------------+ -| symbols | str | None | Path to symbols (.syms) file. Could be calculated if it is not provided.| -+----------------------+--------+------------------+-------------------------------------------------------------------------+ -| nemo_model_file | str | None | The path to '.nemo' file of the ASR model, or name of a pretrained NeMo model. | -+----------------------+--------+------------------+-------------------------------------------------------------------------+ -| force | bool | ``False`` | Whether to recompile and rewrite all files | -+----------------------+--------+------------------+-------------------------------------------------------------------------+ ++----------------------+--------+------------------+-----------------------------------------------------------------------------------------------------------------+ +| arpa_a | str | Required | Path to the ARPA N-gram model file A | ++----------------------+--------+------------------+-----------------------------------------------------------------------------------------------------------------+ +| alpha | float | Required | Weight of N-gram model A | ++----------------------+--------+------------------+-----------------------------------------------------------------------------------------------------------------+ +| arpa_b | int | Required | Path to the ARPA N-gram model file B | ++----------------------+--------+------------------+-----------------------------------------------------------------------------------------------------------------+ +| beta | float | Required | Weight of N-gram model B | ++----------------------+--------+------------------+-----------------------------------------------------------------------------------------------------------------+ +| out_path | str | Required | Path for writing temporary and resulting files. | ++----------------------+--------+------------------+-----------------------------------------------------------------------------------------------------------------+ +| test_file | str | None | Path to test file to count perplexity if provided. | ++----------------------+--------+------------------+-----------------------------------------------------------------------------------------------------------------+ +| symbols | str | None | Path to symbols (.syms) file. Could be calculated if it is not provided. | ++----------------------+--------+------------------+-----------------------------------------------------------------------------------------------------------------+ +| nemo_model_file | str | None | The path to '.nemo' file of the ASR model, or name of a pretrained NeMo model. | ++----------------------+--------+------------------+-----------------------------------------------------------------------------------------------------------------+ +| force | bool | ``False`` | Whether to recompile and rewrite all files | ++----------------------+--------+------------------+-----------------------------------------------------------------------------------------------------------------+ diff --git a/docs/source/asr/configs.rst b/docs/source/asr/configs.rst index 83bf41353d5d..8285b2bfa0ba 100644 --- a/docs/source/asr/configs.rst +++ b/docs/source/asr/configs.rst @@ -1030,20 +1030,20 @@ Fine-tuning Configurations All ASR scripts support easy fine-tuning by partially/fully loading the pretrained weights from a checkpoint into the **currently instantiated model**. Note that the currently instantiated model should have parameters that match the pre-trained checkpoint (such that weights may load properly). In order to directly fine-tune a pre-existing checkpoint, please follow the tutorial `ASR Language Fine-tuning. `_ -Models can be fine-tuned in two ways: +Models can be fine-tuned in two ways: * By updating or retaining current tokenizer alone * By updating model architecture and tokenizer Fine-tuning by updating or retaining current tokenizer -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -In this case, the model architecture is not updated. The model is initialized with the pre-trained weights by +In this case, the model architecture is not updated. The model is initialized with the pre-trained weights by two ways: 1) Providing a path to a NeMo model (via ``init_from_nemo_model``) 2) Providing a name of a pretrained NeMo model (which will be downloaded via the cloud) (via ``init_from_pretrained_model``) -Then users can use existing tokenizer or update the tokenizer with new vocabulary. This is useful when users don't want to update the model architecture +Then users can use existing tokenizer or update the tokenizer with new vocabulary. This is useful when users don't want to update the model architecture but want to update the tokenizer with new vocabulary. The same script can be used to finetune CTC, RNNT or Hybrid models as well. @@ -1073,12 +1073,12 @@ Finetune ASR Models using HuggingFace Datasets Users can utilize HuggingFace Datasets for finetuning NeMo ASR models. The following config file can be used for this purpose: `/examples/asr/conf/asr_finetune/speech_to_text_hf_finetune.yaml` -As mentioned earlier, users can update the tokenizer or use an existing one based on their requirements. If users want to create a new tokenizer +As mentioned earlier, users can update the tokenizer or use an existing one based on their requirements. If users want to create a new tokenizer from HuggingFace Datasets, they can use the following script: `/scripts/tokenizers/get_hf_text_data.py` Fine-tuning by changing model architecture and tokenizer -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If users want to update the model architecture as well they can use the following script: @@ -1105,7 +1105,7 @@ There are multiple ASR subtasks inside the ``examples/asr/`` directory, you can To reinitialize part of the model, to make it different from the pretrained model, users can mention them through config: .. code-block:: yaml - + init_from_nemo_model: "" asr_model: include: ["preprocessor","encoder"] diff --git a/docs/source/asr/datasets.rst b/docs/source/asr/datasets.rst index 661592da1947..7b6873de0ed7 100644 --- a/docs/source/asr/datasets.rst +++ b/docs/source/asr/datasets.rst @@ -218,7 +218,7 @@ of filepaths, e.g. ``['/data/shard1.tar', '/data/shard2.tar']``, or in a single tag ``_CL_``. For SLURM based tasks, we suggest the use of the special tags for ease of use. As with non-tarred datasets, the manifest file should be passed in ``manifest_filepath``. The dataloader assumes that the length -of the manifest after filtering is the correct size of the dataset for reporting training progress. +of the manifest after filtering is the correct size of the dataset for reporting training progress. The ``tarred_shard_strategy`` field of the config file can be set if you have multiple shards and are running an experiment with multiple workers. It defaults to ``scatter``, which preallocates a set of shards per worker which do not change during runtime. @@ -246,8 +246,8 @@ is identical to the audio tarballs and there should be a 1:1 relationship betwee ``'/data/sharded_manifests/manifest__OP_1..64_CL_'`` in the above example. Using sharded manifests improves job startup times and decreases memory usage, as each worker only loads manifest shards for the corresponding audio shards instead of the entire manifest. -To enable sharded manifest filename expansion, set the ``shard_manifests`` field of the config file to true. In addition, the -``defer_setup`` flag needs to be true as well, so that the dataloader will be initialized after the DDP and its length can be collected from +To enable sharded manifest filename expansion, set the ``shard_manifests`` field of the config file to true. In addition, the +``defer_setup`` flag needs to be true as well, so that the dataloader will be initialized after the DDP and its length can be collected from the distributed workers. @@ -276,7 +276,7 @@ audio files according to ``min_duration`` and ``max_duration``, and tar the rema The files in the target directory should look similar to the following: -.. code:: +.. code:: none target_dir/ ├── audio_1.tar @@ -437,7 +437,7 @@ For tarred datasets, shards from the AIS cluster are used by piping ``ais get`` Tarred Dataset from AIS ^^^^^^^^^^^^^^^^^^^^^^^ -A tarred dataset can be easily used as described in the :ref:`Tarred Datasets` section by providing paths to manifests on an AIS cluster. +A tarred dataset can be easily used as described in the `Tarred Datasets`_ section by providing paths to manifests on an AIS cluster. For example, a tarred dataset from an AIS cluster can be configured as .. code:: @@ -445,7 +445,7 @@ For example, a tarred dataset from an AIS cluster can be configured as manifest_filepath='ais://bucket/tarred_audio_manifest.json' tarred_audio_filepaths='ais://bucket/shard_{1..64}.tar' -:ref:`Bucketing Datasets` are configured in a similar way by providing paths on an AIS cluster. +`Bucketing Datasets`_ are configured in a similar way by providing paths on an AIS cluster. Non-tarred Dataset from AIS ^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -637,7 +637,9 @@ Pre-computing bucket duration bins ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ We recommend to pre-compute the bucket duration bins in order to accelerate the start of the training -- otherwise, the dynamic bucketing sampler will have to spend some time estimating them before the training starts. -The following script may be used:: +The following script may be used: + +.. code-block:: bash $ python scripts/speech_recognition/estimate_duration_bins.py -b 30 manifest.json @@ -646,7 +648,9 @@ The following script may be used:: bucket_duration_bins=[1.78,2.34,2.69,... -For multi-dataset setups, one may provide multiple manifests and even their weights:: +For multi-dataset setups, one may provide multiple manifests and even their weights: + +.. code-block:: bash $ python scripts/speech_recognition/estimate_duration_bins.py -b 30 [[manifest.json,0.7],[other.json,0.3]] diff --git a/docs/source/asr/images/conf-ensembles-overview.png b/docs/source/asr/images/conf-ensembles-overview.png new file mode 100644 index 0000000000000000000000000000000000000000..66c63d359290f2026ccd9559dab3517343d4a0fd GIT binary patch literal 134089 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 z%0A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 # path to dir containing audio files to transcribe The script will save all transcriptions in a JSONL file where each line corresponds to an audio file in ````. -This file will correspond to a format that NeMo commonly uses for saving model predictions, and also for storing -input data for training and evaluation. You can learn more about the format that NeMo uses for these files +This file will correspond to a format that NeMo commonly uses for saving model predictions, and also for storing +input data for training and evaluation. You can learn more about the format that NeMo uses for these files (which we refer to as "manifest files") :ref:`here`. -You can also specify the files to be transcribed inside a manifest file, and pass that in using the argument +You can also specify the files to be transcribed inside a manifest file, and pass that in using the argument ``dataset_manifest=`` instead of ``audio_dir``. @@ -87,8 +87,8 @@ You can get a good improvement in transcription accuracy even using a simple N-g After :ref:`training ` an N-gram LM, you can use it for transcribing audio as follows: -1. Install the OpenSeq2Seq beam search decoding and KenLM libraries using `this script `_. -2. Perform transcription using `this script `_: +1. Install the OpenSeq2Seq beam search decoding and KenLM libraries using the `install_beamsearch_decoders script `_. +2. Perform transcription using the `eval_beamsearch_ngram script `_: .. code-block:: bash @@ -124,9 +124,9 @@ The pretrained models also vary by: * **language** (English, Spanish, etc., including some **multilingual** and **code-switching** models), * whether the output text contains **punctuation & capitalization** or not. -The NeMo ASR checkpoints can be found on `HuggingFace `_, or on `NGC `_. All models released by the NeMo team can be found on NGC, and some of those are also available on HuggingFace. +The NeMo ASR checkpoints can be found on `HuggingFace `_, or on `NGC `_. All models released by the NeMo team can be found on NGC, and some of those are also available on HuggingFace. -All NeMo ASR checkpoints open-sourced by the NeMo team follow the following naming convention: +All NeMo ASR checkpoints open-sourced by the NeMo team follow the following naming convention: ``stt_{language}_{encoder name}_{decoder name}_{model size}{_optional descriptor}``. You can load the checkpoints automatically using the ``ASRModel.from_pretrained()`` class method, for example: @@ -141,7 +141,7 @@ You can load the checkpoints automatically using the ``ASRModel.from_pretrained( # you can also load open-sourced NeMo models released by other HF users using: # asr_model = nemo_asr.models.ASRModel.from_pretrained("/") -See further documentation about :doc:`loading checkpoints <./results>`, a full :ref:`list ` of models and their :doc:`benchmark scores <./score>`. +See further documentation about :doc:`loading checkpoints <./results>`, a full :ref:`list ` of models and their :doc:`benchmark scores <./scores>`. There is also more information about the ASR model architectures available in NeMo :doc:`here <./models>`. @@ -175,7 +175,7 @@ Preparing ASR datasets NeMo includes preprocessing scripts for several common ASR datasets. The :doc:`Datasets <./datasets>` section contains instructions on running those scripts. It also includes guidance for creating your own NeMo-compatible dataset, if you have your own data. -Further information +Further information ------------------- For more information, see additional sections in the ASR docs on the left-hand-side menu or in the list below: @@ -189,5 +189,4 @@ For more information, see additional sections in the ASR docs on the left-hand-s scores configs api - resources examples/kinyarwanda_asr.rst diff --git a/docs/source/asr/models.rst b/docs/source/asr/models.rst index 4752ff931af7..6b0087fd5f3d 100644 --- a/docs/source/asr/models.rst +++ b/docs/source/asr/models.rst @@ -98,7 +98,7 @@ Here is the overall architecture of the encoder of Conformer-CTC: :scale: 50% This model supports both the sub-word level and character level encodings. You can find more details on the config files for the -Conformer-CTC models at `Conformer-CTC <./configs.html#conformer-ctc>`_. The variant with sub-word encoding is a BPE-based model +Conformer-CTC models in the `Conformer-CTC configuration documentation <./configs.html#conformer-ctc>`_. The variant with sub-word encoding is a BPE-based model which can be instantiated using the :class:`~nemo.collections.asr.models.EncDecCTCModelBPE` class, while the character-based variant is based on :class:`~nemo.collections.asr.models.EncDecCTCModel`. @@ -118,7 +118,7 @@ Most of the config file for Conformer-Transducer models are similar to Conformer You may take a look at our `tutorials page <../starthere/tutorials.html>`_ on Transducer models to become familiar with their configs: `Introduction to Transducers `_ and `ASR with Transducers `_ -You can find more details on the config files for the Conformer-Transducer models at `Conformer-CTC <./configs.html#conformer-ctc>`_. +You can find more details on the config files for the Conformer-Transducer models in the `Conformer-CTC configuration documentation <./configs.html#conformer-ctc>`_. This model supports both the sub-word level and character level encodings. The variant with sub-word encoding is a BPE-based model which can be instantiated using the :class:`~nemo.collections.asr.models.EncDecRNNTBPEModel` class, while the @@ -159,51 +159,57 @@ You may find more examples under ``/examples/asr/conf/fastconform Cache-aware Streaming Conformer ------------------------------- -Try real-time ASR with the Cache-aware Streaming Conformer `tutorial notebook `_. +Try real-time ASR with the `Cache-aware Streaming Conformer tutorial notebook `_. -Buffered streaming uses overlapping chunks to make an offline ASR model to be used for streaming with reasonable accuracy. However, it uses significant amount of duplication in computations due to the overlapping chunks. -Also there is a accuracy gap between the offline model and the streaming one as there is inconsistency between how we train the model and how we perform inference for streaming. -The Cache-aware Streaming Conformer models would tackle and address these disadvantages. These streaming Conformers are trained with limited right context that it would make it possible to match how the model is being used in both the training and inference. -They also uses caching to store intermediate activations to avoid any duplication in compute. +Buffered streaming uses overlapping chunks to make an offline ASR model usable for streaming with reasonable accuracy. However, it causes significant amount of duplication in computation due to the overlapping chunks. +Also, there is an accuracy gap between the offline model and the streaming one, as there is inconsistency between how we train the model and how we perform inference for streaming. +The Cache-aware Streaming Conformer models tackle and address these disadvantages. These streaming Conformers are trained with limited right context, making it possible to match how the model is being used in both training and inference. +They also use caching to store intermediate activations to avoid any duplication in compute. The cache-aware approach is supported for both the Conformer-CTC and Conformer-Transducer and enables the model to be used very efficiently for streaming. -Three categories of layers in Conformer have access to right tokens: 1-depthwise convolutions 2-self-attention, and 3-convolutions in the downsampling layers. -Streaming Conformer models uses causal convolutions or convolutions with lower right context and also self-attention with limited right context to limit the effective right context for the input. +Three categories of layers in Conformer have access to right tokens: +#. depthwise convolutions +#. self-attention +#. convolutions in the downsampling layers. + +Streaming Conformer models use causal convolutions or convolutions with lower right context and also self-attention with limited right context to limit the effective right context for the input. The model trained with such limitations can be used in streaming mode and give the exact same outputs and accuracy as when the whole audio is given to the model in offline mode. These model can use caching mechanism to store and reuse the activations during streaming inference to avoid any duplications in the computations as much as possible. -We support the following three right context modeling: - -* fully causal model with zero look-ahead: tokens would not see any future tokens. convolution layers are all causal and right tokens are masked for self-attention. - -It gives zero latency but with limited accuracy. -To train such a model, you need to set `model.encoder.att_context_size=[left_context,0]` and `model.encoder.conv_context_size=causal` in the config. +We support the following three right context modeling techniques: -* regular look-ahead: convolutions would be able to see few future frames, and self-attention would also see the same number of future tokens. +* | Fully causal model with zero look-ahead: tokens do not see any future tokens. Convolution layers are all causal and right tokens are masked for self-attention. + | + | It gives zero latency but with limited accuracy. + | To train such a model, you need to set `model.encoder.att_context_size=[left_context,0]` and `model.encoder.conv_context_size=causal` in the config. -In this approach the activations for the look-ahead part is not cached and recalculated in the next chunks. The right context in each layer should be a small number as multiple layers would increase the effective context size and then increase the look-ahead size and latency. -For example for a model of 17 layers with 4x downsampling and 10ms window shift, then even 2 right context in each layer means 17*2*10*4=1360ms look-ahead. Each step after the downsampling corresponds to 4*10=40ms. +* | Regular look-ahead: convolutions are able to see few future frames, and self-attention also sees the same number of future tokens. + | + | In this approach the activations for the look-ahead part are not cached, and are recalculated in the next chunks. The right context in each layer should be a small number as multiple layers would increase the effective context size and then increase the look-ahead size and latency. + | For example for a model of 17 layers with 4x downsampling and 10ms window shift, then even 2 right context in each layer means 17*2*10*4=1360ms look-ahead. Each step after the downsampling corresponds to 4*10=40ms. -* chunk-aware look-ahead: input is split into equal chunks. Convolutions are fully causal while self-attention layers would be able to see all the tokens in their corresponding chunk. +* | Chunk-aware look-ahead: input is split into equal chunks. Convolutions are fully causal while self-attention layers are able to see all the tokens in their corresponding chunk. + | + | For example, in a model with chunk size of 20 tokens, tokens at the first position of each chunk would see all the next 19 tokens while the last token would see zero future tokens. + | This approach is more efficient than regular look-ahead in terms of computations as the activations for most of the look-ahead part would be cached and there is close to zero duplications in the calculations. + | In terms of accuracy, this approach gives similar or even better results in term of accuracy than regular look-ahead as each token in each layer have access to more tokens on average. That is why we recommend to use this approach for streaming. Therefore we recommend to use the chunk-aware for cache-aware models. -For example, in a model which chunk size of 20 tokens, tokens at the first position of each chunk would see all the next 19 tokens while the last token would see zero future tokens. -This approach is more efficient than regular look-ahead in terms of computations as the activations for most of the look-ahead part would be cached and there is close to zero duplications in the calculations. -In terms of accuracy, this approach gives similar or even better results in term of accuracy than regular look-ahead as each token in each layer have access to more tokens on average. That is why we recommend to use this approach for streaming. Therefore we recommend to use the chunk-aware for cache-aware models. - -** Note: Latencies are based on the assumption that the forward time of the network is zero and it just estimates the time needed after a frame would be available until it is passed through the model. +.. note:: Latencies are based on the assumption that the forward time of the network is zero and it just estimates the time needed after a frame would be available until it is passed through the model. Approaches with non-zero look-ahead can give significantly better accuracy by sacrificing latency. The latency can get controlled by the left context size. Increasing the right context would help the accuracy to a limit but would increase the computation time. -In all modes, left context can be controlled by the number of tokens to be visible in the self-attention and the kernel size of the convolutions. -For example, if left context of self-attention in each layer is set to 20 tokens and there are 10 layers of Conformer, then effective left context is 20*10=200 tokens. -Left context of self-attention for regular look-ahead can be set as any number while it should be set as a multiplication of the right context in chunk-aware look-ahead. -For convolutions, if we use a left context of 30 in such model, then there would be 30*10=300 effective left context. -Left context of convolutions is dependent to the their kernel size while it can be any number for self-attention layers. Higher left context for self-attention means larger cache and more computations for the self-attention. -Self-attention left context of around 6 secs would give close result to have unlimited left context. For a model with 4x downsampling and shift window of 10ms in the preprocessor, each token corresponds to 4*10=40ms. +In all modes, left context can be controlled by the number of tokens visible in self-attention and the kernel size of the convolutions. +For example, if the left context of self-attention in each layer is set to 20 tokens and there are 10 layers of Conformer, then the effective left context is 20*10=200 tokens. +Left context of self-attention for regular look-ahead can be set as any number, while it should be set as a multiple of the right context in chunk-aware look-ahead. +For convolutions, if we use a left context of 30, then there would be 30*10=300 effective left context. +Left context of convolutions is dependent on their kernel size while it can be any number for self-attention layers. Higher left context for self-attention means larger cache and more computations for the self-attention. +A self-attention left context of around 6 secs would give close results to unlimited left context. For a model with 4x downsampling and shift window of 10ms in the preprocessor, each token corresponds to 4*10=40ms. If striding approach is used for downsampling, all the convolutions in downsampling would be fully causal and don't see future tokens. -* Multiple Look-aheads +Multiple Look-aheads +~~~~~~~~~~~~~~~~~~~~ + We support multiple look-aheads for cahce-aware models. You may specify a list of context sizes for att_context_size. During the training, different context sizes would be used randomly with the distribution specified by att_context_probs. For example you may enable multiple look-aheads by setting `model.encoder.att_context_size=[[70,13],[70,6],[70,1],[70,0]]` for the training. @@ -377,7 +383,7 @@ Confidence-based Ensembles Confidence-based ensemble is a simple way to combine multiple models into a single system by only retaining the output of the most confident model. Below is a schematic illustration of how such ensembles work. - .. image:: https://github.com/NVIDIA/NeMo/releases/download/v1.19.0/conf-ensembles-overview.png + .. image:: images/conf-ensembles-overview.png :align: center :alt: confidence-based ensembles :scale: 50% diff --git a/docs/source/asr/results.rst b/docs/source/asr/results.rst index 72259f763fa9..b38a661a0ea9 100644 --- a/docs/source/asr/results.rst +++ b/docs/source/asr/results.rst @@ -8,13 +8,13 @@ There are two main ways to load pretrained checkpoints in NeMo: Refer to the following sections for instructions and examples for each. -Note that these instructions are for loading fully trained checkpoints for evaluation or fine-tuning. For resuming an unfinished +Note that these instructions are for loading fully trained checkpoints for evaluation or fine-tuning. For resuming an unfinished training experiment, use the Experiment Manager to do so by setting the ``resume_if_exists`` flag to ``True``. Loading Local Checkpoints ------------------------- -NeMo automatically saves checkpoints of a model that is trained in a ``.nemo`` format. Alternatively, to manually save the model at any +NeMo automatically saves checkpoints of a model that is trained in a ``.nemo`` format. Alternatively, to manually save the model at any point, issue :code:`model.save_to(.nemo)`. If there is a local ``.nemo`` checkpoint that you'd like to load, use the :code:`restore_from()` method: @@ -40,7 +40,7 @@ made for convenience purpose :code:`hybrid_model.save_asr_model_to(`_. The model cards on NGC contain more information about each of the checkpoints available. @@ -139,7 +139,7 @@ Often times, we want to transcribe a large number of files at once (maybe from a For more information, see `nemo.collections.asr.modules <./api.html#modules>`__. For more information on the general ``Transcription API``, please take a look at :class:`~nemo.collections.asr.parts.mixins.transcription.TranscriptionMixin`. The audio files should be 16KHz mono-channel wav files. Inference on long audio -^^^^^^^^^^^^^^^^^^^^^^ +^^^^^^^^^^^^^^^^^^^^^^^ In some cases the audio is too long for standard inference, especially if you're using a model such as Conformer, where the time and memory costs of the attention layers scale quadratically with the duration. @@ -188,7 +188,7 @@ Sometimes, the downsampling module at the earliest stage of the model can take m Inference on Apple M-Series GPU ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -To perform inference on Apple Mac M-Series GPU (``mps`` PyTorch device), use PyTorch 2.0 or higher (see :ref:`mac-installation` section). Environment variable ``PYTORCH_ENABLE_MPS_FALLBACK=1`` should be set, since not all operations in PyTorch are currently implemented on ``mps`` device. +To perform inference on Apple Mac M-Series GPU (``mps`` PyTorch device), use PyTorch 2.0 or higher (see the `mac-installation ` section). Environment variable ``PYTORCH_ENABLE_MPS_FALLBACK=1`` should be set, since not all operations in PyTorch are currently implemented on ``mps`` device. If ``allow_mps=true`` flag is passed to ``speech_to_text_eval.py``, the ``mps`` device will be selected automatically. @@ -268,7 +268,7 @@ French :align: left :widths: 40, 10, 50 :header-rows: 1 - + ----------------------------- Polish @@ -353,7 +353,7 @@ Kinyarwanda ----------------------------- Belarusian -^^^^^^^^^^^ +^^^^^^^^^^ .. csv-table:: :file: data/benchmark_by.csv :align: left @@ -363,7 +363,7 @@ Belarusian ----------------------------- Ukrainian -^^^^^^^^^^^ +^^^^^^^^^ .. csv-table:: :file: data/benchmark_ua.csv :align: left @@ -373,7 +373,7 @@ Ukrainian ----------------------------- Multilingual -^^^^^^^^^^^ +^^^^^^^^^^^^ .. csv-table:: :file: data/benchmark_multilingual.csv :align: left @@ -383,7 +383,7 @@ Multilingual ----------------------------- Code-Switching -^^^^^^^^^^^ +^^^^^^^^^^^^^^ .. csv-table:: :file: data/benchmark_code_switching.csv :align: left diff --git a/docs/source/asr/scores.rst b/docs/source/asr/scores.rst index 31ea31292847..b217693a18e8 100644 --- a/docs/source/asr/scores.rst +++ b/docs/source/asr/scores.rst @@ -11,49 +11,49 @@ EN :header-rows: 1 :align: left :file: data/scores/en/citrinet_en.csv - + -------------------- .. csv-table:: :header-rows: 1 :align: left :file: data/scores/en/conformer_en.csv - + -------------------- .. csv-table:: :header-rows: 1 :align: left :file: data/scores/en/contextnet_en.csv - + -------------------- .. csv-table:: :header-rows: 1 :align: left :file: data/scores/en/fastconformer_en.csv - + -------------------- .. csv-table:: :header-rows: 1 :align: left :file: data/scores/en/jasper10x5dr_en.csv - + -------------------- .. csv-table:: :header-rows: 1 :align: left :file: data/scores/en/quartznet15x5_en.csv - + -------------------- .. csv-table:: :header-rows: 1 :align: left :file: data/scores/en/squeezeformer_en.csv - + -------------------- BE @@ -63,7 +63,7 @@ BE :header-rows: 1 :align: left :file: data/scores/be/conformer_be.csv - + -------------------- BY @@ -73,7 +73,7 @@ BY :header-rows: 1 :align: left :file: data/scores/by/fastconformer_by.csv - + -------------------- CA @@ -83,14 +83,14 @@ CA :header-rows: 1 :align: left :file: data/scores/ca/conformer_ca.csv - + -------------------- .. csv-table:: :header-rows: 1 :align: left :file: data/scores/ca/quartznet15x5_ca.csv - + -------------------- DE @@ -100,35 +100,35 @@ DE :header-rows: 1 :align: left :file: data/scores/de/citrinet_de.csv - + -------------------- .. csv-table:: :header-rows: 1 :align: left :file: data/scores/de/conformer_de.csv - + -------------------- .. csv-table:: :header-rows: 1 :align: left :file: data/scores/de/contextnet_de.csv - + -------------------- .. csv-table:: :header-rows: 1 :align: left :file: data/scores/de/fastconformer_de.csv - + -------------------- .. csv-table:: :header-rows: 1 :align: left :file: data/scores/de/quartznet15x5_de.csv - + -------------------- ENES @@ -138,14 +138,14 @@ ENES :header-rows: 1 :align: left :file: data/scores/enes/conformer_enes.csv - + -------------------- .. csv-table:: :header-rows: 1 :align: left :file: data/scores/enes/contextnet_enes.csv - + -------------------- EO @@ -155,7 +155,7 @@ EO :header-rows: 1 :align: left :file: data/scores/eo/conformer_eo.csv - + -------------------- ES @@ -165,35 +165,35 @@ ES :header-rows: 1 :align: left :file: data/scores/es/citrinet_es.csv - + -------------------- .. csv-table:: :header-rows: 1 :align: left :file: data/scores/es/conformer_es.csv - + -------------------- .. csv-table:: :header-rows: 1 :align: left :file: data/scores/es/contextnet_es.csv - + -------------------- .. csv-table:: :header-rows: 1 :align: left :file: data/scores/es/fastconformer_es.csv - + -------------------- .. csv-table:: :header-rows: 1 :align: left :file: data/scores/es/quartznet15x5_es.csv - + -------------------- FR @@ -203,28 +203,28 @@ FR :header-rows: 1 :align: left :file: data/scores/fr/citrinet_fr.csv - + -------------------- .. csv-table:: :header-rows: 1 :align: left :file: data/scores/fr/conformer_fr.csv - + -------------------- .. csv-table:: :header-rows: 1 :align: left :file: data/scores/fr/contextnet_fr.csv - + -------------------- .. csv-table:: :header-rows: 1 :align: left :file: data/scores/fr/quartznet15x5_fr.csv - + -------------------- HR @@ -234,14 +234,14 @@ HR :header-rows: 1 :align: left :file: data/scores/hr/conformer_hr.csv - + -------------------- .. csv-table:: :header-rows: 1 :align: left :file: data/scores/hr/fastconformer_hr.csv - + -------------------- IT @@ -251,21 +251,21 @@ IT :header-rows: 1 :align: left :file: data/scores/it/conformer_it.csv - + -------------------- .. csv-table:: :header-rows: 1 :align: left :file: data/scores/it/fastconformer_it.csv - + -------------------- .. csv-table:: :header-rows: 1 :align: left :file: data/scores/it/quartznet15x5_it.csv - + -------------------- KAB @@ -275,7 +275,7 @@ KAB :header-rows: 1 :align: left :file: data/scores/kab/conformer_kab.csv - + -------------------- NL @@ -285,7 +285,7 @@ NL :header-rows: 1 :align: left :file: data/scores/nl/fastconformer_nl.csv - + -------------------- PL @@ -295,14 +295,14 @@ PL :header-rows: 1 :align: left :file: data/scores/pl/fastconformer_pl.csv - + -------------------- .. csv-table:: :header-rows: 1 :align: left :file: data/scores/pl/quartznet15x5_pl.csv - + -------------------- RU @@ -312,14 +312,14 @@ RU :header-rows: 1 :align: left :file: data/scores/ru/conformer_ru.csv - + -------------------- .. csv-table:: :header-rows: 1 :align: left :file: data/scores/ru/quartznet15x5_ru.csv - + -------------------- RW @@ -329,7 +329,7 @@ RW :header-rows: 1 :align: left :file: data/scores/rw/conformer_rw.csv - + -------------------- UA @@ -339,7 +339,7 @@ UA :header-rows: 1 :align: left :file: data/scores/ua/fastconformer_ua.csv - + -------------------- ZH @@ -349,14 +349,14 @@ ZH :header-rows: 1 :align: left :file: data/scores/zh/citrinet_zh.csv - + -------------------- .. csv-table:: :header-rows: 1 :align: left :file: data/scores/zh/conformer_zh.csv - + -------------------- @@ -370,7 +370,7 @@ EN with P&C :header-rows: 1 :align: left :file: data/scores_pc/en/fastconformer_en.csv - + -------------------- BY with P&C @@ -380,7 +380,7 @@ BY with P&C :header-rows: 1 :align: left :file: data/scores_pc/by/fastconformer_by.csv - + -------------------- DE with P&C @@ -390,7 +390,7 @@ DE with P&C :header-rows: 1 :align: left :file: data/scores_pc/de/fastconformer_de.csv - + -------------------- ES with P&C @@ -400,7 +400,7 @@ ES with P&C :header-rows: 1 :align: left :file: data/scores_pc/es/fastconformer_es.csv - + -------------------- HR with P&C @@ -410,7 +410,7 @@ HR with P&C :header-rows: 1 :align: left :file: data/scores_pc/hr/fastconformer_hr.csv - + -------------------- IT with P&C @@ -420,7 +420,7 @@ IT with P&C :header-rows: 1 :align: left :file: data/scores_pc/it/fastconformer_it.csv - + -------------------- NL with P&C @@ -430,7 +430,7 @@ NL with P&C :header-rows: 1 :align: left :file: data/scores_pc/nl/fastconformer_nl.csv - + -------------------- PL with P&C @@ -440,7 +440,7 @@ PL with P&C :header-rows: 1 :align: left :file: data/scores_pc/pl/fastconformer_pl.csv - + -------------------- UA with P&C @@ -450,5 +450,3 @@ UA with P&C :header-rows: 1 :align: left :file: data/scores_pc/ua/fastconformer_ua.csv - --------------------- \ No newline at end of file