From 1e173e3ba3a77a1d85d166cf1fe6ce4d796c8846 Mon Sep 17 00:00:00 2001 From: Fangjun Kuang Date: Thu, 9 Apr 2026 21:41:23 +0800 Subject: [PATCH 1/4] Update kaldifst to use openfst 1.8.5 --- .github/workflows/build-pip.yml | 8 +- .github/workflows/build-wheels-macos.yaml | 6 +- .github/workflows/build-wheels-win32.yaml | 1 + .github/workflows/build-wheels-win64.yaml | 1 + .github/workflows/linux.yaml | 2 +- .github/workflows/macos.yaml | 4 +- .github/workflows/windows.yaml | 2 +- CMakeLists.txt | 17 +-- cmake/kaldifst.cmake | 19 ++-- cmake/openfst.cmake | 106 ------------------ kaldi-decoder/csrc/CMakeLists.txt | 13 ++- kaldi-decoder/python/csrc/CMakeLists.txt | 6 +- .../python/kaldi_decoder/__init__.py | 2 +- .../python/kaldi_decoder/lib/.gitkeep | 0 14 files changed, 40 insertions(+), 147 deletions(-) delete mode 100644 cmake/openfst.cmake create mode 100644 kaldi-decoder/python/kaldi_decoder/lib/.gitkeep 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-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..1059dea 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,23 +35,16 @@ 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) -endif() - if(KALDI_DECODER_BUILD_PYTHON) include(pybind11) endif() 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 From b362b24dd52617be1a0629edd60c4a4098f160ed Mon Sep 17 00:00:00 2001 From: Fangjun Kuang Date: Thu, 9 Apr 2026 21:48:27 +0800 Subject: [PATCH 2/4] Fix for windows --- CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1059dea..57b9d69 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,6 +45,10 @@ list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) option(KALDI_DECODER_ENABLE_TESTS "Whether to build tests" ON) option(KALDI_DECODER_BUILD_PYTHON "Whether to build Python" ON) +if(WIN32) + add_definitions(-DNOMINMAX) # Otherwise, std::max() and std::min() won't work +endif() + if(KALDI_DECODER_BUILD_PYTHON) include(pybind11) endif() From 9024cfbac2e9e1adb0ab9679c46c803ac56dbbbd Mon Sep 17 00:00:00 2001 From: Fangjun Kuang Date: Fri, 10 Apr 2026 09:28:23 +0800 Subject: [PATCH 3/4] fix publishing sdist --- .github/workflows/build-wheels-linux.yaml | 35 +++++++++++++---------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/.github/workflows/build-wheels-linux.yaml b/.github/workflows/build-wheels-linux.yaml index 863d8e4..75ae7ae 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 From b4fbe00912ad386f39d78524801fd40c281a00d1 Mon Sep 17 00:00:00 2001 From: Fangjun Kuang Date: Fri, 10 Apr 2026 09:29:21 +0800 Subject: [PATCH 4/4] Fix package name --- .github/workflows/build-wheels-linux.yaml | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-wheels-linux.yaml b/.github/workflows/build-wheels-linux.yaml index 75ae7ae..b2d1123 100644 --- a/.github/workflows/build-wheels-linux.yaml +++ b/.github/workflows/build-wheels-linux.yaml @@ -44,7 +44,7 @@ jobs: TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }} TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }} run: | - twine upload --verbose dist/kaldi-decoder-*.tar.gz + twine upload --verbose dist/kaldi_decoder-*.tar.gz # see https://cibuildwheel.readthedocs.io/en/stable/changelog/ # for a list of versions 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")