diff --git a/.github/workflows/build-pip.yml b/.github/workflows/build-pip.yml new file mode 100644 index 0000000..14801c7 --- /dev/null +++ b/.github/workflows/build-pip.yml @@ -0,0 +1,71 @@ +name: build-pip + +on: + push: + branches: + - master + paths: + - '.github/workflows/build-pip.yml' + - 'CMakeLists.txt' + - 'cmake/**' + - 'kaldi-decoder/csrc/**' + - 'kaldi-decoder/python/**' + - 'setup.py' + pull_request: + branches: + - master + paths: + - '.github/workflows/build-pip.yml' + - 'CMakeLists.txt' + - 'cmake/**' + - 'kaldi-decoder/csrc/**' + - 'kaldi-decoder/python/**' + - 'setup.py' + + workflow_dispatch: + +concurrency: + group: build-pip-${{ github.ref }} + cancel-in-progress: true + +jobs: + build-pip: + name: ${{ matrix.os }} ${{ matrix.python-version }} + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"] + fail-fast: false + steps: + - uses: actions/checkout@v4 + + - name: ccache + uses: hendrikmuhs/ccache-action@v1.2 + with: + key: ${{ matrix.os }}-${{ matrix.python-version }} + + # see https://github.com/microsoft/setup-msbuild + - name: Add msbuild to PATH + if: startsWith(matrix.os, 'windows') + uses: microsoft/setup-msbuild@v1.0.2 + + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + + - name: Build + shell: bash + run: | + export CMAKE_CXX_COMPILER_LAUNCHER=ccache + export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" + cmake --version + + python3 -m pip install -U pip wheel numpy setuptools + python3 setup.py bdist_wheel + ls -lh dist + python3 -m pip install ./dist/kaldi*.whl + cd ../.. + python3 -c "import kaldi_decoder; print(kaldi_decoder.__version__)" + python3 -c "import kaldi_decoder; print(kaldi_decoder.__file__)" diff --git a/.github/workflows/build-wheels-aarch64.yaml b/.github/workflows/build-wheels-aarch64.yaml index 997f583..4fd67d1 100644 --- a/.github/workflows/build-wheels-aarch64.yaml +++ b/.github/workflows/build-wheels-aarch64.yaml @@ -26,7 +26,7 @@ jobs: python-version: ["cp37", "cp38", "cp39", "cp310", "cp311", "cp312"] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Set up QEMU uses: docker/setup-qemu-action@v2 diff --git a/.github/workflows/build-wheels-linux.yaml b/.github/workflows/build-wheels-linux.yaml index 1833396..712b36f 100644 --- a/.github/workflows/build-wheels-linux.yaml +++ b/.github/workflows/build-wheels-linux.yaml @@ -24,7 +24,7 @@ jobs: python-version: ["cp37", "cp38", "cp39", "cp310", "cp311", "cp312"] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 # see https://cibuildwheel.readthedocs.io/en/stable/changelog/ # for a list of versions diff --git a/.github/workflows/build-wheels-macos.yaml b/.github/workflows/build-wheels-macos.yaml index 59b79b8..7382535 100644 --- a/.github/workflows/build-wheels-macos.yaml +++ b/.github/workflows/build-wheels-macos.yaml @@ -27,7 +27,7 @@ jobs: python-version: ["cp38", "cp39", "cp310", "cp311", "cp312"] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 # see https://cibuildwheel.readthedocs.io/en/stable/changelog/ # for a list of versions diff --git a/.github/workflows/linux.yaml b/.github/workflows/linux.yaml index 3347b34..9dcc91e 100644 --- a/.github/workflows/linux.yaml +++ b/.github/workflows/linux.yaml @@ -25,15 +25,15 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest] - python-version: ["3.7", "3.8", "3.9", "3.10"] + python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} diff --git a/.github/workflows/macos.yaml b/.github/workflows/macos.yaml index 0246477..80c4fc4 100644 --- a/.github/workflows/macos.yaml +++ b/.github/workflows/macos.yaml @@ -25,15 +25,15 @@ jobs: fail-fast: false matrix: os: [macos-latest] - python-version: ["3.7", "3.8", "3.9", "3.10"] + python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} diff --git a/.github/workflows/windows.yaml b/.github/workflows/windows.yaml index 45562f6..01c6940 100644 --- a/.github/workflows/windows.yaml +++ b/.github/workflows/windows.yaml @@ -25,10 +25,10 @@ jobs: fail-fast: false matrix: os: [windows-latest] - python-version: ["3.7", "3.8", "3.9", "3.10"] + python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 with: fetch-depth: 0 @@ -37,7 +37,7 @@ jobs: uses: microsoft/setup-msbuild@v1.0.2 - name: Setup Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} diff --git a/CMakeLists.txt b/CMakeLists.txt index 045dcad..0198359 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,7 +9,7 @@ if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.24.0") cmake_policy(SET CMP0135 NEW) endif() -set(KALDI_DECODER_VERSION "0.2.5") +set(KALDI_DECODER_VERSION "0.2.6") set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib") set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib") diff --git a/cmake/kaldifst.cmake b/cmake/kaldifst.cmake index 3360b64..e7b493a 100644 --- a/cmake/kaldifst.cmake +++ b/cmake/kaldifst.cmake @@ -1,18 +1,18 @@ function(download_kaldifst) include(FetchContent) - set(kaldifst_URL "https://github.com/k2-fsa/kaldifst/archive/refs/tags/v1.7.10.tar.gz") - set(kaldifst_URL2 "https://hub.nuaa.cf/k2-fsa/kaldifst/archive/refs/tags/v1.7.10.tar.gz") - set(kaldifst_HASH "SHA256=7f7b3173a6584a6b1987f65ae7af2ac453d66b845f875a9d31074b8d2cd0de54") + set(kaldifst_URL "https://github.com/k2-fsa/kaldifst/archive/refs/tags/v1.7.11.tar.gz") + set(kaldifst_URL2 "https://hub.nuaa.cf/k2-fsa/kaldifst/archive/refs/tags/v1.7.11.tar.gz") + set(kaldifst_HASH "SHA256=b43b3332faa2961edc730e47995a58cd4e22ead21905d55b0c4a41375b4a525f") # If you don't have access to the Internet, # please pre-download kaldifst set(possible_file_locations - $ENV{HOME}/Downloads/kaldifst-1.7.10.tar.gz - ${CMAKE_SOURCE_DIR}/kaldifst-1.7.10.tar.gz - ${CMAKE_BINARY_DIR}/kaldifst-1.7.10.tar.gz - /tmp/kaldifst-1.7.10.tar.gz - /star-fj/fangjun/download/github/kaldifst-1.7.10.tar.gz + $ENV{HOME}/Downloads/kaldifst-1.7.11.tar.gz + ${CMAKE_SOURCE_DIR}/kaldifst-1.7.11.tar.gz + ${CMAKE_BINARY_DIR}/kaldifst-1.7.11.tar.gz + /tmp/kaldifst-1.7.11.tar.gz + /star-fj/fangjun/download/github/kaldifst-1.7.11.tar.gz ) foreach(f IN LISTS possible_file_locations) @@ -50,18 +50,12 @@ function(download_kaldifst) ${kaldifst_SOURCE_DIR} ) - target_include_directories(fst - PUBLIC - ${openfst_SOURCE_DIR}/src/include - ) - set_target_properties(kaldifst_core PROPERTIES OUTPUT_NAME "kaldi-decoder-kaldi-fst-core") - set_target_properties(fst PROPERTIES OUTPUT_NAME "kaldi-decoder-fst") if(KALDI_DECODER_BUILD_PYTHON AND WIN32) - install(TARGETS kaldifst_core fst DESTINATION ..) + install(TARGETS kaldifst_core DESTINATION ..) else() - install(TARGETS kaldifst_core fst DESTINATION lib) + install(TARGETS kaldifst_core DESTINATION lib) endif() endfunction() diff --git a/cmake/openfst.cmake b/cmake/openfst.cmake new file mode 100644 index 0000000..535ea66 --- /dev/null +++ b/cmake/openfst.cmake @@ -0,0 +1,91 @@ +# Copyright (c) 2020 Xiaomi Corporation (author: Fangjun Kuang) + +function(download_openfst) + include(FetchContent) + + set(openfst_URL "https://github.com/csukuangfj/openfst/archive/refs/tags/sherpa-onnx-2024-06-13.tar.gz") + set(openfst_URL2 "https://hub.nuaa.cf/csukuangfj/openfst/archive/refs/tags/sherpa-onnx-2024-06-13.tar.gz") + set(openfst_HASH "SHA256=f10a71c6b64d89eabdc316d372b956c30c825c7c298e2f20c780320e8181ffb6") + + # If you don't have access to the Internet, + # please pre-download it + set(possible_file_locations + $ENV{HOME}/Downloads/openfst-sherpa-onnx-2024-06-13.tar.gz + ${CMAKE_SOURCE_DIR}/openfst-sherpa-onnx-2024-06-13.tar.gz + ${CMAKE_BINARY_DIR}/openfst-sherpa-onnx-2024-06-13.tar.gz + /tmp/openfst-sherpa-onnx-2024-06-13.tar.gz + /star-fj/fangjun/download/github/openfst-sherpa-onnx-2024-06-13.tar.gz + ) + + foreach(f IN LISTS possible_file_locations) + if(EXISTS ${f}) + set(openfst_URL "${f}") + file(TO_CMAKE_PATH "${openfst_URL}" openfst_URL) + set(openfst_URL2) + break() + endif() + endforeach() + + set(HAVE_BIN OFF CACHE BOOL "" FORCE) + set(HAVE_SCRIPT OFF CACHE BOOL "" FORCE) + set(HAVE_COMPACT OFF CACHE BOOL "" FORCE) + set(HAVE_COMPRESS OFF CACHE BOOL "" FORCE) + set(HAVE_CONST OFF CACHE BOOL "" FORCE) + set(HAVE_FAR OFF CACHE BOOL "" FORCE) + set(HAVE_GRM OFF CACHE BOOL "" FORCE) + set(HAVE_PDT OFF CACHE BOOL "" FORCE) + set(HAVE_MPDT OFF CACHE BOOL "" FORCE) + set(HAVE_LINEAR OFF CACHE BOOL "" FORCE) + set(HAVE_LOOKAHEAD OFF CACHE BOOL "" FORCE) + set(HAVE_NGRAM OFF CACHE BOOL "" FORCE) + set(HAVE_PYTHON OFF CACHE BOOL "" FORCE) + set(HAVE_SPECIAL OFF CACHE BOOL "" FORCE) + + if(NOT WIN32) + FetchContent_Declare(openfst + URL + ${openfst_URL} + ${openfst_URL2} + URL_HASH ${openfst_HASH} + PATCH_COMMAND + sed -i.bak s/enable_testing\(\)//g "src/CMakeLists.txt" && + sed -i.bak s/add_subdirectory\(test\)//g "src/CMakeLists.txt" && + sed -i.bak /message/d "src/script/CMakeLists.txt" + # sed -i.bak s/add_subdirectory\(script\)//g "src/CMakeLists.txt" && + # sed -i.bak s/add_subdirectory\(extensions\)//g "src/CMakeLists.txt" + ) + else() + FetchContent_Declare(openfst + URL ${openfst_URL} + URL_HASH ${openfst_HASH} + ) + endif() + + FetchContent_GetProperties(openfst) + if(NOT openfst_POPULATED) + message(STATUS "Downloading openfst from ${openfst_URL}") + FetchContent_Populate(openfst) + endif() + message(STATUS "openfst is downloaded to ${openfst_SOURCE_DIR}") + add_subdirectory(${openfst_SOURCE_DIR} ${openfst_BINARY_DIR} EXCLUDE_FROM_ALL) + set(openfst_SOURCE_DIR ${openfst_SOURCE_DIR} PARENT_SCOPE) + + set_target_properties(fst PROPERTIES OUTPUT_NAME "kaldi-decoder-fst") + + target_include_directories(fst + PUBLIC + ${openfst_SOURCE_DIR}/src/include + ) + + if(KALDI_DECODER_BUILD_PYTHON AND WIN32) + install(TARGETS fst DESTINATION ..) + else() + install(TARGETS fst DESTINATION lib) + endif() + + if(WIN32 AND BUILD_SHARED_LIBS) + install(TARGETS fst DESTINATION bin) + endif() +endfunction() + +download_openfst() diff --git a/kaldi-decoder/python/csrc/CMakeLists.txt b/kaldi-decoder/python/csrc/CMakeLists.txt index a8a8637..fd80faf 100644 --- a/kaldi-decoder/python/csrc/CMakeLists.txt +++ b/kaldi-decoder/python/csrc/CMakeLists.txt @@ -19,7 +19,11 @@ if(APPLE) OUTPUT_VARIABLE PYTHON_SITE_PACKAGE_DIR ) message(STATUS "PYTHON_SITE_PACKAGE_DIR: ${PYTHON_SITE_PACKAGE_DIR}") - target_link_libraries(_kaldi_decoder PRIVATE "-Wl,-rpath,${PYTHON_SITE_PACKAGE_DIR}") + if(PYTHON_SITE_PACKAGE_DIR STREQUAL "") + message(WARNING "PYTHON_SITE_PACKAGE_DIR is empty!") + else() + target_link_libraries(_kaldi_decoder PRIVATE "-Wl,-rpath,${PYTHON_SITE_PACKAGE_DIR}") + endif() endif() if(NOT WIN32)