-
Notifications
You must be signed in to change notification settings - Fork 424
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
add WebAssembly for Kws #648
Changes from 18 commits
484e666
2203911
ec373d1
7c3ba66
33559d3
4cb1074
c02d663
3afb57f
270bbae
47d84f5
8623a4d
6cb41ef
4e37fdd
be354fc
a026fba
18c9322
7b7ee17
a29c6ff
a3e940d
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
#!/usr/bin/env bash | ||
|
||
if [ x"$EMSCRIPTEN" == x"" ]; then | ||
if ! command -v emcc &> /dev/null; then | ||
echo "Please install emscripten first" | ||
echo "" | ||
echo "You can use the following commands to install it:" | ||
echo "" | ||
echo "git clone https://github.com/emscripten-core/emsdk.git" | ||
echo "cd emsdk" | ||
echo "git pull" | ||
echo "./emsdk install latest" | ||
echo "./emsdk activate latest" | ||
echo "source ./emsdk_env.sh" | ||
exit 1 | ||
else | ||
EMSCRIPTEN=$(dirname $(realpath $(which emcc))) | ||
fi | ||
fi | ||
|
||
export EMSCRIPTEN=$EMSCRIPTEN | ||
echo "EMSCRIPTEN: $EMSCRIPTEN" | ||
if [ ! -f $EMSCRIPTEN/cmake/Modules/Platform/Emscripten.cmake ]; then | ||
echo "Cannot find $EMSCRIPTEN/cmake/Modules/Platform/Emscripten.cmake" | ||
echo "Please make sure you have installed emsdk correctly" | ||
exit 1 | ||
fi | ||
|
||
mkdir -p build-wasm-simd-kws | ||
pushd build-wasm-simd-kws | ||
|
||
export SHERPA_ONNX_IS_USING_BUILD_WASM_SH=ON | ||
|
||
cmake \ | ||
-DCMAKE_INSTALL_PREFIX=./install \ | ||
-DCMAKE_BUILD_TYPE=Release \ | ||
-DCMAKE_TOOLCHAIN_FILE=$EMSCRIPTEN/cmake/Modules/Platform/Emscripten.cmake \ | ||
\ | ||
-DSHERPA_ONNX_ENABLE_PYTHON=OFF \ | ||
-DSHERPA_ONNX_ENABLE_TESTS=OFF \ | ||
-DSHERPA_ONNX_ENABLE_CHECK=OFF \ | ||
-DBUILD_SHARED_LIBS=OFF \ | ||
-DSHERPA_ONNX_ENABLE_PORTAUDIO=OFF \ | ||
-DSHERPA_ONNX_ENABLE_JNI=OFF \ | ||
-DSHERPA_ONNX_ENABLE_C_API=ON \ | ||
-DSHERPA_ONNX_ENABLE_WEBSOCKET=OFF \ | ||
-DSHERPA_ONNX_ENABLE_GPU=OFF \ | ||
-DSHERPA_ONNX_ENABLE_WASM=ON \ | ||
-DSHERPA_ONNX_ENABLE_WASM_KWS=ON \ | ||
-DSHERPA_ONNX_ENABLE_BINARY=OFF \ | ||
-DSHERPA_ONNX_LINK_LIBSTDCPP_STATICALLY=OFF \ | ||
.. | ||
make -j8 | ||
make install | ||
|
||
ls -lh install/bin/wasm |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -266,15 +266,22 @@ class KeywordSpotterTransducerImpl : public KeywordSpotterImpl { | |
} | ||
|
||
void InitKeywords() { | ||
#ifdef SHERPA_ONNX_ENABLE_WASM_KWS | ||
// Due to the limitations of the wasm file system, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Could you pass a keyword file from wasm? We have been doing this for model files, such as There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Sure, but it needs to be recompiled when the keywords is modified, which is very inconvenient. Because token.txt and keywords.txt are both packaged into the sherpa-onnx-wasm-kws-main.data file, they cannot be modified and can only be recompiled to generate. What do you think? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ah, I see. Then please keep using your current approach. |
||
// the keyword_file variable is directly parsed as a string of keywords | ||
// if WASM KWS on | ||
std::istringstream is(config_.keywords_file); | ||
InitKeywords(is); | ||
#else | ||
// each line in keywords_file contains space-separated words | ||
|
||
std::ifstream is(config_.keywords_file); | ||
if (!is) { | ||
SHERPA_ONNX_LOGE("Open keywords file failed: %s", | ||
config_.keywords_file.c_str()); | ||
exit(-1); | ||
} | ||
InitKeywords(is); | ||
#endif | ||
} | ||
|
||
#if __ANDROID_API__ >= 9 | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
if(NOT $ENV{SHERPA_ONNX_IS_USING_BUILD_WASM_SH}) | ||
message(FATAL_ERROR "Please use ./build-wasm-simd-kws.sh to build for wasm KWS") | ||
endif() | ||
|
||
if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/assets/decoder-epoch-12-avg-2-chunk-16-left-64.onnx") | ||
message(WARNING "${CMAKE_CURRENT_SOURCE_DIR}/assets/decoder-epoch-12-avg-2-chunk-16-left-64.onnx does not exist") | ||
message(FATAL_ERROR "Please read ${CMAKE_CURRENT_SOURCE_DIR}/assets/README.md before you continue") | ||
endif() | ||
|
||
set(exported_functions | ||
AcceptWaveform | ||
CreateKeywordSpotter | ||
DestroyKeywordSpotter | ||
CreateKeywordStream | ||
DecodeKeywordStream | ||
GetKeywordResult | ||
DestroyKeywordResult | ||
IsKeywordStreamReady | ||
InputFinished | ||
) | ||
set(mangled_exported_functions) | ||
foreach(x IN LISTS exported_functions) | ||
list(APPEND mangled_exported_functions "_${x}") | ||
endforeach() | ||
|
||
list(JOIN mangled_exported_functions "," all_exported_functions) | ||
|
||
include_directories(${CMAKE_SOURCE_DIR}) | ||
set(MY_FLAGS "-s FORCE_FILESYSTEM=1 -s INITIAL_MEMORY=512MB -s ALLOW_MEMORY_GROWTH=1") | ||
string(APPEND MY_FLAGS " -sSTACK_SIZE=10485760 ") | ||
string(APPEND MY_FLAGS " -sEXPORTED_FUNCTIONS=[_CopyHeap,_malloc,_free,${all_exported_functions}] ") | ||
string(APPEND MY_FLAGS "--preload-file ${CMAKE_CURRENT_SOURCE_DIR}/assets@. ") | ||
string(APPEND MY_FLAGS " -sEXPORTED_RUNTIME_METHODS=['ccall','stringToUTF8','setValue','getValue','lengthBytesUTF8','UTF8ToString'] ") | ||
message(STATUS "MY_FLAGS: ${MY_FLAGS}") | ||
|
||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${MY_FLAGS}") | ||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${MY_FLAGS}") | ||
set(CMAKE_EXECUTBLE_LINKER_FLAGS "${CMAKE_EXECUTBLE_LINKER_FLAGS} ${MY_FLAGS}") | ||
|
||
add_executable(sherpa-onnx-wasm-kws-main sherpa-onnx-wasm-main-kws.cc) | ||
target_link_libraries(sherpa-onnx-wasm-kws-main sherpa-onnx-c-api) | ||
install(TARGETS sherpa-onnx-wasm-kws-main DESTINATION bin/wasm) | ||
|
||
install( | ||
FILES | ||
"sherpa-onnx-kws.js" | ||
"app.js" | ||
"index.html" | ||
"$<TARGET_FILE_DIR:sherpa-onnx-wasm-kws-main>/sherpa-onnx-wasm-kws-main.js" | ||
"$<TARGET_FILE_DIR:sherpa-onnx-wasm-kws-main>/sherpa-onnx-wasm-kws-main.wasm" | ||
"$<TARGET_FILE_DIR:sherpa-onnx-wasm-kws-main>/sherpa-onnx-wasm-kws-main.data" | ||
DESTINATION | ||
bin/wasm | ||
) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could you disable only the check for hotword file?
We can still validate model files and tokens.txt.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ok, thank you for your suggestions