diff --git a/.github/workflows/build-pip.yml b/.github/workflows/build-pip.yml index 618512e..a1a545b 100644 --- a/.github/workflows/build-pip.yml +++ b/.github/workflows/build-pip.yml @@ -34,7 +34,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [ubuntu-latest, macos-latest, windows-latest, ubuntu-24.04-arm, macos-13] + os: [ubuntu-latest, macos-latest, windows-latest, ubuntu-24.04-arm, macos-15-intel] python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] fail-fast: false steps: @@ -61,7 +61,13 @@ jobs: python3 setup.py bdist_wheel ls -lh dist unzip -l ./dist/*.whl + python3 -m pip install ./dist/kaldi*.whl + + - name: Test Python + shell: bash + run: | 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-linux.yaml b/.github/workflows/build-wheels-linux.yaml index 863d8e4..b2d1123 100644 --- a/.github/workflows/build-wheels-linux.yaml +++ b/.github/workflows/build-wheels-linux.yaml @@ -26,6 +26,26 @@ jobs: steps: - uses: actions/checkout@v4 + - name: Install dependencies + run: | + python3 -m pip install --upgrade pip + python3 -m pip install wheel twine==5.0.0 setuptools + + - name: Build sdist + if: matrix.python-version == 'cp38' + shell: bash + run: | + python3 setup.py sdist + ls -lh dist/* + + - name: Publish sdist to PyPI + if: matrix.python-version == 'cp38' + env: + TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }} + TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }} + run: | + twine upload --verbose dist/kaldi_decoder-*.tar.gz + # see https://cibuildwheel.readthedocs.io/en/stable/changelog/ # for a list of versions - name: Build wheels @@ -56,18 +76,3 @@ jobs: python3 -m pip install wheel twine==5.0.0 setuptools twine upload ./wheelhouse/*.whl - - - name: Build sdist - if: matrix.python-version == 'cp38' - shell: bash - run: | - python3 setup.py sdist - ls -lh dist/* - - - name: Publish sdist to PyPI - if: matrix.python-version == 'cp38' - env: - TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }} - TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }} - run: | - twine upload dist/kaldi-decoder-*.tar.gz diff --git a/.github/workflows/build-wheels-macos.yaml b/.github/workflows/build-wheels-macos.yaml index 2ba2788..bf34190 100644 --- a/.github/workflows/build-wheels-macos.yaml +++ b/.github/workflows/build-wheels-macos.yaml @@ -49,6 +49,7 @@ jobs: shell: bash run: | ls -lh ./wheelhouse/ + unzip -l ./wheelhouse/*.whl - uses: actions/upload-artifact@v4 with: @@ -60,8 +61,7 @@ jobs: TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }} TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }} run: | - opts='--break-system-packages' - python3 -m pip install $opts --upgrade pip - python3 -m pip install $opts wheel twine==5.0.0 setuptools + # python3 -m pip install --break-system-packages --upgrade pip + python3 -m pip install --break-system-packages wheel twine==5.0.0 setuptools twine upload ./wheelhouse/*.whl diff --git a/.github/workflows/build-wheels-win32.yaml b/.github/workflows/build-wheels-win32.yaml index 3a29529..849e11b 100644 --- a/.github/workflows/build-wheels-win32.yaml +++ b/.github/workflows/build-wheels-win32.yaml @@ -40,6 +40,7 @@ jobs: shell: bash run: | ls -lh ./wheelhouse/ + unzip -l wheelhouse/*.whl - uses: actions/upload-artifact@v4 with: diff --git a/.github/workflows/build-wheels-win64.yaml b/.github/workflows/build-wheels-win64.yaml index d848b06..f49f515 100644 --- a/.github/workflows/build-wheels-win64.yaml +++ b/.github/workflows/build-wheels-win64.yaml @@ -39,6 +39,7 @@ jobs: shell: bash run: | ls -lh ./wheelhouse/ + unzip -l wheelhouse/*.whl - uses: actions/upload-artifact@v4 with: diff --git a/.github/workflows/linux.yaml b/.github/workflows/linux.yaml index e4f9003..e286b95 100644 --- a/.github/workflows/linux.yaml +++ b/.github/workflows/linux.yaml @@ -19,7 +19,7 @@ permissions: jobs: linux: - name: ${{ matrix.python-version }} + name: ${{ matrix.os }} ${{ matrix.python-version }} runs-on: ${{ matrix.os }} strategy: fail-fast: false diff --git a/.github/workflows/macos.yaml b/.github/workflows/macos.yaml index f8e4182..b4baa7a 100644 --- a/.github/workflows/macos.yaml +++ b/.github/workflows/macos.yaml @@ -19,12 +19,12 @@ permissions: jobs: macos: - name: ${{ matrix.python-version }} + name: ${{ matrix.os }} ${{ matrix.python-version }} runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: - os: [macos-latest, macos-13] + os: [macos-latest, macos-15-intel] python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] steps: diff --git a/.github/workflows/windows.yaml b/.github/workflows/windows.yaml index d35b9c0..6e6a57e 100644 --- a/.github/workflows/windows.yaml +++ b/.github/workflows/windows.yaml @@ -19,7 +19,7 @@ permissions: jobs: windows: - name: ${{ matrix.python-version }} + name: ${{ matrix.os }} ${{ matrix.python-version }} runs-on: ${{ matrix.os }} strategy: fail-fast: false diff --git a/CMakeLists.txt b/CMakeLists.txt index b2946e2..57b9d69 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.11") +set(KALDI_DECODER_VERSION "0.3.0") set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib") set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib") @@ -35,21 +35,18 @@ if(NOT CMAKE_BUILD_TYPE) endif() message(STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}") -set(CMAKE_CXX_STANDARD 17 CACHE STRING "The C++ version to be used.") -set(CMAKE_CXX_EXTENSIONS OFF) +if(NOT CMAKE_CXX_STANDARD) + set(CMAKE_CXX_STANDARD 17 CACHE STRING "The C++ version to be used.") + set(CMAKE_CXX_EXTENSIONS OFF) +endif() list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) -option(BUILD_SHARED_LIBS "Whether to build shared libraries" ON) option(KALDI_DECODER_ENABLE_TESTS "Whether to build tests" ON) option(KALDI_DECODER_BUILD_PYTHON "Whether to build Python" ON) -if(BUILD_SHARED_LIBS AND MSVC) - set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) -endif() - -if(BUILD_SHARED_LIBS) - set(CMAKE_POSITION_INDEPENDENT_CODE ON) +if(WIN32) + add_definitions(-DNOMINMAX) # Otherwise, std::max() and std::min() won't work endif() if(KALDI_DECODER_BUILD_PYTHON) diff --git a/cmake/kaldifst.cmake b/cmake/kaldifst.cmake index da5f741..115f850 100644 --- a/cmake/kaldifst.cmake +++ b/cmake/kaldifst.cmake @@ -1,17 +1,17 @@ function(download_kaldifst) include(FetchContent) - set(kaldifst_URL "https://github.com/k2-fsa/kaldifst/archive/refs/tags/v1.7.16.tar.gz") - set(kaldifst_HASH "SHA256=f338135a3d137b7a8c287e2ca2e0918e1394e1c08bad53b26e7be03a5d4a1066") + set(kaldifst_URL "https://github.com/k2-fsa/kaldifst/archive/refs/tags/v1.8.0.tar.gz") + set(kaldifst_HASH "SHA256=3f247b7e5a2409071202f5e2bc6200060f66728c0a3443c03923ad2723e040b3") # If you don't have access to the Internet, # please pre-download kaldifst set(possible_file_locations - $ENV{HOME}/Downloads/kaldifst-1.7.16.tar.gz - ${CMAKE_SOURCE_DIR}/kaldifst-1.7.16.tar.gz - ${CMAKE_BINARY_DIR}/kaldifst-1.7.16.tar.gz - /tmp/kaldifst-1.7.16.tar.gz - /star-fj/fangjun/download/github/kaldifst-1.7.16.tar.gz + $ENV{HOME}/Downloads/kaldifst-1.8.0.tar.gz + ${CMAKE_SOURCE_DIR}/kaldifst-1.8.0.tar.gz + ${CMAKE_BINARY_DIR}/kaldifst-1.8.0.tar.gz + /tmp/kaldifst-1.8.0.tar.gz + /star-fj/fangjun/download/github/kaldifst-1.8.0.tar.gz ) foreach(f IN LISTS possible_file_locations) @@ -64,11 +64,6 @@ function(download_kaldifst) ) set_target_properties(kaldifst_core PROPERTIES OUTPUT_NAME "kaldi-decoder-kaldi-fst-core") - - if(NOT BUILD_SHARED_LIBS) - install(TARGETS kaldifst_core DESTINATION lib) - endif() - endfunction() download_kaldifst() diff --git a/cmake/openfst.cmake b/cmake/openfst.cmake deleted file mode 100644 index 0bbd933..0000000 --- a/cmake/openfst.cmake +++ /dev/null @@ -1,106 +0,0 @@ -# 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-19.tar.gz") - set(openfst_URL2 "https://hub.nuaa.cf/csukuangfj/openfst/archive/refs/tags/sherpa-onnx-2024-06-19.tar.gz") - set(openfst_HASH "SHA256=5c98e82cc509c5618502dde4860b8ea04d843850ed57e6d6b590b644b268853d") - - # 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-19.tar.gz - ${CMAKE_SOURCE_DIR}/openfst-sherpa-onnx-2024-06-19.tar.gz - ${CMAKE_BINARY_DIR}/openfst-sherpa-onnx-2024-06-19.tar.gz - /tmp/openfst-sherpa-onnx-2024-06-19.tar.gz - /star-fj/fangjun/download/github/openfst-sherpa-onnx-2024-06-19.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}") - - if(_build_shared_libs_bak) - set(_build_shared_libs_bak ${BUILD_SHARED_LIBS}) - set(BUILD_SHARED_LIBS OFF) - endif() - - add_subdirectory(${openfst_SOURCE_DIR} ${openfst_BINARY_DIR} EXCLUDE_FROM_ALL) - - if(_build_shared_libs_bak) - set_target_properties(fst fstfar - PROPERTIES - POSITION_INDEPENDENT_CODE ON - C_VISIBILITY_PRESET hidden - CXX_VISIBILITY_PRESET hidden - ) - set(BUILD_SHARED_LIBS ON) - endif() - - set(openfst_SOURCE_DIR ${openfst_SOURCE_DIR} PARENT_SCOPE) - - set_target_properties(fst PROPERTIES OUTPUT_NAME "kaldi-decoder-fst") - - if(LINUX) - target_compile_options(fst PUBLIC -Wno-missing-template-keyword) - endif() - - target_include_directories(fst - PUBLIC - ${openfst_SOURCE_DIR}/src/include - ) - - if(NOT BUILD_SHARED_LIBS) - install(TARGETS fst DESTINATION lib) - endif() -endfunction() - -download_openfst() diff --git a/kaldi-decoder/csrc/CMakeLists.txt b/kaldi-decoder/csrc/CMakeLists.txt index b78c8e1..0a618be 100644 --- a/kaldi-decoder/csrc/CMakeLists.txt +++ b/kaldi-decoder/csrc/CMakeLists.txt @@ -13,6 +13,15 @@ set(srcs # Always static build add_library(kaldi-decoder-core STATIC ${srcs}) +if(NOT WIN32) + set_target_properties(kaldi-decoder-core + PROPERTIES + POSITION_INDEPENDENT_CODE ON + C_VISIBILITY_PRESET hidden + CXX_VISIBILITY_PRESET hidden + ) +endif() + target_link_libraries(kaldi-decoder-core PUBLIC kaldifst_core) target_link_libraries(kaldi-decoder-core PUBLIC Eigen3::Eigen) @@ -42,7 +51,3 @@ if(KALDI_DECODER_ENABLE_TESTS) kaldi_decoder_add_test(${source}) endforeach() endif() - -if(NOT BUILD_SHARED_LIBS) - install(TARGETS kaldi-decoder-core DESTINATION lib) -endif() diff --git a/kaldi-decoder/python/csrc/CMakeLists.txt b/kaldi-decoder/python/csrc/CMakeLists.txt index fd80faf..4c06695 100644 --- a/kaldi-decoder/python/csrc/CMakeLists.txt +++ b/kaldi-decoder/python/csrc/CMakeLists.txt @@ -22,7 +22,7 @@ if(APPLE) 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}") + target_link_libraries(_kaldi_decoder PRIVATE "-Wl,-rpath,${PYTHON_SITE_PACKAGE_DIR}/kaldi_decoder/lib") endif() endif() @@ -30,6 +30,4 @@ if(NOT WIN32) target_link_libraries(_kaldi_decoder PRIVATE "-Wl,-rpath,${KALDI_DECODER_RPATH_ORIGIN}/kaldi_decoder/lib") endif() -install(TARGETS _kaldi_decoder - DESTINATION ../ -) +install(TARGETS _kaldi_decoder DESTINATION lib) diff --git a/kaldi-decoder/python/kaldi_decoder/__init__.py b/kaldi-decoder/python/kaldi_decoder/__init__.py index 326f935..ed42631 100644 --- a/kaldi-decoder/python/kaldi_decoder/__init__.py +++ b/kaldi-decoder/python/kaldi_decoder/__init__.py @@ -1,4 +1,4 @@ -from _kaldi_decoder import ( +from kaldi_decoder.lib._kaldi_decoder import ( DecodableCtc, DecodableInterface, FasterDecoder, diff --git a/kaldi-decoder/python/kaldi_decoder/lib/.gitkeep b/kaldi-decoder/python/kaldi_decoder/lib/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/setup.py b/setup.py index c034fb2..16621b6 100644 --- a/setup.py +++ b/setup.py @@ -30,7 +30,7 @@ def get_package_version(): return latest_version -package_name = "kaldi-decoder" +package_name = "kaldi_decoder" with open("kaldi-decoder/python/kaldi_decoder/__init__.py", "a") as f: f.write(f"__version__ = '{get_package_version()}'\n")