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.
Files changed (228) hide show
  1. package/LICENSE +1 -0
  2. package/README.md +92 -21
  3. package/SherpaOnnx.podspec +3 -0
  4. package/THIRD_PARTY_LICENSES/README.md +62 -0
  5. package/THIRD_PARTY_LICENSES/ffmpeg.txt +502 -0
  6. package/THIRD_PARTY_LICENSES/libarchive.txt +65 -0
  7. package/THIRD_PARTY_LICENSES/nvidia_omla.txt +181 -0
  8. package/THIRD_PARTY_LICENSES/onnxruntime.txt +21 -0
  9. package/THIRD_PARTY_LICENSES/opus.txt +44 -0
  10. package/THIRD_PARTY_LICENSES/sherpa-onnx.txt +201 -0
  11. package/THIRD_PARTY_LICENSES/shine.txt +482 -0
  12. package/THIRD_PARTY_LICENSES/zstd.txt +30 -0
  13. package/android/build.gradle +7 -3
  14. package/android/prebuilt-download.gradle +344 -152
  15. package/android/prebuilt-versions.gradle +1 -1
  16. package/android/src/main/assets/model_licenses/asr-models-license-status.csv +409 -0
  17. package/android/src/main/assets/model_licenses/qnn-asr-models-license-status.csv +695 -0
  18. package/android/src/main/assets/model_licenses/tts-models-license-status.csv +596 -0
  19. package/android/src/main/cpp/CMakeLists.txt +28 -10
  20. package/android/src/main/cpp/jni/archive/sherpa-onnx-archive-helper.cpp +2 -2
  21. package/android/src/main/cpp/jni/audio/sherpa-onnx-audio-convert-jni.cpp +268 -2
  22. package/android/src/main/cpp/jni/model_detect/sherpa-onnx-model-detect-tts.cpp +37 -6
  23. package/android/src/main/cpp/jni/model_detect/sherpa-onnx-model-detect.h +9 -1
  24. package/android/src/main/cpp/jni/model_detect/sherpa-onnx-tts-wrapper.cpp +7 -0
  25. package/android/src/main/cpp/jni/model_detect/sherpa-onnx-validate-tts.cpp +18 -2
  26. package/android/src/main/java/com/sherpaonnx/SherpaOnnxArchiveHelper.kt +40 -10
  27. package/android/src/main/java/com/sherpaonnx/SherpaOnnxModule.kt +99 -0
  28. package/android/src/main/java/com/sherpaonnx/SherpaOnnxOnlineSttHelper.kt +4 -1
  29. package/android/src/main/java/com/sherpaonnx/SherpaOnnxTtsHelper.kt +127 -97
  30. package/ios/Resources/model_licenses/asr-models-license-status.csv +409 -0
  31. package/ios/Resources/model_licenses/qnn-asr-models-license-status.csv +695 -0
  32. package/ios/Resources/model_licenses/tts-models-license-status.csv +596 -0
  33. package/ios/SherpaOnnx+OnlineSTT.mm +2 -0
  34. package/ios/SherpaOnnx+PcmLiveStream.mm +2 -29
  35. package/ios/SherpaOnnx+TTS.mm +179 -20
  36. package/ios/SherpaOnnx.mm +54 -0
  37. package/ios/SherpaOnnxAudioConvert.h +10 -0
  38. package/ios/SherpaOnnxAudioConvert.mm +257 -1
  39. package/ios/archive/sherpa-onnx-archive-helper.h +3 -0
  40. package/ios/archive/sherpa-onnx-archive-helper.mm +39 -6
  41. package/ios/model_detect/sherpa-onnx-model-detect-tts.mm +49 -6
  42. package/ios/model_detect/sherpa-onnx-model-detect.h +9 -1
  43. package/ios/model_detect/sherpa-onnx-validate-tts.mm +18 -2
  44. package/ios/online_stt/sherpa-onnx-online-stt-wrapper.h +1 -0
  45. package/ios/online_stt/sherpa-onnx-online-stt-wrapper.mm +4 -0
  46. package/ios/tts/sherpa-onnx-tts-wrapper.h +37 -0
  47. package/ios/tts/sherpa-onnx-tts-wrapper.mm +158 -3
  48. package/lib/module/NativeSherpaOnnx.js.map +1 -1
  49. package/lib/module/audio/index.js +8 -0
  50. package/lib/module/audio/index.js.map +1 -1
  51. package/lib/module/download/ModelDownloadManager.js +10 -929
  52. package/lib/module/download/ModelDownloadManager.js.map +1 -1
  53. package/lib/module/download/activeModelOperations.js +26 -0
  54. package/lib/module/download/activeModelOperations.js.map +1 -0
  55. package/lib/module/download/background-downloader-types.js +2 -0
  56. package/lib/module/download/background-downloader-types.js.map +1 -0
  57. package/lib/module/download/bulkPurge.js +72 -0
  58. package/lib/module/download/bulkPurge.js.map +1 -0
  59. package/lib/module/download/checksumPrompt.js +19 -0
  60. package/lib/module/download/checksumPrompt.js.map +1 -0
  61. package/lib/module/download/constants.js +7 -0
  62. package/lib/module/download/constants.js.map +1 -0
  63. package/lib/module/download/downloadEvents.js +35 -0
  64. package/lib/module/download/downloadEvents.js.map +1 -0
  65. package/lib/module/download/downloadTask.js +438 -0
  66. package/lib/module/download/downloadTask.js.map +1 -0
  67. package/lib/module/download/ensureModel.js +89 -0
  68. package/lib/module/download/ensureModel.js.map +1 -0
  69. package/lib/module/download/index.js +4 -4
  70. package/lib/module/download/index.js.map +1 -1
  71. package/lib/module/download/localModels.js +151 -0
  72. package/lib/module/download/localModels.js.map +1 -0
  73. package/lib/module/download/modelExtraction.js +174 -0
  74. package/lib/module/download/modelExtraction.js.map +1 -0
  75. package/lib/module/download/paths.js +98 -0
  76. package/lib/module/download/paths.js.map +1 -0
  77. package/lib/module/download/postDownloadProcessing.js +206 -0
  78. package/lib/module/download/postDownloadProcessing.js.map +1 -0
  79. package/lib/module/download/protectedModelKeys.js +31 -0
  80. package/lib/module/download/protectedModelKeys.js.map +1 -0
  81. package/lib/module/download/registry.js +268 -0
  82. package/lib/module/download/registry.js.map +1 -0
  83. package/lib/module/download/retry.js +59 -0
  84. package/lib/module/download/retry.js.map +1 -0
  85. package/lib/module/download/types.js +17 -0
  86. package/lib/module/download/types.js.map +1 -0
  87. package/lib/module/download/validation.js +101 -5
  88. package/lib/module/download/validation.js.map +1 -1
  89. package/lib/module/{download → extraction}/extractTarBz2.js +3 -1
  90. package/lib/module/extraction/extractTarBz2.js.map +1 -0
  91. package/lib/module/{download → extraction}/extractTarZst.js +3 -1
  92. package/lib/module/extraction/extractTarZst.js.map +1 -0
  93. package/lib/module/extraction/index.js +3 -4
  94. package/lib/module/extraction/index.js.map +1 -1
  95. package/lib/module/index.js +1 -1
  96. package/lib/module/index.js.map +1 -1
  97. package/lib/module/licenses.js +63 -0
  98. package/lib/module/licenses.js.map +1 -0
  99. package/lib/module/stt/index.js +16 -2
  100. package/lib/module/stt/index.js.map +1 -1
  101. package/lib/module/stt/streaming.js +2 -0
  102. package/lib/module/stt/streaming.js.map +1 -1
  103. package/lib/module/stt/streamingTypes.js.map +1 -1
  104. package/lib/module/stt/types.js.map +1 -1
  105. package/lib/module/tts/index.js +21 -3
  106. package/lib/module/tts/index.js.map +1 -1
  107. package/lib/module/tts/streaming.js +5 -1
  108. package/lib/module/tts/streaming.js.map +1 -1
  109. package/lib/module/tts/types.js +4 -1
  110. package/lib/module/tts/types.js.map +1 -1
  111. package/lib/module/utils.js +16 -1
  112. package/lib/module/utils.js.map +1 -1
  113. package/lib/typescript/src/NativeSherpaOnnx.d.ts +34 -6
  114. package/lib/typescript/src/NativeSherpaOnnx.d.ts.map +1 -1
  115. package/lib/typescript/src/audio/index.d.ts +10 -0
  116. package/lib/typescript/src/audio/index.d.ts.map +1 -1
  117. package/lib/typescript/src/download/ModelDownloadManager.d.ts +11 -108
  118. package/lib/typescript/src/download/ModelDownloadManager.d.ts.map +1 -1
  119. package/lib/typescript/src/download/activeModelOperations.d.ts +6 -0
  120. package/lib/typescript/src/download/activeModelOperations.d.ts.map +1 -0
  121. package/lib/typescript/src/download/background-downloader-types.d.ts +64 -0
  122. package/lib/typescript/src/download/background-downloader-types.d.ts.map +1 -0
  123. package/lib/typescript/src/download/bulkPurge.d.ts +14 -0
  124. package/lib/typescript/src/download/bulkPurge.d.ts.map +1 -0
  125. package/lib/typescript/src/download/checksumPrompt.d.ts +3 -0
  126. package/lib/typescript/src/download/checksumPrompt.d.ts.map +1 -0
  127. package/lib/typescript/src/download/constants.d.ts +5 -0
  128. package/lib/typescript/src/download/constants.d.ts.map +1 -0
  129. package/lib/typescript/src/download/downloadEvents.d.ts +6 -0
  130. package/lib/typescript/src/download/downloadEvents.d.ts.map +1 -0
  131. package/lib/typescript/src/download/downloadTask.d.ts +30 -0
  132. package/lib/typescript/src/download/downloadTask.d.ts.map +1 -0
  133. package/lib/typescript/src/download/ensureModel.d.ts +26 -0
  134. package/lib/typescript/src/download/ensureModel.d.ts.map +1 -0
  135. package/lib/typescript/src/download/index.d.ts +7 -7
  136. package/lib/typescript/src/download/index.d.ts.map +1 -1
  137. package/lib/typescript/src/download/localModels.d.ts +15 -0
  138. package/lib/typescript/src/download/localModels.d.ts.map +1 -0
  139. package/lib/typescript/src/download/modelExtraction.d.ts +36 -0
  140. package/lib/typescript/src/download/modelExtraction.d.ts.map +1 -0
  141. package/lib/typescript/src/download/paths.d.ts +28 -0
  142. package/lib/typescript/src/download/paths.d.ts.map +1 -0
  143. package/lib/typescript/src/download/postDownloadProcessing.d.ts +19 -0
  144. package/lib/typescript/src/download/postDownloadProcessing.d.ts.map +1 -0
  145. package/lib/typescript/src/download/protectedModelKeys.d.ts +6 -0
  146. package/lib/typescript/src/download/protectedModelKeys.d.ts.map +1 -0
  147. package/lib/typescript/src/download/registry.d.ts +14 -0
  148. package/lib/typescript/src/download/registry.d.ts.map +1 -0
  149. package/lib/typescript/src/download/retry.d.ts +15 -0
  150. package/lib/typescript/src/download/retry.d.ts.map +1 -0
  151. package/lib/typescript/src/download/types.d.ts +96 -0
  152. package/lib/typescript/src/download/types.d.ts.map +1 -0
  153. package/lib/typescript/src/download/validation.d.ts +19 -0
  154. package/lib/typescript/src/download/validation.d.ts.map +1 -1
  155. package/lib/typescript/src/extraction/extractTarBz2.d.ts.map +1 -0
  156. package/lib/typescript/src/extraction/extractTarZst.d.ts.map +1 -0
  157. package/lib/typescript/src/index.d.ts +1 -0
  158. package/lib/typescript/src/index.d.ts.map +1 -1
  159. package/lib/typescript/src/licenses.d.ts +10 -0
  160. package/lib/typescript/src/licenses.d.ts.map +1 -0
  161. package/lib/typescript/src/stt/index.d.ts +4 -1
  162. package/lib/typescript/src/stt/index.d.ts.map +1 -1
  163. package/lib/typescript/src/stt/streaming.d.ts.map +1 -1
  164. package/lib/typescript/src/stt/streamingTypes.d.ts +5 -0
  165. package/lib/typescript/src/stt/streamingTypes.d.ts.map +1 -1
  166. package/lib/typescript/src/stt/types.d.ts +3 -1
  167. package/lib/typescript/src/stt/types.d.ts.map +1 -1
  168. package/lib/typescript/src/tts/index.d.ts +4 -2
  169. package/lib/typescript/src/tts/index.d.ts.map +1 -1
  170. package/lib/typescript/src/tts/streaming.d.ts.map +1 -1
  171. package/lib/typescript/src/tts/types.d.ts +12 -6
  172. package/lib/typescript/src/tts/types.d.ts.map +1 -1
  173. package/lib/typescript/src/utils.d.ts +5 -0
  174. package/lib/typescript/src/utils.d.ts.map +1 -1
  175. package/package.json +6 -1
  176. package/scripts/{check-model-csvs.sh → ci/check-model-csvs.sh} +9 -2
  177. package/scripts/ci/collect_all_sherpa_model_streams.sh +101 -0
  178. package/scripts/ci/collect_one_sherpa_release_stream.sh +189 -0
  179. package/scripts/ci/sherpa_asr_model_release_streams.json +21 -0
  180. package/scripts/ci/sherpa_tts_model_release_streams.json +13 -0
  181. package/scripts/ci/update_model_license_csv.sh +765 -0
  182. package/scripts/setup-ios-framework.sh +14 -11
  183. package/scripts/update_commercial_use.js +73 -0
  184. package/src/NativeSherpaOnnx.ts +37 -6
  185. package/src/audio/index.ts +20 -0
  186. package/src/download/ModelDownloadManager.ts +57 -1343
  187. package/src/download/activeModelOperations.ts +38 -0
  188. package/src/download/background-downloader-types.ts +73 -0
  189. package/src/download/bulkPurge.ts +102 -0
  190. package/src/download/checksumPrompt.ts +25 -0
  191. package/src/download/constants.ts +5 -0
  192. package/src/download/downloadEvents.ts +55 -0
  193. package/src/download/downloadTask.ts +565 -0
  194. package/src/download/ensureModel.ts +124 -0
  195. package/src/download/index.ts +21 -4
  196. package/src/download/localModels.ts +234 -0
  197. package/src/download/modelExtraction.ts +244 -0
  198. package/src/download/paths.ts +134 -0
  199. package/src/download/postDownloadProcessing.ts +292 -0
  200. package/src/download/protectedModelKeys.ts +30 -0
  201. package/src/download/registry.ts +405 -0
  202. package/src/download/retry.ts +76 -0
  203. package/src/download/types.ts +120 -0
  204. package/src/download/validation.ts +114 -8
  205. package/src/{download → extraction}/extractTarBz2.ts +3 -1
  206. package/src/{download → extraction}/extractTarZst.ts +3 -1
  207. package/src/extraction/index.ts +3 -7
  208. package/src/index.tsx +1 -0
  209. package/src/licenses.ts +100 -0
  210. package/src/stt/index.ts +20 -2
  211. package/src/stt/streaming.ts +3 -0
  212. package/src/stt/streamingTypes.ts +5 -0
  213. package/src/stt/types.ts +3 -1
  214. package/src/tts/index.ts +33 -2
  215. package/src/tts/streaming.ts +12 -0
  216. package/src/tts/types.ts +15 -5
  217. package/src/utils.ts +22 -1
  218. package/third_party/sherpa-onnx-prebuilt/ANDROID_RELEASE_TAG +1 -1
  219. package/third_party/sherpa-onnx-prebuilt/IOS_RELEASE_TAG +1 -1
  220. package/android/src/main/cpp/jni/tts/sherpa-onnx-tts-zipvoice-jni.cpp +0 -301
  221. package/android/src/main/java/com/sherpaonnx/ZipvoiceTtsWrapper.kt +0 -187
  222. package/lib/module/download/extractTarBz2.js.map +0 -1
  223. package/lib/module/download/extractTarZst.js.map +0 -1
  224. package/lib/typescript/src/download/extractTarBz2.d.ts.map +0 -1
  225. package/lib/typescript/src/download/extractTarZst.d.ts.map +0 -1
  226. package/scripts/check-qnn-support.sh +0 -78
  227. /package/lib/typescript/src/{download → extraction}/extractTarBz2.d.ts +0 -0
  228. /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
- LOGE("TTS: Pocket model type is detected but not yet supported on iOS");
150
- return result;
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
- LOGE("TTS: Failed to create OfflineTts instance");
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;;AAgpBA,eAAeA,mBAAmB,CAACC,YAAY,CAAO,YAAY,CAAC","ignoreList":[]}
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":[]}