react-native-sherpa-onnx 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/README.md +232 -236
  2. package/SherpaOnnx.podspec +68 -64
  3. package/android/build.gradle +182 -192
  4. package/android/codegen.gradle +57 -0
  5. package/android/prebuilt-download.gradle +428 -0
  6. package/android/prebuilt-versions.gradle +43 -0
  7. package/android/proguard-rules.pro +10 -0
  8. package/android/src/main/assets/testModels/add_mul_add.onnx +28 -0
  9. package/android/src/main/assets/testModels/nnapi_internal_uint8_support.onnx +0 -0
  10. package/android/src/main/assets/testModels/qnn_multi_ctx_embed.onnx +0 -0
  11. package/android/src/main/cpp/CMakeLists.txt +166 -129
  12. package/android/src/main/cpp/CMakePresets.json +54 -0
  13. package/android/src/main/cpp/crypto/sha256.cpp +174 -0
  14. package/android/src/main/cpp/crypto/sha256.h +16 -0
  15. package/android/src/main/cpp/jni/archive/sherpa-onnx-archive-helper.cpp +404 -0
  16. package/android/src/main/cpp/jni/archive/sherpa-onnx-archive-helper.h +56 -0
  17. package/android/src/main/cpp/jni/archive/sherpa-onnx-archive-jni.cpp +181 -0
  18. package/android/src/main/cpp/jni/audio/sherpa-onnx-audio-convert-jni.cpp +888 -0
  19. package/{ios → android/src/main/cpp/jni/model_detect}/sherpa-onnx-common.h +18 -18
  20. package/android/src/main/cpp/jni/model_detect/sherpa-onnx-detect-jni-common.cpp +86 -0
  21. package/android/src/main/cpp/jni/model_detect/sherpa-onnx-detect-jni-common.h +20 -0
  22. package/android/src/main/cpp/jni/model_detect/sherpa-onnx-model-detect-helper.cpp +423 -0
  23. package/android/src/main/cpp/jni/model_detect/sherpa-onnx-model-detect-helper.h +55 -0
  24. package/android/src/main/cpp/jni/model_detect/sherpa-onnx-model-detect-stt.cpp +399 -0
  25. package/android/src/main/cpp/jni/model_detect/sherpa-onnx-model-detect-tts.cpp +238 -0
  26. package/{ios → android/src/main/cpp/jni/model_detect}/sherpa-onnx-model-detect.h +122 -89
  27. package/android/src/main/cpp/jni/model_detect/sherpa-onnx-stt-wrapper.cpp +99 -0
  28. package/android/src/main/cpp/jni/model_detect/sherpa-onnx-stt-wrapper.h +16 -0
  29. package/android/src/main/cpp/jni/model_detect/sherpa-onnx-tts-wrapper.cpp +78 -0
  30. package/android/src/main/cpp/jni/model_detect/sherpa-onnx-tts-wrapper.h +16 -0
  31. package/android/src/main/cpp/jni/module/sherpa-onnx-module-jni.cpp +190 -0
  32. package/android/src/main/cpp/jni/tts/sherpa-onnx-tts-zipvoice-jni.cpp +301 -0
  33. package/android/src/main/java/com/sherpaonnx/SherpaOnnxArchiveHelper.kt +94 -0
  34. package/android/src/main/java/com/sherpaonnx/{SherpaOnnxCoreHelper.kt → SherpaOnnxAssetHelper.kt} +350 -236
  35. package/android/src/main/java/com/sherpaonnx/SherpaOnnxModule.kt +791 -483
  36. package/android/src/main/java/com/sherpaonnx/SherpaOnnxSttHelper.kt +699 -109
  37. package/android/src/main/java/com/sherpaonnx/SherpaOnnxTtsHelper.kt +1123 -668
  38. package/android/src/main/java/com/sherpaonnx/ZipvoiceTtsWrapper.kt +187 -0
  39. package/ios/SherpaOnnx+Assets.h +11 -0
  40. package/ios/SherpaOnnx+Assets.mm +325 -0
  41. package/ios/SherpaOnnx+STT.mm +455 -118
  42. package/ios/SherpaOnnx+TTS.mm +1101 -712
  43. package/ios/SherpaOnnx.h +17 -6
  44. package/ios/SherpaOnnx.mm +206 -311
  45. package/ios/SherpaOnnx.xcconfig +19 -19
  46. package/ios/SherpaOnnxCoreMLHelper.swift +24 -0
  47. package/ios/archive/sherpa-onnx-archive-helper.h +21 -0
  48. package/ios/archive/sherpa-onnx-archive-helper.mm +296 -0
  49. package/ios/libarchive_darwin_config.h +153 -0
  50. package/{android/src/main/cpp/jni → ios/model_detect}/sherpa-onnx-common.h +18 -18
  51. package/ios/model_detect/sherpa-onnx-model-detect-helper.h +49 -0
  52. package/ios/model_detect/sherpa-onnx-model-detect-helper.mm +210 -0
  53. package/ios/model_detect/sherpa-onnx-model-detect-stt.mm +344 -0
  54. package/ios/model_detect/sherpa-onnx-model-detect-tts.mm +201 -0
  55. package/{android/src/main/cpp/jni → ios/model_detect}/sherpa-onnx-model-detect.h +117 -89
  56. package/ios/scripts/patch-libarchive-includes.sh +61 -0
  57. package/ios/scripts/setup-ios-libarchive.sh +98 -0
  58. package/ios/stt/sherpa-onnx-stt-wrapper.h +129 -0
  59. package/ios/stt/sherpa-onnx-stt-wrapper.mm +523 -0
  60. package/ios/{sherpa-onnx-tts-wrapper.h → tts/sherpa-onnx-tts-wrapper.h} +90 -85
  61. package/ios/{sherpa-onnx-tts-wrapper.mm → tts/sherpa-onnx-tts-wrapper.mm} +376 -345
  62. package/lib/module/NativeSherpaOnnx.js +3 -0
  63. package/lib/module/NativeSherpaOnnx.js.map +1 -1
  64. package/lib/module/audio/index.js +22 -0
  65. package/lib/module/audio/index.js.map +1 -0
  66. package/lib/module/diarization/index.js +1 -1
  67. package/lib/module/diarization/index.js.map +1 -1
  68. package/lib/module/download/ModelDownloadManager.js +918 -0
  69. package/lib/module/download/ModelDownloadManager.js.map +1 -0
  70. package/lib/module/download/extractTarBz2.js +53 -0
  71. package/lib/module/download/extractTarBz2.js.map +1 -0
  72. package/lib/module/download/index.js +6 -0
  73. package/lib/module/download/index.js.map +1 -0
  74. package/lib/module/download/validation.js +178 -0
  75. package/lib/module/download/validation.js.map +1 -0
  76. package/lib/module/enhancement/index.js +1 -1
  77. package/lib/module/enhancement/index.js.map +1 -1
  78. package/lib/module/index.js +41 -3
  79. package/lib/module/index.js.map +1 -1
  80. package/lib/module/separation/index.js +1 -1
  81. package/lib/module/separation/index.js.map +1 -1
  82. package/lib/module/stt/index.js +127 -60
  83. package/lib/module/stt/index.js.map +1 -1
  84. package/lib/module/stt/sttModelLanguages.js +512 -0
  85. package/lib/module/stt/sttModelLanguages.js.map +1 -0
  86. package/lib/module/stt/types.js +53 -1
  87. package/lib/module/stt/types.js.map +1 -1
  88. package/lib/module/tts/index.js +216 -289
  89. package/lib/module/tts/index.js.map +1 -1
  90. package/lib/module/tts/types.js +86 -1
  91. package/lib/module/tts/types.js.map +1 -1
  92. package/lib/module/types.js.map +1 -1
  93. package/lib/module/utils.js +86 -73
  94. package/lib/module/utils.js.map +1 -1
  95. package/lib/module/vad/index.js +1 -1
  96. package/lib/module/vad/index.js.map +1 -1
  97. package/lib/typescript/src/NativeSherpaOnnx.d.ts +192 -38
  98. package/lib/typescript/src/NativeSherpaOnnx.d.ts.map +1 -1
  99. package/lib/typescript/src/audio/index.d.ts +13 -0
  100. package/lib/typescript/src/audio/index.d.ts.map +1 -0
  101. package/lib/typescript/src/diarization/index.d.ts +3 -2
  102. package/lib/typescript/src/diarization/index.d.ts.map +1 -1
  103. package/lib/typescript/src/download/ModelDownloadManager.d.ts +108 -0
  104. package/lib/typescript/src/download/ModelDownloadManager.d.ts.map +1 -0
  105. package/lib/typescript/src/download/extractTarBz2.d.ts +14 -0
  106. package/lib/typescript/src/download/extractTarBz2.d.ts.map +1 -0
  107. package/lib/typescript/src/download/index.d.ts +7 -0
  108. package/lib/typescript/src/download/index.d.ts.map +1 -0
  109. package/lib/typescript/src/download/validation.d.ts +57 -0
  110. package/lib/typescript/src/download/validation.d.ts.map +1 -0
  111. package/lib/typescript/src/enhancement/index.d.ts +3 -2
  112. package/lib/typescript/src/enhancement/index.d.ts.map +1 -1
  113. package/lib/typescript/src/index.d.ts +26 -2
  114. package/lib/typescript/src/index.d.ts.map +1 -1
  115. package/lib/typescript/src/separation/index.d.ts +3 -2
  116. package/lib/typescript/src/separation/index.d.ts.map +1 -1
  117. package/lib/typescript/src/stt/index.d.ts +31 -43
  118. package/lib/typescript/src/stt/index.d.ts.map +1 -1
  119. package/lib/typescript/src/stt/sttModelLanguages.d.ts +52 -0
  120. package/lib/typescript/src/stt/sttModelLanguages.d.ts.map +1 -0
  121. package/lib/typescript/src/stt/types.d.ts +196 -9
  122. package/lib/typescript/src/stt/types.d.ts.map +1 -1
  123. package/lib/typescript/src/tts/index.d.ts +25 -211
  124. package/lib/typescript/src/tts/index.d.ts.map +1 -1
  125. package/lib/typescript/src/tts/types.d.ts +148 -25
  126. package/lib/typescript/src/tts/types.d.ts.map +1 -1
  127. package/lib/typescript/src/types.d.ts +0 -32
  128. package/lib/typescript/src/types.d.ts.map +1 -1
  129. package/lib/typescript/src/utils.d.ts +28 -13
  130. package/lib/typescript/src/utils.d.ts.map +1 -1
  131. package/lib/typescript/src/vad/index.d.ts +3 -2
  132. package/lib/typescript/src/vad/index.d.ts.map +1 -1
  133. package/package.json +250 -222
  134. package/scripts/check-qnn-support.sh +78 -0
  135. package/scripts/setup-ios-framework.sh +379 -282
  136. package/src/NativeSherpaOnnx.ts +474 -251
  137. package/src/audio/index.ts +32 -0
  138. package/src/diarization/index.ts +4 -2
  139. package/src/download/ModelDownloadManager.ts +1325 -0
  140. package/src/download/extractTarBz2.ts +78 -0
  141. package/src/download/index.ts +43 -0
  142. package/src/download/validation.ts +279 -0
  143. package/src/enhancement/index.ts +4 -2
  144. package/src/index.tsx +78 -27
  145. package/src/separation/index.ts +4 -2
  146. package/src/stt/index.ts +249 -89
  147. package/src/stt/sttModelLanguages.ts +237 -0
  148. package/src/stt/types.ts +263 -9
  149. package/src/tts/index.ts +470 -458
  150. package/src/tts/types.ts +373 -218
  151. package/src/types.ts +0 -44
  152. package/src/utils.ts +145 -131
  153. package/src/vad/index.ts +4 -2
  154. package/third_party/ffmpeg_prebuilt/ANDROID_RELEASE_TAG +1 -0
  155. package/third_party/libarchive_prebuilt/ANDROID_RELEASE_TAG +1 -0
  156. package/third_party/libarchive_prebuilt/IOS_RELEASE_TAG +1 -0
  157. package/third_party/sherpa-onnx-prebuilt/ANDROID_RELEASE_TAG +1 -0
  158. package/third_party/sherpa-onnx-prebuilt/IOS_RELEASE_TAG +1 -0
  159. package/android/src/main/cpp/include/sherpa-onnx/c-api/c-api.h +0 -1918
  160. package/android/src/main/cpp/include/sherpa-onnx/c-api/cxx-api.h +0 -841
  161. package/android/src/main/cpp/jni/sherpa-onnx-model-detect.cpp +0 -541
  162. package/android/src/main/cpp/jni/sherpa-onnx-stt-jni.cpp +0 -336
  163. package/android/src/main/cpp/jni/sherpa-onnx-stt-wrapper.cpp +0 -222
  164. package/android/src/main/cpp/jni/sherpa-onnx-stt-wrapper.h +0 -68
  165. package/android/src/main/cpp/jni/sherpa-onnx-tts-jni.cpp +0 -823
  166. package/android/src/main/cpp/jni/sherpa-onnx-tts-wrapper.cpp +0 -387
  167. package/android/src/main/cpp/jni/sherpa-onnx-tts-wrapper.h +0 -147
  168. package/ios/Frameworks/sherpa_onnx.xcframework.zip +0 -0
  169. package/ios/include/sherpa-onnx/c-api/c-api.h +0 -1918
  170. package/ios/include/sherpa-onnx/c-api/cxx-api.h +0 -841
  171. package/ios/sherpa-onnx-model-detect.mm +0 -441
  172. package/ios/sherpa-onnx-stt-wrapper.h +0 -48
  173. package/ios/sherpa-onnx-stt-wrapper.mm +0 -201
  174. package/scripts/copy-headers.js +0 -184
  175. package/scripts/setup-assets.js +0 -323
