Add ASR CTC Decoding module
State: closed | Pull request: yes

# What does this PR do ?

Add CTC Decoding modules to any ASR CTC model, equivalent to RNNT decoding

**Collection**: [ASR]

# Changelog 
- Add CTC Decoding code for all Char and Subword CTC models
- Add support for hypothesis update with logprobs, alignments, timestamps
- Compute char/subword and word boundaries from CTC models
- Prepare for high level beam search API.
- Add the change_decoding_strategy() API to CTC models

# Usage
* CTC models will now have a `model.decoding` layer

```python

asr_model = EncDecCTCModelBPE.from_pretrained("<NAME>", map_location='cpu')  # type: EncDecCTCModel
asr_model.eval()
asr_model.freeze()

decoding_cfg = OmegaConf.create({})

with open_dict(decoding_cfg):
    decoding_cfg.strategy = "greedy"
    decoding_cfg.compute_timestamps = True

asr_model.change_decoding_strategy(decoding_cfg)

hyp = asr_model.transcribe(['<SOME AUDIO FILEPATH>'],
                            batch_size=1, return_hypotheses=True)

print("Evaluating -")
print()
print("Transcription: ", hyp[0].text)
print()
print("Total number of timesteps :", hyp[0].length)
print()
print("Character/Subword Time-Stamps :", hyp[0].timestep['char'])
print()
print("Word Time-Stamps :", hyp[0].timestep['word'])
print()

################
'''
Transcription:  now we have some pilot things that do this at the sixty to eighty percent level but getting up to that full percentage that will be very tricky and agreeing on where these co two quantities should be put

Total number of timesteps : tensor(337, dtype=torch.int32)

Character/Subword Time-Stamps : [{'char': 'n', 'start_offset': 10, 'end_offset': 11}, {'char': 'o', 'start_offset': 11, 'end_offset': 12}, {'char': 'w', 'start_offset': 12, 'end_offset': 14}, {'char': 'we', 'start_offset': 14, 'end_offset': 16}, {'char': 'have', 'start_offset': 16, 'end_offset': 21}, {'char': 'so', 'start_offset': 21, 'end_offset': 25}, {'char': 'm', 'start_offset': 25, 'end_offset': 27}, {'char': 'e', 'start_offset': 27, 'end_offset': 28}, {'char': 'p', 'start_offset': 28, 'end_offset': 31}, {'char': 'i', 'start_offset': 31, 'end_offset': 34}, {'char': 'l', 'start_offset': 34, 'end_offset': 36}, {'char': 'o', 'start_offset': 36, 'end_offset': 38}, {'char': 't', 'start_offset': 38, 'end_offset': 40}, {'char': '', 'start_offset': 40, 'end_offset': 43}, {'char': 'th', 'start_offset': 43, 'end_offset': 44}, {'char': 'ing', 'start_offset': 44, 'end_offset': 46}, {'char': 's', 'start_offset': 46, 'end_offset': 48}, {'char': 'that', 'start_offset': 48, 'end_offset': 50}, {'char': 'do', 'start_offset': 50, 'end_offset': 54}, {'char': 'this', 'start_offset': 54, 'end_offset': 59}, {'char': 'a', 'start_offset': 59, 'end_offset': 65}, {'char': 't', 'start_offset': 65, 'end_offset': 66}, {'char': 'the', 'start_offset': 66, 'end_offset': 68}, {'char': 's', 'start_offset': 68, 'end_offset': 73}, {'char': 'i', 'start_offset': 73, 'end_offset': 74}, {'char': 'x', 'start_offset': 74, 'end_offset': 75}, {'char': 't', 'start_offset': 75, 'end_offset': 77}, {'char': 'y', 'start_offset': 77, 'end_offset': 79}, {'char': 'to', 'start_offset': 79, 'end_offset': 81}, {'char': 'e', 'start_offset': 81, 'end_offset': 85}, {'char': 'ight', 'start_offset': 85, 'end_offset': 88}, {'char': 'y', 'start_offset': 88, 'end_offset': 90}, {'char': 'p', 'start_offset': 90, 'end_offset': 93}, {'char': 'er', 'start_offset': 93, 'end_offset': 94}, {'char': 'c', 'start_offset': 94, 'end_offset': 96}, {'char': 'ent', 'start_offset': 96, 'end_offset': 98}, {'char': '', 'start_offset': 98, 'end_offset': 102}, {'char': 'le', 'start_offset': 102, 'end_offset': 103}, {'char': 've', 'start_offset': 103, 'end_offset': 105}, {'char': 'l', 'start_offset': 105, 'end_offset': 107}, {'char': 'but', 'start_offset': 107, 'end_offset': 109}, {'char': 'g', 'start_offset': 109, 'end_offset': 114}, {'char': 'e', 'start_offset': 114, 'end_offset': 115}, {'char': 't', 'start_offset': 115, 'end_offset': 116}, {'char': 't', 'start_offset': 116, 'end_offset': 119}, {'char': 'ing', 'start_offset': 119, 'end_offset': 120}, {'char': '', 'start_offset': 120, 'end_offset': 123}, {'char': 'u', 'start_offset': 123, 'end_offset': 124}, {'char': 'p', 'start_offset': 124, 'end_offset': 126}, {'char': 'to', 'start_offset': 126, 'end_offset': 132}, {'char': 'that', 'start_offset': 132, 'end_offset': 136}, {'char': 'f', 'start_offset': 136, 'end_offset': 140}, {'char': 'u', 'start_offset': 140, 'end_offset': 143}, {'char': 'll', 'start_offset': 143, 'end_offset': 145}, {'char': 'p', 'start_offset': 145, 'end_offset': 149}, {'char': 'er', 'start_offset': 149, 'end_offset': 151}, {'char': 'c', 'start_offset': 151, 'end_offset': 153}, {'char': 'ent', 'start_offset': 153, 'end_offset': 156}, {'char': 'a', 'start_offset': 156, 'end_offset': 159}, {'char': 'g', 'start_offset': 159, 'end_offset': 161}, {'char': 'e', 'start_offset': 161, 'end_offset': 163}, {'char': 'that', 'start_offset': 163, 'end_offset': 174}, {'char': 'will', 'start_offset': 174, 'end_offset': 179}, {'char': 'be', 'start_offset': 179, 'end_offset': 185}, {'char': '', 'start_offset': 185, 'end_offset': 196}, {'char': 'ver', 'start_offset': 196, 'end_offset': 198}, {'char': 'y', 'start_offset': 198, 'end_offset': 201}, {'char': 't', 'start_offset': 201, 'end_offset': 205}, {'char': 'ri', 'start_offset': 205, 'end_offset': 207}, {'char': 'ck', 'start_offset': 207, 'end_offset': 211}, {'char': 'y', 'start_offset': 211, 'end_offset': 214}, {'char': 'and', 'start_offset': 214, 'end_offset': 225}, {'char': 'a', 'start_offset': 225, 'end_offset': 242}, {'char': 'g', 'start_offset': 242, 'end_offset': 245}, {'char': 're', 'start_offset': 245, 'end_offset': 247}, {'char': 'e', 'start_offset': 247, 'end_offset': 248}, {'char': 'ing', 'start_offset': 248, 'end_offset': 250}, {'char': 'on', 'start_offset': 250, 'end_offset': 253}, {'char': 'w', 'start_offset': 253, 'end_offset': 259}, {'char': 'h', 'start_offset': 259, 'end_offset': 260}, {'char': 'e', 'start_offset': 260, 'end_offset': 261}, {'char': 're', 'start_offset': 261, 'end_offset': 263}, {'char': 'the', 'start_offset': 263, 'end_offset': 266}, {'char': 'se', 'start_offset': 266, 'end_offset': 270}, {'char': 'co', 'start_offset': 270, 'end_offset': 278}, {'char': 't', 'start_offset': 278, 'end_offset': 288}, {'char': 'w', 'start_offset': 288, 'end_offset': 289}, {'char': 'o', 'start_offset': 289, 'end_offset': 292}, {'char': '', 'start_offset': 292, 'end_offset': 301}, {'char': 'q', 'start_offset': 301, 'end_offset': 302}, {'char': 'u', 'start_offset': 302, 'end_offset': 303}, {'char': 'an', 'start_offset': 303, 'end_offset': 305}, {'char': 't', 'start_offset': 305, 'end_offset': 306}, {'char': 'it', 'start_offset': 306, 'end_offset': 308}, {'char': 'i', 'start_offset': 308, 'end_offset': 310}, {'char': 'es', 'start_offset': 310, 'end_offset': 312}, {'char': 's', 'start_offset': 312, 'end_offset': 314}, {'char': 'h', 'start_offset': 314, 'end_offset': 315}, {'char': 'o', 'start_offset': 315, 'end_offset': 316}, {'char': 'u', 'start_offset': 316, 'end_offset': 317}, {'char': 'l', 'start_offset': 317, 'end_offset': 318}, {'char': 'd', 'start_offset': 318, 'end_offset': 319}, {'char': 'be', 'start_offset': 319, 'end_offset': 321}, {'char': 'p', 'start_offset': 321, 'end_offset': 324}, {'char': 'u', 'start_offset': 324, 'end_offset': 326}, {'char': 't', 'start_offset': 326, 'end_offset': 327}]

Word Time-Stamps : [{'word': 'now', 'start_offset': 10, 'end_offset': 16}, {'word': 'we', 'start_offset': 16, 'end_offset': 21}, {'word': 'have', 'start_offset': 21, 'end_offset': 25}, {'word': 'some', 'start_offset': 28, 'end_offset': 31}, {'word': 'pilot', 'start_offset': 40, 'end_offset': 43}, {'word': 'things', 'start_offset': 48, 'end_offset': 50}, {'word': 'that', 'start_offset': 50, 'end_offset': 54}, {'word': 'do', 'start_offset': 54, 'end_offset': 59}, {'word': 'this', 'start_offset': 59, 'end_offset': 65}, {'word': 'at', 'start_offset': 66, 'end_offset': 68}, {'word': 'the', 'start_offset': 68, 'end_offset': 73}, {'word': 'sixty', 'start_offset': 79, 'end_offset': 81}, {'word': 'to', 'start_offset': 81, 'end_offset': 85}, {'word': 'eighty', 'start_offset': 90, 'end_offset': 93}, {'word': 'percent', 'start_offset': 98, 'end_offset': 102}, {'word': 'level', 'start_offset': 107, 'end_offset': 109}, {'word': 'but', 'start_offset': 109, 'end_offset': 114}, {'word': 'getting', 'start_offset': 120, 'end_offset': 123}, {'word': 'up', 'start_offset': 126, 'end_offset': 132}, {'word': 'to', 'start_offset': 132, 'end_offset': 136}, {'word': 'that', 'start_offset': 136, 'end_offset': 140}, {'word': 'full', 'start_offset': 145, 'end_offset': 149}, {'word': 'percentage', 'start_offset': 163, 'end_offset': 174}, {'word': 'that', 'start_offset': 174, 'end_offset': 179}, {'word': 'will', 'start_offset': 179, 'end_offset': 185}, {'word': 'be', 'start_offset': 185, 'end_offset': 196}, {'word': 'very', 'start_offset': 201, 'end_offset': 205}, {'word': 'tricky', 'start_offset': 214, 'end_offset': 225}, {'word': 'and', 'start_offset': 225, 'end_offset': 242}, {'word': 'agreeing', 'start_offset': 250, 'end_offset': 253}, {'word': 'on', 'start_offset': 253, 'end_offset': 259}, {'word': 'where', 'start_offset': 263, 'end_offset': 266}, {'word': 'these', 'start_offset': 270, 'end_offset': 278}, {'word': 'co', 'start_offset': 278, 'end_offset': 288}, {'word': 'two', 'start_offset': 292, 'end_offset': 301}, {'word': 'quantities', 'start_offset': 312, 'end_offset': 314}, {'word': 'should', 'start_offset': 319, 'end_offset': 321}, {'word': 'be', 'start_offset': 321, 'end_offset': 324}, {'word': 'put', 'start_offset': 321, 'end_offset': 327}]
'''
```

# Before your PR is "Ready for review"
**Pre checks**:
- [x] Make sure you read and followed [Contributor guidelines](https://github.com/NVIDIA/NeMo/blob/main/CONTRIBUTING.md)
- [ ] Did you write any new necessary tests?
- [ ] Did you add or update any necessary documentation?
- [ ] Does the PR affect components that are optional to install? (Ex: Numba, Pynini, Apex etc)
  - [ ] Reviewer: Does the PR have correct import guards for all optional libraries?
  
**PR Type**:
- [x] New Feature
- [ ] Bugfix
- [ ] Documentation