react-native-sherpa-onnx 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +232 -236
- package/SherpaOnnx.podspec +68 -64
- package/android/build.gradle +182 -192
- package/android/codegen.gradle +57 -0
- package/android/prebuilt-download.gradle +428 -0
- package/android/prebuilt-versions.gradle +43 -0
- package/android/proguard-rules.pro +10 -0
- package/android/src/main/assets/testModels/add_mul_add.onnx +28 -0
- package/android/src/main/assets/testModels/nnapi_internal_uint8_support.onnx +0 -0
- package/android/src/main/assets/testModels/qnn_multi_ctx_embed.onnx +0 -0
- package/android/src/main/cpp/CMakeLists.txt +166 -129
- package/android/src/main/cpp/CMakePresets.json +54 -0
- package/android/src/main/cpp/crypto/sha256.cpp +174 -0
- package/android/src/main/cpp/crypto/sha256.h +16 -0
- package/android/src/main/cpp/jni/archive/sherpa-onnx-archive-helper.cpp +404 -0
- package/android/src/main/cpp/jni/archive/sherpa-onnx-archive-helper.h +56 -0
- package/android/src/main/cpp/jni/archive/sherpa-onnx-archive-jni.cpp +181 -0
- package/android/src/main/cpp/jni/audio/sherpa-onnx-audio-convert-jni.cpp +888 -0
- package/{ios → android/src/main/cpp/jni/model_detect}/sherpa-onnx-common.h +18 -18
- package/android/src/main/cpp/jni/model_detect/sherpa-onnx-detect-jni-common.cpp +86 -0
- package/android/src/main/cpp/jni/model_detect/sherpa-onnx-detect-jni-common.h +20 -0
- package/android/src/main/cpp/jni/model_detect/sherpa-onnx-model-detect-helper.cpp +423 -0
- package/android/src/main/cpp/jni/model_detect/sherpa-onnx-model-detect-helper.h +55 -0
- package/android/src/main/cpp/jni/model_detect/sherpa-onnx-model-detect-stt.cpp +399 -0
- package/android/src/main/cpp/jni/model_detect/sherpa-onnx-model-detect-tts.cpp +238 -0
- package/{ios → android/src/main/cpp/jni/model_detect}/sherpa-onnx-model-detect.h +122 -89
- package/android/src/main/cpp/jni/model_detect/sherpa-onnx-stt-wrapper.cpp +99 -0
- package/android/src/main/cpp/jni/model_detect/sherpa-onnx-stt-wrapper.h +16 -0
- package/android/src/main/cpp/jni/model_detect/sherpa-onnx-tts-wrapper.cpp +78 -0
- package/android/src/main/cpp/jni/model_detect/sherpa-onnx-tts-wrapper.h +16 -0
- package/android/src/main/cpp/jni/module/sherpa-onnx-module-jni.cpp +190 -0
- package/android/src/main/cpp/jni/tts/sherpa-onnx-tts-zipvoice-jni.cpp +301 -0
- package/android/src/main/java/com/sherpaonnx/SherpaOnnxArchiveHelper.kt +94 -0
- package/android/src/main/java/com/sherpaonnx/{SherpaOnnxCoreHelper.kt → SherpaOnnxAssetHelper.kt} +350 -236
- package/android/src/main/java/com/sherpaonnx/SherpaOnnxModule.kt +791 -483
- package/android/src/main/java/com/sherpaonnx/SherpaOnnxSttHelper.kt +699 -109
- package/android/src/main/java/com/sherpaonnx/SherpaOnnxTtsHelper.kt +1123 -668
- package/android/src/main/java/com/sherpaonnx/ZipvoiceTtsWrapper.kt +187 -0
- package/ios/SherpaOnnx+Assets.h +11 -0
- package/ios/SherpaOnnx+Assets.mm +325 -0
- package/ios/SherpaOnnx+STT.mm +455 -118
- package/ios/SherpaOnnx+TTS.mm +1101 -712
- package/ios/SherpaOnnx.h +17 -6
- package/ios/SherpaOnnx.mm +206 -311
- package/ios/SherpaOnnx.xcconfig +19 -19
- package/ios/SherpaOnnxCoreMLHelper.swift +24 -0
- package/ios/archive/sherpa-onnx-archive-helper.h +21 -0
- package/ios/archive/sherpa-onnx-archive-helper.mm +296 -0
- package/ios/libarchive_darwin_config.h +153 -0
- package/{android/src/main/cpp/jni → ios/model_detect}/sherpa-onnx-common.h +18 -18
- package/ios/model_detect/sherpa-onnx-model-detect-helper.h +49 -0
- package/ios/model_detect/sherpa-onnx-model-detect-helper.mm +210 -0
- package/ios/model_detect/sherpa-onnx-model-detect-stt.mm +344 -0
- package/ios/model_detect/sherpa-onnx-model-detect-tts.mm +201 -0
- package/{android/src/main/cpp/jni → ios/model_detect}/sherpa-onnx-model-detect.h +117 -89
- package/ios/scripts/patch-libarchive-includes.sh +61 -0
- package/ios/scripts/setup-ios-libarchive.sh +98 -0
- package/ios/stt/sherpa-onnx-stt-wrapper.h +129 -0
- package/ios/stt/sherpa-onnx-stt-wrapper.mm +523 -0
- package/ios/{sherpa-onnx-tts-wrapper.h → tts/sherpa-onnx-tts-wrapper.h} +90 -85
- package/ios/{sherpa-onnx-tts-wrapper.mm → tts/sherpa-onnx-tts-wrapper.mm} +376 -345
- package/lib/module/NativeSherpaOnnx.js +3 -0
- package/lib/module/NativeSherpaOnnx.js.map +1 -1
- package/lib/module/audio/index.js +22 -0
- package/lib/module/audio/index.js.map +1 -0
- package/lib/module/diarization/index.js +1 -1
- package/lib/module/diarization/index.js.map +1 -1
- package/lib/module/download/ModelDownloadManager.js +918 -0
- package/lib/module/download/ModelDownloadManager.js.map +1 -0
- package/lib/module/download/extractTarBz2.js +53 -0
- package/lib/module/download/extractTarBz2.js.map +1 -0
- package/lib/module/download/index.js +6 -0
- package/lib/module/download/index.js.map +1 -0
- package/lib/module/download/validation.js +178 -0
- package/lib/module/download/validation.js.map +1 -0
- package/lib/module/enhancement/index.js +1 -1
- package/lib/module/enhancement/index.js.map +1 -1
- package/lib/module/index.js +41 -3
- package/lib/module/index.js.map +1 -1
- package/lib/module/separation/index.js +1 -1
- package/lib/module/separation/index.js.map +1 -1
- package/lib/module/stt/index.js +127 -60
- package/lib/module/stt/index.js.map +1 -1
- package/lib/module/stt/sttModelLanguages.js +512 -0
- package/lib/module/stt/sttModelLanguages.js.map +1 -0
- package/lib/module/stt/types.js +53 -1
- package/lib/module/stt/types.js.map +1 -1
- package/lib/module/tts/index.js +216 -289
- package/lib/module/tts/index.js.map +1 -1
- package/lib/module/tts/types.js +86 -1
- package/lib/module/tts/types.js.map +1 -1
- package/lib/module/types.js.map +1 -1
- package/lib/module/utils.js +86 -73
- package/lib/module/utils.js.map +1 -1
- package/lib/module/vad/index.js +1 -1
- package/lib/module/vad/index.js.map +1 -1
- package/lib/typescript/src/NativeSherpaOnnx.d.ts +192 -38
- package/lib/typescript/src/NativeSherpaOnnx.d.ts.map +1 -1
- package/lib/typescript/src/audio/index.d.ts +13 -0
- package/lib/typescript/src/audio/index.d.ts.map +1 -0
- package/lib/typescript/src/diarization/index.d.ts +3 -2
- package/lib/typescript/src/diarization/index.d.ts.map +1 -1
- package/lib/typescript/src/download/ModelDownloadManager.d.ts +108 -0
- package/lib/typescript/src/download/ModelDownloadManager.d.ts.map +1 -0
- package/lib/typescript/src/download/extractTarBz2.d.ts +14 -0
- package/lib/typescript/src/download/extractTarBz2.d.ts.map +1 -0
- package/lib/typescript/src/download/index.d.ts +7 -0
- package/lib/typescript/src/download/index.d.ts.map +1 -0
- package/lib/typescript/src/download/validation.d.ts +57 -0
- package/lib/typescript/src/download/validation.d.ts.map +1 -0
- package/lib/typescript/src/enhancement/index.d.ts +3 -2
- package/lib/typescript/src/enhancement/index.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +26 -2
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/separation/index.d.ts +3 -2
- package/lib/typescript/src/separation/index.d.ts.map +1 -1
- package/lib/typescript/src/stt/index.d.ts +31 -43
- package/lib/typescript/src/stt/index.d.ts.map +1 -1
- package/lib/typescript/src/stt/sttModelLanguages.d.ts +52 -0
- package/lib/typescript/src/stt/sttModelLanguages.d.ts.map +1 -0
- package/lib/typescript/src/stt/types.d.ts +196 -9
- package/lib/typescript/src/stt/types.d.ts.map +1 -1
- package/lib/typescript/src/tts/index.d.ts +25 -211
- package/lib/typescript/src/tts/index.d.ts.map +1 -1
- package/lib/typescript/src/tts/types.d.ts +148 -25
- package/lib/typescript/src/tts/types.d.ts.map +1 -1
- package/lib/typescript/src/types.d.ts +0 -32
- package/lib/typescript/src/types.d.ts.map +1 -1
- package/lib/typescript/src/utils.d.ts +28 -13
- package/lib/typescript/src/utils.d.ts.map +1 -1
- package/lib/typescript/src/vad/index.d.ts +3 -2
- package/lib/typescript/src/vad/index.d.ts.map +1 -1
- package/package.json +250 -222
- package/scripts/check-qnn-support.sh +78 -0
- package/scripts/setup-ios-framework.sh +379 -282
- package/src/NativeSherpaOnnx.ts +474 -251
- package/src/audio/index.ts +32 -0
- package/src/diarization/index.ts +4 -2
- package/src/download/ModelDownloadManager.ts +1325 -0
- package/src/download/extractTarBz2.ts +78 -0
- package/src/download/index.ts +43 -0
- package/src/download/validation.ts +279 -0
- package/src/enhancement/index.ts +4 -2
- package/src/index.tsx +78 -27
- package/src/separation/index.ts +4 -2
- package/src/stt/index.ts +249 -89
- package/src/stt/sttModelLanguages.ts +237 -0
- package/src/stt/types.ts +263 -9
- package/src/tts/index.ts +470 -458
- package/src/tts/types.ts +373 -218
- package/src/types.ts +0 -44
- package/src/utils.ts +145 -131
- package/src/vad/index.ts +4 -2
- package/third_party/ffmpeg_prebuilt/ANDROID_RELEASE_TAG +1 -0
- package/third_party/libarchive_prebuilt/ANDROID_RELEASE_TAG +1 -0
- package/third_party/libarchive_prebuilt/IOS_RELEASE_TAG +1 -0
- package/third_party/sherpa-onnx-prebuilt/ANDROID_RELEASE_TAG +1 -0
- package/third_party/sherpa-onnx-prebuilt/IOS_RELEASE_TAG +1 -0
- package/android/src/main/cpp/include/sherpa-onnx/c-api/c-api.h +0 -1918
- package/android/src/main/cpp/include/sherpa-onnx/c-api/cxx-api.h +0 -841
- package/android/src/main/cpp/jni/sherpa-onnx-model-detect.cpp +0 -541
- package/android/src/main/cpp/jni/sherpa-onnx-stt-jni.cpp +0 -336
- package/android/src/main/cpp/jni/sherpa-onnx-stt-wrapper.cpp +0 -222
- package/android/src/main/cpp/jni/sherpa-onnx-stt-wrapper.h +0 -68
- package/android/src/main/cpp/jni/sherpa-onnx-tts-jni.cpp +0 -823
- package/android/src/main/cpp/jni/sherpa-onnx-tts-wrapper.cpp +0 -387
- package/android/src/main/cpp/jni/sherpa-onnx-tts-wrapper.h +0 -147
- package/ios/Frameworks/sherpa_onnx.xcframework.zip +0 -0
- package/ios/include/sherpa-onnx/c-api/c-api.h +0 -1918
- package/ios/include/sherpa-onnx/c-api/cxx-api.h +0 -841
- package/ios/sherpa-onnx-model-detect.mm +0 -441
- package/ios/sherpa-onnx-stt-wrapper.h +0 -48
- package/ios/sherpa-onnx-stt-wrapper.mm +0 -201
- package/scripts/copy-headers.js +0 -184
- package/scripts/setup-assets.js +0 -323
|
@@ -1,89 +1,122 @@
|
|
|
1
|
-
#ifndef SHERPA_ONNX_MODEL_DETECT_H
|
|
2
|
-
#define SHERPA_ONNX_MODEL_DETECT_H
|
|
3
|
-
|
|
4
|
-
#include "sherpa-onnx-common.h"
|
|
5
|
-
#include <optional>
|
|
6
|
-
#include <string>
|
|
7
|
-
#include <vector>
|
|
8
|
-
|
|
9
|
-
namespace sherpaonnx {
|
|
10
|
-
|
|
11
|
-
enum class SttModelKind {
|
|
12
|
-
kUnknown,
|
|
13
|
-
kTransducer,
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
std::string
|
|
43
|
-
std::string
|
|
44
|
-
std::string
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
std::string
|
|
49
|
-
std::string tokens;
|
|
50
|
-
|
|
51
|
-
std::string
|
|
52
|
-
std::string
|
|
53
|
-
std::string
|
|
54
|
-
std::string
|
|
55
|
-
std::string
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
std::
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
std::string
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
1
|
+
#ifndef SHERPA_ONNX_MODEL_DETECT_H
|
|
2
|
+
#define SHERPA_ONNX_MODEL_DETECT_H
|
|
3
|
+
|
|
4
|
+
#include "sherpa-onnx-common.h"
|
|
5
|
+
#include <optional>
|
|
6
|
+
#include <string>
|
|
7
|
+
#include <vector>
|
|
8
|
+
|
|
9
|
+
namespace sherpaonnx {
|
|
10
|
+
|
|
11
|
+
enum class SttModelKind {
|
|
12
|
+
kUnknown,
|
|
13
|
+
kTransducer,
|
|
14
|
+
kNemoTransducer,
|
|
15
|
+
kParaformer,
|
|
16
|
+
kNemoCtc,
|
|
17
|
+
kWenetCtc,
|
|
18
|
+
kSenseVoice,
|
|
19
|
+
kZipformerCtc,
|
|
20
|
+
kWhisper,
|
|
21
|
+
kFunAsrNano,
|
|
22
|
+
kFireRedAsr,
|
|
23
|
+
kMoonshine,
|
|
24
|
+
kDolphin,
|
|
25
|
+
kCanary,
|
|
26
|
+
kOmnilingual,
|
|
27
|
+
kMedAsr,
|
|
28
|
+
kTeleSpeechCtc
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
enum class TtsModelKind {
|
|
32
|
+
kUnknown,
|
|
33
|
+
kVits,
|
|
34
|
+
kMatcha,
|
|
35
|
+
kKokoro,
|
|
36
|
+
kKitten,
|
|
37
|
+
kPocket,
|
|
38
|
+
kZipvoice
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
struct SttModelPaths {
|
|
42
|
+
std::string encoder;
|
|
43
|
+
std::string decoder;
|
|
44
|
+
std::string joiner;
|
|
45
|
+
std::string paraformerModel;
|
|
46
|
+
std::string ctcModel;
|
|
47
|
+
std::string whisperEncoder;
|
|
48
|
+
std::string whisperDecoder;
|
|
49
|
+
std::string tokens;
|
|
50
|
+
/** BPE vocabulary for hotwords tokenization (sentencepiece export bpe.vocab). Optional. */
|
|
51
|
+
std::string bpeVocab;
|
|
52
|
+
std::string funasrEncoderAdaptor;
|
|
53
|
+
std::string funasrLLM;
|
|
54
|
+
std::string funasrEmbedding;
|
|
55
|
+
std::string funasrTokenizer;
|
|
56
|
+
// Moonshine
|
|
57
|
+
std::string moonshinePreprocessor;
|
|
58
|
+
std::string moonshineEncoder;
|
|
59
|
+
std::string moonshineUncachedDecoder;
|
|
60
|
+
std::string moonshineCachedDecoder;
|
|
61
|
+
// Dolphin, Omnilingual, MedAsr, TeleSpeech (single model each)
|
|
62
|
+
std::string dolphinModel;
|
|
63
|
+
std::string omnilingualModel;
|
|
64
|
+
std::string medasrModel;
|
|
65
|
+
std::string telespeechCtcModel;
|
|
66
|
+
// FireRed ASR, Canary (encoder/decoder)
|
|
67
|
+
std::string fireRedEncoder;
|
|
68
|
+
std::string fireRedDecoder;
|
|
69
|
+
std::string canaryEncoder;
|
|
70
|
+
std::string canaryDecoder;
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
struct TtsModelPaths {
|
|
74
|
+
std::string ttsModel;
|
|
75
|
+
std::string tokens;
|
|
76
|
+
std::string lexicon;
|
|
77
|
+
std::string dataDir;
|
|
78
|
+
std::string voices;
|
|
79
|
+
std::string acousticModel;
|
|
80
|
+
std::string vocoder;
|
|
81
|
+
std::string encoder;
|
|
82
|
+
std::string decoder;
|
|
83
|
+
// Pocket TTS
|
|
84
|
+
std::string lmFlow;
|
|
85
|
+
std::string lmMain;
|
|
86
|
+
std::string textConditioner;
|
|
87
|
+
std::string vocabJson;
|
|
88
|
+
std::string tokenScoresJson;
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
struct SttDetectResult {
|
|
92
|
+
bool ok = false;
|
|
93
|
+
std::string error;
|
|
94
|
+
std::vector<DetectedModel> detectedModels;
|
|
95
|
+
SttModelKind selectedKind = SttModelKind::kUnknown;
|
|
96
|
+
bool tokensRequired = true;
|
|
97
|
+
SttModelPaths paths;
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
struct TtsDetectResult {
|
|
101
|
+
bool ok = false;
|
|
102
|
+
std::string error;
|
|
103
|
+
std::vector<DetectedModel> detectedModels;
|
|
104
|
+
TtsModelKind selectedKind = TtsModelKind::kUnknown;
|
|
105
|
+
TtsModelPaths paths;
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
SttDetectResult DetectSttModel(
|
|
109
|
+
const std::string& modelDir,
|
|
110
|
+
const std::optional<bool>& preferInt8,
|
|
111
|
+
const std::optional<std::string>& modelType,
|
|
112
|
+
bool debug = false
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
TtsDetectResult DetectTtsModel(
|
|
116
|
+
const std::string& modelDir,
|
|
117
|
+
const std::string& modelType
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
} // namespace sherpaonnx
|
|
121
|
+
|
|
122
|
+
#endif // SHERPA_ONNX_MODEL_DETECT_H
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* sherpa-onnx-stt-wrapper.cpp
|
|
3
|
+
*
|
|
4
|
+
* Purpose: Converts C++ SttDetectResult to a Java HashMap for nativeDetectSttModel. Contains
|
|
5
|
+
* STT model kind string mapping and path marshalling. Used by sherpa-onnx-module-jni.cpp.
|
|
6
|
+
*/
|
|
7
|
+
#include "sherpa-onnx-stt-wrapper.h"
|
|
8
|
+
#include "sherpa-onnx-detect-jni-common.h"
|
|
9
|
+
#include "sherpa-onnx-model-detect.h"
|
|
10
|
+
|
|
11
|
+
namespace sherpaonnx {
|
|
12
|
+
|
|
13
|
+
namespace {
|
|
14
|
+
|
|
15
|
+
const char* SttModelKindToString(SttModelKind k) {
|
|
16
|
+
switch (k) {
|
|
17
|
+
case SttModelKind::kTransducer: return "transducer";
|
|
18
|
+
case SttModelKind::kNemoTransducer: return "nemo_transducer";
|
|
19
|
+
case SttModelKind::kParaformer: return "paraformer";
|
|
20
|
+
case SttModelKind::kNemoCtc: return "nemo_ctc";
|
|
21
|
+
case SttModelKind::kWenetCtc: return "wenet_ctc";
|
|
22
|
+
case SttModelKind::kSenseVoice: return "sense_voice";
|
|
23
|
+
case SttModelKind::kZipformerCtc: return "zipformer_ctc";
|
|
24
|
+
case SttModelKind::kWhisper: return "whisper";
|
|
25
|
+
case SttModelKind::kFunAsrNano: return "funasr_nano";
|
|
26
|
+
case SttModelKind::kFireRedAsr: return "fire_red_asr";
|
|
27
|
+
case SttModelKind::kMoonshine: return "moonshine";
|
|
28
|
+
case SttModelKind::kDolphin: return "dolphin";
|
|
29
|
+
case SttModelKind::kCanary: return "canary";
|
|
30
|
+
case SttModelKind::kOmnilingual: return "omnilingual";
|
|
31
|
+
case SttModelKind::kMedAsr: return "medasr";
|
|
32
|
+
case SttModelKind::kTeleSpeechCtc: return "telespeech_ctc";
|
|
33
|
+
default: return "unknown";
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
} // namespace
|
|
38
|
+
|
|
39
|
+
jobject SttDetectResultToJava(JNIEnv* env, const SttDetectResult& result) {
|
|
40
|
+
jclass mapClass = env->FindClass("java/util/HashMap");
|
|
41
|
+
if (!mapClass) return nullptr;
|
|
42
|
+
jmethodID mapInit = env->GetMethodID(mapClass, "<init>", "()V");
|
|
43
|
+
jmethodID mapPut = env->GetMethodID(mapClass, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
|
|
44
|
+
if (!mapInit || !mapPut) {
|
|
45
|
+
env->DeleteLocalRef(mapClass);
|
|
46
|
+
return nullptr;
|
|
47
|
+
}
|
|
48
|
+
jobject map = env->NewObject(mapClass, mapInit);
|
|
49
|
+
env->DeleteLocalRef(mapClass);
|
|
50
|
+
if (!map) return nullptr;
|
|
51
|
+
|
|
52
|
+
PutBoolean(env, map, mapPut, "success", result.ok);
|
|
53
|
+
PutString(env, map, mapPut, "error", result.error);
|
|
54
|
+
PutString(env, map, mapPut, "modelType", SttModelKindToString(result.selectedKind));
|
|
55
|
+
|
|
56
|
+
jobject detectedList = BuildDetectedModelsList(env, result.detectedModels);
|
|
57
|
+
if (detectedList) {
|
|
58
|
+
env->CallObjectMethod(map, mapPut, env->NewStringUTF("detectedModels"), detectedList);
|
|
59
|
+
env->DeleteLocalRef(detectedList);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
jclass hashMapClass = env->FindClass("java/util/HashMap");
|
|
63
|
+
if (hashMapClass) {
|
|
64
|
+
jobject pathsMap = env->NewObject(hashMapClass, mapInit);
|
|
65
|
+
env->DeleteLocalRef(hashMapClass);
|
|
66
|
+
if (pathsMap) {
|
|
67
|
+
PutString(env, pathsMap, mapPut, "encoder", result.paths.encoder);
|
|
68
|
+
PutString(env, pathsMap, mapPut, "decoder", result.paths.decoder);
|
|
69
|
+
PutString(env, pathsMap, mapPut, "joiner", result.paths.joiner);
|
|
70
|
+
PutString(env, pathsMap, mapPut, "tokens", result.paths.tokens);
|
|
71
|
+
PutString(env, pathsMap, mapPut, "paraformerModel", result.paths.paraformerModel);
|
|
72
|
+
PutString(env, pathsMap, mapPut, "ctcModel", result.paths.ctcModel);
|
|
73
|
+
PutString(env, pathsMap, mapPut, "whisperEncoder", result.paths.whisperEncoder);
|
|
74
|
+
PutString(env, pathsMap, mapPut, "whisperDecoder", result.paths.whisperDecoder);
|
|
75
|
+
PutString(env, pathsMap, mapPut, "funasrEncoderAdaptor", result.paths.funasrEncoderAdaptor);
|
|
76
|
+
PutString(env, pathsMap, mapPut, "funasrLLM", result.paths.funasrLLM);
|
|
77
|
+
PutString(env, pathsMap, mapPut, "funasrEmbedding", result.paths.funasrEmbedding);
|
|
78
|
+
PutString(env, pathsMap, mapPut, "funasrTokenizer", result.paths.funasrTokenizer);
|
|
79
|
+
PutString(env, pathsMap, mapPut, "moonshinePreprocessor", result.paths.moonshinePreprocessor);
|
|
80
|
+
PutString(env, pathsMap, mapPut, "moonshineEncoder", result.paths.moonshineEncoder);
|
|
81
|
+
PutString(env, pathsMap, mapPut, "moonshineUncachedDecoder", result.paths.moonshineUncachedDecoder);
|
|
82
|
+
PutString(env, pathsMap, mapPut, "moonshineCachedDecoder", result.paths.moonshineCachedDecoder);
|
|
83
|
+
PutString(env, pathsMap, mapPut, "dolphinModel", result.paths.dolphinModel);
|
|
84
|
+
PutString(env, pathsMap, mapPut, "omnilingualModel", result.paths.omnilingualModel);
|
|
85
|
+
PutString(env, pathsMap, mapPut, "medasrModel", result.paths.medasrModel);
|
|
86
|
+
PutString(env, pathsMap, mapPut, "telespeechCtcModel", result.paths.telespeechCtcModel);
|
|
87
|
+
PutString(env, pathsMap, mapPut, "fireRedEncoder", result.paths.fireRedEncoder);
|
|
88
|
+
PutString(env, pathsMap, mapPut, "fireRedDecoder", result.paths.fireRedDecoder);
|
|
89
|
+
PutString(env, pathsMap, mapPut, "canaryEncoder", result.paths.canaryEncoder);
|
|
90
|
+
PutString(env, pathsMap, mapPut, "canaryDecoder", result.paths.canaryDecoder);
|
|
91
|
+
PutString(env, pathsMap, mapPut, "bpeVocab", result.paths.bpeVocab);
|
|
92
|
+
env->CallObjectMethod(map, mapPut, env->NewStringUTF("paths"), pathsMap);
|
|
93
|
+
env->DeleteLocalRef(pathsMap);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return map;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
} // namespace sherpaonnx
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#ifndef SHERPA_ONNX_STT_WRAPPER_H
|
|
2
|
+
#define SHERPA_ONNX_STT_WRAPPER_H
|
|
3
|
+
|
|
4
|
+
#include <jni.h>
|
|
5
|
+
|
|
6
|
+
namespace sherpaonnx {
|
|
7
|
+
|
|
8
|
+
struct SttDetectResult;
|
|
9
|
+
|
|
10
|
+
// Converts C++ SttDetectResult to a Java HashMap (success, error, modelType, detectedModels, paths).
|
|
11
|
+
// Caller must DeleteLocalRef the returned jobject.
|
|
12
|
+
jobject SttDetectResultToJava(JNIEnv* env, const SttDetectResult& result);
|
|
13
|
+
|
|
14
|
+
} // namespace sherpaonnx
|
|
15
|
+
|
|
16
|
+
#endif // SHERPA_ONNX_STT_WRAPPER_H
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* sherpa-onnx-tts-wrapper.cpp
|
|
3
|
+
*
|
|
4
|
+
* Purpose: Converts C++ TtsDetectResult to a Java HashMap for nativeDetectTtsModel. Contains
|
|
5
|
+
* TTS model kind string mapping and path marshalling. Used by sherpa-onnx-module-jni.cpp.
|
|
6
|
+
*/
|
|
7
|
+
#include "sherpa-onnx-tts-wrapper.h"
|
|
8
|
+
#include "sherpa-onnx-detect-jni-common.h"
|
|
9
|
+
#include "sherpa-onnx-model-detect.h"
|
|
10
|
+
|
|
11
|
+
namespace sherpaonnx {
|
|
12
|
+
|
|
13
|
+
namespace {
|
|
14
|
+
|
|
15
|
+
const char* TtsModelKindToString(TtsModelKind k) {
|
|
16
|
+
switch (k) {
|
|
17
|
+
case TtsModelKind::kVits: return "vits";
|
|
18
|
+
case TtsModelKind::kMatcha: return "matcha";
|
|
19
|
+
case TtsModelKind::kKokoro: return "kokoro";
|
|
20
|
+
case TtsModelKind::kKitten: return "kitten";
|
|
21
|
+
case TtsModelKind::kPocket: return "pocket";
|
|
22
|
+
case TtsModelKind::kZipvoice: return "zipvoice";
|
|
23
|
+
default: return "unknown";
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
} // namespace
|
|
28
|
+
|
|
29
|
+
jobject TtsDetectResultToJava(JNIEnv* env, const TtsDetectResult& result) {
|
|
30
|
+
jclass mapClass = env->FindClass("java/util/HashMap");
|
|
31
|
+
if (!mapClass) return nullptr;
|
|
32
|
+
jmethodID mapInit = env->GetMethodID(mapClass, "<init>", "()V");
|
|
33
|
+
jmethodID mapPut = env->GetMethodID(mapClass, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
|
|
34
|
+
if (!mapInit || !mapPut) {
|
|
35
|
+
env->DeleteLocalRef(mapClass);
|
|
36
|
+
return nullptr;
|
|
37
|
+
}
|
|
38
|
+
jobject map = env->NewObject(mapClass, mapInit);
|
|
39
|
+
env->DeleteLocalRef(mapClass);
|
|
40
|
+
if (!map) return nullptr;
|
|
41
|
+
|
|
42
|
+
PutBoolean(env, map, mapPut, "success", result.ok);
|
|
43
|
+
PutString(env, map, mapPut, "error", result.error);
|
|
44
|
+
PutString(env, map, mapPut, "modelType", TtsModelKindToString(result.selectedKind));
|
|
45
|
+
|
|
46
|
+
jobject detectedList = BuildDetectedModelsList(env, result.detectedModels);
|
|
47
|
+
if (detectedList) {
|
|
48
|
+
env->CallObjectMethod(map, mapPut, env->NewStringUTF("detectedModels"), detectedList);
|
|
49
|
+
env->DeleteLocalRef(detectedList);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
jclass hashMapClass = env->FindClass("java/util/HashMap");
|
|
53
|
+
if (hashMapClass) {
|
|
54
|
+
jobject pathsMap = env->NewObject(hashMapClass, mapInit);
|
|
55
|
+
env->DeleteLocalRef(hashMapClass);
|
|
56
|
+
if (pathsMap) {
|
|
57
|
+
PutString(env, pathsMap, mapPut, "ttsModel", result.paths.ttsModel);
|
|
58
|
+
PutString(env, pathsMap, mapPut, "tokens", result.paths.tokens);
|
|
59
|
+
PutString(env, pathsMap, mapPut, "lexicon", result.paths.lexicon);
|
|
60
|
+
PutString(env, pathsMap, mapPut, "dataDir", result.paths.dataDir);
|
|
61
|
+
PutString(env, pathsMap, mapPut, "voices", result.paths.voices);
|
|
62
|
+
PutString(env, pathsMap, mapPut, "acousticModel", result.paths.acousticModel);
|
|
63
|
+
PutString(env, pathsMap, mapPut, "vocoder", result.paths.vocoder);
|
|
64
|
+
PutString(env, pathsMap, mapPut, "encoder", result.paths.encoder);
|
|
65
|
+
PutString(env, pathsMap, mapPut, "decoder", result.paths.decoder);
|
|
66
|
+
PutString(env, pathsMap, mapPut, "lmFlow", result.paths.lmFlow);
|
|
67
|
+
PutString(env, pathsMap, mapPut, "lmMain", result.paths.lmMain);
|
|
68
|
+
PutString(env, pathsMap, mapPut, "textConditioner", result.paths.textConditioner);
|
|
69
|
+
PutString(env, pathsMap, mapPut, "vocabJson", result.paths.vocabJson);
|
|
70
|
+
PutString(env, pathsMap, mapPut, "tokenScoresJson", result.paths.tokenScoresJson);
|
|
71
|
+
env->CallObjectMethod(map, mapPut, env->NewStringUTF("paths"), pathsMap);
|
|
72
|
+
env->DeleteLocalRef(pathsMap);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return map;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
} // namespace sherpaonnx
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#ifndef SHERPA_ONNX_TTS_WRAPPER_H
|
|
2
|
+
#define SHERPA_ONNX_TTS_WRAPPER_H
|
|
3
|
+
|
|
4
|
+
#include <jni.h>
|
|
5
|
+
|
|
6
|
+
namespace sherpaonnx {
|
|
7
|
+
|
|
8
|
+
struct TtsDetectResult;
|
|
9
|
+
|
|
10
|
+
// Converts C++ TtsDetectResult to a Java HashMap (success, error, modelType, detectedModels, paths).
|
|
11
|
+
// Caller must DeleteLocalRef the returned jobject.
|
|
12
|
+
jobject TtsDetectResultToJava(JNIEnv* env, const TtsDetectResult& result);
|
|
13
|
+
|
|
14
|
+
} // namespace sherpaonnx
|
|
15
|
+
|
|
16
|
+
#endif // SHERPA_ONNX_TTS_WRAPPER_H
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* sherpa-onnx-module-jni.cpp
|
|
3
|
+
*
|
|
4
|
+
* Purpose: JNI entry points for SherpaOnnxModule: nativeTestSherpaInit, nativeCanInitQnnHtp,
|
|
5
|
+
* nativeHasNnapiAccelerator, nativeDetectSttModel, nativeDetectTtsModel. Used by Kotlin to probe
|
|
6
|
+
* capabilities and get model paths for the Kotlin STT/TTS API.
|
|
7
|
+
*/
|
|
8
|
+
#include <jni.h>
|
|
9
|
+
#include <string>
|
|
10
|
+
#include <optional>
|
|
11
|
+
|
|
12
|
+
#if defined(__ANDROID__)
|
|
13
|
+
#include <dlfcn.h>
|
|
14
|
+
#include <android/log.h>
|
|
15
|
+
#include <cstdint>
|
|
16
|
+
#endif
|
|
17
|
+
|
|
18
|
+
#define NNAPI_LOG_TAG "SherpaOnnx"
|
|
19
|
+
|
|
20
|
+
#include "sherpa-onnx-model-detect.h"
|
|
21
|
+
#include "sherpa-onnx-stt-wrapper.h"
|
|
22
|
+
#include "sherpa-onnx-tts-wrapper.h"
|
|
23
|
+
|
|
24
|
+
extern "C" {
|
|
25
|
+
|
|
26
|
+
JNIEXPORT jstring JNICALL
|
|
27
|
+
Java_com_sherpaonnx_SherpaOnnxModule_nativeTestSherpaInit(JNIEnv* env, jobject /* this */) {
|
|
28
|
+
return env->NewStringUTF("sherpa-onnx native (libsherpaonnx) loaded");
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Check if QNN HTP backend can actually be initialized (QnnBackend_create + free).
|
|
32
|
+
// Uses dlopen/dlsym so we do not need to link against QNN SDK at build time.
|
|
33
|
+
JNIEXPORT jboolean JNICALL
|
|
34
|
+
Java_com_sherpaonnx_SherpaOnnxModule_nativeCanInitQnnHtp(JNIEnv* /* env */, jobject /* this */) {
|
|
35
|
+
#if !defined(__ANDROID__)
|
|
36
|
+
return JNI_FALSE;
|
|
37
|
+
#else
|
|
38
|
+
static const char* QNN_LOG_TAG = "SherpaOnnx";
|
|
39
|
+
void* handle = dlopen("libQnnHtp.so", RTLD_NOW | RTLD_LOCAL);
|
|
40
|
+
if (!handle) {
|
|
41
|
+
__android_log_print(ANDROID_LOG_INFO, QNN_LOG_TAG, "QNN: dlopen(libQnnHtp.so) failed: %s", dlerror());
|
|
42
|
+
return JNI_FALSE;
|
|
43
|
+
}
|
|
44
|
+
using CreateFn = int (*)(const char*, const void*, void**);
|
|
45
|
+
using FreeFn = int (*)(void*);
|
|
46
|
+
auto create = reinterpret_cast<CreateFn>(dlsym(handle, "QnnBackend_create"));
|
|
47
|
+
auto free_fn = reinterpret_cast<FreeFn>(dlsym(handle, "QnnBackend_free"));
|
|
48
|
+
if (!create || !free_fn) {
|
|
49
|
+
__android_log_print(ANDROID_LOG_INFO, QNN_LOG_TAG, "QNN: dlsym failed: %s", dlerror());
|
|
50
|
+
dlclose(handle);
|
|
51
|
+
return JNI_FALSE;
|
|
52
|
+
}
|
|
53
|
+
void* backend = nullptr;
|
|
54
|
+
const int err = create("QnnHtp", nullptr, &backend);
|
|
55
|
+
__android_log_print(ANDROID_LOG_INFO, QNN_LOG_TAG, "QNN: QnnBackend_create err=%d backend=%p", err, (void*)backend);
|
|
56
|
+
if (err == 0 && backend) {
|
|
57
|
+
free_fn(backend);
|
|
58
|
+
}
|
|
59
|
+
dlclose(handle);
|
|
60
|
+
jboolean ok = (err == 0 && backend) ? JNI_TRUE : JNI_FALSE;
|
|
61
|
+
__android_log_print(ANDROID_LOG_INFO, QNN_LOG_TAG, "QNN: canInit=%s", ok ? "true" : "false");
|
|
62
|
+
return ok;
|
|
63
|
+
#endif
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// NNAPI device enumeration via dlopen so it works regardless of compile-time minSdk (API 29+ at runtime).
|
|
67
|
+
#if defined(__ANDROID__)
|
|
68
|
+
namespace {
|
|
69
|
+
constexpr int ANEURALNETWORKS_NO_ERROR = 0;
|
|
70
|
+
// Must match enum values in Android NDK NeuralNetworks.h:
|
|
71
|
+
// https://android.googlesource.com/platform/frameworks/ml/+/refs/heads/master/nn/runtime/include/NeuralNetworks.h
|
|
72
|
+
// UNKNOWN= 0, OTHER = 1, CPU = 2, GPU = 3, ACCELERATOR = 4.
|
|
73
|
+
constexpr int32_t ANEURALNETWORKS_DEVICE_GPU = 3;
|
|
74
|
+
constexpr int32_t ANEURALNETWORKS_DEVICE_ACCELERATOR = 4;
|
|
75
|
+
struct ANeuralNetworksDeviceOpaque {};
|
|
76
|
+
using ANeuralNetworksDevice = ANeuralNetworksDeviceOpaque*;
|
|
77
|
+
} // namespace
|
|
78
|
+
#endif
|
|
79
|
+
|
|
80
|
+
// Check if the device has an NNAPI accelerator (GPU/DSP/NPU). Requires Android API 29+ at runtime.
|
|
81
|
+
// Loads NNAPI from libandroid.so via dlopen so it works even when the app is built with minSdk < 29.
|
|
82
|
+
JNIEXPORT jboolean JNICALL
|
|
83
|
+
Java_com_sherpaonnx_SherpaOnnxModule_nativeHasNnapiAccelerator(JNIEnv* /* env */, jobject /* this */, jint sdkInt) {
|
|
84
|
+
#if !defined(__ANDROID__)
|
|
85
|
+
return JNI_FALSE;
|
|
86
|
+
#else
|
|
87
|
+
__android_log_print(ANDROID_LOG_INFO, NNAPI_LOG_TAG,
|
|
88
|
+
"NNAPI hasAccelerator: called (runtime SDK=%d)", sdkInt);
|
|
89
|
+
if (sdkInt < 29) {
|
|
90
|
+
__android_log_print(ANDROID_LOG_INFO, NNAPI_LOG_TAG, "NNAPI: SDK %d < 29, returning false", sdkInt);
|
|
91
|
+
return JNI_FALSE;
|
|
92
|
+
}
|
|
93
|
+
// NNAPI symbols can be in libneuralnetworks.so (runtime) or libandroid.so; try both.
|
|
94
|
+
const char* libs[] = {"libneuralnetworks.so", "libandroid.so"};
|
|
95
|
+
void* lib = nullptr;
|
|
96
|
+
for (const char* libName : libs) {
|
|
97
|
+
lib = dlopen(libName, RTLD_NOW);
|
|
98
|
+
if (lib) break;
|
|
99
|
+
__android_log_print(ANDROID_LOG_INFO, NNAPI_LOG_TAG, "NNAPI: dlopen(%s) failed: %s", libName, dlerror());
|
|
100
|
+
}
|
|
101
|
+
if (!lib) {
|
|
102
|
+
return JNI_FALSE;
|
|
103
|
+
}
|
|
104
|
+
using GetDeviceCountFn = int (*)(uint32_t*);
|
|
105
|
+
using GetDeviceFn = int (*)(uint32_t, ANeuralNetworksDevice*); // out param: ANeuralNetworksDevice*
|
|
106
|
+
using GetTypeFn = int (*)(ANeuralNetworksDevice, int32_t*);
|
|
107
|
+
auto getDeviceCount = reinterpret_cast<GetDeviceCountFn>(dlsym(lib, "ANeuralNetworks_getDeviceCount"));
|
|
108
|
+
auto getDevice = reinterpret_cast<GetDeviceFn>(dlsym(lib, "ANeuralNetworks_getDevice"));
|
|
109
|
+
auto getType = reinterpret_cast<GetTypeFn>(dlsym(lib, "ANeuralNetworksDevice_getType"));
|
|
110
|
+
if (!getDeviceCount || !getDevice || !getType) {
|
|
111
|
+
__android_log_print(ANDROID_LOG_INFO, NNAPI_LOG_TAG, "NNAPI: dlsym failed (getCount=%p getDevice=%p getType=%p): %s",
|
|
112
|
+
(void*)getDeviceCount, (void*)getDevice, (void*)getType, dlerror());
|
|
113
|
+
dlclose(lib);
|
|
114
|
+
return JNI_FALSE;
|
|
115
|
+
}
|
|
116
|
+
uint32_t numDevices = 0;
|
|
117
|
+
int err = getDeviceCount(&numDevices);
|
|
118
|
+
__android_log_print(ANDROID_LOG_INFO, NNAPI_LOG_TAG, "NNAPI getDeviceCount: err=%d numDevices=%u", err, numDevices);
|
|
119
|
+
if (err != ANEURALNETWORKS_NO_ERROR || numDevices == 0) {
|
|
120
|
+
dlclose(lib);
|
|
121
|
+
return JNI_FALSE;
|
|
122
|
+
}
|
|
123
|
+
jboolean hasAccelerator = JNI_FALSE;
|
|
124
|
+
for (uint32_t i = 0; i < numDevices; ++i) {
|
|
125
|
+
ANeuralNetworksDevice device = nullptr;
|
|
126
|
+
err = getDevice(i, &device);
|
|
127
|
+
if (err != ANEURALNETWORKS_NO_ERROR || !device) {
|
|
128
|
+
__android_log_print(ANDROID_LOG_INFO, NNAPI_LOG_TAG,
|
|
129
|
+
"NNAPI device[%u] getDevice: err=%d device=%p", i, err, (void*)device);
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
int32_t type = 0;
|
|
133
|
+
int typeErr = getType(device, &type);
|
|
134
|
+
__android_log_print(ANDROID_LOG_INFO, NNAPI_LOG_TAG,
|
|
135
|
+
"NNAPI device[%u] getType: err=%d type=%d (1=OTHER 2=CPU 3=GPU 4=ACCELERATOR)", i, typeErr, type);
|
|
136
|
+
if (typeErr == ANEURALNETWORKS_NO_ERROR &&
|
|
137
|
+
(type == ANEURALNETWORKS_DEVICE_ACCELERATOR || type == ANEURALNETWORKS_DEVICE_GPU)) {
|
|
138
|
+
hasAccelerator = JNI_TRUE;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
__android_log_print(ANDROID_LOG_INFO, NNAPI_LOG_TAG, "NNAPI hasAccelerator result=%s", hasAccelerator ? "true" : "false");
|
|
142
|
+
dlclose(lib);
|
|
143
|
+
return hasAccelerator;
|
|
144
|
+
#endif
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Detect STT model in directory. Returns HashMap with success, error, detectedModels, modelType, paths.
|
|
148
|
+
JNIEXPORT jobject JNICALL
|
|
149
|
+
Java_com_sherpaonnx_SherpaOnnxModule_nativeDetectSttModel(
|
|
150
|
+
JNIEnv* env,
|
|
151
|
+
jobject /* this */,
|
|
152
|
+
jstring j_model_dir,
|
|
153
|
+
jboolean j_prefer_int8,
|
|
154
|
+
jboolean j_has_prefer_int8,
|
|
155
|
+
jstring j_model_type,
|
|
156
|
+
jboolean j_debug) {
|
|
157
|
+
const char* model_dir_c = env->GetStringUTFChars(j_model_dir, nullptr);
|
|
158
|
+
const char* model_type_c = j_model_type ? env->GetStringUTFChars(j_model_type, nullptr) : nullptr;
|
|
159
|
+
std::string model_dir(model_dir_c ? model_dir_c : "");
|
|
160
|
+
std::optional<bool> prefer_int8;
|
|
161
|
+
if (j_has_prefer_int8) prefer_int8 = (j_prefer_int8 == JNI_TRUE);
|
|
162
|
+
std::optional<std::string> model_type_opt;
|
|
163
|
+
if (model_type_c && model_type_c[0] != '\0') model_type_opt = std::string(model_type_c);
|
|
164
|
+
env->ReleaseStringUTFChars(j_model_dir, model_dir_c);
|
|
165
|
+
if (model_type_c) env->ReleaseStringUTFChars(j_model_type, model_type_c);
|
|
166
|
+
|
|
167
|
+
sherpaonnx::SttDetectResult result = sherpaonnx::DetectSttModel(
|
|
168
|
+
model_dir, prefer_int8, model_type_opt, (j_debug == JNI_TRUE));
|
|
169
|
+
return sherpaonnx::SttDetectResultToJava(env, result);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Detect TTS model in directory. Returns HashMap with success, error, detectedModels, modelType, paths.
|
|
173
|
+
JNIEXPORT jobject JNICALL
|
|
174
|
+
Java_com_sherpaonnx_SherpaOnnxModule_nativeDetectTtsModel(
|
|
175
|
+
JNIEnv* env,
|
|
176
|
+
jobject /* this */,
|
|
177
|
+
jstring j_model_dir,
|
|
178
|
+
jstring j_model_type) {
|
|
179
|
+
const char* model_dir_c = env->GetStringUTFChars(j_model_dir, nullptr);
|
|
180
|
+
const char* model_type_c = j_model_type ? env->GetStringUTFChars(j_model_type, nullptr) : nullptr;
|
|
181
|
+
std::string model_dir(model_dir_c ? model_dir_c : "");
|
|
182
|
+
std::string model_type(model_type_c ? model_type_c : "auto");
|
|
183
|
+
env->ReleaseStringUTFChars(j_model_dir, model_dir_c);
|
|
184
|
+
if (model_type_c) env->ReleaseStringUTFChars(j_model_type, model_type_c);
|
|
185
|
+
|
|
186
|
+
sherpaonnx::TtsDetectResult result = sherpaonnx::DetectTtsModel(model_dir, model_type);
|
|
187
|
+
return sherpaonnx::TtsDetectResultToJava(env, result);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
} // extern "C"
|