react-native-sherpa-onnx 0.3.6 → 0.3.8
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/LICENSE +1 -0
- package/README.md +92 -21
- package/SherpaOnnx.podspec +3 -0
- package/THIRD_PARTY_LICENSES/README.md +62 -0
- package/THIRD_PARTY_LICENSES/ffmpeg.txt +502 -0
- package/THIRD_PARTY_LICENSES/libarchive.txt +65 -0
- package/THIRD_PARTY_LICENSES/nvidia_omla.txt +181 -0
- package/THIRD_PARTY_LICENSES/onnxruntime.txt +21 -0
- package/THIRD_PARTY_LICENSES/opus.txt +44 -0
- package/THIRD_PARTY_LICENSES/sherpa-onnx.txt +201 -0
- package/THIRD_PARTY_LICENSES/shine.txt +482 -0
- package/THIRD_PARTY_LICENSES/zstd.txt +30 -0
- package/android/build.gradle +7 -3
- package/android/prebuilt-download.gradle +344 -152
- package/android/prebuilt-versions.gradle +1 -1
- package/android/src/main/assets/model_licenses/asr-models-license-status.csv +409 -0
- package/android/src/main/assets/model_licenses/qnn-asr-models-license-status.csv +695 -0
- package/android/src/main/assets/model_licenses/tts-models-license-status.csv +596 -0
- package/android/src/main/cpp/CMakeLists.txt +28 -10
- package/android/src/main/cpp/jni/archive/sherpa-onnx-archive-helper.cpp +2 -2
- package/android/src/main/cpp/jni/audio/sherpa-onnx-audio-convert-jni.cpp +268 -2
- package/android/src/main/cpp/jni/model_detect/sherpa-onnx-model-detect-tts.cpp +37 -6
- package/android/src/main/cpp/jni/model_detect/sherpa-onnx-model-detect.h +9 -1
- package/android/src/main/cpp/jni/model_detect/sherpa-onnx-tts-wrapper.cpp +7 -0
- package/android/src/main/cpp/jni/model_detect/sherpa-onnx-validate-tts.cpp +18 -2
- package/android/src/main/java/com/sherpaonnx/SherpaOnnxArchiveHelper.kt +40 -10
- package/android/src/main/java/com/sherpaonnx/SherpaOnnxModule.kt +99 -0
- package/android/src/main/java/com/sherpaonnx/SherpaOnnxOnlineSttHelper.kt +4 -1
- package/android/src/main/java/com/sherpaonnx/SherpaOnnxTtsHelper.kt +127 -97
- package/ios/Resources/model_licenses/asr-models-license-status.csv +409 -0
- package/ios/Resources/model_licenses/qnn-asr-models-license-status.csv +695 -0
- package/ios/Resources/model_licenses/tts-models-license-status.csv +596 -0
- package/ios/SherpaOnnx+OnlineSTT.mm +2 -0
- package/ios/SherpaOnnx+PcmLiveStream.mm +2 -29
- package/ios/SherpaOnnx+TTS.mm +179 -20
- package/ios/SherpaOnnx.mm +54 -0
- package/ios/SherpaOnnxAudioConvert.h +10 -0
- package/ios/SherpaOnnxAudioConvert.mm +257 -1
- package/ios/archive/sherpa-onnx-archive-helper.h +3 -0
- package/ios/archive/sherpa-onnx-archive-helper.mm +39 -6
- package/ios/model_detect/sherpa-onnx-model-detect-tts.mm +49 -6
- package/ios/model_detect/sherpa-onnx-model-detect.h +9 -1
- package/ios/model_detect/sherpa-onnx-validate-tts.mm +18 -2
- package/ios/online_stt/sherpa-onnx-online-stt-wrapper.h +1 -0
- package/ios/online_stt/sherpa-onnx-online-stt-wrapper.mm +4 -0
- package/ios/tts/sherpa-onnx-tts-wrapper.h +37 -0
- package/ios/tts/sherpa-onnx-tts-wrapper.mm +158 -3
- package/lib/module/NativeSherpaOnnx.js.map +1 -1
- package/lib/module/audio/index.js +8 -0
- package/lib/module/audio/index.js.map +1 -1
- package/lib/module/download/ModelDownloadManager.js +10 -929
- package/lib/module/download/ModelDownloadManager.js.map +1 -1
- package/lib/module/download/activeModelOperations.js +26 -0
- package/lib/module/download/activeModelOperations.js.map +1 -0
- package/lib/module/download/background-downloader-types.js +2 -0
- package/lib/module/download/background-downloader-types.js.map +1 -0
- package/lib/module/download/bulkPurge.js +72 -0
- package/lib/module/download/bulkPurge.js.map +1 -0
- package/lib/module/download/checksumPrompt.js +19 -0
- package/lib/module/download/checksumPrompt.js.map +1 -0
- package/lib/module/download/constants.js +7 -0
- package/lib/module/download/constants.js.map +1 -0
- package/lib/module/download/downloadEvents.js +35 -0
- package/lib/module/download/downloadEvents.js.map +1 -0
- package/lib/module/download/downloadTask.js +438 -0
- package/lib/module/download/downloadTask.js.map +1 -0
- package/lib/module/download/ensureModel.js +89 -0
- package/lib/module/download/ensureModel.js.map +1 -0
- package/lib/module/download/index.js +4 -4
- package/lib/module/download/index.js.map +1 -1
- package/lib/module/download/localModels.js +151 -0
- package/lib/module/download/localModels.js.map +1 -0
- package/lib/module/download/modelExtraction.js +174 -0
- package/lib/module/download/modelExtraction.js.map +1 -0
- package/lib/module/download/paths.js +98 -0
- package/lib/module/download/paths.js.map +1 -0
- package/lib/module/download/postDownloadProcessing.js +206 -0
- package/lib/module/download/postDownloadProcessing.js.map +1 -0
- package/lib/module/download/protectedModelKeys.js +31 -0
- package/lib/module/download/protectedModelKeys.js.map +1 -0
- package/lib/module/download/registry.js +268 -0
- package/lib/module/download/registry.js.map +1 -0
- package/lib/module/download/retry.js +59 -0
- package/lib/module/download/retry.js.map +1 -0
- package/lib/module/download/types.js +17 -0
- package/lib/module/download/types.js.map +1 -0
- package/lib/module/download/validation.js +101 -5
- package/lib/module/download/validation.js.map +1 -1
- package/lib/module/{download → extraction}/extractTarBz2.js +3 -1
- package/lib/module/extraction/extractTarBz2.js.map +1 -0
- package/lib/module/{download → extraction}/extractTarZst.js +3 -1
- package/lib/module/extraction/extractTarZst.js.map +1 -0
- package/lib/module/extraction/index.js +3 -4
- package/lib/module/extraction/index.js.map +1 -1
- package/lib/module/index.js +1 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/licenses.js +63 -0
- package/lib/module/licenses.js.map +1 -0
- package/lib/module/stt/index.js +16 -2
- package/lib/module/stt/index.js.map +1 -1
- package/lib/module/stt/streaming.js +2 -0
- package/lib/module/stt/streaming.js.map +1 -1
- package/lib/module/stt/streamingTypes.js.map +1 -1
- package/lib/module/stt/types.js.map +1 -1
- package/lib/module/tts/index.js +21 -3
- package/lib/module/tts/index.js.map +1 -1
- package/lib/module/tts/streaming.js +5 -1
- package/lib/module/tts/streaming.js.map +1 -1
- package/lib/module/tts/types.js +4 -1
- package/lib/module/tts/types.js.map +1 -1
- package/lib/module/utils.js +16 -1
- package/lib/module/utils.js.map +1 -1
- package/lib/typescript/src/NativeSherpaOnnx.d.ts +34 -6
- package/lib/typescript/src/NativeSherpaOnnx.d.ts.map +1 -1
- package/lib/typescript/src/audio/index.d.ts +10 -0
- package/lib/typescript/src/audio/index.d.ts.map +1 -1
- package/lib/typescript/src/download/ModelDownloadManager.d.ts +11 -108
- package/lib/typescript/src/download/ModelDownloadManager.d.ts.map +1 -1
- package/lib/typescript/src/download/activeModelOperations.d.ts +6 -0
- package/lib/typescript/src/download/activeModelOperations.d.ts.map +1 -0
- package/lib/typescript/src/download/background-downloader-types.d.ts +64 -0
- package/lib/typescript/src/download/background-downloader-types.d.ts.map +1 -0
- package/lib/typescript/src/download/bulkPurge.d.ts +14 -0
- package/lib/typescript/src/download/bulkPurge.d.ts.map +1 -0
- package/lib/typescript/src/download/checksumPrompt.d.ts +3 -0
- package/lib/typescript/src/download/checksumPrompt.d.ts.map +1 -0
- package/lib/typescript/src/download/constants.d.ts +5 -0
- package/lib/typescript/src/download/constants.d.ts.map +1 -0
- package/lib/typescript/src/download/downloadEvents.d.ts +6 -0
- package/lib/typescript/src/download/downloadEvents.d.ts.map +1 -0
- package/lib/typescript/src/download/downloadTask.d.ts +30 -0
- package/lib/typescript/src/download/downloadTask.d.ts.map +1 -0
- package/lib/typescript/src/download/ensureModel.d.ts +26 -0
- package/lib/typescript/src/download/ensureModel.d.ts.map +1 -0
- package/lib/typescript/src/download/index.d.ts +7 -7
- package/lib/typescript/src/download/index.d.ts.map +1 -1
- package/lib/typescript/src/download/localModels.d.ts +15 -0
- package/lib/typescript/src/download/localModels.d.ts.map +1 -0
- package/lib/typescript/src/download/modelExtraction.d.ts +36 -0
- package/lib/typescript/src/download/modelExtraction.d.ts.map +1 -0
- package/lib/typescript/src/download/paths.d.ts +28 -0
- package/lib/typescript/src/download/paths.d.ts.map +1 -0
- package/lib/typescript/src/download/postDownloadProcessing.d.ts +19 -0
- package/lib/typescript/src/download/postDownloadProcessing.d.ts.map +1 -0
- package/lib/typescript/src/download/protectedModelKeys.d.ts +6 -0
- package/lib/typescript/src/download/protectedModelKeys.d.ts.map +1 -0
- package/lib/typescript/src/download/registry.d.ts +14 -0
- package/lib/typescript/src/download/registry.d.ts.map +1 -0
- package/lib/typescript/src/download/retry.d.ts +15 -0
- package/lib/typescript/src/download/retry.d.ts.map +1 -0
- package/lib/typescript/src/download/types.d.ts +96 -0
- package/lib/typescript/src/download/types.d.ts.map +1 -0
- package/lib/typescript/src/download/validation.d.ts +19 -0
- package/lib/typescript/src/download/validation.d.ts.map +1 -1
- package/lib/typescript/src/extraction/extractTarBz2.d.ts.map +1 -0
- package/lib/typescript/src/extraction/extractTarZst.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +1 -0
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/licenses.d.ts +10 -0
- package/lib/typescript/src/licenses.d.ts.map +1 -0
- package/lib/typescript/src/stt/index.d.ts +4 -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/streamingTypes.d.ts +5 -0
- package/lib/typescript/src/stt/streamingTypes.d.ts.map +1 -1
- package/lib/typescript/src/stt/types.d.ts +3 -1
- package/lib/typescript/src/stt/types.d.ts.map +1 -1
- package/lib/typescript/src/tts/index.d.ts +4 -2
- package/lib/typescript/src/tts/index.d.ts.map +1 -1
- package/lib/typescript/src/tts/streaming.d.ts.map +1 -1
- package/lib/typescript/src/tts/types.d.ts +12 -6
- package/lib/typescript/src/tts/types.d.ts.map +1 -1
- package/lib/typescript/src/utils.d.ts +5 -0
- package/lib/typescript/src/utils.d.ts.map +1 -1
- package/package.json +6 -1
- package/scripts/{check-model-csvs.sh → ci/check-model-csvs.sh} +9 -2
- package/scripts/ci/collect_all_sherpa_model_streams.sh +101 -0
- package/scripts/ci/collect_one_sherpa_release_stream.sh +189 -0
- package/scripts/ci/sherpa_asr_model_release_streams.json +21 -0
- package/scripts/ci/sherpa_tts_model_release_streams.json +13 -0
- package/scripts/ci/update_model_license_csv.sh +765 -0
- package/scripts/setup-ios-framework.sh +14 -11
- package/scripts/update_commercial_use.js +73 -0
- package/src/NativeSherpaOnnx.ts +37 -6
- package/src/audio/index.ts +20 -0
- package/src/download/ModelDownloadManager.ts +57 -1343
- package/src/download/activeModelOperations.ts +38 -0
- package/src/download/background-downloader-types.ts +73 -0
- package/src/download/bulkPurge.ts +102 -0
- package/src/download/checksumPrompt.ts +25 -0
- package/src/download/constants.ts +5 -0
- package/src/download/downloadEvents.ts +55 -0
- package/src/download/downloadTask.ts +565 -0
- package/src/download/ensureModel.ts +124 -0
- package/src/download/index.ts +21 -4
- package/src/download/localModels.ts +234 -0
- package/src/download/modelExtraction.ts +244 -0
- package/src/download/paths.ts +134 -0
- package/src/download/postDownloadProcessing.ts +292 -0
- package/src/download/protectedModelKeys.ts +30 -0
- package/src/download/registry.ts +405 -0
- package/src/download/retry.ts +76 -0
- package/src/download/types.ts +120 -0
- package/src/download/validation.ts +114 -8
- package/src/{download → extraction}/extractTarBz2.ts +3 -1
- package/src/{download → extraction}/extractTarZst.ts +3 -1
- package/src/extraction/index.ts +3 -7
- package/src/index.tsx +1 -0
- package/src/licenses.ts +100 -0
- package/src/stt/index.ts +20 -2
- package/src/stt/streaming.ts +3 -0
- package/src/stt/streamingTypes.ts +5 -0
- package/src/stt/types.ts +3 -1
- package/src/tts/index.ts +33 -2
- package/src/tts/streaming.ts +12 -0
- package/src/tts/types.ts +15 -5
- package/src/utils.ts +22 -1
- package/third_party/sherpa-onnx-prebuilt/ANDROID_RELEASE_TAG +1 -1
- package/third_party/sherpa-onnx-prebuilt/IOS_RELEASE_TAG +1 -1
- package/android/src/main/cpp/jni/tts/sherpa-onnx-tts-zipvoice-jni.cpp +0 -301
- package/android/src/main/java/com/sherpaonnx/ZipvoiceTtsWrapper.kt +0 -187
- package/lib/module/download/extractTarBz2.js.map +0 -1
- package/lib/module/download/extractTarZst.js.map +0 -1
- package/lib/typescript/src/download/extractTarBz2.d.ts.map +0 -1
- package/lib/typescript/src/download/extractTarZst.d.ts.map +0 -1
- package/scripts/check-qnn-support.sh +0 -78
- /package/lib/typescript/src/{download → extraction}/extractTarBz2.d.ts +0 -0
- /package/lib/typescript/src/{download → extraction}/extractTarZst.d.ts +0 -0
|
@@ -2,21 +2,35 @@
|
|
|
2
2
|
#define SHERPA_ONNX_TTS_WRAPPER_H
|
|
3
3
|
|
|
4
4
|
#include "sherpa-onnx-common.h"
|
|
5
|
+
#include "sherpa-onnx-model-detect.h"
|
|
5
6
|
#include <cstdint>
|
|
6
7
|
#include <functional>
|
|
7
8
|
#include <memory>
|
|
8
9
|
#include <optional>
|
|
9
10
|
#include <string>
|
|
11
|
+
#include <unordered_map>
|
|
10
12
|
#include <vector>
|
|
11
13
|
|
|
12
14
|
namespace sherpaonnx {
|
|
13
15
|
|
|
16
|
+
/** Voice cloning / zero-shot options for Zipvoice and Pocket (matches JS referenceAudio + referenceSampleRate + optional fields). */
|
|
17
|
+
struct VoiceCloneOptions {
|
|
18
|
+
std::vector<float> reference_audio;
|
|
19
|
+
int32_t reference_sample_rate = 0;
|
|
20
|
+
std::string reference_text;
|
|
21
|
+
int32_t num_steps = 5;
|
|
22
|
+
float silence_scale = 0.2f;
|
|
23
|
+
std::unordered_map<std::string, std::string> extra;
|
|
24
|
+
};
|
|
25
|
+
|
|
14
26
|
/**
|
|
15
27
|
* Result of TTS initialization.
|
|
16
28
|
*/
|
|
17
29
|
struct TtsInitializeResult {
|
|
18
30
|
bool success;
|
|
19
31
|
std::vector<DetectedModel> detectedModels; // List of detected models with type and path
|
|
32
|
+
/** When success is false, optional error message (e.g. from DetectTtsModel or OfflineTts::Create). */
|
|
33
|
+
std::string error;
|
|
20
34
|
};
|
|
21
35
|
|
|
22
36
|
/**
|
|
@@ -59,6 +73,17 @@ public:
|
|
|
59
73
|
float speed = 1.0f
|
|
60
74
|
);
|
|
61
75
|
|
|
76
|
+
/**
|
|
77
|
+
* When cloning is set (non-empty reference_audio and reference_sample_rate > 0), calls
|
|
78
|
+
* OfflineTts::Generate(text, GenerationConfig). Otherwise same as generate(text, sid, speed).
|
|
79
|
+
*/
|
|
80
|
+
AudioResult generate(
|
|
81
|
+
const std::string& text,
|
|
82
|
+
int32_t sid,
|
|
83
|
+
float speed,
|
|
84
|
+
const std::optional<VoiceCloneOptions>& cloning
|
|
85
|
+
);
|
|
86
|
+
|
|
62
87
|
bool generateStream(
|
|
63
88
|
const std::string& text,
|
|
64
89
|
int32_t sid,
|
|
@@ -66,6 +91,15 @@ public:
|
|
|
66
91
|
const TtsStreamCallback& callback
|
|
67
92
|
);
|
|
68
93
|
|
|
94
|
+
/** Pocket: streaming with reference audio. Zipvoice + cloning is not supported (match Android). */
|
|
95
|
+
bool generateStream(
|
|
96
|
+
const std::string& text,
|
|
97
|
+
int32_t sid,
|
|
98
|
+
float speed,
|
|
99
|
+
const TtsStreamCallback& callback,
|
|
100
|
+
const std::optional<VoiceCloneOptions>& cloning
|
|
101
|
+
);
|
|
102
|
+
|
|
69
103
|
static bool saveToWavFile(
|
|
70
104
|
const std::vector<float>& samples,
|
|
71
105
|
int32_t sampleRate,
|
|
@@ -78,6 +112,9 @@ public:
|
|
|
78
112
|
|
|
79
113
|
bool isInitialized() const;
|
|
80
114
|
|
|
115
|
+
/** Model kind from last successful initialize() (for voice-cloning validation). */
|
|
116
|
+
TtsModelKind getModelKind() const;
|
|
117
|
+
|
|
81
118
|
void release();
|
|
82
119
|
|
|
83
120
|
private:
|
|
@@ -38,6 +38,7 @@ class TtsWrapper::Impl {
|
|
|
38
38
|
public:
|
|
39
39
|
bool initialized = false;
|
|
40
40
|
std::string modelDir;
|
|
41
|
+
TtsModelKind modelKind = TtsModelKind::kUnknown;
|
|
41
42
|
std::optional<sherpa_onnx::cxx::OfflineTts> tts;
|
|
42
43
|
};
|
|
43
44
|
|
|
@@ -86,6 +87,7 @@ TtsInitializeResult TtsWrapper::initialize(
|
|
|
86
87
|
|
|
87
88
|
auto detect = DetectTtsModel(modelDir, modelType);
|
|
88
89
|
if (!detect.ok) {
|
|
90
|
+
result.error = detect.error;
|
|
89
91
|
LOGE("%s", detect.error.c_str());
|
|
90
92
|
return result;
|
|
91
93
|
}
|
|
@@ -144,12 +146,33 @@ TtsInitializeResult TtsWrapper::initialize(
|
|
|
144
146
|
config.model.zipvoice.vocoder = detect.paths.vocoder;
|
|
145
147
|
config.model.zipvoice.tokens = detect.paths.tokens;
|
|
146
148
|
config.model.zipvoice.data_dir = detect.paths.dataDir;
|
|
149
|
+
if (!detect.paths.lexicon.empty()) {
|
|
150
|
+
config.model.zipvoice.lexicon = detect.paths.lexicon;
|
|
151
|
+
}
|
|
152
|
+
// Limit peak RAM (same idea as Android Zipvoice init).
|
|
153
|
+
config.model.num_threads = 1;
|
|
147
154
|
break;
|
|
148
155
|
case TtsModelKind::kPocket:
|
|
149
|
-
|
|
150
|
-
|
|
156
|
+
config.model.pocket.lm_flow = detect.paths.lmFlow;
|
|
157
|
+
config.model.pocket.lm_main = detect.paths.lmMain;
|
|
158
|
+
config.model.pocket.encoder = detect.paths.encoder;
|
|
159
|
+
config.model.pocket.decoder = detect.paths.decoder;
|
|
160
|
+
config.model.pocket.text_conditioner = detect.paths.textConditioner;
|
|
161
|
+
config.model.pocket.vocab_json = detect.paths.vocabJson;
|
|
162
|
+
config.model.pocket.token_scores_json = detect.paths.tokenScoresJson;
|
|
163
|
+
break;
|
|
164
|
+
case TtsModelKind::kSupertonic:
|
|
165
|
+
config.model.supertonic.duration_predictor = detect.paths.durationPredictor;
|
|
166
|
+
config.model.supertonic.text_encoder = detect.paths.textEncoder;
|
|
167
|
+
config.model.supertonic.vector_estimator = detect.paths.vectorEstimator;
|
|
168
|
+
config.model.supertonic.vocoder = detect.paths.vocoder;
|
|
169
|
+
config.model.supertonic.tts_json = detect.paths.ttsJson;
|
|
170
|
+
config.model.supertonic.unicode_indexer = detect.paths.unicodeIndexer;
|
|
171
|
+
config.model.supertonic.voice_style = detect.paths.voiceStyle;
|
|
172
|
+
break;
|
|
151
173
|
case TtsModelKind::kUnknown:
|
|
152
174
|
default:
|
|
175
|
+
result.error = "TTS: Unknown model type: " + modelType;
|
|
153
176
|
LOGE("TTS: Unknown model type: %s", modelType.c_str());
|
|
154
177
|
return result;
|
|
155
178
|
}
|
|
@@ -167,16 +190,35 @@ TtsInitializeResult TtsWrapper::initialize(
|
|
|
167
190
|
config.silence_scale = *silenceScale;
|
|
168
191
|
}
|
|
169
192
|
|
|
193
|
+
// Log paths passed to sherpa-onnx C++ API to diagnose /usr/share/espeak-ng-data fallback.
|
|
194
|
+
LOGI("TTS: modelDir=%s", modelDir.c_str());
|
|
195
|
+
switch (detect.selectedKind) {
|
|
196
|
+
case TtsModelKind::kVits:
|
|
197
|
+
LOGI("TTS: vits data_dir=%s (empty=%d)", detect.paths.dataDir.empty() ? "(empty)" : detect.paths.dataDir.c_str(), (int)detect.paths.dataDir.empty());
|
|
198
|
+
break;
|
|
199
|
+
case TtsModelKind::kMatcha:
|
|
200
|
+
LOGI("TTS: matcha data_dir=%s (empty=%d)", detect.paths.dataDir.empty() ? "(empty)" : detect.paths.dataDir.c_str(), (int)detect.paths.dataDir.empty());
|
|
201
|
+
break;
|
|
202
|
+
case TtsModelKind::kKokoro:
|
|
203
|
+
case TtsModelKind::kKitten:
|
|
204
|
+
case TtsModelKind::kZipvoice:
|
|
205
|
+
LOGI("TTS: data_dir=%s (empty=%d)", detect.paths.dataDir.empty() ? "(empty)" : detect.paths.dataDir.c_str(), (int)detect.paths.dataDir.empty());
|
|
206
|
+
break;
|
|
207
|
+
default:
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
170
210
|
LOGI("TTS: Creating OfflineTts instance...");
|
|
171
211
|
pImpl->tts = sherpa_onnx::cxx::OfflineTts::Create(config);
|
|
172
212
|
|
|
173
213
|
if (!pImpl->tts.has_value()) {
|
|
174
|
-
|
|
214
|
+
result.error = "TTS: Failed to create OfflineTts instance (e.g. missing espeak-ng data or invalid model)";
|
|
215
|
+
LOGE("%s", result.error.c_str());
|
|
175
216
|
return result;
|
|
176
217
|
}
|
|
177
218
|
|
|
178
219
|
pImpl->initialized = true;
|
|
179
220
|
pImpl->modelDir = modelDir;
|
|
221
|
+
pImpl->modelKind = detect.selectedKind;
|
|
180
222
|
|
|
181
223
|
LOGI("TTS: Initialization successful");
|
|
182
224
|
LOGI("TTS: Sample rate: %d Hz", pImpl->tts.value().SampleRate());
|
|
@@ -186,9 +228,11 @@ TtsInitializeResult TtsWrapper::initialize(
|
|
|
186
228
|
result.detectedModels = detect.detectedModels;
|
|
187
229
|
return result;
|
|
188
230
|
} catch (const std::exception& e) {
|
|
231
|
+
result.error = std::string("TTS init exception: ") + e.what();
|
|
189
232
|
LOGE("TTS: Exception during initialization: %s", e.what());
|
|
190
233
|
return result;
|
|
191
234
|
} catch (...) {
|
|
235
|
+
result.error = "TTS: Unknown exception during initialization";
|
|
192
236
|
LOGE("TTS: Unknown exception during initialization");
|
|
193
237
|
return result;
|
|
194
238
|
}
|
|
@@ -234,6 +278,55 @@ TtsWrapper::AudioResult TtsWrapper::generate(
|
|
|
234
278
|
}
|
|
235
279
|
}
|
|
236
280
|
|
|
281
|
+
TtsWrapper::AudioResult TtsWrapper::generate(
|
|
282
|
+
const std::string& text,
|
|
283
|
+
int32_t sid,
|
|
284
|
+
float speed,
|
|
285
|
+
const std::optional<VoiceCloneOptions>& cloning
|
|
286
|
+
) {
|
|
287
|
+
if (!cloning.has_value() || cloning->reference_audio.empty() ||
|
|
288
|
+
cloning->reference_sample_rate <= 0) {
|
|
289
|
+
return generate(text, sid, speed);
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
AudioResult result;
|
|
293
|
+
result.sampleRate = 0;
|
|
294
|
+
|
|
295
|
+
if (!pImpl->initialized || !pImpl->tts.has_value()) {
|
|
296
|
+
LOGE("TTS: Not initialized. Call initialize() first.");
|
|
297
|
+
return result;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
if (text.empty()) {
|
|
301
|
+
LOGE("TTS: Input text is empty");
|
|
302
|
+
return result;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
try {
|
|
306
|
+
sherpa_onnx::cxx::GenerationConfig gc;
|
|
307
|
+
gc.silence_scale = cloning->silence_scale;
|
|
308
|
+
gc.speed = speed;
|
|
309
|
+
gc.sid = sid;
|
|
310
|
+
gc.reference_audio = cloning->reference_audio;
|
|
311
|
+
gc.reference_sample_rate = cloning->reference_sample_rate;
|
|
312
|
+
gc.reference_text = cloning->reference_text;
|
|
313
|
+
gc.num_steps = cloning->num_steps;
|
|
314
|
+
gc.extra = cloning->extra;
|
|
315
|
+
|
|
316
|
+
auto audio = pImpl->tts.value().Generate(text, gc);
|
|
317
|
+
result.samples = std::move(audio.samples);
|
|
318
|
+
result.sampleRate = audio.sample_rate;
|
|
319
|
+
LOGI("TTS: Generated (voice clone) %zu samples at %d Hz", result.samples.size(), result.sampleRate);
|
|
320
|
+
return result;
|
|
321
|
+
} catch (const std::exception& e) {
|
|
322
|
+
LOGE("TTS: Exception during generation (clone): %s", e.what());
|
|
323
|
+
return result;
|
|
324
|
+
} catch (...) {
|
|
325
|
+
LOGE("TTS: Unknown exception during generation (clone)");
|
|
326
|
+
return result;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
|
|
237
330
|
bool TtsWrapper::generateStream(
|
|
238
331
|
const std::string& text,
|
|
239
332
|
int32_t sid,
|
|
@@ -279,6 +372,63 @@ bool TtsWrapper::generateStream(
|
|
|
279
372
|
}
|
|
280
373
|
}
|
|
281
374
|
|
|
375
|
+
bool TtsWrapper::generateStream(
|
|
376
|
+
const std::string& text,
|
|
377
|
+
int32_t sid,
|
|
378
|
+
float speed,
|
|
379
|
+
const TtsStreamCallback& callback,
|
|
380
|
+
const std::optional<VoiceCloneOptions>& cloning
|
|
381
|
+
) {
|
|
382
|
+
if (!cloning.has_value() || cloning->reference_audio.empty() ||
|
|
383
|
+
cloning->reference_sample_rate <= 0) {
|
|
384
|
+
return generateStream(text, sid, speed, callback);
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
if (!pImpl->initialized || !pImpl->tts.has_value()) {
|
|
388
|
+
LOGE("TTS: Not initialized. Call initialize() first.");
|
|
389
|
+
return false;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
if (text.empty()) {
|
|
393
|
+
LOGE("TTS: Input text is empty");
|
|
394
|
+
return false;
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
try {
|
|
398
|
+
auto callbackCopy = callback;
|
|
399
|
+
auto shim = [](const float *samples, int32_t numSamples, float progress, void *arg) -> int32_t {
|
|
400
|
+
auto *cb = reinterpret_cast<TtsStreamCallback*>(arg);
|
|
401
|
+
if (!cb || !(*cb)) return 0;
|
|
402
|
+
return (*cb)(samples, numSamples, progress);
|
|
403
|
+
};
|
|
404
|
+
|
|
405
|
+
sherpa_onnx::cxx::GenerationConfig gc;
|
|
406
|
+
gc.silence_scale = cloning->silence_scale;
|
|
407
|
+
gc.speed = speed;
|
|
408
|
+
gc.sid = sid;
|
|
409
|
+
gc.reference_audio = cloning->reference_audio;
|
|
410
|
+
gc.reference_sample_rate = cloning->reference_sample_rate;
|
|
411
|
+
gc.reference_text = cloning->reference_text;
|
|
412
|
+
gc.num_steps = cloning->num_steps;
|
|
413
|
+
gc.extra = cloning->extra;
|
|
414
|
+
|
|
415
|
+
pImpl->tts.value().Generate(
|
|
416
|
+
text,
|
|
417
|
+
gc,
|
|
418
|
+
callbackCopy ? shim : nullptr,
|
|
419
|
+
callbackCopy ? &callbackCopy : nullptr
|
|
420
|
+
);
|
|
421
|
+
|
|
422
|
+
return true;
|
|
423
|
+
} catch (const std::exception& e) {
|
|
424
|
+
LOGE("TTS: Exception during streaming generation (clone): %s", e.what());
|
|
425
|
+
return false;
|
|
426
|
+
} catch (...) {
|
|
427
|
+
LOGE("TTS: Unknown exception during streaming generation (clone)");
|
|
428
|
+
return false;
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
|
|
282
432
|
int32_t TtsWrapper::getSampleRate() const {
|
|
283
433
|
if (!pImpl->initialized || !pImpl->tts.has_value()) {
|
|
284
434
|
LOGE("TTS: Not initialized. Call initialize() first.");
|
|
@@ -304,10 +454,15 @@ void TtsWrapper::release() {
|
|
|
304
454
|
pImpl->tts.reset();
|
|
305
455
|
pImpl->initialized = false;
|
|
306
456
|
pImpl->modelDir.clear();
|
|
457
|
+
pImpl->modelKind = TtsModelKind::kUnknown;
|
|
307
458
|
LOGI("TTS: Resources released");
|
|
308
459
|
}
|
|
309
460
|
}
|
|
310
461
|
|
|
462
|
+
TtsModelKind TtsWrapper::getModelKind() const {
|
|
463
|
+
return pImpl->modelKind;
|
|
464
|
+
}
|
|
465
|
+
|
|
311
466
|
bool TtsWrapper::saveToWavFile(
|
|
312
467
|
const std::vector<float>& samples,
|
|
313
468
|
int32_t sampleRate,
|
|
@@ -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;;AA+qBA,eAAeA,mBAAmB,CAACC,YAAY,CAAO,YAAY,CAAC","ignoreList":[]}
|
|
@@ -73,4 +73,12 @@ export function convertAudioToFormat(inputPath, outputPath, format, outputSample
|
|
|
73
73
|
export function convertAudioToWav16k(inputPath, outputPath) {
|
|
74
74
|
return SherpaOnnx.convertAudioToWav16k(inputPath, outputPath);
|
|
75
75
|
}
|
|
76
|
+
/**
|
|
77
|
+
* Decode a supported audio file to mono float PCM in [-1, 1] plus sample rate.
|
|
78
|
+
* Same decode coverage as {@link convertAudioToFormat} (FFmpeg-backed on Android when not WAV).
|
|
79
|
+
* @param targetSampleRateHz - Resample to this rate when > 0; use native decoded rate when 0 or omitted.
|
|
80
|
+
*/
|
|
81
|
+
export function decodeAudioFileToFloatSamples(inputPath, targetSampleRateHz) {
|
|
82
|
+
return SherpaOnnx.decodeAudioFileToFloatSamples(inputPath, targetSampleRateHz ?? 0);
|
|
83
|
+
}
|
|
76
84
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Buffer","DeviceEventEmitter","SherpaOnnx","base64PcmToFloatArray","base64","bytes","from","view","DataView","buffer","byteOffset","byteLength","len","out","Float32Array","i","getInt16","createPcmLiveStream","options","sampleRate","channelCount","bufferSizeFrames","start","startPcmLiveStream","stop","stopPcmLiveStream","onData","callback","sub","addListener","event","base64Pcm","sr","samples","remove","onError","message","convertAudioToFormat","inputPath","outputPath","format","outputSampleRateHz","convertAudioToWav16k"],"sourceRoot":"../../../src","sources":["audio/index.ts"],"mappings":";;AAAA,SAASA,MAAM,QAAQ,QAAQ;AAC/B,SAASC,kBAAkB,QAAQ,cAAc;AACjD,OAAOC,UAAU,MAAM,wBAAqB;;AAE5C;AACA;AACA;AACA;AACA,SAASC,qBAAqBA,CAACC,MAAc,EAAgB;EAC3D,MAAMC,KAAK,GAAGL,MAAM,CAACM,IAAI,CAACF,MAAM,EAAE,QAAQ,CAAC;EAC3C,MAAMG,IAAI,GAAG,IAAIC,QAAQ,CAACH,KAAK,CAACI,MAAM,EAAEJ,KAAK,CAACK,UAAU,EAAEL,KAAK,CAACM,UAAU,CAAC;EAC3E,MAAMC,GAAG,GAAGP,KAAK,CAACM,UAAU,GAAG,CAAC;EAChC,MAAME,GAAG,GAAG,IAAIC,YAAY,CAACF,GAAG,CAAC;EACjC,KAAK,IAAIG,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGH,GAAG,EAAEG,CAAC,EAAE,EAAE;IAC5BF,GAAG,CAACE,CAAC,CAAC,GAAGR,IAAI,CAACS,QAAQ,CAACD,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,KAAK;EAC7C;EACA,OAAOF,GAAG;AACZ;AAiBA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASI,mBAAmBA,CACjCC,OAA8B,EACT;EACrB,MAAMC,UAAU,GAAGD,OAAO,EAAEC,UAAU,IAAI,KAAK;EAC/C,MAAMC,YAAY,GAAGF,OAAO,EAAEE,YAAY,IAAI,CAAC;EAC/C,MAAMC,gBAAgB,GAAGH,OAAO,EAAEG,gBAAgB,IAAI,CAAC;EAEvD,OAAO;IACLC,KAAK,EAAEA,CAAA,KACLpB,UAAU,CAACqB,kBAAkB,CAAC;MAC5BJ,UAAU;MACVC,YAAY;MACZC;IACF,CAAC,CAAC;IAEJG,IAAI,EAAEA,CAAA,KAAMtB,UAAU,CAACuB,iBAAiB,CAAC,CAAC;IAE1CC,MAAM,EAAGC,QAA6D,IAAK;MACzE,MAAMC,GAAG,GAAG3B,kBAAkB,CAAC4B,WAAW,CACxC,mBAAmB,EAClBC,KAAkD,IAAK;QACtD,MAAM1B,MAAM,GAAG0B,KAAK,EAAEC,SAAS,IAAI,EAAE;QACrC,MAAMC,EAAE,GAAGF,KAAK,EAAEX,UAAU,IAAIA,UAAU;QAC1C,IAAIf,MAAM,EAAE;UACV,MAAM6B,OAAO,GAAG9B,qBAAqB,CAACC,MAAM,CAAC;UAC7CuB,QAAQ,CAACM,OAAO,EAAED,EAAE,CAAC;QACvB;MACF,CACF,CAAC;MACD,OAAO,MAAMJ,GAAG,CAACM,MAAM,CAAC,CAAC;IAC3B,CAAC;IAEDC,OAAO,EAAGR,QAAmC,IAAK;MAChD,MAAMC,GAAG,GAAG3B,kBAAkB,CAAC4B,WAAW,CACxC,oBAAoB,EACnBC,KAA2B,IAAK;QAC/BH,QAAQ,CAACG,KAAK,EAAEM,OAAO,IAAI,eAAe,CAAC;MAC7C,CACF,CAAC;MACD,OAAO,MAAMR,GAAG,CAACM,MAAM,CAAC,CAAC;IAC3B;EACF,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASG,oBAAoBA,CAClCC,SAAiB,EACjBC,UAAkB,EAClBC,MAAc,EACdC,kBAA2B,EACZ;EACf,OAAOvC,UAAU,CAACmC,oBAAoB,CACpCC,SAAS,EACTC,UAAU,EACVC,MAAM,EACNC,kBAAkB,IAAI,CACxB,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASC,oBAAoBA,CAClCJ,SAAiB,EACjBC,UAAkB,EACH;EACf,OAAOrC,UAAU,CAACwC,oBAAoB,CAACJ,SAAS,EAAEC,UAAU,CAAC;AAC/D","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["Buffer","DeviceEventEmitter","SherpaOnnx","base64PcmToFloatArray","base64","bytes","from","view","DataView","buffer","byteOffset","byteLength","len","out","Float32Array","i","getInt16","createPcmLiveStream","options","sampleRate","channelCount","bufferSizeFrames","start","startPcmLiveStream","stop","stopPcmLiveStream","onData","callback","sub","addListener","event","base64Pcm","sr","samples","remove","onError","message","convertAudioToFormat","inputPath","outputPath","format","outputSampleRateHz","convertAudioToWav16k","decodeAudioFileToFloatSamples","targetSampleRateHz"],"sourceRoot":"../../../src","sources":["audio/index.ts"],"mappings":"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","ignoreList":[]}
|