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.
Files changed (175) hide show
  1. package/README.md +232 -236
  2. package/SherpaOnnx.podspec +68 -64
  3. package/android/build.gradle +182 -192
  4. package/android/codegen.gradle +57 -0
  5. package/android/prebuilt-download.gradle +428 -0
  6. package/android/prebuilt-versions.gradle +43 -0
  7. package/android/proguard-rules.pro +10 -0
  8. package/android/src/main/assets/testModels/add_mul_add.onnx +28 -0
  9. package/android/src/main/assets/testModels/nnapi_internal_uint8_support.onnx +0 -0
  10. package/android/src/main/assets/testModels/qnn_multi_ctx_embed.onnx +0 -0
  11. package/android/src/main/cpp/CMakeLists.txt +166 -129
  12. package/android/src/main/cpp/CMakePresets.json +54 -0
  13. package/android/src/main/cpp/crypto/sha256.cpp +174 -0
  14. package/android/src/main/cpp/crypto/sha256.h +16 -0
  15. package/android/src/main/cpp/jni/archive/sherpa-onnx-archive-helper.cpp +404 -0
  16. package/android/src/main/cpp/jni/archive/sherpa-onnx-archive-helper.h +56 -0
  17. package/android/src/main/cpp/jni/archive/sherpa-onnx-archive-jni.cpp +181 -0
  18. package/android/src/main/cpp/jni/audio/sherpa-onnx-audio-convert-jni.cpp +888 -0
  19. package/{ios → android/src/main/cpp/jni/model_detect}/sherpa-onnx-common.h +18 -18
  20. package/android/src/main/cpp/jni/model_detect/sherpa-onnx-detect-jni-common.cpp +86 -0
  21. package/android/src/main/cpp/jni/model_detect/sherpa-onnx-detect-jni-common.h +20 -0
  22. package/android/src/main/cpp/jni/model_detect/sherpa-onnx-model-detect-helper.cpp +423 -0
  23. package/android/src/main/cpp/jni/model_detect/sherpa-onnx-model-detect-helper.h +55 -0
  24. package/android/src/main/cpp/jni/model_detect/sherpa-onnx-model-detect-stt.cpp +399 -0
  25. package/android/src/main/cpp/jni/model_detect/sherpa-onnx-model-detect-tts.cpp +238 -0
  26. package/{ios → android/src/main/cpp/jni/model_detect}/sherpa-onnx-model-detect.h +122 -89
  27. package/android/src/main/cpp/jni/model_detect/sherpa-onnx-stt-wrapper.cpp +99 -0
  28. package/android/src/main/cpp/jni/model_detect/sherpa-onnx-stt-wrapper.h +16 -0
  29. package/android/src/main/cpp/jni/model_detect/sherpa-onnx-tts-wrapper.cpp +78 -0
  30. package/android/src/main/cpp/jni/model_detect/sherpa-onnx-tts-wrapper.h +16 -0
  31. package/android/src/main/cpp/jni/module/sherpa-onnx-module-jni.cpp +190 -0
  32. package/android/src/main/cpp/jni/tts/sherpa-onnx-tts-zipvoice-jni.cpp +301 -0
  33. package/android/src/main/java/com/sherpaonnx/SherpaOnnxArchiveHelper.kt +94 -0
  34. package/android/src/main/java/com/sherpaonnx/{SherpaOnnxCoreHelper.kt → SherpaOnnxAssetHelper.kt} +350 -236
  35. package/android/src/main/java/com/sherpaonnx/SherpaOnnxModule.kt +791 -483
  36. package/android/src/main/java/com/sherpaonnx/SherpaOnnxSttHelper.kt +699 -109
  37. package/android/src/main/java/com/sherpaonnx/SherpaOnnxTtsHelper.kt +1123 -668
  38. package/android/src/main/java/com/sherpaonnx/ZipvoiceTtsWrapper.kt +187 -0
  39. package/ios/SherpaOnnx+Assets.h +11 -0
  40. package/ios/SherpaOnnx+Assets.mm +325 -0
  41. package/ios/SherpaOnnx+STT.mm +455 -118
  42. package/ios/SherpaOnnx+TTS.mm +1101 -712
  43. package/ios/SherpaOnnx.h +17 -6
  44. package/ios/SherpaOnnx.mm +206 -311
  45. package/ios/SherpaOnnx.xcconfig +19 -19
  46. package/ios/SherpaOnnxCoreMLHelper.swift +24 -0
  47. package/ios/archive/sherpa-onnx-archive-helper.h +21 -0
  48. package/ios/archive/sherpa-onnx-archive-helper.mm +296 -0
  49. package/ios/libarchive_darwin_config.h +153 -0
  50. package/{android/src/main/cpp/jni → ios/model_detect}/sherpa-onnx-common.h +18 -18
  51. package/ios/model_detect/sherpa-onnx-model-detect-helper.h +49 -0
  52. package/ios/model_detect/sherpa-onnx-model-detect-helper.mm +210 -0
  53. package/ios/model_detect/sherpa-onnx-model-detect-stt.mm +344 -0
  54. package/ios/model_detect/sherpa-onnx-model-detect-tts.mm +201 -0
  55. package/{android/src/main/cpp/jni → ios/model_detect}/sherpa-onnx-model-detect.h +117 -89
  56. package/ios/scripts/patch-libarchive-includes.sh +61 -0
  57. package/ios/scripts/setup-ios-libarchive.sh +98 -0
  58. package/ios/stt/sherpa-onnx-stt-wrapper.h +129 -0
  59. package/ios/stt/sherpa-onnx-stt-wrapper.mm +523 -0
  60. package/ios/{sherpa-onnx-tts-wrapper.h → tts/sherpa-onnx-tts-wrapper.h} +90 -85
  61. package/ios/{sherpa-onnx-tts-wrapper.mm → tts/sherpa-onnx-tts-wrapper.mm} +376 -345
  62. package/lib/module/NativeSherpaOnnx.js +3 -0
  63. package/lib/module/NativeSherpaOnnx.js.map +1 -1
  64. package/lib/module/audio/index.js +22 -0
  65. package/lib/module/audio/index.js.map +1 -0
  66. package/lib/module/diarization/index.js +1 -1
  67. package/lib/module/diarization/index.js.map +1 -1
  68. package/lib/module/download/ModelDownloadManager.js +918 -0
  69. package/lib/module/download/ModelDownloadManager.js.map +1 -0
  70. package/lib/module/download/extractTarBz2.js +53 -0
  71. package/lib/module/download/extractTarBz2.js.map +1 -0
  72. package/lib/module/download/index.js +6 -0
  73. package/lib/module/download/index.js.map +1 -0
  74. package/lib/module/download/validation.js +178 -0
  75. package/lib/module/download/validation.js.map +1 -0
  76. package/lib/module/enhancement/index.js +1 -1
  77. package/lib/module/enhancement/index.js.map +1 -1
  78. package/lib/module/index.js +41 -3
  79. package/lib/module/index.js.map +1 -1
  80. package/lib/module/separation/index.js +1 -1
  81. package/lib/module/separation/index.js.map +1 -1
  82. package/lib/module/stt/index.js +127 -60
  83. package/lib/module/stt/index.js.map +1 -1
  84. package/lib/module/stt/sttModelLanguages.js +512 -0
  85. package/lib/module/stt/sttModelLanguages.js.map +1 -0
  86. package/lib/module/stt/types.js +53 -1
  87. package/lib/module/stt/types.js.map +1 -1
  88. package/lib/module/tts/index.js +216 -289
  89. package/lib/module/tts/index.js.map +1 -1
  90. package/lib/module/tts/types.js +86 -1
  91. package/lib/module/tts/types.js.map +1 -1
  92. package/lib/module/types.js.map +1 -1
  93. package/lib/module/utils.js +86 -73
  94. package/lib/module/utils.js.map +1 -1
  95. package/lib/module/vad/index.js +1 -1
  96. package/lib/module/vad/index.js.map +1 -1
  97. package/lib/typescript/src/NativeSherpaOnnx.d.ts +192 -38
  98. package/lib/typescript/src/NativeSherpaOnnx.d.ts.map +1 -1
  99. package/lib/typescript/src/audio/index.d.ts +13 -0
  100. package/lib/typescript/src/audio/index.d.ts.map +1 -0
  101. package/lib/typescript/src/diarization/index.d.ts +3 -2
  102. package/lib/typescript/src/diarization/index.d.ts.map +1 -1
  103. package/lib/typescript/src/download/ModelDownloadManager.d.ts +108 -0
  104. package/lib/typescript/src/download/ModelDownloadManager.d.ts.map +1 -0
  105. package/lib/typescript/src/download/extractTarBz2.d.ts +14 -0
  106. package/lib/typescript/src/download/extractTarBz2.d.ts.map +1 -0
  107. package/lib/typescript/src/download/index.d.ts +7 -0
  108. package/lib/typescript/src/download/index.d.ts.map +1 -0
  109. package/lib/typescript/src/download/validation.d.ts +57 -0
  110. package/lib/typescript/src/download/validation.d.ts.map +1 -0
  111. package/lib/typescript/src/enhancement/index.d.ts +3 -2
  112. package/lib/typescript/src/enhancement/index.d.ts.map +1 -1
  113. package/lib/typescript/src/index.d.ts +26 -2
  114. package/lib/typescript/src/index.d.ts.map +1 -1
  115. package/lib/typescript/src/separation/index.d.ts +3 -2
  116. package/lib/typescript/src/separation/index.d.ts.map +1 -1
  117. package/lib/typescript/src/stt/index.d.ts +31 -43
  118. package/lib/typescript/src/stt/index.d.ts.map +1 -1
  119. package/lib/typescript/src/stt/sttModelLanguages.d.ts +52 -0
  120. package/lib/typescript/src/stt/sttModelLanguages.d.ts.map +1 -0
  121. package/lib/typescript/src/stt/types.d.ts +196 -9
  122. package/lib/typescript/src/stt/types.d.ts.map +1 -1
  123. package/lib/typescript/src/tts/index.d.ts +25 -211
  124. package/lib/typescript/src/tts/index.d.ts.map +1 -1
  125. package/lib/typescript/src/tts/types.d.ts +148 -25
  126. package/lib/typescript/src/tts/types.d.ts.map +1 -1
  127. package/lib/typescript/src/types.d.ts +0 -32
  128. package/lib/typescript/src/types.d.ts.map +1 -1
  129. package/lib/typescript/src/utils.d.ts +28 -13
  130. package/lib/typescript/src/utils.d.ts.map +1 -1
  131. package/lib/typescript/src/vad/index.d.ts +3 -2
  132. package/lib/typescript/src/vad/index.d.ts.map +1 -1
  133. package/package.json +250 -222
  134. package/scripts/check-qnn-support.sh +78 -0
  135. package/scripts/setup-ios-framework.sh +379 -282
  136. package/src/NativeSherpaOnnx.ts +474 -251
  137. package/src/audio/index.ts +32 -0
  138. package/src/diarization/index.ts +4 -2
  139. package/src/download/ModelDownloadManager.ts +1325 -0
  140. package/src/download/extractTarBz2.ts +78 -0
  141. package/src/download/index.ts +43 -0
  142. package/src/download/validation.ts +279 -0
  143. package/src/enhancement/index.ts +4 -2
  144. package/src/index.tsx +78 -27
  145. package/src/separation/index.ts +4 -2
  146. package/src/stt/index.ts +249 -89
  147. package/src/stt/sttModelLanguages.ts +237 -0
  148. package/src/stt/types.ts +263 -9
  149. package/src/tts/index.ts +470 -458
  150. package/src/tts/types.ts +373 -218
  151. package/src/types.ts +0 -44
  152. package/src/utils.ts +145 -131
  153. package/src/vad/index.ts +4 -2
  154. package/third_party/ffmpeg_prebuilt/ANDROID_RELEASE_TAG +1 -0
  155. package/third_party/libarchive_prebuilt/ANDROID_RELEASE_TAG +1 -0
  156. package/third_party/libarchive_prebuilt/IOS_RELEASE_TAG +1 -0
  157. package/third_party/sherpa-onnx-prebuilt/ANDROID_RELEASE_TAG +1 -0
  158. package/third_party/sherpa-onnx-prebuilt/IOS_RELEASE_TAG +1 -0
  159. package/android/src/main/cpp/include/sherpa-onnx/c-api/c-api.h +0 -1918
  160. package/android/src/main/cpp/include/sherpa-onnx/c-api/cxx-api.h +0 -841
  161. package/android/src/main/cpp/jni/sherpa-onnx-model-detect.cpp +0 -541
  162. package/android/src/main/cpp/jni/sherpa-onnx-stt-jni.cpp +0 -336
  163. package/android/src/main/cpp/jni/sherpa-onnx-stt-wrapper.cpp +0 -222
  164. package/android/src/main/cpp/jni/sherpa-onnx-stt-wrapper.h +0 -68
  165. package/android/src/main/cpp/jni/sherpa-onnx-tts-jni.cpp +0 -823
  166. package/android/src/main/cpp/jni/sherpa-onnx-tts-wrapper.cpp +0 -387
  167. package/android/src/main/cpp/jni/sherpa-onnx-tts-wrapper.h +0 -147
  168. package/ios/Frameworks/sherpa_onnx.xcframework.zip +0 -0
  169. package/ios/include/sherpa-onnx/c-api/c-api.h +0 -1918
  170. package/ios/include/sherpa-onnx/c-api/cxx-api.h +0 -841
  171. package/ios/sherpa-onnx-model-detect.mm +0 -441
  172. package/ios/sherpa-onnx-stt-wrapper.h +0 -48
  173. package/ios/sherpa-onnx-stt-wrapper.mm +0 -201
  174. package/scripts/copy-headers.js +0 -184
  175. 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
