Add C++ support for non-streaming NeMo fast conformer hybrid transducer ctc (the ctc branch) (#848)
This commit is contained in:
@@ -20,6 +20,7 @@ namespace {
|
||||
|
||||
enum class ModelType {
|
||||
kEncDecCTCModelBPE,
|
||||
kEncDecHybridRNNTCTCBPEModel,
|
||||
kTdnn,
|
||||
kZipformerCtc,
|
||||
kWenetCtc,
|
||||
@@ -55,7 +56,10 @@ static ModelType GetModelType(char *model_data, size_t model_data_length,
|
||||
"No model_type in the metadata!\n"
|
||||
"If you are using models from NeMo, please refer to\n"
|
||||
"https://huggingface.co/csukuangfj/"
|
||||
"sherpa-onnx-nemo-ctc-en-citrinet-512/blob/main/add-model-metadata.py"
|
||||
"sherpa-onnx-nemo-ctc-en-citrinet-512/blob/main/add-model-metadata.py\n"
|
||||
"or "
|
||||
"https://github.com/k2-fsa/sherpa-onnx/tree/master/scripts/nemo/"
|
||||
"fast-conformer-hybrid-transducer-ctc\n"
|
||||
"If you are using models from WeNet, please refer to\n"
|
||||
"https://github.com/k2-fsa/sherpa-onnx/blob/master/scripts/wenet/"
|
||||
"run.sh\n"
|
||||
@@ -66,6 +70,8 @@ static ModelType GetModelType(char *model_data, size_t model_data_length,
|
||||
|
||||
if (model_type.get() == std::string("EncDecCTCModelBPE")) {
|
||||
return ModelType::kEncDecCTCModelBPE;
|
||||
} else if (model_type.get() == std::string("EncDecHybridRNNTCTCBPEModel")) {
|
||||
return ModelType::kEncDecHybridRNNTCTCBPEModel;
|
||||
} else if (model_type.get() == std::string("tdnn")) {
|
||||
return ModelType::kTdnn;
|
||||
} else if (model_type.get() == std::string("zipformer2_ctc")) {
|
||||
@@ -106,6 +112,9 @@ std::unique_ptr<OfflineCtcModel> OfflineCtcModel::Create(
|
||||
case ModelType::kEncDecCTCModelBPE:
|
||||
return std::make_unique<OfflineNemoEncDecCtcModel>(config);
|
||||
break;
|
||||
case ModelType::kEncDecHybridRNNTCTCBPEModel:
|
||||
return std::make_unique<OfflineNemoEncDecHybridRNNTCTCBPEModel>(config);
|
||||
break;
|
||||
case ModelType::kTdnn:
|
||||
return std::make_unique<OfflineTdnnCtcModel>(config);
|
||||
break;
|
||||
@@ -153,6 +162,9 @@ std::unique_ptr<OfflineCtcModel> OfflineCtcModel::Create(
|
||||
case ModelType::kEncDecCTCModelBPE:
|
||||
return std::make_unique<OfflineNemoEncDecCtcModel>(mgr, config);
|
||||
break;
|
||||
case ModelType::kEncDecHybridRNNTCTCBPEModel:
|
||||
return std::make_unique<OfflineNemoEncDecHybridRNNTCTCBPEModel>(config);
|
||||
break;
|
||||
case ModelType::kTdnn:
|
||||
return std::make_unique<OfflineTdnnCtcModel>(mgr, config);
|
||||
break;
|
||||
|
||||
@@ -81,6 +81,8 @@ class OfflineNemoEncDecCtcModel : public OfflineCtcModel {
|
||||
std::unique_ptr<Impl> impl_;
|
||||
};
|
||||
|
||||
using OfflineNemoEncDecHybridRNNTCTCBPEModel = OfflineNemoEncDecCtcModel;
|
||||
|
||||
} // namespace sherpa_onnx
|
||||
|
||||
#endif // SHERPA_ONNX_CSRC_OFFLINE_NEMO_ENC_DEC_CTC_MODEL_H_
|
||||
|
||||
@@ -122,7 +122,8 @@ std::unique_ptr<OfflineRecognizerImpl> OfflineRecognizerImpl::Create(
|
||||
return std::make_unique<OfflineRecognizerParaformerImpl>(config);
|
||||
}
|
||||
|
||||
if (model_type == "EncDecCTCModelBPE" || model_type == "tdnn" ||
|
||||
if (model_type == "EncDecCTCModelBPE" ||
|
||||
model_type == "EncDecHybridRNNTCTCBPEModel" || model_type == "tdnn" ||
|
||||
model_type == "zipformer2_ctc" || model_type == "wenet_ctc") {
|
||||
return std::make_unique<OfflineRecognizerCtcImpl>(config);
|
||||
}
|
||||
@@ -137,6 +138,7 @@ std::unique_ptr<OfflineRecognizerImpl> OfflineRecognizerImpl::Create(
|
||||
" - Non-streaming transducer models from icefall\n"
|
||||
" - Non-streaming Paraformer models from FunASR\n"
|
||||
" - EncDecCTCModelBPE models from NeMo\n"
|
||||
" - EncDecHybridRNNTCTCBPEModel models from NeMo\n"
|
||||
" - Whisper models\n"
|
||||
" - Tdnn models\n"
|
||||
" - Zipformer CTC models\n"
|
||||
@@ -252,7 +254,8 @@ std::unique_ptr<OfflineRecognizerImpl> OfflineRecognizerImpl::Create(
|
||||
return std::make_unique<OfflineRecognizerParaformerImpl>(mgr, config);
|
||||
}
|
||||
|
||||
if (model_type == "EncDecCTCModelBPE" || model_type == "tdnn" ||
|
||||
if (model_type == "EncDecCTCModelBPE" ||
|
||||
model_type == "EncDecHybridRNNTCTCBPEModel" || model_type == "tdnn" ||
|
||||
model_type == "zipformer2_ctc" || model_type == "wenet_ctc") {
|
||||
return std::make_unique<OfflineRecognizerCtcImpl>(mgr, config);
|
||||
}
|
||||
@@ -267,6 +270,7 @@ std::unique_ptr<OfflineRecognizerImpl> OfflineRecognizerImpl::Create(
|
||||
" - Non-streaming transducer models from icefall\n"
|
||||
" - Non-streaming Paraformer models from FunASR\n"
|
||||
" - EncDecCTCModelBPE models from NeMo\n"
|
||||
" - EncDecHybridRNNTCTCBPEModel models from NeMo\n"
|
||||
" - Whisper models\n"
|
||||
" - Tdnn models\n"
|
||||
" - Zipformer CTC models\n"
|
||||
|
||||
@@ -67,9 +67,13 @@ void SymbolTable::Init(std::istream &is) {
|
||||
// the following check.
|
||||
//
|
||||
// Note: Only id2sym_ matters as we use it to convert ID to symbols.
|
||||
#if 0
|
||||
// we disable the test here since for some multi-lingual BPE models
|
||||
// from NeMo, the same symbol can appear multiple times with different IDs.
|
||||
if (sym != " ") {
|
||||
assert(sym2id_.count(sym) == 0);
|
||||
}
|
||||
#endif
|
||||
|
||||
assert(id2sym_.count(id) == 0);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user