Skip to content

Commit 5f1153b

Browse files
authored
Add C++ runtime for Parakeet TDT models with QNN (k2-fsa#3720)
1 parent d250d04 commit 5f1153b

9 files changed

Lines changed: 1116 additions & 19 deletions

sherpa-onnx/csrc/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,7 @@ endif()
257257
if(SHERPA_ONNX_ENABLE_QNN)
258258
list(APPEND sources
259259
./qnn/offline-parakeet-ctc-model-qnn.cc
260+
./qnn/offline-parakeet-tdt-model-qnn.cc
260261
./qnn/offline-sense-voice-model-qnn.cc
261262
./qnn/offline-paraformer-model-qnn.cc
262263
./qnn/offline-whisper-model-qnn.cc

sherpa-onnx/csrc/offline-nemo-enc-dec-ctc-model.cc

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@
33
// Copyright (c) 2023-2024 Xiaomi Corporation
44

55
#include "sherpa-onnx/csrc/offline-nemo-enc-dec-ctc-model.h"
6-
#include "sherpa-onnx/csrc/ort-env.h"
76

87
#include <memory>
98
#include <string>
109
#include <utility>
1110
#include <vector>
1211

12+
#include "sherpa-onnx/csrc/ort-env.h"
13+
1314
#if __ANDROID_API__ >= 9
1415
#include "android/asset_manager.h"
1516
#include "android/asset_manager_jni.h"
@@ -93,8 +94,8 @@ class OfflineNemoEncDecCtcModel::Impl {
9394
private:
9495
void Init(void *model_data, size_t model_data_length) {
9596
if (model_data) {
96-
sess_ = std::make_unique<Ort::Session>(
97-
env_, model_data, model_data_length, sess_opts_);
97+
sess_ = std::make_unique<Ort::Session>(env_, model_data,
98+
model_data_length, sess_opts_);
9899
} else if (!sess_) {
99100
SHERPA_ONNX_LOGE(
100101
"Please pass model data or initialize the session outside of "
@@ -124,6 +125,10 @@ class OfflineNemoEncDecCtcModel::Impl {
124125
SHERPA_ONNX_READ_META_DATA_STR_ALLOW_EMPTY(normalize_type_,
125126
"normalize_type");
126127
SHERPA_ONNX_READ_META_DATA_WITH_DEFAULT(is_giga_am_, "is_giga_am", 0);
128+
129+
if (normalize_type_ == "NA") {
130+
normalize_type_ = "";
131+
}
127132
}
128133

129134
private:

sherpa-onnx/csrc/offline-recognizer-impl.cc

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,15 @@
33
// Copyright (c) 2023 Xiaomi Corporation
44

55
#include "sherpa-onnx/csrc/offline-recognizer-impl.h"
6-
#include "sherpa-onnx/csrc/ort-env.h"
76

87
#include <memory>
98
#include <sstream>
109
#include <string>
1110
#include <utility>
1211
#include <vector>
1312

13+
#include "sherpa-onnx/csrc/ort-env.h"
14+
1415
#if __ANDROID_API__ >= 9
1516

1617
#include "android/asset_manager.h"
@@ -68,6 +69,7 @@
6869
#if SHERPA_ONNX_ENABLE_QNN
6970
#include "sherpa-onnx/csrc/qnn/offline-paraformer-model-qnn.h"
7071
#include "sherpa-onnx/csrc/qnn/offline-recognizer-parakeet-ctc-qnn-impl.h"
72+
#include "sherpa-onnx/csrc/qnn/offline-recognizer-parakeet-tdt-qnn-impl.h"
7173
#include "sherpa-onnx/csrc/qnn/offline-recognizer-transducer-qnn-impl.h"
7274
#include "sherpa-onnx/csrc/qnn/offline-recognizer-zipformer-ctc-qnn-impl.h"
7375
#include "sherpa-onnx/csrc/qnn/offline-sense-voice-model-qnn.h"
@@ -191,6 +193,9 @@ std::unique_ptr<OfflineRecognizerImpl> OfflineRecognizerImpl::Create(
191193
return std::make_unique<
192194
OfflineRecognizerSenseVoiceTplImpl<OfflineSenseVoiceModelQnn>>(
193195
config);
196+
} else if (IsQnnTransducerArtifact(config.model_config.transducer) &&
197+
config.model_config.model_type == "nemo_transducer") {
198+
return std::make_unique<OfflineRecognizerParakeetTdtQnnImpl>(config);
194199
} else if (IsQnnTransducerArtifact(config.model_config.transducer)) {
195200
return std::make_unique<OfflineRecognizerTransducerQnnImpl>(config);
196201
} else if (!config.model_config.zipformer_ctc.model.empty() ||
@@ -208,15 +213,14 @@ std::unique_ptr<OfflineRecognizerImpl> OfflineRecognizerImpl::Create(
208213
.empty()) {
209214
return std::make_unique<OfflineRecognizerParakeetCtcQnnImpl>(config);
210215
} else if (!config.model_config.whisper.encoder.empty() ||
211-
!config.model_config.whisper.qnn_config.context_binary
212-
.empty()) {
216+
!config.model_config.whisper.qnn_config.context_binary.empty()) {
213217
return std::make_unique<
214218
OfflineRecognizerWhisperTplImpl<OfflineWhisperModelQnn>>(config);
215219
} else {
216220
SHERPA_ONNX_LOGE(
217-
"Only SenseVoice, Paraformer, offline transducer, Zipformer CTC, "
218-
"NeMo CTC (Parakeet), and Whisper models are currently supported by "
219-
"QNN for non-streaming ASR.");
221+
"Only SenseVoice, Paraformer, Zipformer transducer, Zipformer CTC, "
222+
"NeMo CTC (Parakeet), Parakeet TDT, and Whisper models are "
223+
"currently supported by QNN for non-streaming ASR.");
220224
SHERPA_ONNX_EXIT(-1);
221225
return nullptr;
222226
}
@@ -554,8 +558,9 @@ std::unique_ptr<OfflineRecognizerImpl> OfflineRecognizerImpl::Create(
554558
mgr, config);
555559
} else if (IsQnnTransducerArtifact(config.model_config.transducer)) {
556560
SHERPA_ONNX_LOGE(
557-
"QNN offline transducer does not support loading from asset manager. "
558-
"Please copy model files to writable storage and use file paths.");
561+
"QNN Zipformer transducer does not support loading from asset "
562+
"manager. Please copy model files to writable storage and use file "
563+
"paths.");
559564
SHERPA_ONNX_EXIT(-1);
560565
return nullptr;
561566
} else if (!config.model_config.zipformer_ctc.model.empty() ||
@@ -574,15 +579,14 @@ std::unique_ptr<OfflineRecognizerImpl> OfflineRecognizerImpl::Create(
574579
.empty()) {
575580
return std::make_unique<OfflineRecognizerParakeetCtcQnnImpl>(mgr, config);
576581
} else if (!config.model_config.whisper.encoder.empty() ||
577-
!config.model_config.whisper.qnn_config.context_binary
578-
.empty()) {
582+
!config.model_config.whisper.qnn_config.context_binary.empty()) {
579583
return std::make_unique<
580584
OfflineRecognizerWhisperTplImpl<OfflineWhisperModelQnn>>(mgr, config);
581585
} else {
582586
SHERPA_ONNX_LOGE(
583-
"Only SenseVoice, Paraformer, offline transducer, Zipformer CTC, "
584-
"NeMo CTC (Parakeet), and Whisper models are currently supported by "
585-
"QNN for non-streaming ASR.");
587+
"Only SenseVoice, Paraformer, Zipformer transducer, Zipformer CTC, "
588+
"NeMo CTC (Parakeet), Parakeet TDT, and Whisper models are "
589+
"currently supported by QNN for non-streaming ASR.");
586590
SHERPA_ONNX_EXIT(-1);
587591
return nullptr;
588592
}

0 commit comments

Comments
 (0)