- kParaformer,
15
- kNemoCtc,
16
- kWenetCtc,
17
- kSenseVoice,
18
- kZipformerCtc,
19
- kWhisper,
20
- kFunAsrNano
21
- };
22
-
23
- enum class TtsModelKind {
24
- kUnknown,
25
- kVits,
26
- kMatcha,
27
- kKokoro,
28
- kKitten,
29
- kZipvoice
30
- };
31
-
32
- struct SttModelPaths {
33
- std::string encoder;
34
- std::string decoder;
35
- std::string joiner;
36
- std::string paraformerModel;
37
- std::string ctcModel;
38
- std::string whisperEncoder;
39
- std::string whisperDecoder;
40
- std::string tokens;
41
- std::string funasrEncoderAdaptor;
42
- std::string funasrLLM;
43
- std::string funasrEmbedding;
44
- std::string funasrTokenizer;
45
- };
46
-
47
- struct TtsModelPaths {
48
- std::string ttsModel;
49
- std::string tokens;
50
- std::string lexicon;
51
- std::string dataDir;
52
- std::string voices;
53
- std::string acousticModel;
54
- std::string vocoder;
55
- std::string encoder;
56
- std::string decoder;
57
- };
58
-
59
- struct SttDetectResult {
60
- bool ok = false;
61
- std::string error;
62
- std::vector<DetectedModel> detectedModels;
63
- SttModelKind selectedKind = SttModelKind::kUnknown;
64
- bool tokensRequired = true;
65
- SttModelPaths paths;
66
- };
67
-
68
- struct TtsDetectResult {
69
- bool ok = false;
70
- std::string error;
71
- std::vector<DetectedModel> detectedModels;
72
- TtsModelKind selectedKind = TtsModelKind::kUnknown;
73
- TtsModelPaths paths;
74
- };
75
-
76
- SttDetectResult DetectSttModel(
77
- const std::string& modelDir,
78
- const std::optional<bool>& preferInt8,
79
- const std::optional<std::string>& modelType
80
- );
81
-
82
- TtsDetectResult DetectTtsModel(
83
- const std::string& modelDir,
84
- const std::string& modelType
85
- );
86
-
87
- } // namespace sherpaonnx
88
-
89
- #endif // SHERPA_ONNX_MODEL_DETECT_H
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"