react-native-sherpa-onnx 0.3.8 → 0.3.9
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 +4 -2
- package/SherpaOnnx.podspec +4 -1
- package/android/prebuilt-download.gradle +23 -23
- package/android/src/main/assets/model_licenses/asr-models-license-status.csv +1 -0
- package/android/src/main/cpp/jni/model_detect/sherpa-onnx-model-detect-helper.cpp +23 -0
- package/android/src/main/cpp/jni/model_detect/sherpa-onnx-model-detect-helper.h +9 -0
- package/android/src/main/cpp/jni/model_detect/sherpa-onnx-model-detect-stt.cpp +51 -8
- package/android/src/main/cpp/jni/model_detect/sherpa-onnx-model-detect.h +10 -0
- package/android/src/main/cpp/jni/model_detect/sherpa-onnx-stt-wrapper.cpp +5 -0
- package/android/src/main/cpp/jni/model_detect/sherpa-onnx-validate-stt.cpp +11 -0
- package/android/src/main/java/com/sherpaonnx/SherpaOnnxArchiveHelper.kt +110 -35
- package/android/src/main/java/com/sherpaonnx/SherpaOnnxExtractionNotificationHelper.kt +102 -0
- package/android/src/main/java/com/sherpaonnx/SherpaOnnxModule.kt +92 -18
- package/android/src/main/java/com/sherpaonnx/SherpaOnnxSttHelper.kt +22 -0
- package/ios/Resources/model_licenses/asr-models-license-status.csv +1 -0
- package/ios/SherpaOnnx+STT.mm +13 -1
- package/ios/SherpaOnnx.mm +87 -17
- package/ios/model_detect/sherpa-onnx-model-detect-helper.h +5 -0
- package/ios/model_detect/sherpa-onnx-model-detect-helper.mm +23 -0
- package/ios/model_detect/sherpa-onnx-model-detect-stt.mm +51 -7
- package/ios/model_detect/sherpa-onnx-model-detect.h +10 -0
- package/ios/model_detect/sherpa-onnx-validate-stt.mm +11 -0
- package/ios/stt/sherpa-onnx-stt-wrapper.h +11 -1
- package/ios/stt/sherpa-onnx-stt-wrapper.mm +30 -2
- package/ios/tts/sherpa-onnx-tts-wrapper.mm +16 -0
- package/lib/module/NativeSherpaOnnx.js.map +1 -1
- package/lib/module/download/postDownloadProcessing.js +17 -4
- package/lib/module/download/postDownloadProcessing.js.map +1 -1
- package/lib/module/extraction/extractTarBz2.js +2 -2
- package/lib/module/extraction/extractTarBz2.js.map +1 -1
- package/lib/module/extraction/extractTarZst.js +2 -2
- package/lib/module/extraction/extractTarZst.js.map +1 -1
- package/lib/module/extraction/index.js +10 -5
- package/lib/module/extraction/index.js.map +1 -1
- package/lib/module/stt/index.js +4 -2
- package/lib/module/stt/index.js.map +1 -1
- package/lib/module/stt/streaming.js +2 -1
- package/lib/module/stt/streaming.js.map +1 -1
- package/lib/module/stt/types.js +3 -1
- package/lib/module/stt/types.js.map +1 -1
- package/lib/module/tts/index.js +4 -2
- package/lib/module/tts/index.js.map +1 -1
- package/lib/module/tts/streaming.js +3 -1
- package/lib/module/tts/streaming.js.map +1 -1
- package/lib/typescript/src/NativeSherpaOnnx.d.ts +25 -9
- package/lib/typescript/src/NativeSherpaOnnx.d.ts.map +1 -1
- package/lib/typescript/src/download/postDownloadProcessing.d.ts +9 -0
- package/lib/typescript/src/download/postDownloadProcessing.d.ts.map +1 -1
- package/lib/typescript/src/extraction/extractTarBz2.d.ts +2 -1
- package/lib/typescript/src/extraction/extractTarBz2.d.ts.map +1 -1
- package/lib/typescript/src/extraction/extractTarZst.d.ts +2 -1
- package/lib/typescript/src/extraction/extractTarZst.d.ts.map +1 -1
- package/lib/typescript/src/extraction/index.d.ts +1 -1
- package/lib/typescript/src/extraction/index.d.ts.map +1 -1
- package/lib/typescript/src/extraction/types.d.ts +12 -0
- package/lib/typescript/src/extraction/types.d.ts.map +1 -1
- package/lib/typescript/src/stt/index.d.ts +1 -1
- package/lib/typescript/src/stt/index.d.ts.map +1 -1
- package/lib/typescript/src/stt/streaming.d.ts.map +1 -1
- package/lib/typescript/src/stt/types.d.ts +16 -1
- package/lib/typescript/src/stt/types.d.ts.map +1 -1
- package/lib/typescript/src/tts/index.d.ts.map +1 -1
- package/lib/typescript/src/tts/streaming.d.ts.map +1 -1
- package/package.json +1 -1
- package/scripts/ci/update_model_license_csv.sh +16 -16
- package/src/NativeSherpaOnnx.ts +37 -10
- package/src/download/postDownloadProcessing.ts +24 -1
- package/src/extraction/extractTarBz2.ts +7 -2
- package/src/extraction/extractTarZst.ts +7 -2
- package/src/extraction/index.ts +29 -6
- package/src/extraction/types.ts +16 -0
- package/src/stt/index.ts +8 -7
- package/src/stt/streaming.ts +7 -1
- package/src/stt/types.ts +18 -0
- package/src/tts/index.ts +7 -7
- package/src/tts/streaming.ts +6 -3
- package/third_party/sherpa-onnx-prebuilt/ANDROID_RELEASE_TAG +1 -1
- package/third_party/sherpa-onnx-prebuilt/IOS_RELEASE_TAG +1 -1
package/ios/SherpaOnnx.mm
CHANGED
|
@@ -138,9 +138,15 @@
|
|
|
138
138
|
- (void)extractTarBz2:(NSString *)sourcePath
|
|
139
139
|
targetPath:(NSString *)targetPath
|
|
140
140
|
force:(BOOL)force
|
|
141
|
-
|
|
142
|
-
|
|
141
|
+
showNotificationsEnabled:(NSNumber *)showNotificationsEnabled
|
|
142
|
+
notificationTitle:(NSString *)notificationTitle
|
|
143
|
+
notificationText:(NSString *)notificationText
|
|
144
|
+
resolve:(RCTPromiseResolveBlock)resolve
|
|
145
|
+
reject:(RCTPromiseRejectBlock)reject
|
|
143
146
|
{
|
|
147
|
+
(void)showNotificationsEnabled;
|
|
148
|
+
(void)notificationTitle;
|
|
149
|
+
(void)notificationText;
|
|
144
150
|
SherpaOnnxArchiveHelper *helper = [SherpaOnnxArchiveHelper new];
|
|
145
151
|
NSDictionary *result = [helper extractTarBz2:sourcePath
|
|
146
152
|
targetPath:targetPath
|
|
@@ -165,9 +171,15 @@
|
|
|
165
171
|
- (void)extractTarZst:(NSString *)sourcePath
|
|
166
172
|
targetPath:(NSString *)targetPath
|
|
167
173
|
force:(BOOL)force
|
|
168
|
-
|
|
169
|
-
|
|
174
|
+
showNotificationsEnabled:(NSNumber *)showNotificationsEnabled
|
|
175
|
+
notificationTitle:(NSString *)notificationTitle
|
|
176
|
+
notificationText:(NSString *)notificationText
|
|
177
|
+
resolve:(RCTPromiseResolveBlock)resolve
|
|
178
|
+
reject:(RCTPromiseRejectBlock)reject
|
|
170
179
|
{
|
|
180
|
+
(void)showNotificationsEnabled;
|
|
181
|
+
(void)notificationTitle;
|
|
182
|
+
(void)notificationText;
|
|
171
183
|
SherpaOnnxArchiveHelper *helper = [SherpaOnnxArchiveHelper new];
|
|
172
184
|
NSDictionary *result = [helper extractTarZst:sourcePath
|
|
173
185
|
targetPath:targetPath
|
|
@@ -229,19 +241,33 @@
|
|
|
229
241
|
|
|
230
242
|
- (void)extractTarZstFromAsset:(NSString *)assetPath
|
|
231
243
|
targetPath:(NSString *)targetPath
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
244
|
+
force:(BOOL)force
|
|
245
|
+
showNotificationsEnabled:(NSNumber *)showNotificationsEnabled
|
|
246
|
+
notificationTitle:(NSString *)notificationTitle
|
|
247
|
+
notificationText:(NSString *)notificationText
|
|
248
|
+
resolve:(RCTPromiseResolveBlock)resolve
|
|
249
|
+
reject:(RCTPromiseRejectBlock)reject
|
|
235
250
|
{
|
|
251
|
+
(void)force;
|
|
252
|
+
(void)showNotificationsEnabled;
|
|
253
|
+
(void)notificationTitle;
|
|
254
|
+
(void)notificationText;
|
|
236
255
|
resolve(@{ @"success": @NO, @"reason": @"Not supported on iOS; use path-based extraction." });
|
|
237
256
|
}
|
|
238
257
|
|
|
239
258
|
- (void)extractTarBz2FromAsset:(NSString *)assetPath
|
|
240
259
|
targetPath:(NSString *)targetPath
|
|
241
|
-
force:(
|
|
242
|
-
|
|
243
|
-
|
|
260
|
+
force:(BOOL)force
|
|
261
|
+
showNotificationsEnabled:(NSNumber *)showNotificationsEnabled
|
|
262
|
+
notificationTitle:(NSString *)notificationTitle
|
|
263
|
+
notificationText:(NSString *)notificationText
|
|
264
|
+
resolve:(RCTPromiseResolveBlock)resolve
|
|
265
|
+
reject:(RCTPromiseRejectBlock)reject
|
|
244
266
|
{
|
|
267
|
+
(void)force;
|
|
268
|
+
(void)showNotificationsEnabled;
|
|
269
|
+
(void)notificationTitle;
|
|
270
|
+
(void)notificationText;
|
|
245
271
|
resolve(@{ @"success": @NO, @"reason": @"Not supported on iOS; use path-based extraction." });
|
|
246
272
|
}
|
|
247
273
|
|
|
@@ -329,15 +355,59 @@
|
|
|
329
355
|
nil);
|
|
330
356
|
return;
|
|
331
357
|
}
|
|
332
|
-
NSString *
|
|
333
|
-
|
|
358
|
+
NSString *fullPath = nil;
|
|
359
|
+
NSBundle *mainBundle = [NSBundle mainBundle];
|
|
360
|
+
NSString *assetDir = [assetPath stringByDeletingLastPathComponent];
|
|
361
|
+
NSString *assetNameWithExt = [assetPath lastPathComponent];
|
|
362
|
+
NSString *assetName = [assetNameWithExt stringByDeletingPathExtension];
|
|
363
|
+
NSString *assetExt = [assetNameWithExt pathExtension];
|
|
364
|
+
|
|
365
|
+
// 1) App bundle: regular nested path (keeps generic asset support)
|
|
366
|
+
NSString *mainPath = [mainBundle pathForResource:assetName
|
|
367
|
+
ofType:assetExt.length > 0 ? assetExt : nil
|
|
368
|
+
inDirectory:assetDir.length > 0 ? assetDir : nil];
|
|
369
|
+
if (mainPath.length > 0) {
|
|
370
|
+
fullPath = mainPath;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
// 2) CocoaPods resource bundle: files are flattened into bundle root
|
|
374
|
+
if (!fullPath) {
|
|
375
|
+
NSString *resBundlePath = [mainBundle pathForResource:@"SherpaOnnxResources"
|
|
376
|
+
ofType:@"bundle"];
|
|
377
|
+
if (resBundlePath.length > 0) {
|
|
378
|
+
NSBundle *resBundle = [NSBundle bundleWithPath:resBundlePath];
|
|
379
|
+
if (resBundle) {
|
|
380
|
+
NSString *bundleRootPath = [resBundle pathForResource:assetName
|
|
381
|
+
ofType:assetExt.length > 0 ? assetExt : nil];
|
|
382
|
+
if (bundleRootPath.length > 0) {
|
|
383
|
+
fullPath = bundleRootPath;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
if (!fullPath) {
|
|
390
|
+
reject(@"ASSET_READ_ERROR",
|
|
391
|
+
[NSString stringWithFormat:@"Failed to locate asset %@", assetPath],
|
|
392
|
+
nil);
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
|
|
334
396
|
NSError *error = nil;
|
|
335
|
-
NSString *content = [NSString stringWithContentsOfFile:fullPath
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
397
|
+
NSString *content = [NSString stringWithContentsOfFile:fullPath
|
|
398
|
+
encoding:NSUTF8StringEncoding
|
|
399
|
+
error:&error];
|
|
400
|
+
if (error || content == nil) {
|
|
401
|
+
reject(@"ASSET_READ_ERROR",
|
|
402
|
+
[NSString stringWithFormat:@"Failed to read asset %@ at %@: %@",
|
|
403
|
+
assetPath,
|
|
404
|
+
fullPath,
|
|
405
|
+
error.localizedDescription ?: @"Unknown error"],
|
|
406
|
+
error);
|
|
407
|
+
return;
|
|
340
408
|
}
|
|
409
|
+
|
|
410
|
+
resolve(content);
|
|
341
411
|
}
|
|
342
412
|
|
|
343
413
|
@end
|
|
@@ -80,6 +80,11 @@ std::vector<LexiconCandidate> FindLexiconCandidates(
|
|
|
80
80
|
const std::string& rootDir
|
|
81
81
|
);
|
|
82
82
|
|
|
83
|
+
bool Qwen3TokenizerDirHasVocabAndMerges(
|
|
84
|
+
const std::vector<FileEntry>& files,
|
|
85
|
+
const std::string& dir
|
|
86
|
+
);
|
|
87
|
+
|
|
83
88
|
} // namespace model_detect
|
|
84
89
|
} // namespace sherpaonnx
|
|
85
90
|
|
|
@@ -257,5 +257,28 @@ std::vector<LexiconCandidate> FindLexiconCandidates(
|
|
|
257
257
|
return candidates;
|
|
258
258
|
}
|
|
259
259
|
|
|
260
|
+
bool Qwen3TokenizerDirHasVocabAndMerges(
|
|
261
|
+
const std::vector<FileEntry>& files,
|
|
262
|
+
const std::string& dirRaw
|
|
263
|
+
) {
|
|
264
|
+
std::string dir = dirRaw;
|
|
265
|
+
while (!dir.empty() && (dir.back() == '/' || dir.back() == '\\'))
|
|
266
|
+
dir.pop_back();
|
|
267
|
+
if (dir.empty()) return false;
|
|
268
|
+
bool hasVocab = false;
|
|
269
|
+
bool hasMerges = false;
|
|
270
|
+
const std::string prefix = dir + "/";
|
|
271
|
+
for (const auto& e : files) {
|
|
272
|
+
if (e.path.size() <= prefix.size()) continue;
|
|
273
|
+
if (e.path.compare(0, prefix.size(), prefix) != 0) continue;
|
|
274
|
+
std::string rest = e.path.substr(prefix.size());
|
|
275
|
+
if (rest.find('/') != std::string::npos || rest.find('\\') != std::string::npos) continue;
|
|
276
|
+
if (e.nameLower == "vocab.json") hasVocab = true;
|
|
277
|
+
if (e.nameLower == "merges.txt") hasMerges = true;
|
|
278
|
+
}
|
|
279
|
+
if (hasVocab && hasMerges) return true;
|
|
280
|
+
return FileExists(dir + "/vocab.json") && FileExists(dir + "/merges.txt");
|
|
281
|
+
}
|
|
282
|
+
|
|
260
283
|
} // namespace model_detect
|
|
261
284
|
} // namespace sherpaonnx
|
|
@@ -58,6 +58,7 @@ static const char* KindToName(SttModelKind k) {
|
|
|
58
58
|
case SttModelKind::kZipformerCtc: return "zipformer_ctc";
|
|
59
59
|
case SttModelKind::kWhisper: return "whisper";
|
|
60
60
|
case SttModelKind::kFunAsrNano: return "funasr_nano";
|
|
61
|
+
case SttModelKind::kQwen3Asr: return "qwen3_asr";
|
|
61
62
|
case SttModelKind::kFireRedAsr: return "fire_red_asr";
|
|
62
63
|
case SttModelKind::kMoonshine: return "moonshine";
|
|
63
64
|
case SttModelKind::kMoonshineV2: return "moonshine_v2";
|
|
@@ -85,6 +86,7 @@ SttModelKind ParseSttModelType(const std::string& modelType) {
|
|
|
85
86
|
if (modelType == "zipformer_ctc" || modelType == "ctc") return SttModelKind::kZipformerCtc;
|
|
86
87
|
if (modelType == "whisper") return SttModelKind::kWhisper;
|
|
87
88
|
if (modelType == "funasr_nano") return SttModelKind::kFunAsrNano;
|
|
89
|
+
if (modelType == "qwen3_asr") return SttModelKind::kQwen3Asr;
|
|
88
90
|
if (modelType == "fire_red_asr") return SttModelKind::kFireRedAsr;
|
|
89
91
|
if (modelType == "moonshine") return SttModelKind::kMoonshine;
|
|
90
92
|
if (modelType == "moonshine_v2") return SttModelKind::kMoonshineV2;
|
|
@@ -123,6 +125,8 @@ static bool CapabilitySupportsKind(
|
|
|
123
125
|
return cap.hasWhisper;
|
|
124
126
|
case SttModelKind::kFunAsrNano:
|
|
125
127
|
return cap.hasFunAsrNano;
|
|
128
|
+
case SttModelKind::kQwen3Asr:
|
|
129
|
+
return cap.hasQwen3Asr;
|
|
126
130
|
case SttModelKind::kFireRedAsr:
|
|
127
131
|
return cap.hasFireRedAsr;
|
|
128
132
|
case SttModelKind::kMoonshine:
|
|
@@ -185,6 +189,8 @@ static std::vector<SttModelKind> GetKindsFromDirName(const std::string& modelDir
|
|
|
185
189
|
add(SttModelKind::kTransducer);
|
|
186
190
|
add(SttModelKind::kZipformerCtc);
|
|
187
191
|
}
|
|
192
|
+
if (lower.find("qwen3-asr") != std::string::npos || lower.find("qwen3_asr") != std::string::npos)
|
|
193
|
+
add(SttModelKind::kQwen3Asr);
|
|
188
194
|
if (lower.find("funasr") != std::string::npos)
|
|
189
195
|
add(SttModelKind::kFunAsrNano);
|
|
190
196
|
if (lower.find("canary") != std::string::npos)
|
|
@@ -245,6 +251,19 @@ static SttCandidatePaths GatherSttCandidatePaths(
|
|
|
245
251
|
p.funasrTokenizerDir = vocabInSubdir.substr(0, lastSlash);
|
|
246
252
|
}
|
|
247
253
|
}
|
|
254
|
+
p.qwen3ConvFrontend = FindOnnxByAnyToken(files, {"conv_frontend"}, preferInt8);
|
|
255
|
+
{
|
|
256
|
+
for (const auto& entry : files) {
|
|
257
|
+
if (entry.nameLower != "tokenizer_config.json") continue;
|
|
258
|
+
size_t slash = entry.path.find_last_of("/\\");
|
|
259
|
+
if (slash == std::string::npos) continue;
|
|
260
|
+
std::string dir = entry.path.substr(0, slash);
|
|
261
|
+
if (Qwen3TokenizerDirHasVocabAndMerges(files, dir)) {
|
|
262
|
+
p.qwen3TokenizerDir = dir;
|
|
263
|
+
break;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
248
267
|
p.moonshinePreprocessor = FindOnnxByAnyToken(files, {"preprocess", "preprocessor"}, preferInt8);
|
|
249
268
|
p.moonshineEncoder = FindOnnxByAnyToken(files, {"encode", "encoder_model"}, preferInt8);
|
|
250
269
|
p.moonshineUncachedDecoder = FindOnnxByAnyToken(files, {"uncached_decode", "uncached"}, preferInt8);
|
|
@@ -254,7 +273,8 @@ static SttCandidatePaths GatherSttCandidatePaths(
|
|
|
254
273
|
static const std::vector<std::string> modelExcludes = {
|
|
255
274
|
"encoder", "decoder", "joiner", "vocoder", "acoustic", "embedding", "llm",
|
|
256
275
|
"encoder_adaptor", "encoder-adaptor", "encoder_model", "decoder_model",
|
|
257
|
-
"merged_decoder", "decoder_model_merged", "preprocess", "encode", "uncached", "cached"
|
|
276
|
+
"merged_decoder", "decoder_model_merged", "preprocess", "encode", "uncached", "cached",
|
|
277
|
+
"conv_frontend"
|
|
258
278
|
};
|
|
259
279
|
p.paraformerModel = FindOnnxByAnyToken(files, {"model"}, preferInt8);
|
|
260
280
|
if (!p.paraformerModel.empty()) {
|
|
@@ -297,6 +317,7 @@ static SttPathHints GetSttPathHints(const std::string& modelDir) {
|
|
|
297
317
|
h.isLikelyWenetCtc = lower.find("wenet") != std::string::npos;
|
|
298
318
|
h.isLikelySenseVoice = lower.find("sense") != std::string::npos || lower.find("sensevoice") != std::string::npos;
|
|
299
319
|
h.isLikelyFunAsrNano = lower.find("funasr") != std::string::npos || lower.find("funasr-nano") != std::string::npos;
|
|
320
|
+
h.isLikelyQwen3Asr = lower.find("qwen3-asr") != std::string::npos || lower.find("qwen3_asr") != std::string::npos;
|
|
300
321
|
h.isLikelyZipformer = lower.find("zipformer") != std::string::npos;
|
|
301
322
|
h.isLikelyMoonshine = lower.find("moonshine") != std::string::npos;
|
|
302
323
|
h.isLikelyDolphin = lower.find("dolphin") != std::string::npos;
|
|
@@ -338,7 +359,9 @@ static SttCapabilities ComputeSttCapabilities(const SttCandidatePaths& paths, co
|
|
|
338
359
|
c.hasTransducer = !paths.encoder.empty() && !paths.decoder.empty() && !paths.joiner.empty();
|
|
339
360
|
bool hasWhisperEnc = !paths.encoder.empty();
|
|
340
361
|
bool hasWhisperDec = !paths.decoder.empty();
|
|
341
|
-
|
|
362
|
+
bool hasQwen3Tok = !paths.qwen3TokenizerDir.empty();
|
|
363
|
+
c.hasQwen3Asr = !paths.qwen3ConvFrontend.empty() && hasWhisperEnc && hasWhisperDec && hasQwen3Tok;
|
|
364
|
+
c.hasWhisper = hasWhisperEnc && hasWhisperDec && paths.joiner.empty() && !c.hasQwen3Asr;
|
|
342
365
|
bool hasFunAsrTok = !paths.funasrTokenizerDir.empty();
|
|
343
366
|
c.hasFunAsrNano = !paths.funasrEncoderAdaptor.empty() && !paths.funasrLLM.empty() &&
|
|
344
367
|
!paths.funasrEmbedding.empty() && hasFunAsrTok;
|
|
@@ -378,6 +401,7 @@ static void CollectDetectedModels(
|
|
|
378
401
|
out.push_back({"paraformer", modelDir});
|
|
379
402
|
}
|
|
380
403
|
if (cap.hasWhisper) out.push_back({"whisper", modelDir});
|
|
404
|
+
if (cap.hasQwen3Asr) out.push_back({"qwen3_asr", modelDir});
|
|
381
405
|
if (cap.hasFunAsrNano) out.push_back({"funasr_nano", modelDir});
|
|
382
406
|
if (cap.hasMoonshine) out.push_back({"moonshine", modelDir});
|
|
383
407
|
if (cap.hasMoonshineV2) out.push_back({"moonshine_v2", modelDir});
|
|
@@ -439,6 +463,10 @@ static SttModelKind ResolveSttKind(
|
|
|
439
463
|
outError = "FunASR Nano model requested but required files not found in " + modelDir;
|
|
440
464
|
return SttModelKind::kUnknown;
|
|
441
465
|
}
|
|
466
|
+
if (selected == SttModelKind::kQwen3Asr && !cap.hasQwen3Asr) {
|
|
467
|
+
outError = "Qwen3-ASR model requested but conv_frontend/encoder/decoder/tokenizer not found in " + modelDir;
|
|
468
|
+
return SttModelKind::kUnknown;
|
|
469
|
+
}
|
|
442
470
|
if (selected == SttModelKind::kMoonshine && !cap.hasMoonshine) {
|
|
443
471
|
outError = "Moonshine v1 model requested but preprocess/encode/uncached_decode/cached_decode not found in " + modelDir;
|
|
444
472
|
return SttModelKind::kUnknown;
|
|
@@ -505,7 +533,9 @@ static SttModelKind ResolveSttKind(
|
|
|
505
533
|
if (!paths.paraformerModel.empty()) return SttModelKind::kParaformer;
|
|
506
534
|
if (cap.hasCanary) return SttModelKind::kCanary;
|
|
507
535
|
if (cap.hasFireRedAsr) return SttModelKind::kFireRedAsr;
|
|
536
|
+
if (cap.hasQwen3Asr && hints.isLikelyQwen3Asr) return SttModelKind::kQwen3Asr;
|
|
508
537
|
if (cap.hasWhisper) return SttModelKind::kWhisper;
|
|
538
|
+
if (cap.hasQwen3Asr) return SttModelKind::kQwen3Asr;
|
|
509
539
|
if (cap.hasFunAsrNano) return SttModelKind::kFunAsrNano;
|
|
510
540
|
if (cap.hasMoonshineV2) return SttModelKind::kMoonshineV2;
|
|
511
541
|
if (cap.hasDolphin) return SttModelKind::kDolphin;
|
|
@@ -551,6 +581,12 @@ static void ApplyPathsForSttKind(SttModelKind kind, const SttCandidatePaths& can
|
|
|
551
581
|
resultPaths.funasrEmbedding = candidate.funasrEmbedding;
|
|
552
582
|
resultPaths.funasrTokenizer = candidate.funasrTokenizerDir;
|
|
553
583
|
break;
|
|
584
|
+
case SttModelKind::kQwen3Asr:
|
|
585
|
+
resultPaths.qwen3ConvFrontend = candidate.qwen3ConvFrontend;
|
|
586
|
+
resultPaths.qwen3Encoder = candidate.encoder;
|
|
587
|
+
resultPaths.qwen3Decoder = candidate.decoder;
|
|
588
|
+
resultPaths.qwen3Tokenizer = candidate.qwen3TokenizerDir;
|
|
589
|
+
break;
|
|
554
590
|
case SttModelKind::kMoonshine:
|
|
555
591
|
resultPaths.moonshinePreprocessor = candidate.moonshinePreprocessor;
|
|
556
592
|
resultPaths.moonshineEncoder = candidate.moonshineEncoder;
|
|
@@ -624,13 +660,15 @@ SttDetectResult DetectSttModel(
|
|
|
624
660
|
EmptyOrPath(candidate.encoder), EmptyOrPath(candidate.decoder));
|
|
625
661
|
LOGI("DetectSttModel: funasr encoderAdaptor=%s llm=%s embedding=%s tokenizerDir=%s",
|
|
626
662
|
EmptyOrPath(candidate.funasrEncoderAdaptor), EmptyOrPath(candidate.funasrLLM), EmptyOrPath(candidate.funasrEmbedding), EmptyOrPath(candidate.funasrTokenizerDir));
|
|
627
|
-
LOGI("DetectSttModel:
|
|
663
|
+
LOGI("DetectSttModel: qwen3_asr conv=%s tokenizerDir=%s",
|
|
664
|
+
EmptyOrPath(candidate.qwen3ConvFrontend), EmptyOrPath(candidate.qwen3TokenizerDir));
|
|
665
|
+
LOGI("DetectSttModel: hasTransducer=%d hasWhisper=%d hasMoonshine=%d hasMoonshineV2=%d hasParaformer=%d hasFunAsrNano=%d hasQwen3Asr=%d hasDolphin=%d hasFireRedAsr=%d hasFireRedCtc=%d hasCanary=%d hasOmnilingual=%d hasMedAsr=%d hasTeleSpeechCtc=%d hasToneCtc=%d",
|
|
628
666
|
(int)cap.hasTransducer, (int)cap.hasWhisper, (int)cap.hasMoonshine, (int)cap.hasMoonshineV2,
|
|
629
|
-
(int)cap.hasParaformer, (int)cap.hasFunAsrNano, (int)cap.hasDolphin, (int)cap.hasFireRedAsr, (int)cap.hasFireRedCtc,
|
|
667
|
+
(int)cap.hasParaformer, (int)cap.hasFunAsrNano, (int)cap.hasQwen3Asr, (int)cap.hasDolphin, (int)cap.hasFireRedAsr, (int)cap.hasFireRedCtc,
|
|
630
668
|
(int)cap.hasCanary, (int)cap.hasOmnilingual, (int)cap.hasMedAsr, (int)cap.hasTeleSpeechCtc, (int)cap.hasToneCtc);
|
|
631
|
-
LOGI("DetectSttModel: hints isLikelyNemo=%d isLikelyTdt=%d isLikelyWenetCtc=%d isLikelySenseVoice=%d isLikelyFunAsrNano=%d isLikelyZipformer=%d isLikelyMoonshine=%d isLikelyDolphin=%d isLikelyFireRedAsr=%d isLikelyCanary=%d isLikelyOmnilingual=%d isLikelyMedAsr=%d isLikelyTeleSpeech=%d isLikelyToneCtc=%d isLikelyParaformer=%d isLikelyVad=%d isLikelyTdnn=%d",
|
|
669
|
+
LOGI("DetectSttModel: hints isLikelyNemo=%d isLikelyTdt=%d isLikelyWenetCtc=%d isLikelySenseVoice=%d isLikelyFunAsrNano=%d isLikelyQwen3Asr=%d isLikelyZipformer=%d isLikelyMoonshine=%d isLikelyDolphin=%d isLikelyFireRedAsr=%d isLikelyCanary=%d isLikelyOmnilingual=%d isLikelyMedAsr=%d isLikelyTeleSpeech=%d isLikelyToneCtc=%d isLikelyParaformer=%d isLikelyVad=%d isLikelyTdnn=%d",
|
|
632
670
|
(int)hints.isLikelyNemo, (int)hints.isLikelyTdt, (int)hints.isLikelyWenetCtc, (int)hints.isLikelySenseVoice,
|
|
633
|
-
(int)hints.isLikelyFunAsrNano, (int)hints.isLikelyZipformer, (int)hints.isLikelyMoonshine, (int)hints.isLikelyDolphin,
|
|
671
|
+
(int)hints.isLikelyFunAsrNano, (int)hints.isLikelyQwen3Asr, (int)hints.isLikelyZipformer, (int)hints.isLikelyMoonshine, (int)hints.isLikelyDolphin,
|
|
634
672
|
(int)hints.isLikelyFireRedAsr, (int)hints.isLikelyCanary, (int)hints.isLikelyOmnilingual, (int)hints.isLikelyMedAsr,
|
|
635
673
|
(int)hints.isLikelyTeleSpeech, (int)hints.isLikelyToneCtc, (int)hints.isLikelyParaformer, (int)hints.isLikelyVad, (int)hints.isLikelyTdnn);
|
|
636
674
|
}
|
|
@@ -653,7 +691,8 @@ SttDetectResult DetectSttModel(
|
|
|
653
691
|
}
|
|
654
692
|
|
|
655
693
|
LOGI("DetectSttModel: selected kind=%d (%s)", static_cast<int>(result.selectedKind), KindToName(result.selectedKind));
|
|
656
|
-
result.tokensRequired = (result.selectedKind != SttModelKind::kFunAsrNano
|
|
694
|
+
result.tokensRequired = (result.selectedKind != SttModelKind::kFunAsrNano &&
|
|
695
|
+
result.selectedKind != SttModelKind::kQwen3Asr);
|
|
657
696
|
ApplyPathsForSttKind(result.selectedKind, candidate, result.paths);
|
|
658
697
|
|
|
659
698
|
if (!candidate.tokens.empty() && FileExists(candidate.tokens)) {
|
|
@@ -711,6 +750,11 @@ SttDetectResult DetectSttModel(
|
|
|
711
750
|
EmptyOrPath(result.paths.funasrEncoderAdaptor), EmptyOrPath(result.paths.funasrLLM),
|
|
712
751
|
EmptyOrPath(result.paths.funasrEmbedding), EmptyOrPath(result.paths.funasrTokenizer));
|
|
713
752
|
break;
|
|
753
|
+
case SttModelKind::kQwen3Asr:
|
|
754
|
+
LOGI("DetectSttModel: paths set qwen3_asr conv=%s encoder=%s decoder=%s tokenizer=%s",
|
|
755
|
+
EmptyOrPath(result.paths.qwen3ConvFrontend), EmptyOrPath(result.paths.qwen3Encoder),
|
|
756
|
+
EmptyOrPath(result.paths.qwen3Decoder), EmptyOrPath(result.paths.qwen3Tokenizer));
|
|
757
|
+
break;
|
|
714
758
|
default:
|
|
715
759
|
break;
|
|
716
760
|
}
|
|
@@ -19,6 +19,7 @@ enum class SttModelKind {
|
|
|
19
19
|
kZipformerCtc,
|
|
20
20
|
kWhisper,
|
|
21
21
|
kFunAsrNano,
|
|
22
|
+
kQwen3Asr,
|
|
22
23
|
kFireRedAsr,
|
|
23
24
|
kMoonshine,
|
|
24
25
|
kMoonshineV2,
|
|
@@ -56,6 +57,11 @@ struct SttModelPaths {
|
|
|
56
57
|
std::string funasrLLM;
|
|
57
58
|
std::string funasrEmbedding;
|
|
58
59
|
std::string funasrTokenizer;
|
|
60
|
+
/** Qwen3-ASR: conv_frontend.onnx + encoder + decoder + tokenizer dir (vocab.json, merges.txt, tokenizer_config.json). */
|
|
61
|
+
std::string qwen3ConvFrontend;
|
|
62
|
+
std::string qwen3Encoder;
|
|
63
|
+
std::string qwen3Decoder;
|
|
64
|
+
std::string qwen3Tokenizer;
|
|
59
65
|
std::string moonshinePreprocessor;
|
|
60
66
|
std::string moonshineEncoder;
|
|
61
67
|
std::string moonshineUncachedDecoder;
|
|
@@ -85,6 +91,8 @@ struct SttCandidatePaths {
|
|
|
85
91
|
std::string funasrLLM;
|
|
86
92
|
std::string funasrEmbedding;
|
|
87
93
|
std::string funasrTokenizerDir;
|
|
94
|
+
std::string qwen3ConvFrontend;
|
|
95
|
+
std::string qwen3TokenizerDir;
|
|
88
96
|
std::string moonshinePreprocessor;
|
|
89
97
|
std::string moonshineEncoder;
|
|
90
98
|
std::string moonshineUncachedDecoder;
|
|
@@ -100,6 +108,7 @@ struct SttPathHints {
|
|
|
100
108
|
bool isLikelyWenetCtc = false;
|
|
101
109
|
bool isLikelySenseVoice = false;
|
|
102
110
|
bool isLikelyFunAsrNano = false;
|
|
111
|
+
bool isLikelyQwen3Asr = false;
|
|
103
112
|
bool isLikelyZipformer = false;
|
|
104
113
|
bool isLikelyMoonshine = false;
|
|
105
114
|
bool isLikelyDolphin = false;
|
|
@@ -124,6 +133,7 @@ struct SttCapabilities {
|
|
|
124
133
|
bool hasMoonshineV2 = false;
|
|
125
134
|
bool hasParaformer = false;
|
|
126
135
|
bool hasFunAsrNano = false;
|
|
136
|
+
bool hasQwen3Asr = false;
|
|
127
137
|
bool hasDolphin = false;
|
|
128
138
|
bool hasFireRedAsr = false;
|
|
129
139
|
/** True when dir name suggests Fire Red but only a single CTC/paraformer model (no encoder/decoder). Use zipformer_ctc. */
|
|
@@ -52,6 +52,13 @@ static const SttFieldRequirement kFunAsrNanoReqs[] = {
|
|
|
52
52
|
{"funasrTokenizer", &SttModelPaths::funasrTokenizer, true},
|
|
53
53
|
};
|
|
54
54
|
|
|
55
|
+
static const SttFieldRequirement kQwen3AsrReqs[] = {
|
|
56
|
+
{"qwen3ConvFrontend", &SttModelPaths::qwen3ConvFrontend, true},
|
|
57
|
+
{"qwen3Encoder", &SttModelPaths::qwen3Encoder, true},
|
|
58
|
+
{"qwen3Decoder", &SttModelPaths::qwen3Decoder, true},
|
|
59
|
+
{"qwen3Tokenizer", &SttModelPaths::qwen3Tokenizer, true},
|
|
60
|
+
};
|
|
61
|
+
|
|
55
62
|
static const SttFieldRequirement kMoonshineReqs[] = {
|
|
56
63
|
{"moonshinePreprocessor", &SttModelPaths::moonshinePreprocessor, true},
|
|
57
64
|
{"moonshineEncoder", &SttModelPaths::moonshineEncoder, true},
|
|
@@ -120,6 +127,9 @@ static const SttFieldRequirement* GetRequirements(SttModelKind kind, size_t& cou
|
|
|
120
127
|
case SttModelKind::kFunAsrNano:
|
|
121
128
|
count = std::size(kFunAsrNanoReqs);
|
|
122
129
|
return kFunAsrNanoReqs;
|
|
130
|
+
case SttModelKind::kQwen3Asr:
|
|
131
|
+
count = std::size(kQwen3AsrReqs);
|
|
132
|
+
return kQwen3AsrReqs;
|
|
123
133
|
case SttModelKind::kMoonshine:
|
|
124
134
|
count = std::size(kMoonshineReqs);
|
|
125
135
|
return kMoonshineReqs;
|
|
@@ -161,6 +171,7 @@ static const char* SttKindToName(SttModelKind k) {
|
|
|
161
171
|
case SttModelKind::kZipformerCtc: return "Zipformer CTC";
|
|
162
172
|
case SttModelKind::kWhisper: return "Whisper";
|
|
163
173
|
case SttModelKind::kFunAsrNano: return "FunASR Nano";
|
|
174
|
+
case SttModelKind::kQwen3Asr: return "Qwen3 ASR";
|
|
164
175
|
case SttModelKind::kFireRedAsr: return "Fire Red ASR";
|
|
165
176
|
case SttModelKind::kMoonshine: return "Moonshine";
|
|
166
177
|
case SttModelKind::kMoonshineV2: return "Moonshine v2";
|
|
@@ -83,6 +83,15 @@ struct SttFunAsrNanoOptions {
|
|
|
83
83
|
std::optional<std::string> hotwords;
|
|
84
84
|
};
|
|
85
85
|
|
|
86
|
+
/** Model-specific options: Qwen3 ASR (sherpa-onnx OfflineQwen3ASRModelConfig). */
|
|
87
|
+
struct SttQwen3AsrOptions {
|
|
88
|
+
std::optional<int32_t> max_total_len;
|
|
89
|
+
std::optional<int32_t> max_new_tokens;
|
|
90
|
+
std::optional<float> temperature;
|
|
91
|
+
std::optional<float> top_p;
|
|
92
|
+
std::optional<int32_t> seed;
|
|
93
|
+
};
|
|
94
|
+
|
|
86
95
|
/**
|
|
87
96
|
* Wrapper class for sherpa-onnx OfflineRecognizer (STT).
|
|
88
97
|
*/
|
|
@@ -106,7 +115,8 @@ public:
|
|
|
106
115
|
const SttWhisperOptions* whisperOpts = nullptr,
|
|
107
116
|
const SttSenseVoiceOptions* senseVoiceOpts = nullptr,
|
|
108
117
|
const SttCanaryOptions* canaryOpts = nullptr,
|
|
109
|
-
const SttFunAsrNanoOptions* funasrNanoOpts = nullptr
|
|
118
|
+
const SttFunAsrNanoOptions* funasrNanoOpts = nullptr,
|
|
119
|
+
const SttQwen3AsrOptions* qwen3AsrOpts = nullptr
|
|
110
120
|
);
|
|
111
121
|
|
|
112
122
|
SttRecognitionResult transcribeFile(const std::string& filePath);
|
|
@@ -138,7 +138,8 @@ SttInitializeResult SttWrapper::initialize(
|
|
|
138
138
|
const SttWhisperOptions* whisperOpts,
|
|
139
139
|
const SttSenseVoiceOptions* senseVoiceOpts,
|
|
140
140
|
const SttCanaryOptions* canaryOpts,
|
|
141
|
-
const SttFunAsrNanoOptions* funasrNanoOpts
|
|
141
|
+
const SttFunAsrNanoOptions* funasrNanoOpts,
|
|
142
|
+
const SttQwen3AsrOptions* qwen3AsrOpts
|
|
142
143
|
) {
|
|
143
144
|
SttInitializeResult result;
|
|
144
145
|
result.success = false;
|
|
@@ -197,6 +198,12 @@ SttInitializeResult SttWrapper::initialize(
|
|
|
197
198
|
config.model_config.funasr_nano.embedding = detect.paths.funasrEmbedding;
|
|
198
199
|
config.model_config.funasr_nano.tokenizer = detect.paths.funasrTokenizer;
|
|
199
200
|
break;
|
|
201
|
+
case SttModelKind::kQwen3Asr:
|
|
202
|
+
config.model_config.qwen3_asr.conv_frontend = detect.paths.qwen3ConvFrontend;
|
|
203
|
+
config.model_config.qwen3_asr.encoder = detect.paths.qwen3Encoder;
|
|
204
|
+
config.model_config.qwen3_asr.decoder = detect.paths.qwen3Decoder;
|
|
205
|
+
config.model_config.qwen3_asr.tokenizer = detect.paths.qwen3Tokenizer;
|
|
206
|
+
break;
|
|
200
207
|
case SttModelKind::kFireRedAsr:
|
|
201
208
|
config.model_config.fire_red_asr.encoder = detect.paths.fireRedEncoder;
|
|
202
209
|
config.model_config.fire_red_asr.decoder = detect.paths.fireRedDecoder;
|
|
@@ -290,6 +297,20 @@ SttInitializeResult SttWrapper::initialize(
|
|
|
290
297
|
config.model_config.funasr_nano.hotwords = *funasrNanoOpts->hotwords;
|
|
291
298
|
}
|
|
292
299
|
break;
|
|
300
|
+
case SttModelKind::kQwen3Asr:
|
|
301
|
+
if (qwen3AsrOpts) {
|
|
302
|
+
if (qwen3AsrOpts->max_total_len.has_value())
|
|
303
|
+
config.model_config.qwen3_asr.max_total_len = *qwen3AsrOpts->max_total_len;
|
|
304
|
+
if (qwen3AsrOpts->max_new_tokens.has_value())
|
|
305
|
+
config.model_config.qwen3_asr.max_new_tokens = *qwen3AsrOpts->max_new_tokens;
|
|
306
|
+
if (qwen3AsrOpts->temperature.has_value())
|
|
307
|
+
config.model_config.qwen3_asr.temperature = *qwen3AsrOpts->temperature;
|
|
308
|
+
if (qwen3AsrOpts->top_p.has_value())
|
|
309
|
+
config.model_config.qwen3_asr.top_p = *qwen3AsrOpts->top_p;
|
|
310
|
+
if (qwen3AsrOpts->seed.has_value())
|
|
311
|
+
config.model_config.qwen3_asr.seed = *qwen3AsrOpts->seed;
|
|
312
|
+
}
|
|
313
|
+
break;
|
|
293
314
|
default:
|
|
294
315
|
break;
|
|
295
316
|
}
|
|
@@ -329,9 +350,16 @@ SttInitializeResult SttWrapper::initialize(
|
|
|
329
350
|
}
|
|
330
351
|
(void)dither; // FeatureConfig in bundled cxx-api.h has no dither; reserve for future use
|
|
331
352
|
|
|
332
|
-
bool isWhisperModel =
|
|
353
|
+
bool isWhisperModel = detect.selectedKind == SttModelKind::kWhisper &&
|
|
354
|
+
!config.model_config.whisper.encoder.empty() && !config.model_config.whisper.decoder.empty();
|
|
333
355
|
if (isWhisperModel) {
|
|
334
356
|
LOGI("Initializing Whisper model with encoder: %s, decoder: %s", config.model_config.whisper.encoder.c_str(), config.model_config.whisper.decoder.c_str());
|
|
357
|
+
} else if (detect.selectedKind == SttModelKind::kQwen3Asr) {
|
|
358
|
+
LOGI("Initializing Qwen3 ASR: conv=%s encoder=%s decoder=%s tokenizer=%s",
|
|
359
|
+
config.model_config.qwen3_asr.conv_frontend.c_str(),
|
|
360
|
+
config.model_config.qwen3_asr.encoder.c_str(),
|
|
361
|
+
config.model_config.qwen3_asr.decoder.c_str(),
|
|
362
|
+
config.model_config.qwen3_asr.tokenizer.c_str());
|
|
335
363
|
} else {
|
|
336
364
|
LOGI("Initializing non-Whisper model");
|
|
337
365
|
}
|
|
@@ -97,6 +97,9 @@ TtsInitializeResult TtsWrapper::initialize(
|
|
|
97
97
|
config.model.vits.model = detect.paths.ttsModel;
|
|
98
98
|
config.model.vits.tokens = detect.paths.tokens;
|
|
99
99
|
config.model.vits.data_dir = detect.paths.dataDir;
|
|
100
|
+
if (!detect.paths.lexicon.empty()) {
|
|
101
|
+
config.model.vits.lexicon = detect.paths.lexicon;
|
|
102
|
+
}
|
|
100
103
|
if (noiseScale.has_value()) {
|
|
101
104
|
config.model.vits.noise_scale = *noiseScale;
|
|
102
105
|
}
|
|
@@ -177,6 +180,19 @@ TtsInitializeResult TtsWrapper::initialize(
|
|
|
177
180
|
return result;
|
|
178
181
|
}
|
|
179
182
|
|
|
183
|
+
// Prevent hard native aborts from sherpa-onnx when phonemization data is missing.
|
|
184
|
+
// Some VITS models require either espeak-ng-data or a lexicon. If both are missing,
|
|
185
|
+
// fail gracefully so JS/UI can display a recoverable error instead of crashing.
|
|
186
|
+
if (detect.selectedKind == TtsModelKind::kVits &&
|
|
187
|
+
detect.paths.dataDir.empty() &&
|
|
188
|
+
detect.paths.lexicon.empty()) {
|
|
189
|
+
result.error =
|
|
190
|
+
"TTS VITS init blocked: missing both espeak-ng-data and lexicon. "
|
|
191
|
+
"Please add espeak-ng-data to the model folder or provide a lexicon.";
|
|
192
|
+
LOGE("%s", result.error.c_str());
|
|
193
|
+
return result;
|
|
194
|
+
}
|
|
195
|
+
|
|
180
196
|
if (ruleFsts.has_value() && !ruleFsts->empty()) {
|
|
181
197
|
config.rule_fsts = *ruleFsts;
|
|
182
198
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeSherpaOnnx.ts"],"mappings":";;AAAA,SAASA,mBAAmB,QAA0B,cAAc;;AAEpE;;
|
|
1
|
+
{"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeSherpaOnnx.ts"],"mappings":";;AAAA,SAASA,mBAAmB,QAA0B,cAAc;;AAEpE;;AA0sBA,eAAeA,mBAAmB,CAACC,YAAY,CAAO,YAAY,CAAC","ignoreList":[]}
|
|
@@ -20,7 +20,10 @@ export async function runPostDownloadProcessing(options) {
|
|
|
20
20
|
onChecksumIssue,
|
|
21
21
|
deleteArchiveAfterExtract,
|
|
22
22
|
onProgress,
|
|
23
|
-
getDownloadedList
|
|
23
|
+
getDownloadedList,
|
|
24
|
+
showExtractionNotifications,
|
|
25
|
+
extractionNotificationTitle,
|
|
26
|
+
extractionNotificationText
|
|
24
27
|
} = options;
|
|
25
28
|
registerActivePostProcess(category, id);
|
|
26
29
|
try {
|
|
@@ -36,7 +39,10 @@ export async function runPostDownloadProcessing(options) {
|
|
|
36
39
|
onChecksumIssue,
|
|
37
40
|
deleteArchiveAfterExtract,
|
|
38
41
|
onProgress,
|
|
39
|
-
getDownloadedList
|
|
42
|
+
getDownloadedList,
|
|
43
|
+
showExtractionNotifications,
|
|
44
|
+
extractionNotificationTitle,
|
|
45
|
+
extractionNotificationText
|
|
40
46
|
});
|
|
41
47
|
} finally {
|
|
42
48
|
unregisterActivePostProcess(category, id);
|
|
@@ -55,7 +61,10 @@ async function runPostDownloadProcessingBody(options) {
|
|
|
55
61
|
onChecksumIssue,
|
|
56
62
|
deleteArchiveAfterExtract,
|
|
57
63
|
onProgress,
|
|
58
|
-
getDownloadedList
|
|
64
|
+
getDownloadedList,
|
|
65
|
+
showExtractionNotifications,
|
|
66
|
+
extractionNotificationTitle,
|
|
67
|
+
extractionNotificationText
|
|
59
68
|
} = options;
|
|
60
69
|
const isAborted = () => Boolean(signal?.aborted);
|
|
61
70
|
const abortError = new Error('Download aborted');
|
|
@@ -100,7 +109,11 @@ async function runPostDownloadProcessingBody(options) {
|
|
|
100
109
|
};
|
|
101
110
|
onProgress?.(progress);
|
|
102
111
|
emitDownloadProgress(category, id, progress);
|
|
103
|
-
}, signal
|
|
112
|
+
}, signal, {
|
|
113
|
+
showNotificationsEnabled: showExtractionNotifications !== false,
|
|
114
|
+
notificationTitle: extractionNotificationTitle,
|
|
115
|
+
notificationText: extractionNotificationText
|
|
116
|
+
});
|
|
104
117
|
}
|
|
105
118
|
if (model.sha256) {
|
|
106
119
|
const expectedSha = model.sha256.toLowerCase();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["exists","mkdir","writeFile","stat","unlink","getReadyMarkerPath","getManifestPath","getExtractionStatePath","validateChecksum","validateExtractedFiles","resolveActualModelDir","extractTarBz2","promptChecksumFallback","emitDownloadProgress","emitModelsListUpdated","registerActivePostProcess","unregisterActivePostProcess","runPostDownloadProcessing","options","category","id","model","downloadPath","modelDir","isArchive","statePath","signal","onChecksumIssue","deleteArchiveAfterExtract","onProgress","getDownloadedList","runPostDownloadProcessingBody","isAborted","Boolean","aborted","abortError","Error","name","extractResult","extractedTotalBytes","archiveStat","bytes","size","console","warn","statErr","message","includes","extractionStatePath","JSON","stringify","modelId","phase","startedAt","Date","toISOString","archivePath","evt","totalBytes","progress","bytesDownloaded","percent","sha256","expectedSha","toLowerCase","issue","nativeSha","expected","reason","checksumResult","success","error","keepFile","filesValidation","now","sizeOnDisk","s","downloadedAt","lastUsed","err","String","list","resolvedPath","localPath"],"sourceRoot":"../../../src","sources":["download/postDownloadProcessing.ts"],"mappings":";;AAAA,SACEA,MAAM,EACNC,KAAK,EACLC,SAAS,EACTC,IAAI,EACJC,MAAM,QACD,6BAA6B;AAQpC,SACEC,kBAAkB,EAClBC,eAAe,EACfC,sBAAsB,QACjB,YAAS;AAChB,SACEC,gBAAgB,EAChBC,sBAAsB,EACtBC,qBAAqB,QAChB,iBAAc;AACrB,SAASC,aAAa,QAAQ,gCAA6B;AAC3D,SAASC,sBAAsB,QAAQ,qBAAkB;AACzD,SAASC,oBAAoB,EAAEC,qBAAqB,QAAQ,qBAAkB;AAE9E,SACEC,yBAAyB,EACzBC,2BAA2B,QACtB,4BAAyB;
|
|
1
|
+
{"version":3,"names":["exists","mkdir","writeFile","stat","unlink","getReadyMarkerPath","getManifestPath","getExtractionStatePath","validateChecksum","validateExtractedFiles","resolveActualModelDir","extractTarBz2","promptChecksumFallback","emitDownloadProgress","emitModelsListUpdated","registerActivePostProcess","unregisterActivePostProcess","runPostDownloadProcessing","options","category","id","model","downloadPath","modelDir","isArchive","statePath","signal","onChecksumIssue","deleteArchiveAfterExtract","onProgress","getDownloadedList","showExtractionNotifications","extractionNotificationTitle","extractionNotificationText","runPostDownloadProcessingBody","isAborted","Boolean","aborted","abortError","Error","name","extractResult","extractedTotalBytes","archiveStat","bytes","size","console","warn","statErr","message","includes","extractionStatePath","JSON","stringify","modelId","phase","startedAt","Date","toISOString","archivePath","evt","totalBytes","progress","bytesDownloaded","percent","showNotificationsEnabled","notificationTitle","notificationText","sha256","expectedSha","toLowerCase","issue","nativeSha","expected","reason","checksumResult","success","error","keepFile","filesValidation","now","sizeOnDisk","s","downloadedAt","lastUsed","err","String","list","resolvedPath","localPath"],"sourceRoot":"../../../src","sources":["download/postDownloadProcessing.ts"],"mappings":"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","ignoreList":[]}
|