diff --git a/.github/workflows/mfc.yaml b/.github/workflows/mfc.yaml new file mode 100644 index 000000000..44c65da45 --- /dev/null +++ b/.github/workflows/mfc.yaml @@ -0,0 +1,115 @@ +name: mfc + +on: + push: + branches: + - master + tags: + - '*' + paths: + - '.github/workflows/mfc.yaml' + - 'CMakeLists.txt' + - 'cmake/**' + - 'mfc-examples/**' + - 'sherpa-onnx/csrc/*' + pull_request: + branches: + - master + paths: + - '.github/workflows/mfc.yaml' + - 'CMakeLists.txt' + - 'cmake/**' + - 'mfc-examples/**' + - 'sherpa-onnx/csrc/*' + release: + types: + - published + + workflow_dispatch: + inputs: + release: + description: "Whether to release" + type: boolean + +env: + RELEASE: + |- # Release if there is a release tag name or a release flag in workflow_dispatch + ${{ github.event.release.tag_name != '' || github.event.inputs.release == 'true' }} + +concurrency: + group: mfc-${{ github.ref }} + cancel-in-progress: true + +jobs: + mfc: + name: MFC for ${{ matrix.arch }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [windows-latest] + # arch: [x64, Win32] + arch: [x64] + + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - name: Display MSBuild info + shell: cmd + run: | + set path="C:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\Current\Bin" + msbuild -help + + - name: Configure CMake + shell: bash + run: | + mkdir build + cd build + cmake -A ${{ matrix.arch }} -D CMAKE_BUILD_TYPE=Release -D BUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_PREFIX=./install .. + + - name: Build sherpa-onnx for windows + shell: bash + run: | + cd build + cmake --build . --config Release -- -m:2 + cmake --build . --config Release --target install -- -m:2 + + ls -lh install/* + + ls -lh install/lib + ls -lh install/bin + + - name: Build MFC + shell: cmd + run: | + set path="C:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\Current\Bin" + + cd mfc-examples + + msbuild .\mfc-examples.sln /property:Configuration=Release /property:Platform=${{ matrix.arch }} + + - name: Copy files + shell: bash + run: | + SHERPA_ONNX_VERSION=v$(grep "SHERPA_ONNX_VERSION" ./CMakeLists.txt | cut -d " " -f 2 | cut -d '"' -f 2) + arch=${{ matrix.arch }} + + cd mfc-examples/$arch/Release + cp StreamingSpeechRecognition.exe sherpa-onnx-streaming-${SHERPA_ONNX_VERSION}.exe + ls -lh + + - name: Upload artifact + uses: actions/upload-artifact@v2 + with: + name: streaming-speech-recognition-${{ matrix.arch }} + path: ./mfc-examples/${{ matrix.arch }}/Release/StreamingSpeechRecognition.exe + + - name: Release pre-compiled binaries and libs for macOS + if: env.RELEASE == 'true' + uses: svenstaro/upload-release-action@v2 + with: + file_glob: true + overwrite: true + file: ./mfc-examples/${{ matrix.arch }}/Release/sherpa-onnx*.exe diff --git a/.github/workflows/windows-x64.yaml b/.github/workflows/windows-x64.yaml index fcf879502..8372321b7 100644 --- a/.github/workflows/windows-x64.yaml +++ b/.github/workflows/windows-x64.yaml @@ -46,27 +46,13 @@ concurrency: jobs: windows_x64: + name: Windows x64 runs-on: ${{ matrix.os }} - name: ${{ matrix.vs-version }} strategy: fail-fast: false matrix: - include: - - vs-version: vs2015 - toolset-version: v140 - os: windows-2019 - - - vs-version: vs2017 - toolset-version: v141 - os: windows-2019 - - - vs-version: vs2019 - toolset-version: v142 - os: windows-2022 - - - vs-version: vs2022 - toolset-version: v143 - os: windows-2022 + os: [windows-latest] + shared_lib: [ON, OFF] steps: - uses: actions/checkout@v2 @@ -78,7 +64,7 @@ jobs: run: | mkdir build cd build - cmake -T ${{ matrix.toolset-version}},host=x64 -A x64 -D CMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=./install .. + cmake -A x64 -D CMAKE_BUILD_TYPE=Release -D BUILD_SHARED_LIBS=${{ matrix.shared_lib }} -DCMAKE_INSTALL_PREFIX=./install .. - name: Build sherpa-onnx for windows shell: bash @@ -122,7 +108,7 @@ jobs: .github/scripts/test-online-transducer.sh - name: Copy files - if: env.RELEASE == 'true' && matrix.vs-version == 'vs2015' + if: env.RELEASE == 'true' shell: bash run: | SHERPA_ONNX_VERSION=v$(grep "SHERPA_ONNX_VERSION" ./CMakeLists.txt | cut -d " " -f 2 | cut -d '"' -f 2) @@ -137,7 +123,7 @@ jobs: tar cjvf ${dst}.tar.bz2 $dst - name: Release pre-compiled binaries and libs for macOS - if: env.RELEASE == 'true' && matrix.vs-version == 'vs2015' + if: env.RELEASE == 'true' uses: svenstaro/upload-release-action@v2 with: file_glob: true diff --git a/.github/workflows/windows-x86.yaml b/.github/workflows/windows-x86.yaml index 38425d326..d8da350d8 100644 --- a/.github/workflows/windows-x86.yaml +++ b/.github/workflows/windows-x86.yaml @@ -44,28 +44,13 @@ concurrency: jobs: windows_x86: - if: true # disable windows x86 CI for now + name: Windows x86 runs-on: ${{ matrix.os }} - name: ${{ matrix.vs-version }} strategy: fail-fast: false matrix: - include: - - vs-version: vs2015 - toolset-version: v140 - os: windows-2019 - - - vs-version: vs2017 - toolset-version: v141 - os: windows-2019 - - - vs-version: vs2019 - toolset-version: v142 - os: windows-2022 - - - vs-version: vs2022 - toolset-version: v143 - os: windows-2022 + os: [windows-latest] + shared_lib: [ON, OFF] steps: - uses: actions/checkout@v2 @@ -77,7 +62,7 @@ jobs: run: | mkdir build cd build - cmake -T ${{ matrix.toolset-version}},host=x64 -A Win32 -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=./install .. + cmake -A Win32 -D CMAKE_BUILD_TYPE=Release -D BUILD_SHARED_LIBS=${{ matrix.shared_lib }} -D CMAKE_INSTALL_PREFIX=./install .. - name: Build sherpa-onnx for windows shell: bash diff --git a/CMakeLists.txt b/CMakeLists.txt index 46c59de95..236bc648e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.13 FATAL_ERROR) project(sherpa-onnx) -set(SHERPA_ONNX_VERSION "1.5.0") +set(SHERPA_ONNX_VERSION "1.5.1") # Disable warning about # @@ -71,6 +71,18 @@ if(BUILD_SHARED_LIBS AND MSVC) set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) endif() +if(NOT BUILD_SHARED_LIBS AND MSVC) + # see https://cmake.org/cmake/help/latest/prop_tgt/MSVC_RUNTIME_LIBRARY.html + # https://stackoverflow.com/questions/14172856/compile-with-mt-instead-of-md-using-cmake + if(MSVC) + add_compile_options( + $<$:/MT> #---------| + $<$:/MTd> #---|-- Statically link the runtime libraries + $<$:/MT> #--| + ) + endif() +endif() + message(STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}") message(STATUS "CMAKE_INSTALL_PREFIX: ${CMAKE_INSTALL_PREFIX}") message(STATUS "BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS}") @@ -154,3 +166,4 @@ add_subdirectory(sherpa-onnx) if(SHERPA_ONNX_ENABLE_C_API) add_subdirectory(c-api-examples) endif() +message(STATUS "CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}") diff --git a/CPPLINT.cfg b/CPPLINT.cfg new file mode 100644 index 000000000..714091c37 --- /dev/null +++ b/CPPLINT.cfg @@ -0,0 +1 @@ +filter=-./mfc-examples diff --git a/cmake/kaldi-native-fbank.cmake b/cmake/kaldi-native-fbank.cmake index a0c00e577..40c25e75c 100644 --- a/cmake/kaldi-native-fbank.cmake +++ b/cmake/kaldi-native-fbank.cmake @@ -1,9 +1,9 @@ function(download_kaldi_native_fbank) include(FetchContent) - set(kaldi_native_fbank_URL "https://github.com/csukuangfj/kaldi-native-fbank/archive/refs/tags/v1.14.tar.gz") - set(kaldi_native_fbank_URL2 "https://huggingface.co/csukuangfj/sherpa-onnx-cmake-deps/resolve/main/kaldi-native-fbank-1.14.tar.gz") - set(kaldi_native_fbank_HASH "SHA256=6a66638a111d3ce21fe6f29cbf9ab3dbcae2331c77391bf825927df5cbf2babe") + set(kaldi_native_fbank_URL "https://github.com/csukuangfj/kaldi-native-fbank/archive/refs/tags/v1.17.tar.gz") + set(kaldi_native_fbank_URL2 "https://huggingface.co/csukuangfj/sherpa-onnx-cmake-deps/resolve/main/kaldi-native-fbank-1.17.tar.gz") + set(kaldi_native_fbank_HASH "SHA256=300dc282d51d738e70f194ef13a50bf4cf8d54a3b2686d75f7fc2fb821f8c1e6") set(KALDI_NATIVE_FBANK_BUILD_TESTS OFF CACHE BOOL "" FORCE) set(KALDI_NATIVE_FBANK_BUILD_PYTHON OFF CACHE BOOL "" FORCE) @@ -12,11 +12,11 @@ function(download_kaldi_native_fbank) # If you don't have access to the Internet, # please pre-download kaldi-native-fbank set(possible_file_locations - $ENV{HOME}/Downloads/kaldi-native-fbank-1.14.tar.gz - ${PROJECT_SOURCE_DIR}/kaldi-native-fbank-1.14.tar.gz - ${PROJECT_BINARY_DIR}/kaldi-native-fbank-1.14.tar.gz - /tmp/kaldi-native-fbank-1.14.tar.gz - /star-fj/fangjun/download/github/kaldi-native-fbank-1.14.tar.gz + $ENV{HOME}/Downloads/kaldi-native-fbank-1.17.tar.gz + ${PROJECT_SOURCE_DIR}/kaldi-native-fbank-1.17.tar.gz + ${PROJECT_BINARY_DIR}/kaldi-native-fbank-1.17.tar.gz + /tmp/kaldi-native-fbank-1.17.tar.gz + /star-fj/fangjun/download/github/kaldi-native-fbank-1.17.tar.gz ) foreach(f IN LISTS possible_file_locations) diff --git a/cmake/onnxruntime.cmake b/cmake/onnxruntime.cmake index d5d6b5dce..50bedd941 100644 --- a/cmake/onnxruntime.cmake +++ b/cmake/onnxruntime.cmake @@ -88,50 +88,80 @@ function(download_onnxruntime) message(STATUS "CMAKE_VS_PLATFORM_NAME: ${CMAKE_VS_PLATFORM_NAME}") if(CMAKE_VS_PLATFORM_NAME STREQUAL Win32 OR CMAKE_VS_PLATFORM_NAME STREQUAL win32) - # If you don't have access to the Internet, - # please pre-download onnxruntime - # - # for 32-bit windows - set(possible_file_locations - $ENV{HOME}/Downloads/onnxruntime-win-x86-1.15.1.zip - ${PROJECT_SOURCE_DIR}/onnxruntime-win-x86-1.15.1.zip - ${PROJECT_BINARY_DIR}/onnxruntime-win-x86-1.15.1.zip - /tmp/onnxruntime-win-x86-1.15.1.zip - ) + if(BUILD_SHARED_LIBS) + # If you don't have access to the Internet, + # please pre-download onnxruntime + # + # for 32-bit windows + set(possible_file_locations + $ENV{HOME}/Downloads/onnxruntime-win-x86-1.15.1.zip + ${PROJECT_SOURCE_DIR}/onnxruntime-win-x86-1.15.1.zip + ${PROJECT_BINARY_DIR}/onnxruntime-win-x86-1.15.1.zip + /tmp/onnxruntime-win-x86-1.15.1.zip + ) - set(onnxruntime_URL "https://github.com/microsoft/onnxruntime/releases/download/v1.15.1/onnxruntime-win-x86-1.15.1.zip") - set(onnxruntime_URL2 "https://huggingface.co/csukuangfj/sherpa-onnx-cmake-deps/resolve/main/onnxruntime-win-x86-1.15.1.zip") - set(onnxruntime_HASH "SHA256=8de18fdf274a8adcd95272fcf58beda0fe2fb37f0cd62c02bc4bb6200429e4e2") + set(onnxruntime_URL "https://github.com/microsoft/onnxruntime/releases/download/v1.15.1/onnxruntime-win-x86-1.15.1.zip") + set(onnxruntime_URL2 "https://huggingface.co/csukuangfj/sherpa-onnx-cmake-deps/resolve/main/onnxruntime-win-x86-1.15.1.zip") + set(onnxruntime_HASH "SHA256=8de18fdf274a8adcd95272fcf58beda0fe2fb37f0cd62c02bc4bb6200429e4e2") + else() + set(possible_file_locations + $ENV{HOME}/Downloads/onnxruntime-win-x86-static-1.15.1.tar.bz2 + ${PROJECT_SOURCE_DIR}/onnxruntime-win-x86-static-1.15.1.tar.bz2 + ${PROJECT_BINARY_DIR}/onnxruntime-win-x86-static-1.15.1.tar.bz2 + /tmp/onnxruntime-win-x86-static-1.15.1.tar.bz2 + ) + + set(onnxruntime_URL "https://huggingface.co/csukuangfj/onnxruntime-libs/resolve/main/onnxruntime-win-x86-static-1.15.1.tar.bz2") + set(onnxruntime_URL2 "") + set(onnxruntime_HASH "SHA256=a2b33a3e8a1f89cddf303f0a97a5a88f4202579c653cfb29158c8cf7da3734eb") + endif() if(SHERPA_ONNX_ENABLE_GPU) message(FATAL_ERROR "GPU support for Win32 is not supported!") endif() else() - # If you don't have access to the Internet, - # please pre-download onnxruntime - # # for 64-bit windows - set(possible_file_locations - $ENV{HOME}/Downloads/onnxruntime-win-x64-1.15.1.zip - ${PROJECT_SOURCE_DIR}/onnxruntime-win-x64-1.15.1.zip - ${PROJECT_BINARY_DIR}/onnxruntime-win-x64-1.15.1.zip - /tmp/onnxruntime-win-x64-1.15.1.zip - ) - set(onnxruntime_URL "https://github.com/microsoft/onnxruntime/releases/download/v1.15.1/onnxruntime-win-x64-1.15.1.zip") - set(onnxruntime_URL2 "https://huggingface.co/csukuangfj/sherpa-onnx-cmake-deps/resolve/main/onnxruntime-win-x64-1.15.1.zip") - set(onnxruntime_HASH "SHA256=261308ee5526dfd3f405ce8863e43d624a2e0bcd16b2d33cdea8c120ab3534d3") + if(BUILD_SHARED_LIBS) + # If you don't have access to the Internet, + # please pre-download onnxruntime + set(possible_file_locations + $ENV{HOME}/Downloads/onnxruntime-win-x64-1.15.1.zip + ${PROJECT_SOURCE_DIR}/onnxruntime-win-x64-1.15.1.zip + ${PROJECT_BINARY_DIR}/onnxruntime-win-x64-1.15.1.zip + /tmp/onnxruntime-win-x64-1.15.1.zip + ) - if(SHERPA_ONNX_ENABLE_GPU) - set(onnxruntime_URL "https://github.com/microsoft/onnxruntime/releases/download/v1.15.1/onnxruntime-win-x64-gpu-1.15.1.zip") - set(onnxruntime_URL2 "https://huggingface.co/csukuangfj/sherpa-onnx-cmake-deps/resolve/main/onnxruntime-win-x64-gpu-1.15.1.zip") - set(onnxruntime_HASH "SHA256=dcc3a385b415dd2e4a813018b71da5085d9b97774552edf17947826a255a3732") + set(onnxruntime_URL "https://github.com/microsoft/onnxruntime/releases/download/v1.15.1/onnxruntime-win-x64-1.15.1.zip") + set(onnxruntime_URL2 "https://huggingface.co/csukuangfj/sherpa-onnx-cmake-deps/resolve/main/onnxruntime-win-x64-1.15.1.zip") + set(onnxruntime_HASH "SHA256=261308ee5526dfd3f405ce8863e43d624a2e0bcd16b2d33cdea8c120ab3534d3") + + if(SHERPA_ONNX_ENABLE_GPU) + set(onnxruntime_URL "https://github.com/microsoft/onnxruntime/releases/download/v1.15.1/onnxruntime-win-x64-gpu-1.15.1.zip") + set(onnxruntime_URL2 "https://huggingface.co/csukuangfj/sherpa-onnx-cmake-deps/resolve/main/onnxruntime-win-x64-gpu-1.15.1.zip") + set(onnxruntime_HASH "SHA256=dcc3a385b415dd2e4a813018b71da5085d9b97774552edf17947826a255a3732") + set(possible_file_locations + $ENV{HOME}/Downloads/onnxruntime-win-x64-gpu-1.15.1.zip + ${PROJECT_SOURCE_DIR}/onnxruntime-win-x64-gpu-1.15.1.zip + ${PROJECT_BINARY_DIR}/onnxruntime-win-x64-gpu-1.15.1.zip + /tmp/onnxruntime-win-x64-gpu-1.15.1.zip + ) + endif() + else() + # static libraries for windows x64 + message(STATUS "Use static onnxruntime libraries") + # If you don't have access to the Internet, + # please pre-download onnxruntime set(possible_file_locations - $ENV{HOME}/Downloads/onnxruntime-win-x64-gpu-1.15.1.zip - ${PROJECT_SOURCE_DIR}/onnxruntime-win-x64-gpu-1.15.1.zip - ${PROJECT_BINARY_DIR}/onnxruntime-win-x64-gpu-1.15.1.zip - /tmp/onnxruntime-win-x64-gpu-1.15.1.zip + $ENV{HOME}/Downloads/onnxruntime-win-x64-static-1.15.1.tar.bz2 + ${PROJECT_SOURCE_DIR}/onnxruntime-win-x64-static-1.15.1.tar.bz2 + ${PROJECT_BINARY_DIR}/onnxruntime-win-x64-static-1.15.1.tar.bz2 + /tmp/onnxruntime-win-x64-static-1.15.1.tar.bz2 ) + + set(onnxruntime_URL "https://huggingface.co/csukuangfj/onnxruntime-libs/resolve/main/onnxruntime-win-x64-static-1.15.1.tar.bz2") + set(onnxruntime_URL2 "") + set(onnxruntime_HASH "SHA256=f5c19ac1fc6a61c78a231a41df10aede2586665ab397bdc3f007eb8d2c8d4a19") endif() endif() # After downloading, it contains: @@ -170,20 +200,22 @@ function(download_onnxruntime) endif() message(STATUS "onnxruntime is downloaded to ${onnxruntime_SOURCE_DIR}") - find_library(location_onnxruntime onnxruntime - PATHS - "${onnxruntime_SOURCE_DIR}/lib" - NO_CMAKE_SYSTEM_PATH - ) + if(BUILD_SHARED_LIBS OR NOT WIN32) + find_library(location_onnxruntime onnxruntime + PATHS + "${onnxruntime_SOURCE_DIR}/lib" + NO_CMAKE_SYSTEM_PATH + ) - message(STATUS "location_onnxruntime: ${location_onnxruntime}") + message(STATUS "location_onnxruntime: ${location_onnxruntime}") - add_library(onnxruntime SHARED IMPORTED) + add_library(onnxruntime SHARED IMPORTED) - set_target_properties(onnxruntime PROPERTIES - IMPORTED_LOCATION ${location_onnxruntime} - INTERFACE_INCLUDE_DIRECTORIES "${onnxruntime_SOURCE_DIR}/include" - ) + set_target_properties(onnxruntime PROPERTIES + IMPORTED_LOCATION ${location_onnxruntime} + INTERFACE_INCLUDE_DIRECTORIES "${onnxruntime_SOURCE_DIR}/include" + ) + endif() if(SHERPA_ONNX_ENABLE_GPU AND NOT WIN32) find_library(location_onnxruntime_cuda_lib onnxruntime_providers_cuda @@ -198,32 +230,37 @@ function(download_onnxruntime) endif() if(WIN32) - set_property(TARGET onnxruntime - PROPERTY - IMPORTED_IMPLIB "${onnxruntime_SOURCE_DIR}/lib/onnxruntime.lib" - ) - - file(COPY ${onnxruntime_SOURCE_DIR}/lib/onnxruntime.dll - DESTINATION - ${CMAKE_BINARY_DIR}/bin/${CMAKE_BUILD_TYPE} - ) - if(SHERPA_ONNX_ENABLE_GPU) - add_library(onnxruntime_providers_cuda SHARED IMPORTED) - - set_target_properties(onnxruntime_providers_cuda PROPERTIES - IMPORTED_LOCATION ${location_onnxruntime} - INTERFACE_INCLUDE_DIRECTORIES "${onnxruntime_SOURCE_DIR}/include" - ) - - set_property(TARGET onnxruntime_providers_cuda + if(BUILD_SHARED_LIBS) + set_property(TARGET onnxruntime PROPERTY - IMPORTED_IMPLIB "${onnxruntime_SOURCE_DIR}/lib/onnxruntime_providers_cuda.lib" + IMPORTED_IMPLIB "${onnxruntime_SOURCE_DIR}/lib/onnxruntime.lib" ) - file(COPY ${onnxruntime_SOURCE_DIR}/lib/onnxruntime_providers_cuda.dll + file(COPY ${onnxruntime_SOURCE_DIR}/lib/onnxruntime.dll DESTINATION ${CMAKE_BINARY_DIR}/bin/${CMAKE_BUILD_TYPE} ) + if(SHERPA_ONNX_ENABLE_GPU) + add_library(onnxruntime_providers_cuda SHARED IMPORTED) + + set_target_properties(onnxruntime_providers_cuda PROPERTIES + IMPORTED_LOCATION ${location_onnxruntime} + INTERFACE_INCLUDE_DIRECTORIES "${onnxruntime_SOURCE_DIR}/include" + ) + + set_property(TARGET onnxruntime_providers_cuda + PROPERTY + IMPORTED_IMPLIB "${onnxruntime_SOURCE_DIR}/lib/onnxruntime_providers_cuda.lib" + ) + + file(COPY ${onnxruntime_SOURCE_DIR}/lib/onnxruntime_providers_cuda.dll + DESTINATION + ${CMAKE_BINARY_DIR}/bin/${CMAKE_BUILD_TYPE} + ) + endif() + else() + # for static libraries, we use onnxruntime_lib_files directly below + include_directories(${onnxruntime_SOURCE_DIR}/include) endif() endif() @@ -232,7 +269,12 @@ function(download_onnxruntime) elseif(APPLE) file(GLOB onnxruntime_lib_files "${onnxruntime_SOURCE_DIR}/lib/libonnxruntime.*.*dylib") elseif(WIN32) - file(GLOB onnxruntime_lib_files "${onnxruntime_SOURCE_DIR}/lib/*.dll") + if(BUILD_SHARED_LIBS) + file(GLOB onnxruntime_lib_files "${onnxruntime_SOURCE_DIR}/lib/*.dll") + else() + file(GLOB onnxruntime_lib_files "${onnxruntime_SOURCE_DIR}/lib/*.lib") + set(onnxruntime_lib_files ${onnxruntime_lib_files} PARENT_SCOPE) + endif() endif() message(STATUS "onnxruntime lib files: ${onnxruntime_lib_files}") diff --git a/mfc-examples/README.md b/mfc-examples/README.md index 45d481447..6d4ada565 100644 --- a/mfc-examples/README.md +++ b/mfc-examples/README.md @@ -17,13 +17,12 @@ git clone https://github.com/k2-fsa/sherpa-onnx cd sherpa-onnx mkdir build -cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX=./install .. +cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_PREFIX=./install .. cmake --build . --config Release --target install cd ../mfc-examples msbuild ./mfc-examples.sln /property:Configuration=Release /property:Platform=x64 -cp ../build/install/lib/*.dll ./x64/Release/ # now run the program diff --git a/mfc-examples/StreamingSpeechRecognition/StreamingSpeechRecognition.cpp b/mfc-examples/StreamingSpeechRecognition/StreamingSpeechRecognition.cpp index 796c18c90..3d81cf2f9 100644 --- a/mfc-examples/StreamingSpeechRecognition/StreamingSpeechRecognition.cpp +++ b/mfc-examples/StreamingSpeechRecognition/StreamingSpeechRecognition.cpp @@ -3,11 +3,12 @@ // application. // -#include "StreamingSpeechRecognition.h" +#include "pch.h" +#include "framework.h" +#include "StreamingSpeechRecognition.h" #include "StreamingSpeechRecognitionDlg.h" -#include "framework.h" -#include "pch.h" + #ifdef _DEBUG #define new DEBUG_NEW diff --git a/mfc-examples/StreamingSpeechRecognition/StreamingSpeechRecognition.rc b/mfc-examples/StreamingSpeechRecognition/StreamingSpeechRecognition.rc index 34b8a3504..c38f97ee3 100644 Binary files a/mfc-examples/StreamingSpeechRecognition/StreamingSpeechRecognition.rc and b/mfc-examples/StreamingSpeechRecognition/StreamingSpeechRecognition.rc differ diff --git a/mfc-examples/StreamingSpeechRecognition/StreamingSpeechRecognition.vcxproj b/mfc-examples/StreamingSpeechRecognition/StreamingSpeechRecognition.vcxproj index 767dcbe7b..5d408f588 100644 --- a/mfc-examples/StreamingSpeechRecognition/StreamingSpeechRecognition.vcxproj +++ b/mfc-examples/StreamingSpeechRecognition/StreamingSpeechRecognition.vcxproj @@ -51,7 +51,7 @@ Application false - v142 + v143 true Unicode Static diff --git a/mfc-examples/StreamingSpeechRecognition/StreamingSpeechRecognitionDlg.cpp b/mfc-examples/StreamingSpeechRecognition/StreamingSpeechRecognitionDlg.cpp index b6d82add8..7df684ce3 100644 --- a/mfc-examples/StreamingSpeechRecognition/StreamingSpeechRecognitionDlg.cpp +++ b/mfc-examples/StreamingSpeechRecognition/StreamingSpeechRecognitionDlg.cpp @@ -1,6 +1,10 @@ // StreamingSpeechRecognitionDlg.cpp : implementation file // +#include "pch.h" +#include "framework.h" +#include "afxdialogex.h" + #include "StreamingSpeechRecognitionDlg.h" @@ -10,9 +14,7 @@ #include #include "StreamingSpeechRecognition.h" -#include "afxdialogex.h" -#include "framework.h" -#include "pch.h" + #ifdef _DEBUG #define new DEBUG_NEW @@ -131,6 +133,7 @@ static int32_t RecordCallback(const void *input_buffer, void CStreamingSpeechRecognitionDlg::OnBnClickedOk() { if (!recognizer_) { AppendLineToMultilineEditCtrl("Creating recognizer..."); + AppendLineToMultilineEditCtrl("It will take several seconds. Please wait"); InitRecognizer(); if (!recognizer_) { // failed to create the recognizer @@ -264,20 +267,56 @@ void CStreamingSpeechRecognitionDlg::InitRecognizer() { if (!is_ok) { my_btn_.EnableWindow(FALSE); std::string msg = - "\r\nPlease go to " + "\r\nPlease go to\r\n" "https://k2-fsa.github.io/sherpa/onnx/pretrained_models/index.html " "\r\n"; - msg += "to download an offline model."; + msg += "to download a streaming model, i.e., an online model.\r\n"; + msg += + "You need to rename them to encoder.onnx, decoder.onnx, and " + "joiner.onnx correspoondingly.\r\n\r\n"; msg += - " You need to rename them to encoder.onnx, decoder.onnx, and " - "joiner.onnx correspoondingly"; + "We use the following model as an example to show you how to do " + "that.\r\n"; + msg += + "https://huggingface.co/pkufool/" + "icefall-asr-zipformer-streaming-wenetspeech-20230615"; + msg += "\r\n\r\n"; + msg += + "wget https:// " + "huggingface.co/pkufool/" + "icefall-asr-zipformer-streaming-wenetspeech-20230615/resolve/main/exp/" + "encoder-epoch-12-avg-4-chunk-16-left-128.onnx\r\n"; + msg += + "wget https:// " + "huggingface.co/pkufool/" + "icefall-asr-zipformer-streaming-wenetspeech-20230615/resolve/main/exp/" + "decoder-epoch-12-avg-4-chunk-16-left-128.onnx\r\n"; + msg += + "wget https:// " + "huggingface.co/pkufool/" + "icefall-asr-zipformer-streaming-wenetspeech-20230615/resolve/main/exp/" + "joiner-epoch-12-avg-4-chunk-16-left-128.onnx\r\n"; + msg += + "wget " + "https://huggingface.co/pkufool/" + "icefall-asr-zipformer-streaming-wenetspeech-20230615/resolve/main/" + "data/lang_char/tokens.txt\r\n"; + + msg += "\r\nNow rename them.\r\n"; + msg += "mv encoder-epoch-12-avg-4-chunk-16-left-128.onnx encoder.onnx\r\n"; + msg += "mv decoder-epoch-12-avg-4-chunk-16-left-128.onnx decoder.onnx\r\n"; + msg += "mv joiner-epoch-12-avg-4-chunk-16-left-128.onnx joiner.onnx\r\n"; + msg += "\r\n"; + msg += "That's it!\r\n"; + + AppendLineToMultilineEditCtrl(msg); return; } SherpaOnnxOnlineRecognizerConfig config; config.model_config.debug = 0; - config.model_config.num_threads = 2; + config.model_config.num_threads = 1; config.model_config.provider = "cpu"; config.decoding_method = "greedy_search"; @@ -301,7 +340,7 @@ void CStreamingSpeechRecognitionDlg::InitRecognizer() { // see // https://stackoverflow.com/questions/7153935/how-to-convert-utf-8-stdstring-to-utf-16-stdwstring -std::wstring Utf8ToUtf16(const std::string &utf8) { +static std::wstring Utf8ToUtf16(const std::string &utf8) { std::vector unicode; size_t i = 0; while (i < utf8.size()) { @@ -392,6 +431,7 @@ static std::string Cat(const std::vector &results, int CStreamingSpeechRecognitionDlg::RunThread() { std::vector results; + std::string last_text; while (started_) { while (IsOnlineStreamReady(recognizer_, stream_)) { @@ -406,6 +446,8 @@ int CStreamingSpeechRecognitionDlg::RunThread() { // str.Format(_T("%s"), Cat(results, text).c_str()); auto str = Utf8ToUtf16(Cat(results, text).c_str()); my_text_.SetWindowText(str.c_str()); + my_text_.SetFocus(); + my_text_.SetSel(-1); last_text = text; } int is_endpoint = IsEndpoint(recognizer_, stream_); diff --git a/mfc-examples/StreamingSpeechRecognition/StreamingSpeechRecognitionDlg.h b/mfc-examples/StreamingSpeechRecognition/StreamingSpeechRecognitionDlg.h index 0c624ba3b..122b61983 100644 --- a/mfc-examples/StreamingSpeechRecognition/StreamingSpeechRecognitionDlg.h +++ b/mfc-examples/StreamingSpeechRecognition/StreamingSpeechRecognitionDlg.h @@ -48,7 +48,7 @@ class CStreamingSpeechRecognitionDlg : public CDialogEx { SherpaOnnxOnlineRecognizer *recognizer_ = nullptr; PaStream *pa_stream_ = nullptr; - RecognizerThread *thread_; + RecognizerThread *thread_ = nullptr; CButton my_btn_; CEdit my_text_; diff --git a/mfc-examples/StreamingSpeechRecognition/sherpa-onnx-deps.props b/mfc-examples/StreamingSpeechRecognition/sherpa-onnx-deps.props index c142360ef..f0e609d3c 100644 --- a/mfc-examples/StreamingSpeechRecognition/sherpa-onnx-deps.props +++ b/mfc-examples/StreamingSpeechRecognition/sherpa-onnx-deps.props @@ -5,17 +5,46 @@ ..\..\build ..\..\build\install - sherpa-onnx-portaudio.lib;sherpa-onnx-c-api.lib;sherpa-onnx-core.lib + + sherpa-onnx-portaudio_static.lib; + sherpa-onnx-c-api.lib; + sherpa-onnx-core.lib; + kaldi-native-fbank-core.lib; + absl_base.lib; + absl_city.lib; + absl_hash.lib; + absl_low_level_hash.lib; + absl_raw_hash_set.lib; + absl_raw_logging_internal.lib; + absl_throw_delegate.lib; + clog.lib; + cpuinfo.lib; + flatbuffers.lib; + libprotobuf-lite.lib; + onnx.lib; + onnx_proto.lib; + onnxruntime_common.lib; + onnxruntime_flatbuffers.lib; + onnxruntime_framework.lib; + onnxruntime_graph.lib; + onnxruntime_mlas.lib; + onnxruntime_optimizer.lib; + onnxruntime_providers.lib; + onnxruntime_session.lib; + onnxruntime_util.lib; + re2.lib; + - $(SherpaOnnxBuildDirectory)\_deps\portaudio-src\include;$(SherpaOnnxInstallDirectory)\include;%(AdditionalIncludeDirectories) + $(SherpaOnnxBuildDirectory)\_deps\portaudio-src\include; + $(SherpaOnnxInstallDirectory)\include;%(AdditionalIncludeDirectories) - $(SherpaOnnxInstallDirectory)\lib;%(AdditionalLibraryDirectories) - $(SherpaOnnxLibraries) - + $(SherpaOnnxInstallDirectory)\lib;%(AdditionalLibraryDirectories) + $(SherpaOnnxLibraries); + diff --git a/sherpa-onnx/csrc/CMakeLists.txt b/sherpa-onnx/csrc/CMakeLists.txt index 9bbe3645e..857757255 100644 --- a/sherpa-onnx/csrc/CMakeLists.txt +++ b/sherpa-onnx/csrc/CMakeLists.txt @@ -75,10 +75,13 @@ if(ANDROID_NDK) target_link_libraries(sherpa-onnx-core android log) endif() -target_link_libraries(sherpa-onnx-core - onnxruntime - kaldi-native-fbank-core -) +target_link_libraries(sherpa-onnx-core kaldi-native-fbank-core) + +if(BUILD_SHARED_LIBS OR NOT WIN32) + target_link_libraries(sherpa-onnx-core onnxruntime) +else() + target_link_libraries(sherpa-onnx-core ${onnxruntime_lib_files}) +endif() if(SHERPA_ONNX_ENABLE_GPU) target_link_libraries(sherpa-onnx-core diff --git a/sherpa-onnx/csrc/online-transducer-model.cc b/sherpa-onnx/csrc/online-transducer-model.cc index d8cb578f1..d00afcbee 100644 --- a/sherpa-onnx/csrc/online-transducer-model.cc +++ b/sherpa-onnx/csrc/online-transducer-model.cc @@ -31,7 +31,7 @@ enum class ModelType { kUnkown, }; -} +} // namespace namespace sherpa_onnx { diff --git a/sherpa-onnx/csrc/online-zipformer2-transducer-model.cc b/sherpa-onnx/csrc/online-zipformer2-transducer-model.cc index 0ffb68500..d5697e7ff 100644 --- a/sherpa-onnx/csrc/online-zipformer2-transducer-model.cc +++ b/sherpa-onnx/csrc/online-zipformer2-transducer-model.cc @@ -9,11 +9,11 @@ #include #include +#include #include #include #include #include -#include #if __ANDROID_API__ >= 9 #include "android/asset_manager.h" @@ -78,7 +78,7 @@ OnlineZipformer2TransducerModel::OnlineZipformer2TransducerModel( #endif void OnlineZipformer2TransducerModel::InitEncoder(void *model_data, - size_t model_data_length) { + size_t model_data_length) { encoder_sess_ = std::make_unique(env_, model_data, model_data_length, sess_opts_); @@ -130,7 +130,7 @@ void OnlineZipformer2TransducerModel::InitEncoder(void *model_data, } void OnlineZipformer2TransducerModel::InitDecoder(void *model_data, - size_t model_data_length) { + size_t model_data_length) { decoder_sess_ = std::make_unique(env_, model_data, model_data_length, sess_opts_); @@ -155,7 +155,7 @@ void OnlineZipformer2TransducerModel::InitDecoder(void *model_data, } void OnlineZipformer2TransducerModel::InitJoiner(void *model_data, - size_t model_data_length) { + size_t model_data_length) { joiner_sess_ = std::make_unique(env_, model_data, model_data_length, sess_opts_); @@ -252,7 +252,8 @@ std::vector OnlineZipformer2TransducerModel::StackStates( std::vector> OnlineZipformer2TransducerModel::UnStackStates( const std::vector &states) const { - int32_t m = std::accumulate(num_encoder_layers_.begin(), num_encoder_layers_.end(), 0); + int32_t m = std::accumulate(num_encoder_layers_.begin(), + num_encoder_layers_.end(), 0); assert(states.size() == m * 6 + 2); int32_t batch_size = states[0].GetTensorTypeAndShapeInfo().GetShape()[1]; @@ -332,10 +333,12 @@ OnlineZipformer2TransducerModel::UnStackStates( return ans; } -std::vector OnlineZipformer2TransducerModel::GetEncoderInitStates() { +std::vector +OnlineZipformer2TransducerModel::GetEncoderInitStates() { std::vector ans; int32_t n = static_cast(encoder_dims_.size()); - int32_t m = std::accumulate(num_encoder_layers_.begin(), num_encoder_layers_.end(), 0); + int32_t m = std::accumulate(num_encoder_layers_.begin(), + num_encoder_layers_.end(), 0); ans.reserve(m * 6 + 2); for (int32_t i = 0; i != n; ++i) { @@ -354,7 +357,8 @@ std::vector OnlineZipformer2TransducerModel::GetEncoderInitStates() } { - std::array s{1, 1, left_context_len_[i], nonlin_attn_head_dim}; + std::array s{1, 1, left_context_len_[i], + nonlin_attn_head_dim}; auto v = Ort::Value::CreateTensor(allocator_, s.data(), s.size()); Fill(&v, 0); @@ -378,7 +382,8 @@ std::vector OnlineZipformer2TransducerModel::GetEncoderInitStates() } { - std::array s{1, encoder_dims_[i], cnn_module_kernels_[i] / 2}; + std::array s{1, encoder_dims_[i], + cnn_module_kernels_[i] / 2}; auto v = Ort::Value::CreateTensor(allocator_, s.data(), s.size()); Fill(&v, 0); @@ -386,7 +391,8 @@ std::vector OnlineZipformer2TransducerModel::GetEncoderInitStates() } { - std::array s{1, encoder_dims_[i], cnn_module_kernels_[i] / 2}; + std::array s{1, encoder_dims_[i], + cnn_module_kernels_[i] / 2}; auto v = Ort::Value::CreateTensor(allocator_, s.data(), s.size()); Fill(&v, 0); @@ -413,8 +419,8 @@ std::vector OnlineZipformer2TransducerModel::GetEncoderInitStates() std::pair> OnlineZipformer2TransducerModel::RunEncoder(Ort::Value features, - std::vector states, - Ort::Value /* processed_frames */) { + std::vector states, + Ort::Value /* processed_frames */) { std::vector encoder_inputs; encoder_inputs.reserve(1 + states.size()); @@ -446,7 +452,7 @@ Ort::Value OnlineZipformer2TransducerModel::RunDecoder( } Ort::Value OnlineZipformer2TransducerModel::RunJoiner(Ort::Value encoder_out, - Ort::Value decoder_out) { + Ort::Value decoder_out) { std::array joiner_input = {std::move(encoder_out), std::move(decoder_out)}; auto logit = diff --git a/sherpa-onnx/python/csrc/online-recognizer.cc b/sherpa-onnx/python/csrc/online-recognizer.cc index bb8aba975..ec1b0af86 100644 --- a/sherpa-onnx/python/csrc/online-recognizer.cc +++ b/sherpa-onnx/python/csrc/online-recognizer.cc @@ -17,9 +17,11 @@ static void PybindOnlineRecognizerResult(py::module *m) { .def_property_readonly( "text", [](PyClass &self) -> std::string { return self.text; }) .def_property_readonly( - "tokens", [](PyClass &self) -> std::vector { return self.tokens; }) + "tokens", + [](PyClass &self) -> std::vector { return self.tokens; }) .def_property_readonly( - "timestamps", [](PyClass &self) -> std::vector { return self.timestamps; }); + "timestamps", + [](PyClass &self) -> std::vector { return self.timestamps; }); } static void PybindOnlineRecognizerConfig(py::module *m) {