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.
- package/README.md +232 -236
- package/SherpaOnnx.podspec +68 -64
- package/android/build.gradle +182 -192
- package/android/codegen.gradle +57 -0
- package/android/prebuilt-download.gradle +428 -0
- package/android/prebuilt-versions.gradle +43 -0
- package/android/proguard-rules.pro +10 -0
- package/android/src/main/assets/testModels/add_mul_add.onnx +28 -0
- package/android/src/main/assets/testModels/nnapi_internal_uint8_support.onnx +0 -0
- package/android/src/main/assets/testModels/qnn_multi_ctx_embed.onnx +0 -0
- package/android/src/main/cpp/CMakeLists.txt +166 -129
- package/android/src/main/cpp/CMakePresets.json +54 -0
- package/android/src/main/cpp/crypto/sha256.cpp +174 -0
- package/android/src/main/cpp/crypto/sha256.h +16 -0
- package/android/src/main/cpp/jni/archive/sherpa-onnx-archive-helper.cpp +404 -0
- package/android/src/main/cpp/jni/archive/sherpa-onnx-archive-helper.h +56 -0
- package/android/src/main/cpp/jni/archive/sherpa-onnx-archive-jni.cpp +181 -0
- package/android/src/main/cpp/jni/audio/sherpa-onnx-audio-convert-jni.cpp +888 -0
- package/{ios → android/src/main/cpp/jni/model_detect}/sherpa-onnx-common.h +18 -18
- package/android/src/main/cpp/jni/model_detect/sherpa-onnx-detect-jni-common.cpp +86 -0
- package/android/src/main/cpp/jni/model_detect/sherpa-onnx-detect-jni-common.h +20 -0
- package/android/src/main/cpp/jni/model_detect/sherpa-onnx-model-detect-helper.cpp +423 -0
- package/android/src/main/cpp/jni/model_detect/sherpa-onnx-model-detect-helper.h +55 -0
- package/android/src/main/cpp/jni/model_detect/sherpa-onnx-model-detect-stt.cpp +399 -0
- package/android/src/main/cpp/jni/model_detect/sherpa-onnx-model-detect-tts.cpp +238 -0
- package/{ios → android/src/main/cpp/jni/model_detect}/sherpa-onnx-model-detect.h +122 -89
- package/android/src/main/cpp/jni/model_detect/sherpa-onnx-stt-wrapper.cpp +99 -0
- package/android/src/main/cpp/jni/model_detect/sherpa-onnx-stt-wrapper.h +16 -0
- package/android/src/main/cpp/jni/model_detect/sherpa-onnx-tts-wrapper.cpp +78 -0
- package/android/src/main/cpp/jni/model_detect/sherpa-onnx-tts-wrapper.h +16 -0
- package/android/src/main/cpp/jni/module/sherpa-onnx-module-jni.cpp +190 -0
- package/android/src/main/cpp/jni/tts/sherpa-onnx-tts-zipvoice-jni.cpp +301 -0
- package/android/src/main/java/com/sherpaonnx/SherpaOnnxArchiveHelper.kt +94 -0
- package/android/src/main/java/com/sherpaonnx/{SherpaOnnxCoreHelper.kt → SherpaOnnxAssetHelper.kt} +350 -236
- package/android/src/main/java/com/sherpaonnx/SherpaOnnxModule.kt +791 -483
- package/android/src/main/java/com/sherpaonnx/SherpaOnnxSttHelper.kt +699 -109
- package/android/src/main/java/com/sherpaonnx/SherpaOnnxTtsHelper.kt +1123 -668
- package/android/src/main/java/com/sherpaonnx/ZipvoiceTtsWrapper.kt +187 -0
- package/ios/SherpaOnnx+Assets.h +11 -0
- package/ios/SherpaOnnx+Assets.mm +325 -0
- package/ios/SherpaOnnx+STT.mm +455 -118
- package/ios/SherpaOnnx+TTS.mm +1101 -712
- package/ios/SherpaOnnx.h +17 -6
- package/ios/SherpaOnnx.mm +206 -311
- package/ios/SherpaOnnx.xcconfig +19 -19
- package/ios/SherpaOnnxCoreMLHelper.swift +24 -0
- package/ios/archive/sherpa-onnx-archive-helper.h +21 -0
- package/ios/archive/sherpa-onnx-archive-helper.mm +296 -0
- package/ios/libarchive_darwin_config.h +153 -0
- package/{android/src/main/cpp/jni → ios/model_detect}/sherpa-onnx-common.h +18 -18
- package/ios/model_detect/sherpa-onnx-model-detect-helper.h +49 -0
- package/ios/model_detect/sherpa-onnx-model-detect-helper.mm +210 -0
- package/ios/model_detect/sherpa-onnx-model-detect-stt.mm +344 -0
- package/ios/model_detect/sherpa-onnx-model-detect-tts.mm +201 -0
- package/{android/src/main/cpp/jni → ios/model_detect}/sherpa-onnx-model-detect.h +117 -89
- package/ios/scripts/patch-libarchive-includes.sh +61 -0
- package/ios/scripts/setup-ios-libarchive.sh +98 -0
- package/ios/stt/sherpa-onnx-stt-wrapper.h +129 -0
- package/ios/stt/sherpa-onnx-stt-wrapper.mm +523 -0
- package/ios/{sherpa-onnx-tts-wrapper.h → tts/sherpa-onnx-tts-wrapper.h} +90 -85
- package/ios/{sherpa-onnx-tts-wrapper.mm → tts/sherpa-onnx-tts-wrapper.mm} +376 -345
- package/lib/module/NativeSherpaOnnx.js +3 -0
- package/lib/module/NativeSherpaOnnx.js.map +1 -1
- package/lib/module/audio/index.js +22 -0
- package/lib/module/audio/index.js.map +1 -0
- package/lib/module/diarization/index.js +1 -1
- package/lib/module/diarization/index.js.map +1 -1
- package/lib/module/download/ModelDownloadManager.js +918 -0
- package/lib/module/download/ModelDownloadManager.js.map +1 -0
- package/lib/module/download/extractTarBz2.js +53 -0
- package/lib/module/download/extractTarBz2.js.map +1 -0
- package/lib/module/download/index.js +6 -0
- package/lib/module/download/index.js.map +1 -0
- package/lib/module/download/validation.js +178 -0
- package/lib/module/download/validation.js.map +1 -0
- package/lib/module/enhancement/index.js +1 -1
- package/lib/module/enhancement/index.js.map +1 -1
- package/lib/module/index.js +41 -3
- package/lib/module/index.js.map +1 -1
- package/lib/module/separation/index.js +1 -1
- package/lib/module/separation/index.js.map +1 -1
- package/lib/module/stt/index.js +127 -60
- package/lib/module/stt/index.js.map +1 -1
- package/lib/module/stt/sttModelLanguages.js +512 -0
- package/lib/module/stt/sttModelLanguages.js.map +1 -0
- package/lib/module/stt/types.js +53 -1
- package/lib/module/stt/types.js.map +1 -1
- package/lib/module/tts/index.js +216 -289
- package/lib/module/tts/index.js.map +1 -1
- package/lib/module/tts/types.js +86 -1
- package/lib/module/tts/types.js.map +1 -1
- package/lib/module/types.js.map +1 -1
- package/lib/module/utils.js +86 -73
- package/lib/module/utils.js.map +1 -1
- package/lib/module/vad/index.js +1 -1
- package/lib/module/vad/index.js.map +1 -1
- package/lib/typescript/src/NativeSherpaOnnx.d.ts +192 -38
- package/lib/typescript/src/NativeSherpaOnnx.d.ts.map +1 -1
- package/lib/typescript/src/audio/index.d.ts +13 -0
- package/lib/typescript/src/audio/index.d.ts.map +1 -0
- package/lib/typescript/src/diarization/index.d.ts +3 -2
- package/lib/typescript/src/diarization/index.d.ts.map +1 -1
- package/lib/typescript/src/download/ModelDownloadManager.d.ts +108 -0
- package/lib/typescript/src/download/ModelDownloadManager.d.ts.map +1 -0
- package/lib/typescript/src/download/extractTarBz2.d.ts +14 -0
- package/lib/typescript/src/download/extractTarBz2.d.ts.map +1 -0
- package/lib/typescript/src/download/index.d.ts +7 -0
- package/lib/typescript/src/download/index.d.ts.map +1 -0
- package/lib/typescript/src/download/validation.d.ts +57 -0
- package/lib/typescript/src/download/validation.d.ts.map +1 -0
- package/lib/typescript/src/enhancement/index.d.ts +3 -2
- package/lib/typescript/src/enhancement/index.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +26 -2
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/separation/index.d.ts +3 -2
- package/lib/typescript/src/separation/index.d.ts.map +1 -1
- package/lib/typescript/src/stt/index.d.ts +31 -43
- package/lib/typescript/src/stt/index.d.ts.map +1 -1
- package/lib/typescript/src/stt/sttModelLanguages.d.ts +52 -0
- package/lib/typescript/src/stt/sttModelLanguages.d.ts.map +1 -0
- package/lib/typescript/src/stt/types.d.ts +196 -9
- package/lib/typescript/src/stt/types.d.ts.map +1 -1
- package/lib/typescript/src/tts/index.d.ts +25 -211
- package/lib/typescript/src/tts/index.d.ts.map +1 -1
- package/lib/typescript/src/tts/types.d.ts +148 -25
- package/lib/typescript/src/tts/types.d.ts.map +1 -1
- package/lib/typescript/src/types.d.ts +0 -32
- package/lib/typescript/src/types.d.ts.map +1 -1
- package/lib/typescript/src/utils.d.ts +28 -13
- package/lib/typescript/src/utils.d.ts.map +1 -1
- package/lib/typescript/src/vad/index.d.ts +3 -2
- package/lib/typescript/src/vad/index.d.ts.map +1 -1
- package/package.json +250 -222
- package/scripts/check-qnn-support.sh +78 -0
- package/scripts/setup-ios-framework.sh +379 -282
- package/src/NativeSherpaOnnx.ts +474 -251
- package/src/audio/index.ts +32 -0
- package/src/diarization/index.ts +4 -2
- package/src/download/ModelDownloadManager.ts +1325 -0
- package/src/download/extractTarBz2.ts +78 -0
- package/src/download/index.ts +43 -0
- package/src/download/validation.ts +279 -0
- package/src/enhancement/index.ts +4 -2
- package/src/index.tsx +78 -27
- package/src/separation/index.ts +4 -2
- package/src/stt/index.ts +249 -89
- package/src/stt/sttModelLanguages.ts +237 -0
- package/src/stt/types.ts +263 -9
- package/src/tts/index.ts +470 -458
- package/src/tts/types.ts +373 -218
- package/src/types.ts +0 -44
- package/src/utils.ts +145 -131
- package/src/vad/index.ts +4 -2
- package/third_party/ffmpeg_prebuilt/ANDROID_RELEASE_TAG +1 -0
- package/third_party/libarchive_prebuilt/ANDROID_RELEASE_TAG +1 -0
- package/third_party/libarchive_prebuilt/IOS_RELEASE_TAG +1 -0
- package/third_party/sherpa-onnx-prebuilt/ANDROID_RELEASE_TAG +1 -0
- package/third_party/sherpa-onnx-prebuilt/IOS_RELEASE_TAG +1 -0
- package/android/src/main/cpp/include/sherpa-onnx/c-api/c-api.h +0 -1918
- package/android/src/main/cpp/include/sherpa-onnx/c-api/cxx-api.h +0 -841
- package/android/src/main/cpp/jni/sherpa-onnx-model-detect.cpp +0 -541
- package/android/src/main/cpp/jni/sherpa-onnx-stt-jni.cpp +0 -336
- package/android/src/main/cpp/jni/sherpa-onnx-stt-wrapper.cpp +0 -222
- package/android/src/main/cpp/jni/sherpa-onnx-stt-wrapper.h +0 -68
- package/android/src/main/cpp/jni/sherpa-onnx-tts-jni.cpp +0 -823
- package/android/src/main/cpp/jni/sherpa-onnx-tts-wrapper.cpp +0 -387
- package/android/src/main/cpp/jni/sherpa-onnx-tts-wrapper.h +0 -147
- package/ios/Frameworks/sherpa_onnx.xcframework.zip +0 -0
- package/ios/include/sherpa-onnx/c-api/c-api.h +0 -1918
- package/ios/include/sherpa-onnx/c-api/cxx-api.h +0 -841
- package/ios/sherpa-onnx-model-detect.mm +0 -441
- package/ios/sherpa-onnx-stt-wrapper.h +0 -48
- package/ios/sherpa-onnx-stt-wrapper.mm +0 -201
- package/scripts/copy-headers.js +0 -184
- 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
|
-
#
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
if
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
#
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
jni/sherpa-onnx-
|
|
58
|
-
jni/sherpa-onnx-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
#
|
|
72
|
-
set(
|
|
73
|
-
set(
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
)
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
#
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
)
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
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]);
|