@@ -1,129 +1,166 @@
1
- cmake_minimum_required(VERSION 3.22.1)
2
-
3
- project("sherpaonnx")
4
-
5
- # Set C++ standard
6
- set(CMAKE_CXX_STANDARD 17)
7
- set(CMAKE_CXX_STANDARD_REQUIRED ON)
8
-
9
- # Android specific settings
10
- set(CMAKE_ANDROID_ARCH_ABI ${ANDROID_ABI})
11
- set(CMAKE_SYSTEM_NAME Android)
12
- set(CMAKE_SYSTEM_VERSION ${ANDROID_PLATFORM_LEVEL})
13
-
14
- # Set Windows path length limit
15
- if(WIN32)
16
- set(CMAKE_OBJECT_PATH_MAX 500)
17
- endif()
18
-
19
- # Calculate path relative to project root: android/src/main/cpp -> android -> project root
20
- get_filename_component(PROJECT_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/../../.." ABSOLUTE)
21
-
22
- # Fixed location where Gradle extracts native libraries
23
- set(EXTRACTED_LIBS_DIR "${PROJECT_ROOT}/build/extracted_native_libs/jni/${ANDROID_ABI}")
24
-
25
- # Try to find library directly by path (most reliable)
26
- set(SHERPA_ONNX_LIB_CXX "${EXTRACTED_LIBS_DIR}/libsherpa-onnx-cxx-api.so")
27
- set(SHERPA_ONNX_LIB_C "${EXTRACTED_LIBS_DIR}/libsherpa-onnx-c-api.so")
28
-
29
- if(EXISTS "${SHERPA_ONNX_LIB_CXX}")
30
- set(SHERPA_ONNX_LIB "${SHERPA_ONNX_LIB_CXX}")
31
- message(STATUS "Found sherpa-onnx library (cxx-api): ${SHERPA_ONNX_LIB}")
32
- elseif(EXISTS "${SHERPA_ONNX_LIB_C}")
33
- set(SHERPA_ONNX_LIB "${SHERPA_ONNX_LIB_C}")
34
- message(STATUS "Found sherpa-onnx library (c-api): ${SHERPA_ONNX_LIB}")
35
- else()
36
- # Fallback: use find_library
37
- find_library(SHERPA_ONNX_LIB
38
- NAMES sherpa-onnx-cxx-api libsherpa-onnx-cxx-api sherpa-onnx-c-api libsherpa-onnx-c-api
39
- PATHS ${EXTRACTED_LIBS_DIR}
40
- NO_DEFAULT_PATH
41
- )
42
-
43
- if(NOT SHERPA_ONNX_LIB)
44
- message(FATAL_ERROR "sherpa-onnx library not found in ${EXTRACTED_LIBS_DIR}\n"
45
- "Expected files:\n"
46
- " - ${SHERPA_ONNX_LIB_CXX}\n"
47
- " - ${SHERPA_ONNX_LIB_C}\n"
48
- "Please ensure extractNativeLibs task ran successfully.")
49
- endif()
50
- endif()
51
-
52
- # Source files
53
- set(SOURCES
54
- jni/sherpa-onnx-stt-jni.cpp
55
- jni/sherpa-onnx-tts-jni.cpp
56
- jni/sherpa-onnx-model-detect.cpp
57
- jni/sherpa-onnx-stt-wrapper.cpp
58
- jni/sherpa-onnx-tts-wrapper.cpp
59
- )
60
-
61
- # Create shared library
62
- add_library(sherpaonnx SHARED
63
- ${SOURCES}
64
- )
65
-
66
- # Try to find sherpa-onnx headers
67
- # Priority order:
68
- # 1. Local include directory (bundled in npm package) - preferred for published packages
69
- # 2. Git submodule (for local development)
70
- # The headers use "sherpa-onnx/c-api/..." includes, so we need to add
71
- # the directory that contains "sherpa-onnx" as a subdirectory
72
- set(SHERPA_ONNX_INCLUDE_DIRS "")
73
- set(POSSIBLE_BASE_PATHS
74
- "${CMAKE_CURRENT_SOURCE_DIR}/include" # Bundled headers in npm package
75
- "${PROJECT_ROOT}/android/src/main/cpp/include" # Alternative path for bundled headers
76
- "${PROJECT_ROOT}/sherpa-onnx" # Git submodule (for local development)
77
- "${CMAKE_CURRENT_SOURCE_DIR}/../../../../sherpa-onnx" # Alternative submodule path
78
- )
79
-
80
- set(HEADER_SOURCE_TYPE "")
81
- foreach(BASE_PATH ${POSSIBLE_BASE_PATHS})
82
- if(EXISTS "${BASE_PATH}/sherpa-onnx/c-api/cxx-api.h")
83
- list(APPEND SHERPA_ONNX_INCLUDE_DIRS "${BASE_PATH}")
84
-
85
- # Determine header source type for logging
86
- if("${BASE_PATH}" MATCHES "include")
87
- set(HEADER_SOURCE_TYPE "bundled (npm package)")
88
- else()
89
- set(HEADER_SOURCE_TYPE "git submodule")
90
- endif()
91
-
92
- message(STATUS "Found sherpa-onnx headers from ${HEADER_SOURCE_TYPE} at: ${BASE_PATH}")
93
- # Also output as regular message to ensure visibility in Gradle logs
94
- message("-- Using sherpa-onnx headers from: ${HEADER_SOURCE_TYPE}")
95
- break() # Found it, no need to check other paths
96
- endif()
97
- endforeach()
98
-
99
- if(SHERPA_ONNX_INCLUDE_DIRS STREQUAL "")
100
- message(FATAL_ERROR "sherpa-onnx headers not found.\n"
101
- "Please ensure:\n"
102
- " 1. Headers are copied by running: yarn copy-headers\n"
103
- " 2. Or git submodule is initialized: git submodule update --init --recursive")
104
- endif()
105
-
106
- # Include directories (must be after add_library)
107
- target_include_directories(sherpaonnx PRIVATE
108
- ${CMAKE_CURRENT_SOURCE_DIR}
109
- ${CMAKE_CURRENT_SOURCE_DIR}/jni
110
- ${SHERPA_ONNX_INCLUDE_DIRS}
111
- )
112
-
113
- # Also link onnxruntime (required dependency)
114
- set(ONNXRUNTIME_LIB "${EXTRACTED_LIBS_DIR}/libonnxruntime.so")
115
-
116
- # Link libraries
117
- target_link_libraries(sherpaonnx
118
- ${SHERPA_ONNX_LIB}
119
- ${ONNXRUNTIME_LIB}
120
- log
121
- android
122
- )
123
-
124
- # Compiler flags
125
- target_compile_options(sherpaonnx PRIVATE
126
- -Wall
127
- -Wextra
128
- -fvisibility=hidden
129
- )
1
+ cmake_minimum_required(VERSION 3.22.1)
2
+
3
+ project("sherpaonnx")
4
+
5
+ # Set C++ standard
6
+ set(CMAKE_CXX_STANDARD 17)
7
+ set(CMAKE_CXX_STANDARD_REQUIRED ON)
8
+
9
+ # ANDROID_ABI MUST be set by Gradle - it should never be empty
10
+ if(NOT ANDROID_ABI)
11
+ message(FATAL_ERROR "ANDROID_ABI not set. This is a normal error.\n\n"
12
+ "How to fix:\n"
13
+ " 1. Use: cd example && yarn android\n"
14
+ " (This runs Gradle which sets ANDROID_ABI)\n\n"
15
+ " 2. Or if building manually with CMake, specify:\n"
16
+ " cmake -B build -DANDROID_ABI=arm64-v8a -DANDROID_PLATFORM=android-24 ...\n\n"
17
+ "Supported ABIs: arm64-v8a, armeabi-v7a, x86, x86_64")
18
+ endif()
19
+
20
+ # Set Windows path length limit
21
+ if(WIN32)
22
+ set(CMAKE_OBJECT_PATH_MAX 500)
23
+ endif()
24
+
25
+ # Calculate path relative to project root: android/src/main/cpp -> android -> project root
26
+ get_filename_component(PROJECT_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/../../.." ABSOLUTE)
27
+
28
+ # FFmpeg: libs and headers from (1) third_party/ffmpeg_prebuilt/android (local build) or (2) jniLibs + cpp/include/ffmpeg (GitHub release zip).
29
+ # PROJECT_ROOT = android/; repo root = PROJECT_ROOT/..
30
+ set(FFMPEG_PREBUILT_BASE "${PROJECT_ROOT}/../third_party/ffmpeg_prebuilt/android")
31
+ set(FFMPEG_PREBUILT_LIB "${FFMPEG_PREBUILT_BASE}/${ANDROID_ABI}/lib")
32
+ set(FFMPEG_JNILIBS "${PROJECT_ROOT}/src/main/jniLibs/${ANDROID_ABI}")
33
+ set(FFMPEG_INCLUDE_CPP "${PROJECT_ROOT}/src/main/cpp/include/ffmpeg")
34
+ if(EXISTS "${FFMPEG_PREBUILT_BASE}/include")
35
+ set(FFMPEG_INCLUDE_DIR "${FFMPEG_PREBUILT_BASE}/include")
36
+ message(STATUS "FFmpeg headers: prebuilts ${FFMPEG_INCLUDE_DIR}")
37
+ elseif(EXISTS "${FFMPEG_INCLUDE_CPP}")
38
+ set(FFMPEG_INCLUDE_DIR "${FFMPEG_INCLUDE_CPP}")
39
+ message(STATUS "FFmpeg headers: jniLibs/release ${FFMPEG_INCLUDE_DIR}")
40
+ else()
41
+ message(FATAL_ERROR "FFmpeg headers missing. Either:\n"
42
+ " - Build: cd third_party/ffmpeg_prebuilt && ./build_ffmpeg.sh (creates android/include)\n"
43
+ " - Or use a release that includes include/ (Gradle extracts to ${FFMPEG_INCLUDE_CPP})")
44
+ endif()
45
+ if(EXISTS "${FFMPEG_PREBUILT_LIB}/libavcodec.so")
46
+ set(FFMPEG_LIB_DIR "${FFMPEG_PREBUILT_LIB}")
47
+ message(STATUS "FFmpeg libs: prebuilts ${FFMPEG_LIB_DIR}")
48
+ elseif(EXISTS "${FFMPEG_JNILIBS}/libavcodec.so")
49
+ set(FFMPEG_LIB_DIR "${FFMPEG_JNILIBS}")
50
+ message(STATUS "FFmpeg libs: jniLibs ${FFMPEG_LIB_DIR}")
51
+ else()
52
+ message(FATAL_ERROR "FFmpeg libs missing for ABI ${ANDROID_ABI}. Run third_party/ffmpeg_prebuilt/copy_prebuilts_to_sdk.js or ensure ANDROID_RELEASE_TAG release is downloaded.")
53
+ endif()
54
+
55
+ # Source files by domain (see docs/NATIVE_NAMING_CONVENTION.md). Move .cpp into subdirs; .h go alongside for include path.
56
+ set(SOURCES
57
+ jni/module/sherpa-onnx-module-jni.cpp
58
+ jni/archive/sherpa-onnx-archive-helper.cpp
59
+ jni/archive/sherpa-onnx-archive-jni.cpp
60
+ jni/model_detect/sherpa-onnx-model-detect-helper.cpp
61
+ jni/model_detect/sherpa-onnx-model-detect-stt.cpp
62
+ jni/model_detect/sherpa-onnx-model-detect-tts.cpp
63
+ jni/model_detect/sherpa-onnx-detect-jni-common.cpp
64
+ jni/model_detect/sherpa-onnx-stt-wrapper.cpp
65
+ jni/model_detect/sherpa-onnx-tts-wrapper.cpp
66
+ jni/audio/sherpa-onnx-audio-convert-jni.cpp
67
+ jni/tts/sherpa-onnx-tts-zipvoice-jni.cpp
68
+ crypto/sha256.cpp
69
+ )
70
+
71
+ # libarchive: (1) prebuilt from third_party/libarchive_prebuilt or jniLibs + cpp/include/libarchive (Maven/GitHub), or (2) build from source.
72
+ set(LIBARCHIVE_PREBUILT_BASE "${PROJECT_ROOT}/../third_party/libarchive_prebuilt/android")
73
+ set(LIBARCHIVE_PREBUILT_LIB "${LIBARCHIVE_PREBUILT_BASE}/${ANDROID_ABI}/lib")
74
+ set(LIBARCHIVE_JNILIBS "${PROJECT_ROOT}/src/main/jniLibs/${ANDROID_ABI}")
75
+ set(LIBARCHIVE_INCLUDE_CPP "${PROJECT_ROOT}/src/main/cpp/include/libarchive")
76
+ set(USE_LIBARCHIVE_PREBUILT OFF)
77
+ if(EXISTS "${LIBARCHIVE_PREBUILT_LIB}/libarchive.so")
78
+ set(USE_LIBARCHIVE_PREBUILT ON)
79
+ set(LIBARCHIVE_LIB_DIR "${LIBARCHIVE_PREBUILT_LIB}")
80
+ if(EXISTS "${LIBARCHIVE_PREBUILT_BASE}/include")
81
+ set(LIBARCHIVE_INCLUDE_DIR "${LIBARCHIVE_PREBUILT_BASE}/include")
82
+ elseif(EXISTS "${LIBARCHIVE_INCLUDE_CPP}/archive.h")
83
+ set(LIBARCHIVE_INCLUDE_DIR "${LIBARCHIVE_INCLUDE_CPP}")
84
+ endif()
85
+ elseif(EXISTS "${LIBARCHIVE_JNILIBS}/libarchive.so")
86
+ set(USE_LIBARCHIVE_PREBUILT ON)
87
+ set(LIBARCHIVE_LIB_DIR "${LIBARCHIVE_JNILIBS}")
88
+ if(EXISTS "${LIBARCHIVE_INCLUDE_CPP}/archive.h")
89
+ set(LIBARCHIVE_INCLUDE_DIR "${LIBARCHIVE_INCLUDE_CPP}")
90
+ endif()
91
+ endif()
92
+ if(USE_LIBARCHIVE_PREBUILT AND LIBARCHIVE_INCLUDE_DIR)
93
+ message(STATUS "libarchive: using prebuilt (libs: ${LIBARCHIVE_LIB_DIR}, include: ${LIBARCHIVE_INCLUDE_DIR})")
94
+ else()
95
+ message(STATUS "Building libarchive from bundled source...")
96
+ add_subdirectory(${PROJECT_ROOT}/../third_party/libarchive ${CMAKE_BINARY_DIR}/libarchive)
97
+ message(STATUS "libarchive built successfully")
98
+ endif()
99
+
100
+ # Create shared library
101
+ add_library(sherpaonnx SHARED
102
+ ${SOURCES}
103
+ )
104
+
105
+ # sherpa-onnx C-API: link by directory + library name only (no IMPORTED target).
106
+ # The .so and headers land in jniLibs and cpp/include/sherpa-onnx via:
107
+ # (1) local third_party build, (2) Maven AAR extraction (libs + c-api headers), or (3) GitHub release zip (last resort).
108
+ # If we used IMPORTED here, AGP would also copy .so from CMake → duplicate in mergeNativeLibs.
109
+ set(SHERPA_ONNX_PREBUILT_BASE "${PROJECT_ROOT}/../third_party/sherpa-onnx-prebuilt/android")
110
+ set(SHERPA_ONNX_ABI_LIB "${SHERPA_ONNX_PREBUILT_BASE}/${ANDROID_ABI}/lib")
111
+ set(SHERPA_C_API_LIB_DIR "")
112
+ if(EXISTS "${SHERPA_ONNX_ABI_LIB}/libsherpa-onnx-c-api.so")
113
+ set(SHERPA_C_API_LIB_DIR "${SHERPA_ONNX_ABI_LIB}")
114
+ message(STATUS "sherpa-onnx C-API (link only): ${SHERPA_C_API_LIB_DIR}")
115
+ elseif(EXISTS "${PROJECT_ROOT}/src/main/jniLibs/${ANDROID_ABI}/libsherpa-onnx-c-api.so")
116
+ set(SHERPA_C_API_LIB_DIR "${PROJECT_ROOT}/src/main/jniLibs/${ANDROID_ABI}")
117
+ message(STATUS "sherpa-onnx C-API (link only, jniLibs): ${SHERPA_C_API_LIB_DIR}")
118
+ else()
119
+ message(WARNING "sherpa-onnx C-API not found. Zipvoice TTS will not be available. "
120
+ "Build prebuilts: cd third_party/sherpa-onnx-prebuilt && ./build_sherpa_onnx.sh")
121
+ endif()
122
+
123
+ # Include directories (must be after add_library). Subdirs so #include "sherpa-onnx-*.h" resolves after move.
124
+ target_include_directories(sherpaonnx PRIVATE
125
+ ${CMAKE_CURRENT_SOURCE_DIR}
126
+ ${CMAKE_CURRENT_SOURCE_DIR}/jni
127
+ ${CMAKE_CURRENT_SOURCE_DIR}/jni/module
128
+ ${CMAKE_CURRENT_SOURCE_DIR}/jni/archive
129
+ ${CMAKE_CURRENT_SOURCE_DIR}/jni/model_detect
130
+ ${CMAKE_CURRENT_SOURCE_DIR}/jni/audio
131
+ ${CMAKE_CURRENT_SOURCE_DIR}/jni/tts
132
+ ${CMAKE_CURRENT_SOURCE_DIR}/include
133
+ ${FFMPEG_INCLUDE_DIR}
134
+ )
135
+ if(USE_LIBARCHIVE_PREBUILT AND LIBARCHIVE_INCLUDE_DIR)
136
+ target_include_directories(sherpaonnx PRIVATE ${LIBARCHIVE_INCLUDE_DIR})
137
+ endif()
138
+ target_compile_definitions(sherpaonnx PRIVATE HAVE_FFMPEG=1)
139
+
140
+ # Link libraries (Kotlin API from AAR handles STT/TTS; C-API only for Zipvoice)
141
+ target_link_directories(sherpaonnx PRIVATE ${FFMPEG_LIB_DIR})
142
+ if(USE_LIBARCHIVE_PREBUILT AND LIBARCHIVE_LIB_DIR)
143
+ target_link_directories(sherpaonnx PRIVATE ${LIBARCHIVE_LIB_DIR})
144
+ endif()
145
+ if(SHERPA_C_API_LIB_DIR)
146
+ target_link_directories(sherpaonnx PRIVATE ${SHERPA_C_API_LIB_DIR})
147
+ target_link_libraries(sherpaonnx PRIVATE sherpa-onnx-c-api)
148
+ endif()
149
+ target_link_libraries(sherpaonnx
150
+ PRIVATE
151
+ archive
152
+ avcodec
153
+ avformat
154
+ avutil
155
+ avfilter
156
+ swresample
157
+ log
158
+ android
159
+ )
160
+
161
+ # Compiler flags for our library
162
+ target_compile_options(sherpaonnx PRIVATE
163
+ -Wall
164
+ -Wextra
165
+ -fvisibility=hidden
166
+ )
@@ -0,0 +1,54 @@
1
+ {
2
+ "version": 3,
3
+ "configurePresets": [
4
+ {
5
+ "name": "default",
6
+ "description": "Android NDK development preset",
7
+ "hidden": false,
8
+ "binaryDir": "${sourceDir}/../../../build",
9
+ "cacheVariables": {
10
+ "ANDROID_ABI": "arm64-v8a",
11
+ "ANDROID_PLATFORM": "android-24",
12
+ "CMAKE_EXPORT_COMPILE_COMMANDS": true
13
+ }
14
+ },
15
+ {
16
+ "name": "android-arm64",
17
+ "inherits": "default",
18
+ "description": "Build for Android ARM64",
19
+ "cacheVariables": {
20
+ "ANDROID_ABI": "arm64-v8a"
21
+ }
22
+ },
23
+ {
24
+ "name": "android-armv7",
25
+ "inherits": "default",
26
+ "description": "Build for Android ARMv7",
27
+ "cacheVariables": {
28
+ "ANDROID_ABI": "armeabi-v7a"
29
+ }
30
+ },
31
+ {
32
+ "name": "android-x86",
33
+ "inherits": "default",
34
+ "description": "Build for Android x86",
35
+ "cacheVariables": {
36
+ "ANDROID_ABI": "x86"
37
+ }
38
+ },
39
+ {
40
+ "name": "android-x86_64",
41
+ "inherits": "default",
42
+ "description": "Build for Android x86_64",
43
+ "cacheVariables": {
44
+ "ANDROID_ABI": "x86_64"
45
+ }
46
+ }
47
+ ],
48
+ "buildPresets": [
49
+ {
50
+ "name": "default",
51
+ "configurePreset": "default"
52
+ }
53
+ ]
54
+ }
@@ -0,0 +1,174 @@
1
+ /**
2
+ * sha256.cpp
3
+ *
4
+ * Purpose: SHA-256 implementation for file hashing. Used by the archive helper (Android) for
5
+ * integrity verification of extracted model archives.
6
+ */
7
+ #include "crypto/sha256.h"
8
+
9
+ #include <cstring>
10
+
11
+ namespace {
12
+ constexpr uint32_t kInitState[8] = {
13
+ 0x6a09e667u,
14
+ 0xbb67ae85u,
15
+ 0x3c6ef372u,
16
+ 0xa54ff53au,
17
+ 0x510e527fu,
18
+ 0x9b05688cu,
19
+ 0x1f83d9abu,
20
+ 0x5be0cd19u,
21
+ };
22
+
23
+ constexpr uint32_t kRoundConstants[64] = {
24
+ 0x428a2f98u, 0x71374491u, 0xb5c0fbcfu, 0xe9b5dba5u, 0x3956c25bu,
25
+ 0x59f111f1u, 0x923f82a4u, 0xab1c5ed5u, 0xd807aa98u, 0x12835b01u,
26
+ 0x243185beu, 0x550c7dc3u, 0x72be5d74u, 0x80deb1feu, 0x9bdc06a7u,
27
+ 0xc19bf174u, 0xe49b69c1u, 0xefbe4786u, 0x0fc19dc6u, 0x240ca1ccu,
28
+ 0x2de92c6fu, 0x4a7484aau, 0x5cb0a9dcu, 0x76f988dau, 0x983e5152u,
29
+ 0xa831c66du, 0xb00327c8u, 0xbf597fc7u, 0xc6e00bf3u, 0xd5a79147u,
30
+ 0x06ca6351u, 0x14292967u, 0x27b70a85u, 0x2e1b2138u, 0x4d2c6dfcu,
31
+ 0x53380d13u, 0x650a7354u, 0x766a0abbu, 0x81c2c92eu, 0x92722c85u,
32
+ 0xa2bfe8a1u, 0xa81a664bu, 0xc24b8b70u, 0xc76c51a3u, 0xd192e819u,
33
+ 0xd6990624u, 0xf40e3585u, 0x106aa070u, 0x19a4c116u, 0x1e376c08u,
34
+ 0x2748774cu, 0x34b0bcb5u, 0x391c0cb3u, 0x4ed8aa4au, 0x5b9cca4fu,
35
+ 0x682e6ff3u, 0x748f82eeu, 0x78a5636fu, 0x84c87814u, 0x8cc70208u,
36
+ 0x90befffau, 0xa4506cebu, 0xbef9a3f7u, 0xc67178f2u,
37
+ };
38
+
39
+ inline uint32_t rotr(uint32_t value, uint32_t bits) {
40
+ return (value >> bits) | (value << (32 - bits));
41
+ }
42
+
43
+ inline uint32_t ch(uint32_t x, uint32_t y, uint32_t z) {
44
+ return (x & y) ^ (~x & z);
45
+ }
46
+
47
+ inline uint32_t maj(uint32_t x, uint32_t y, uint32_t z) {
48
+ return (x & y) ^ (x & z) ^ (y & z);
49
+ }
50
+
51
+ inline uint32_t big_sigma0(uint32_t x) {
52
+ return rotr(x, 2) ^ rotr(x, 13) ^ rotr(x, 22);
53
+ }
54
+
55
+ inline uint32_t big_sigma1(uint32_t x) {
56
+ return rotr(x, 6) ^ rotr(x, 11) ^ rotr(x, 25);
57
+ }
58
+
59
+ inline uint32_t small_sigma0(uint32_t x) {
60
+ return rotr(x, 7) ^ rotr(x, 18) ^ (x >> 3);
61
+ }
62
+
63
+ inline uint32_t small_sigma1(uint32_t x) {
64
+ return rotr(x, 17) ^ rotr(x, 19) ^ (x >> 10);
65
+ }
66
+
67
+ void process_block(Sha256Context* ctx, const uint8_t block[64]) {
68
+ uint32_t w[64];
69
+ for (int i = 0; i < 16; ++i) {
70
+ int idx = i * 4;
71
+ w[i] = (static_cast<uint32_t>(block[idx]) << 24) |
72
+ (static_cast<uint32_t>(block[idx + 1]) << 16) |
73
+ (static_cast<uint32_t>(block[idx + 2]) << 8) |
74
+ (static_cast<uint32_t>(block[idx + 3]));
75
+ }
76
+ for (int i = 16; i < 64; ++i) {
77
+ w[i] = small_sigma1(w[i - 2]) + w[i - 7] + small_sigma0(w[i - 15]) + w[i - 16];
78
+ }
79
+
80
+ uint32_t a = ctx->state[0];
81
+ uint32_t b = ctx->state[1];
82
+ uint32_t c = ctx->state[2];
83
+ uint32_t d = ctx->state[3];
84
+ uint32_t e = ctx->state[4];
85
+ uint32_t f = ctx->state[5];
86
+ uint32_t g = ctx->state[6];
87
+ uint32_t h = ctx->state[7];
88
+
89
+ for (int i = 0; i < 64; ++i) {
90
+ uint32_t t1 = h + big_sigma1(e) + ch(e, f, g) + kRoundConstants[i] + w[i];
91
+ uint32_t t2 = big_sigma0(a) + maj(a, b, c);
92
+ h = g;
93
+ g = f;
94
+ f = e;
95
+ e = d + t1;
96
+ d = c;
97
+ c = b;
98
+ b = a;
99
+ a = t1 + t2;
100
+ }
101
+
102
+ ctx->state[0] += a;
103
+ ctx->state[1] += b;
104
+ ctx->state[2] += c;
105
+ ctx->state[3] += d;
106
+ ctx->state[4] += e;
107
+ ctx->state[5] += f;
108
+ ctx->state[6] += g;
109
+ ctx->state[7] += h;
110
+ }
111
+ } // namespace
112
+
113
+ void sha256_init(Sha256Context* ctx) {
114
+ ctx->total_bits = 0;
115
+ ctx->buffer_size = 0;
116
+ std::memcpy(ctx->state, kInitState, sizeof(kInitState));
117
+ }
118
+
119
+ void sha256_update(Sha256Context* ctx, const uint8_t* data, size_t len) {
120
+ if (len == 0) {
121
+ return;
122
+ }
123
+
124
+ ctx->total_bits += static_cast<uint64_t>(len) * 8u;
125
+ size_t offset = 0;
126
+
127
+ if (ctx->buffer_size > 0) {
128
+ size_t to_copy = 64 - ctx->buffer_size;
129
+ if (to_copy > len) {
130
+ to_copy = len;
131
+ }
132
+ std::memcpy(ctx->buffer + ctx->buffer_size, data, to_copy);
133
+ ctx->buffer_size += to_copy;
134
+ offset += to_copy;
135
+ if (ctx->buffer_size == 64) {
136
+ process_block(ctx, ctx->buffer);
137
+ ctx->buffer_size = 0;
138
+ }
139
+ }
140
+
141
+ while (offset + 64 <= len) {
142
+ process_block(ctx, data + offset);
143
+ offset += 64;
144
+ }
145
+
146
+ if (offset < len) {
147
+ ctx->buffer_size = len - offset;
148
+ std::memcpy(ctx->buffer, data + offset, ctx->buffer_size);
149
+ }
150
+ }
151
+
152
+ void sha256_final(Sha256Context* ctx, uint8_t out[32]) {
153
+ uint64_t message_bits = ctx->total_bits;
154
+ uint8_t padding[64] = {};
155
+ padding[0] = 0x80;
156
+
157
+ size_t pad_len = (ctx->buffer_size < 56) ? (56 - ctx->buffer_size) : (120 - ctx->buffer_size);
158
+ sha256_update(ctx, padding, pad_len);
159
+
160
+ uint8_t length_bytes[8];
161
+ uint64_t total_bits = message_bits;
162
+ for (int i = 7; i >= 0; --i) {
163
+ length_bytes[i] = static_cast<uint8_t>(total_bits & 0xFFu);
164
+ total_bits >>= 8;
165
+ }
166
+ sha256_update(ctx, length_bytes, 8);
167
+
168
+ for (int i = 0; i < 8; ++i) {
169
+ out[i * 4] = static_cast<uint8_t>((ctx->state[i] >> 24) & 0xFFu);
170
+ out[i * 4 + 1] = static_cast<uint8_t>((ctx->state[i] >> 16) & 0xFFu);
171
+ out[i * 4 + 2] = static_cast<uint8_t>((ctx->state[i] >> 8) & 0xFFu);
172
+ out[i * 4 + 3] = static_cast<uint8_t>(ctx->state[i] & 0xFFu);
173
+ }
174
+ }
@@ -0,0 +1,16 @@
1
+ #pragma once
2
+
3
+ #include <cstddef>
4
+ #include <cstdint>
5
+
6
+ // Minimal SHA-256 implementation for Android builds (no external deps).
7
+ struct Sha256Context {
8
+ uint64_t total_bits = 0;
9
+ uint32_t state[8] = {};
10
+ uint8_t buffer[64] = {};
11
+ size_t buffer_size = 0;
12
+ };
13
+
14
+ void sha256_init(Sha256Context* ctx);
15
+ void sha256_update(Sha256Context* ctx, const uint8_t* data, size_t len);
16
+ void sha256_final(Sha256Context* ctx, uint8_t out[32]);