libspeech 0.2.0__tar.gz → 0.4.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- libspeech-0.4.0/.github/workflows/cmake.yml +165 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/.github/workflows/wheels.yml +3 -1
- {libspeech-0.2.0 → libspeech-0.4.0}/.gitmodules +0 -5
- libspeech-0.4.0/CHANGELOG.md +252 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/CMakeLists.txt +33 -228
- libspeech-0.4.0/CONTRIBUTING.md +221 -0
- libspeech-0.4.0/LICENSE +202 -0
- libspeech-0.4.0/NOTICE +12 -0
- libspeech-0.4.0/PKG-INFO +357 -0
- libspeech-0.4.0/README.md +327 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/audioflux_issues.md +4 -4
- libspeech-0.4.0/benchmarks/.gitignore +3 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/benchmarks/CMakeLists.txt +30 -4
- libspeech-0.4.0/benchmarks/README.md +83 -0
- libspeech-0.4.0/benchmarks/cmake/Download.cmake +26 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/benchmarks/cpp/bench_stft.cpp +16 -16
- libspeech-0.4.0/benchmarks/profile/README.md +40 -0
- libspeech-0.4.0/benchmarks/profile/prof_dct.cpp +15 -0
- libspeech-0.4.0/benchmarks/profile/prof_dsp.cpp +51 -0
- libspeech-0.4.0/benchmarks/profile/prof_dsp.py +122 -0
- libspeech-0.4.0/benchmarks/profile/prof_models.cpp +78 -0
- libspeech-0.4.0/benchmarks/python/CMakeLists.txt +163 -0
- libspeech-0.4.0/benchmarks/python/bench_op_memory_driver.py +85 -0
- libspeech-0.4.0/benchmarks/python/bench_op_memory_one.py +91 -0
- libspeech-0.4.0/benchmarks/python/bench_sizes.py +61 -0
- libspeech-0.4.0/benchmarks/python/bench_throughput.py +106 -0
- libspeech-0.4.0/benchmarks/python/corpus.py +91 -0
- libspeech-0.4.0/benchmarks/python/ops.py +254 -0
- libspeech-0.4.0/benchmarks/python/requirements.txt +13 -0
- libspeech-0.4.0/benchmarks/python/system_info.py +74 -0
- libspeech-0.4.0/benchmarks/report/CMakeLists.txt +58 -0
- libspeech-0.4.0/benchmarks/report/generate_report.py +138 -0
- libspeech-0.4.0/benchmarks/report/template.html.jinja2 +128 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/checklist.md +98 -15
- libspeech-0.4.0/cmake/FixLCovPaths.cmake +9 -0
- libspeech-0.4.0/cmake/GenerateIframe.cmake +23 -0
- libspeech-0.4.0/cmake/coverage_iframe.html.in +160 -0
- libspeech-0.4.0/data/models.csv +15 -0
- libspeech-0.4.0/docs/CMakeLists.txt +176 -0
- libspeech-0.4.0/docs/CreateDocs.cmake +52 -0
- libspeech-0.4.0/docs/Doxyfile.in +32 -0
- libspeech-0.4.0/docs/FinishPages.cmake +42 -0
- libspeech-0.4.0/docs/InjectComment.cmake +85 -0
- libspeech-0.4.0/docs/SpeechPages.cmake +198 -0
- libspeech-0.4.0/docs/api-renames.md +112 -0
- libspeech-0.4.0/docs/convert_page.py +392 -0
- libspeech-0.4.0/docs/cpp/CreateDocs.cmake +62 -0
- libspeech-0.4.0/docs/cpp/Doxyfile.in +62 -0
- libspeech-0.4.0/docs/cpp/footer.html.in +27 -0
- libspeech-0.4.0/docs/cpp/index-docs.json +9 -0
- libspeech-0.4.0/docs/cpp/index-example.txt +24 -0
- libspeech-0.4.0/docs/cpp/index-install.txt +19 -0
- libspeech-0.4.0/docs/cpp/mainpage.md +68 -0
- libspeech-0.4.0/docs/generate_index.py +196 -0
- libspeech-0.4.0/docs/images/libspeech-logo.txt +7 -0
- libspeech-0.4.0/docs/index.html.in +286 -0
- libspeech-0.4.0/docs/initial_comment.in +15 -0
- libspeech-0.4.0/docs/page.html.in +419 -0
- libspeech-0.4.0/docs/python/CreateDocs.cmake +59 -0
- libspeech-0.4.0/docs/python/index-docs.json +9 -0
- libspeech-0.4.0/docs/python/index-example.txt +21 -0
- libspeech-0.4.0/docs/python/index-install.txt +11 -0
- libspeech-0.4.0/docs/python/source/_static/custom.css +233 -0
- libspeech-0.4.0/docs/python/source/_themes/speech/layout.html +202 -0
- libspeech-0.4.0/docs/python/source/_themes/speech/page.html +2 -0
- libspeech-0.4.0/docs/python/source/_themes/speech/speech-footer.html +36 -0
- libspeech-0.4.0/docs/python/source/_themes/speech/speech-nav.html +14 -0
- libspeech-0.4.0/docs/python/source/_themes/speech/speech-topbar.html +27 -0
- libspeech-0.4.0/docs/python/source/_themes/speech/static/speech-docs.css +418 -0
- libspeech-0.4.0/docs/python/source/_themes/speech/static/speech-sphinx.css +741 -0
- libspeech-0.4.0/docs/python/source/_themes/speech/theme.toml +9 -0
- libspeech-0.4.0/docs/python/source/conf.py +87 -0
- libspeech-0.4.0/docs/python/source/dsp.rst +35 -0
- libspeech-0.4.0/docs/python/source/index.rst +32 -0
- libspeech-0.4.0/docs/python/source/io.rst +5 -0
- libspeech-0.4.0/docs/python/source/models.rst +9 -0
- libspeech-0.4.0/docs/python/source/utils.rst +17 -0
- libspeech-0.4.0/docs/section.html.in +471 -0
- libspeech-0.4.0/docs/speech-docs.css +436 -0
- libspeech-0.4.0/docs/supported_langs.json +49 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/examples/common.h +1 -1
- {libspeech-0.2.0 → libspeech-0.4.0}/examples/main.cpp +40 -35
- {libspeech-0.2.0 → libspeech-0.4.0}/examples/silero_app/main.cpp +8 -8
- libspeech-0.4.0/include/libspeech/audio.h +52 -0
- libspeech-0.4.0/include/libspeech/detail/log.h +197 -0
- libspeech-0.4.0/include/libspeech/detail/uninit_vector.h +48 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/include/libspeech/dsp/dct.h +29 -4
- libspeech-0.4.0/include/libspeech/dsp/fft.h +128 -0
- libspeech-0.4.0/include/libspeech/dsp/mfcc.h +99 -0
- libspeech-0.4.0/include/libspeech/dsp/resample.h +123 -0
- libspeech-0.4.0/include/libspeech/dsp/simd.h +49 -0
- libspeech-0.4.0/include/libspeech/dsp/stft.h +211 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/include/libspeech/dsp/window.h +3 -4
- libspeech-0.4.0/include/libspeech/dsp/window_type.h +34 -0
- libspeech-0.4.0/include/libspeech/models/base_model.h +51 -0
- libspeech-0.4.0/include/libspeech/models/denoiser.h +106 -0
- libspeech-0.4.0/include/libspeech/models/dpdfnet_denoiser.h +64 -0
- libspeech-0.4.0/include/libspeech/models/facebook_denoiser.h +45 -0
- libspeech-0.4.0/include/libspeech/models/gtcrn_denoiser.h +58 -0
- libspeech-0.4.0/include/libspeech/models/model_files.h +73 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/include/libspeech/models/onnx_model.h +6 -3
- libspeech-0.4.0/include/libspeech/models/providers.h +27 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/include/libspeech/models/silero_vad.h +13 -12
- libspeech-0.4.0/include/libspeech/models/speechbrain_denoiser.h +45 -0
- libspeech-0.4.0/include/libspeech/span.h +420 -0
- libspeech-0.4.0/include/libspeech/utils/log.h +43 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/include/libspeech/utils/utils.h +11 -4
- {libspeech-0.2.0 → libspeech-0.4.0}/include/libspeech/version.h +1 -1
- {libspeech-0.2.0 → libspeech-0.4.0}/pyproject.toml +49 -5
- libspeech-0.4.0/src/audio.cpp +436 -0
- libspeech-0.4.0/src/bindings/python/CMakeLists.txt +275 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/bindings/python/bind_audio.cpp +14 -14
- libspeech-0.4.0/src/bindings/python/bind_dsp.cpp +374 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/bindings/python/bind_io.cpp +29 -14
- libspeech-0.4.0/src/bindings/python/bind_models.cpp +214 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/bindings/python/libspeech/__init__.py +30 -1
- libspeech-0.4.0/src/bindings/python/libspeech/_functional.py +232 -0
- libspeech-0.4.0/src/bindings/python/libspeech/py.typed +0 -0
- libspeech-0.4.0/src/bindings/python/ndarray_util.h +54 -0
- libspeech-0.4.0/src/dsp/dct.cpp +148 -0
- libspeech-0.4.0/src/dsp/fft.cpp +232 -0
- libspeech-0.4.0/src/dsp/mfcc.cpp +199 -0
- libspeech-0.4.0/src/dsp/real_fft.cpp +262 -0
- libspeech-0.4.0/src/dsp/real_fft.h +89 -0
- libspeech-0.4.0/src/dsp/resample.cpp +746 -0
- libspeech-0.4.0/src/dsp/simd.cpp +81 -0
- libspeech-0.4.0/src/dsp/simd_internal.h +97 -0
- libspeech-0.4.0/src/dsp/stft.cpp +540 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/dsp/window.cpp +8 -6
- libspeech-0.4.0/src/dsp/window_type_internal.h +38 -0
- libspeech-0.4.0/src/models/base_model.cpp +51 -0
- libspeech-0.4.0/src/models/denoiser.cpp +85 -0
- libspeech-0.4.0/src/models/dpdfnet_denoiser.cpp +190 -0
- libspeech-0.4.0/src/models/facebook_denoiser.cpp +32 -0
- libspeech-0.4.0/src/models/gtcrn_denoiser.cpp +124 -0
- libspeech-0.4.0/src/models/model_files.cpp +266 -0
- libspeech-0.4.0/src/models/model_files_detail.h +39 -0
- libspeech-0.4.0/src/models/onnx_denoiser_impl.h +99 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/models/onnx_model.cpp +5 -5
- libspeech-0.4.0/src/models/providers.cpp +31 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/models/silero_vad.cpp +15 -15
- libspeech-0.4.0/src/models/spectral.h +188 -0
- libspeech-0.4.0/src/models/speechbrain_denoiser.cpp +27 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/third_party/README.md +12 -6
- libspeech-0.4.0/src/third_party/audioflux/UPSTREAM_PATCHES.md +14 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/third_party/audioflux/src/dsp/resample_algorithm.c +17 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/third_party/audioflux/src/dsp/resample_algorithm.h +7 -0
- libspeech-0.4.0/src/utils/utils.cpp +159 -0
- libspeech-0.4.0/tests/CMakeLists.txt +343 -0
- libspeech-0.4.0/tests/coverage_dashboard.html.in +607 -0
- libspeech-0.4.0/tests/dsp/test_complex_views.cpp +255 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/tests/dsp/test_dct.cpp +10 -10
- libspeech-0.4.0/tests/dsp/test_fast_paths.cpp +639 -0
- libspeech-0.4.0/tests/dsp/test_fft.cpp +124 -0
- libspeech-0.4.0/tests/dsp/test_fft_into.cpp +171 -0
- libspeech-0.4.0/tests/dsp/test_istft.cpp +188 -0
- libspeech-0.4.0/tests/dsp/test_mfcc.cpp +128 -0
- libspeech-0.4.0/tests/dsp/test_resample.cpp +134 -0
- libspeech-0.4.0/tests/dsp/test_span.cpp +293 -0
- libspeech-0.4.0/tests/dsp/test_stft.cpp +102 -0
- libspeech-0.4.0/tests/dsp/test_window.cpp +69 -0
- libspeech-0.4.0/tests/genhtml.css +241 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/tests/models/CMakeLists.txt +11 -1
- {libspeech-0.2.0 → libspeech-0.4.0}/tests/models/test_default_model_cache_dir.cpp +30 -30
- libspeech-0.4.0/tests/models/test_denoiser.cpp +98 -0
- libspeech-0.4.0/tests/models/test_log.cpp +70 -0
- libspeech-0.4.0/tests/models/test_model_files.cpp +483 -0
- libspeech-0.4.0/tests/models/test_providers.cpp +24 -0
- libspeech-0.4.0/tests/models/test_spectral.cpp +160 -0
- libspeech-0.4.0/tests/python/CMakeLists.txt +136 -0
- libspeech-0.4.0/tests/python/conftest.py +19 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/tests/python/test_dsp.py +16 -0
- libspeech-0.4.0/tests/python/test_functional.py +197 -0
- libspeech-0.4.0/tests/python/test_librosa_compat.py +427 -0
- libspeech-0.4.0/tests/python/test_logging.py +107 -0
- libspeech-0.4.0/tests/python/test_model_files.py +396 -0
- libspeech-0.4.0/tests/python/test_models.py +250 -0
- libspeech-0.4.0/tests/python/test_numpy_api.py +426 -0
- libspeech-0.4.0/tests/python/test_providers.py +19 -0
- libspeech-0.4.0/tests/python/test_simd.py +90 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/version.py +2 -2
- libspeech-0.2.0/.github/workflows/cmake.yml +0 -52
- libspeech-0.2.0/CONTRIBUTING.md +0 -144
- libspeech-0.2.0/LICENSE +0 -36
- libspeech-0.2.0/PKG-INFO +0 -221
- libspeech-0.2.0/README.md +0 -195
- libspeech-0.2.0/include/libspeech/audio.h +0 -46
- libspeech-0.2.0/include/libspeech/dsp/fft.h +0 -73
- libspeech-0.2.0/include/libspeech/dsp/mfcc.h +0 -72
- libspeech-0.2.0/include/libspeech/dsp/resample.h +0 -64
- libspeech-0.2.0/include/libspeech/dsp/stft.h +0 -81
- libspeech-0.2.0/include/libspeech/models/base_model.h +0 -33
- libspeech-0.2.0/include/libspeech/models/denoiser.h +0 -38
- libspeech-0.2.0/include/libspeech/models/facebook_denoiser.h +0 -45
- libspeech-0.2.0/include/libspeech/models/speechbrain_denoiser.h +0 -45
- libspeech-0.2.0/src/audio.cpp +0 -441
- libspeech-0.2.0/src/bindings/python/bind_dsp.cpp +0 -85
- libspeech-0.2.0/src/bindings/python/bind_models.cpp +0 -58
- libspeech-0.2.0/src/bindings/python/libspeech/__main__.py +0 -33
- libspeech-0.2.0/src/bindings/python/libspeech/core.py +0 -15
- libspeech-0.2.0/src/dsp/dct.cpp +0 -47
- libspeech-0.2.0/src/dsp/fft.cpp +0 -104
- libspeech-0.2.0/src/dsp/mfcc.cpp +0 -128
- libspeech-0.2.0/src/dsp/resample.cpp +0 -136
- libspeech-0.2.0/src/dsp/stft.cpp +0 -124
- libspeech-0.2.0/src/models/base_model.cpp +0 -46
- libspeech-0.2.0/src/models/denoiser.cpp +0 -22
- libspeech-0.2.0/src/models/facebook_denoiser.cpp +0 -75
- libspeech-0.2.0/src/models/speechbrain_denoiser.cpp +0 -85
- libspeech-0.2.0/src/third_party/audioflux/UPSTREAM_PATCHES.md +0 -6
- libspeech-0.2.0/src/utils/utils.cpp +0 -117
- libspeech-0.2.0/tests/CMakeLists.txt +0 -61
- libspeech-0.2.0/tests/dsp/test_fft.cpp +0 -124
- libspeech-0.2.0/tests/dsp/test_mfcc.cpp +0 -128
- libspeech-0.2.0/tests/dsp/test_resample.cpp +0 -82
- libspeech-0.2.0/tests/dsp/test_stft.cpp +0 -102
- libspeech-0.2.0/tests/dsp/test_window.cpp +0 -67
- libspeech-0.2.0/tests/models/test_denoiser.cpp +0 -43
- libspeech-0.2.0/tests/python/CMakeLists.txt +0 -50
- libspeech-0.2.0/tests/python/test_models.py +0 -39
- {libspeech-0.2.0 → libspeech-0.4.0}/.clang-format +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/.github/workflows/orchestrator.yml +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/.gitignore +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/benchmarks/cpp/CMakeLists.txt +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/cmake/AudioFlux.cmake +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/cmake/Conan.cmake +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/cmake/DynamicVersion.cmake +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/cmake/ONNXRuntime.cmake +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/cmake/PyProject.cmake +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/conanfile.txt +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/conda.recipe/meta.yaml +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/docs/logo/README.md +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/docs/logo/libspeech-logo-pods.svg +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/docs/logo/libspeech-logo.svg +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/examples/denoiser_app/controler.h +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/examples/denoiser_app/main.cpp +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/git-submodule.sh +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/include/libspeech/export.h +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/bindings/python/about.cpp +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/speech_umbrella_placeholder.cpp +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/third_party/aixlog/LICENSE +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/third_party/aixlog/README.md +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/third_party/aixlog/include/aixlog.hpp +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/third_party/audioflux/LICENSE.md +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/third_party/audioflux/README.md +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/third_party/audioflux/include/dsp/resample_algorithm.h +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/third_party/audioflux/include/flux_base.h +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/third_party/audioflux/include/stft_algorithm.h +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/third_party/audioflux/include/util/flux_util.h +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/third_party/audioflux/include/util/flux_wave.h +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/third_party/audioflux/include/vector/flux_complex.h +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/third_party/audioflux/include/vector/flux_vector.h +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/third_party/audioflux/src/dsp/fft_algorithm.c +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/third_party/audioflux/src/dsp/fft_algorithm.h +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/third_party/audioflux/src/dsp/filterDesign_fir.c +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/third_party/audioflux/src/dsp/filterDesign_fir.h +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/third_party/audioflux/src/dsp/flux_window.c +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/third_party/audioflux/src/dsp/flux_window.h +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/third_party/audioflux/src/flux_base.h +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/third_party/audioflux/src/stft_algorithm.c +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/third_party/audioflux/src/stft_algorithm.h +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/third_party/audioflux/src/util/flux_util.c +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/third_party/audioflux/src/util/flux_util.h +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/third_party/audioflux/src/util/flux_wave.c +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/third_party/audioflux/src/util/flux_wave.h +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/third_party/audioflux/src/vector/flux_complex.c +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/third_party/audioflux/src/vector/flux_complex.h +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/third_party/audioflux/src/vector/flux_vector.c +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/third_party/audioflux/src/vector/flux_vector.h +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/third_party/audioflux/src/vector/flux_vectorOp.c +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/src/third_party/audioflux/src/vector/flux_vectorOp.h +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/tests/python/test_audio.py +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/tests/utest/utest.h +0 -0
- {libspeech-0.2.0 → libspeech-0.4.0}/tests/utest/utest_main.cxx +0 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
name: cmake stuff
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
workflow_call:
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [ master ]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
build-and-test:
|
|
11
|
+
strategy:
|
|
12
|
+
fail-fast: false
|
|
13
|
+
matrix:
|
|
14
|
+
os: [ubuntu-latest, macos-latest, windows-latest]
|
|
15
|
+
|
|
16
|
+
runs-on: ${{ matrix.os }}
|
|
17
|
+
|
|
18
|
+
steps:
|
|
19
|
+
- name: Checkout repository
|
|
20
|
+
uses: actions/checkout@v6
|
|
21
|
+
with:
|
|
22
|
+
submodules: true
|
|
23
|
+
|
|
24
|
+
- name: Set up Python
|
|
25
|
+
uses: actions/setup-python@v6
|
|
26
|
+
with:
|
|
27
|
+
python-version: "3.11"
|
|
28
|
+
cache: "pip"
|
|
29
|
+
|
|
30
|
+
# speech::models (BUILD_MODELS=ON, the default) needs httpp on the
|
|
31
|
+
# CMAKE_PREFIX_PATH via find_package(httpp) -- see the "Model
|
|
32
|
+
# downloading" comment block in the top-level CMakeLists.txt. This has
|
|
33
|
+
# to happen before the configure step below, since CMake shells out to
|
|
34
|
+
# `python -c "import httpp; ..."` at configure time to locate it.
|
|
35
|
+
- name: Install httpp
|
|
36
|
+
run: pip install httpp
|
|
37
|
+
|
|
38
|
+
- name: Build Project
|
|
39
|
+
uses: threeal/cmake-action@v2.1.0
|
|
40
|
+
with:
|
|
41
|
+
build-dir: build
|
|
42
|
+
options: |
|
|
43
|
+
CMAKE_BUILD_TYPE=Release
|
|
44
|
+
BUILD_MODELS=ON
|
|
45
|
+
BUILD_TESTS=ON
|
|
46
|
+
BUILD_PYTHON=OFF
|
|
47
|
+
|
|
48
|
+
- name: Build
|
|
49
|
+
run: cmake --build build --config Release
|
|
50
|
+
|
|
51
|
+
- name: Run tests
|
|
52
|
+
run: ctest --test-dir build --output-on-failure --build-config Release
|
|
53
|
+
|
|
54
|
+
build-docs:
|
|
55
|
+
needs: build-and-test
|
|
56
|
+
runs-on: ubuntu-latest
|
|
57
|
+
|
|
58
|
+
steps:
|
|
59
|
+
- name: Checkout repository
|
|
60
|
+
uses: actions/checkout@v6
|
|
61
|
+
with:
|
|
62
|
+
submodules: true
|
|
63
|
+
|
|
64
|
+
- name: Set up Python
|
|
65
|
+
uses: actions/setup-python@v6
|
|
66
|
+
with:
|
|
67
|
+
python-version: "3.11"
|
|
68
|
+
cache: "pip"
|
|
69
|
+
|
|
70
|
+
# httpp: needed at CMake-configure time (see build-and-test above). The rest are the docs
|
|
71
|
+
# tools: Sphinx (Python reference), doxygen-awesome-css (C++ theme), markdown-it-py (pages).
|
|
72
|
+
# The Python reference imports the package built in the build tree, so this is a full build.
|
|
73
|
+
- name: Install python dependencies
|
|
74
|
+
run: pip install httpp sphinx doxygen-awesome-css markdown-it-py
|
|
75
|
+
|
|
76
|
+
- name: Install Doxygen + graphviz
|
|
77
|
+
run: |
|
|
78
|
+
sudo apt-get update
|
|
79
|
+
sudo apt-get install -y doxygen graphviz
|
|
80
|
+
|
|
81
|
+
- name: Configure CMake
|
|
82
|
+
run: |
|
|
83
|
+
cmake -B build \
|
|
84
|
+
-DCMAKE_BUILD_TYPE=Release \
|
|
85
|
+
-DBUILD_MODELS=ON \
|
|
86
|
+
-DBUILD_PYTHON=ON \
|
|
87
|
+
-DBUILD_TESTS=OFF \
|
|
88
|
+
-DBUILD_DOCS=ON
|
|
89
|
+
|
|
90
|
+
- name: Build documentation
|
|
91
|
+
run: cmake --build build --target speech_docs
|
|
92
|
+
|
|
93
|
+
- name: Upload documentation artifact
|
|
94
|
+
uses: actions/upload-artifact@v7
|
|
95
|
+
with:
|
|
96
|
+
name: cmake-documentation
|
|
97
|
+
path: build/docs/out
|
|
98
|
+
retention-days: 5
|
|
99
|
+
|
|
100
|
+
build-coverage:
|
|
101
|
+
needs: build-and-test
|
|
102
|
+
runs-on: ubuntu-latest
|
|
103
|
+
|
|
104
|
+
steps:
|
|
105
|
+
- name: Checkout repository
|
|
106
|
+
uses: actions/checkout@v6
|
|
107
|
+
with:
|
|
108
|
+
submodules: true
|
|
109
|
+
|
|
110
|
+
- name: Set up Python
|
|
111
|
+
uses: actions/setup-python@v6
|
|
112
|
+
with:
|
|
113
|
+
python-version: "3.11"
|
|
114
|
+
cache: "pip"
|
|
115
|
+
|
|
116
|
+
# httpp: needed at CMake-configure time (see build-and-test above).
|
|
117
|
+
# coverage: drives speech_coverage_python. The rest of the Python side
|
|
118
|
+
# (nanobind, pytest, ...) is installed by CMakeLists.txt itself when
|
|
119
|
+
# BUILD_PYTHON=ON.
|
|
120
|
+
- name: Install python dependencies
|
|
121
|
+
run: pip install httpp coverage
|
|
122
|
+
|
|
123
|
+
- name: Install lcov
|
|
124
|
+
run: |
|
|
125
|
+
sudo apt-get update
|
|
126
|
+
sudo apt-get install -y lcov
|
|
127
|
+
|
|
128
|
+
# Same shape as ctoon's coverage job: every component (speech::dsp,
|
|
129
|
+
# speech::models C++ tests + the Python package's tests) is covered
|
|
130
|
+
# individually, then merged into coverage/total/ + a dashboard at
|
|
131
|
+
# coverage/index.html. BUILD_COVERAGE is an explicit opt-in (see the
|
|
132
|
+
# comment in tests/CMakeLists.txt for why it isn't implied by lcov
|
|
133
|
+
# merely being installed).
|
|
134
|
+
- name: Configure CMake with coverage
|
|
135
|
+
run: |
|
|
136
|
+
cmake -B build \
|
|
137
|
+
-DBUILD_MODELS=ON \
|
|
138
|
+
-DBUILD_TESTS=ON \
|
|
139
|
+
-DBUILD_PYTHON=ON \
|
|
140
|
+
-DBUILD_COVERAGE=ON
|
|
141
|
+
|
|
142
|
+
- name: Generate coverage report
|
|
143
|
+
run: cmake --build build --target speech_coverage
|
|
144
|
+
|
|
145
|
+
# Heavy end-to-end Denoiser test (downloads the ONNX model, ~1 GB RAM). It carries the
|
|
146
|
+
# `models` pytest marker, so the normal pytest runs (wheels.yml / cibuildwheel, the coverage
|
|
147
|
+
# run above) skip it; this is the one place it runs (pytest -m models).
|
|
148
|
+
- name: Run model tests (pytest -m models)
|
|
149
|
+
run: cmake --build build --target speech_test_python_models_e2e
|
|
150
|
+
|
|
151
|
+
- name: Upload coverage to Codecov
|
|
152
|
+
uses: codecov/codecov-action@v5
|
|
153
|
+
with:
|
|
154
|
+
files: build/coverage/total/coverage.lcov
|
|
155
|
+
flags: unittests
|
|
156
|
+
name: codecov-libspeech
|
|
157
|
+
fail_ci_if_error: false
|
|
158
|
+
verbose: true
|
|
159
|
+
|
|
160
|
+
- name: Upload coverage artifact
|
|
161
|
+
uses: actions/upload-artifact@v7
|
|
162
|
+
with:
|
|
163
|
+
name: cmake-coverage-report
|
|
164
|
+
path: build/coverage/
|
|
165
|
+
retention-days: 5
|
|
@@ -57,7 +57,7 @@ jobs:
|
|
|
57
57
|
submodules: true
|
|
58
58
|
|
|
59
59
|
- name: Build wheels
|
|
60
|
-
uses: pypa/cibuildwheel@
|
|
60
|
+
uses: pypa/cibuildwheel@v4.2.0
|
|
61
61
|
env:
|
|
62
62
|
# ONNX Runtime's own v1.21.0 release notes state outright: "All
|
|
63
63
|
# macOS packages now require macOS version >= 13.3." Without this,
|
|
@@ -85,6 +85,8 @@ jobs:
|
|
|
85
85
|
# cp38 is excluded: httpp (a build-time dependency, see above) only
|
|
86
86
|
# ships wheels from cp39-abi3 up on PyPI, not cp38 -- building a
|
|
87
87
|
# cp38 wheel here would require httpp built from source instead.
|
|
88
|
+
# (cibuildwheel 4.2 builds CPython 3.15 by default; this explicit list keeps the
|
|
89
|
+
# matrix at 3.9-3.12 -- the cp312 wheel is abi3, so it also serves 3.13 and newer.)
|
|
88
90
|
CIBW_BUILD: "cp39-* cp310-* cp311-* cp312-*"
|
|
89
91
|
# Per-Python-version env var overrides (SKBUILD_WHEEL_PY_API=cp312
|
|
90
92
|
# for the cp312 build only, so scikit-build-core tags it as a
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to libspeech. The version lives in `include/libspeech/version.h`.
|
|
4
|
+
This file starts at 0.3.1; older history is in `git log`.
|
|
5
|
+
|
|
6
|
+
## Unreleased
|
|
7
|
+
|
|
8
|
+
## 0.4.0 (2026-10-17)
|
|
9
|
+
|
|
10
|
+
Needs **httpp 0.7.x** (`httpp>=0.7,<0.8`, in `pyproject.toml`): the download lock and the SHA-256 functions used
|
|
11
|
+
here are not in 0.6.x, and httpp's API is still changing, so the range is deliberately narrow.
|
|
12
|
+
|
|
13
|
+
### Breaking
|
|
14
|
+
- **C++ API renamed to snake_case, STL style** (types, enumerators, functions, methods,
|
|
15
|
+
constants). A few names changed beyond case because a type cannot share a method's name:
|
|
16
|
+
`STFT::stft` → `stft::compute`, `Resample::resample` → `resample::process`,
|
|
17
|
+
`Spectrogram` → `complex_spectrogram`, `DctII` → `dct_ii_plan`,
|
|
18
|
+
`Denoiser::Create` → `denoiser::create`. Full old → new table: `docs/api-renames.md`.
|
|
19
|
+
Python class names (`libspeech.STFT`, ...) are unchanged.
|
|
20
|
+
- **`window_type`** (`enum class`, `include/libspeech/dsp/window_type.h`) replaces AudioFlux's
|
|
21
|
+
`WindowType`/`Window_*` in the public headers; no AudioFlux header is public any more.
|
|
22
|
+
- **`denoiser` is single-inheritance** (pimpl backends `facebook_denoiser`, `speechbrain_denoiser`);
|
|
23
|
+
`process()`/`close()` are non-virtual in the base.
|
|
24
|
+
- **Default log level is now `warning`** (it used to print everything). Use
|
|
25
|
+
`libspeech.set_log_level("debug")`, `speech::utils::set_log_level` or `LIBSPEECH_LOG`.
|
|
26
|
+
- **`istft` with an invalid `method` raises** (only 0/1, or `"weighted"`/`"plain"` in Python).
|
|
27
|
+
- **`nanobind>=2.0.0`** is required to build the Python bindings.
|
|
28
|
+
|
|
29
|
+
### Changed
|
|
30
|
+
- **License is now Apache-2.0** (was declared as MIT in the README/pyproject, while the `LICENSE` file actually held
|
|
31
|
+
pybind11's BSD-3 text). `LICENSE` is the standard Apache-2.0 text, `NOTICE` names the third-party code and says
|
|
32
|
+
that the downloaded models keep their own licenses. Copies of libspeech already distributed under MIT stay MIT.
|
|
33
|
+
|
|
34
|
+
### Added
|
|
35
|
+
- **Verified model downloads.** A model now always comes with two small files next to it, and all three
|
|
36
|
+
are downloaded: `<model>.onnx.sha256` (one line, `<sha256> <file name>`, as `sha256sum` writes it) and
|
|
37
|
+
`<model>.onnx.readme` (what the model is, who made it, license, provenance). The checksum file is fetched
|
|
38
|
+
**first** and must be exactly that one line (an HTML error page is rejected); then the readme (so a missing
|
|
39
|
+
one fails before the big download); then the model, which httpp checks against the checksum and deletes if it
|
|
40
|
+
does not match. The checksum and readme are installed next to the model only after it arrived and matched,
|
|
41
|
+
so a failed or interrupted download no longer leaves a broken file behind that later calls would trust
|
|
42
|
+
(`download_file` skipped any existing file). A cached model is hashed on every load and downloaded again if
|
|
43
|
+
it does not match; a model cached by an older version just gets its two files. A bare model name (the
|
|
44
|
+
`models` release) must have all three; an explicit URL may lack the sidecar files and is then used unverified
|
|
45
|
+
with a warning (a malformed checksum file is still an error).
|
|
46
|
+
- **Several processes, one download.** The lock is httpp's: `httpp::download` always takes `<file>.lock/`,
|
|
47
|
+
whose `alive` file the downloading process keeps rewriting. Another process (or thread) that wants the same
|
|
48
|
+
model waits and then finds the finished file instead of downloading it again; a lock that stops being
|
|
49
|
+
updated belongs to a dead process and is taken over. A download that was killed is resumed from its `.part`
|
|
50
|
+
file and verified against the checksum. The checksum and readme are fetched under per-download temporary
|
|
51
|
+
names (`*.<tag>.new`), so a failed refresh (`ignore_cache`) leaves the old cache as it was. A cache hit
|
|
52
|
+
never takes the lock.
|
|
53
|
+
- **`ignore_cache`**: `Denoiser(..., ignore_cache=True)`, `SileroVad(..., ignore_cache=True)`,
|
|
54
|
+
`libspeech.fetch_model(..., ignore_cache=True)`; C++ `denoiser::create(..., ignore_cache)`, the model
|
|
55
|
+
constructors and `fetch_options::ignore_cache`. Downloads everything again; if that fails the old cache is untouched.
|
|
56
|
+
- **Readme API**: `Denoiser.readme()`, `SileroVad.readme()`, `libspeech.model_readme(name)`; C++
|
|
57
|
+
`denoiser::readme()`, `base_model::readme()`, `speech::models::model_readme(name)`. Also `model_path`
|
|
58
|
+
and `sha256` on loaded models, `libspeech.fetch_model(name)` (returns the verified path without loading
|
|
59
|
+
the model) and C++ `speech::models::fetch_model` / `fetch_options` / `parse_checksum`.
|
|
60
|
+
- **SHA-256**: `libspeech.sha256(bytes)`, `libspeech.sha256_file(path)`, C++ `speech::utils::sha256_hex` /
|
|
61
|
+
`sha256_file` (chunked, any file size). The hashing itself is httpp's (`httpp::sha256_hex`), which also
|
|
62
|
+
verifies the downloads; no SHA-256 code is vendored.
|
|
63
|
+
- **`data/models.csv`**: every model in the `models` release (name, file, backend, sample rate, size, sha256,
|
|
64
|
+
license, `commercial_use`, source, notes). A test checks it against the release's `.sha256` files.
|
|
65
|
+
- Python `libspeech.stft(...)` / `libspeech.istft(...)` (librosa style, NumPy in/out), and
|
|
66
|
+
`STFT.stft_complex`, `STFT.istft`, `FFT.fft`/`FFT.ifft` returning `complex64`.
|
|
67
|
+
- C++ `istft` (inverse real FFT, one-sided or full input, AudioFlux-compatible normalisation),
|
|
68
|
+
`fft::forward_into/inverse_into/dct_into/idct_into`, `span<T>`/`frame_view<T>` and complex
|
|
69
|
+
views (`as_complex`, `split_complex_span`, `complex_spectrogram::frames()`).
|
|
70
|
+
- Real-FFT fast path for real input up to 2^17 points.
|
|
71
|
+
- `Denoiser`: `close()`, `closed`, context manager, `sample_rate`, `num_threads`
|
|
72
|
+
(default 1, 0 = automatic), NumPy overload, GIL released while running, `Denoiser("facebook")`
|
|
73
|
+
with the default model, `denoiser(x)`.
|
|
74
|
+
- Logger with a public API (`set_log_level`, `get_log_level`, `LIBSPEECH_LOG`), output
|
|
75
|
+
`time [level] (tag) message`; it no longer takes over `std::clog`.
|
|
76
|
+
- Type stubs: `py.typed` and one `.pyi` per compiled module, generated with
|
|
77
|
+
`python -m nanobind.stubgen` in `src/bindings/python/CMakeLists.txt` and installed with the
|
|
78
|
+
wheel.
|
|
79
|
+
- **`resample_quality`** (`best` default, `high`, `medium`, `fast`; Python
|
|
80
|
+
`Resample(src, dst, "medium")`) trades passband width and alias rejection for speed. Python,
|
|
81
|
+
44.1 → 16 kHz, one core, min of 60 runs, 10 s / 60 s of audio, in ms: best 2.5 / 15.4,
|
|
82
|
+
high 1.9 / 11.9, medium 1.35 / 8.2, fast 0.77 / 4.7, against librosa 2.3 / 13.5, soxr MQ
|
|
83
|
+
2.0 / 11.7, soxr LQ 1.8 / 10.5. Quality, measured with pure tones: aliases rejected by
|
|
84
|
+
> 150 dB (best), 135 (high), 124 (medium), 107 (fast) at 12 kHz; passband loss at 7 kHz
|
|
85
|
+
0.00 / 0.00 / 0.07 / 2.3 dB. soxr keeps a flatter passband close to 8 kHz (-0.02 dB at
|
|
86
|
+
7.4 kHz against -1.1 dB for `best` and -2.0 dB for `medium`), so the levels are not an
|
|
87
|
+
equal-quality comparison with soxr.
|
|
88
|
+
- **Denoiser backends `gtcrn` and `dpdfnet`** (`gtcrn_denoiser`, `dpdfnet_denoiser`;
|
|
89
|
+
`Denoiser("gtcrn")`, `Denoiser("dpdfnet", model="dpdfnet4")`). Small streaming models that work
|
|
90
|
+
on the STFT one frame at a time and carry their state, so any input length works. GTCRN (0.5 MB,
|
|
91
|
+
16 kHz) and DPDFNet (`dpdfnet_baseline`, `dpdfnet2` (default), `dpdfnet4`, `dpdfnet8` at 16 kHz,
|
|
92
|
+
`dpdfnet2_48khz_hr` at 48 kHz; pass `sample_rate=48000` for that one) are Ceva's / the GTCRN
|
|
93
|
+
authors' public ONNX exports, hosted in the `models` release (each with a `.readme` and `.sha256`)
|
|
94
|
+
and downloaded on first use. Checked against sherpa-onnx 1.13.8 on its
|
|
95
|
+
9.8 s sample clip: max |difference| 1.5e-7 (float precision) for GTCRN and the four 16 kHz
|
|
96
|
+
DPDFNet models, 1.4e-5 for the 48 kHz one. Two deliberate differences: the output always has the
|
|
97
|
+
input's length (sherpa-onnx drops the last `len % hop` samples), and DPDFNet's 4-hop latency is
|
|
98
|
+
compensated by flushing the model with silence, so its last 40 ms are real output instead of
|
|
99
|
+
zeros. Single thread, 9.8 s of audio (not compared to anything else): GTCRN 0.8 s,
|
|
100
|
+
`dpdfnet_baseline` 1.4 s, `dpdfnet2` 2.9 s, `dpdfnet4` 4.0 s, `dpdfnet8` 6.3 s. DPDFNet's
|
|
101
|
+
optional attenuation limit is not exposed.
|
|
102
|
+
- `libspeech.available_providers()` and `libspeech.is_cuda_available()` (C++:
|
|
103
|
+
`speech::models::available_providers/is_cuda_available`): the ONNX Runtime providers of the loaded
|
|
104
|
+
build, and whether CUDA can really be created. Models still run on the CPU; selecting a provider
|
|
105
|
+
for a session is not implemented yet.
|
|
106
|
+
- Test marker `models` (real-model tests, run by `cmake.yml` only: `pytest -m models`).
|
|
107
|
+
- `benchmarks/profile/`: profiling README and C++ timing scripts for DCT/FFT (2026-10-05).
|
|
108
|
+
- DSP loops link `OpenMP_CXX`; the README documents the SIMD backends and the architecture-agnostic
|
|
109
|
+
vectorization logic (2026-10-02).
|
|
110
|
+
|
|
111
|
+
### Changed
|
|
112
|
+
- **httpp 0.7.x is required** (see above); libspeech no longer has its own download lock or SHA-256 code.
|
|
113
|
+
- Resample output is numerically more accurate than before (up to ~6e-3 different from the
|
|
114
|
+
old kernel). The default (`best`) is still ~8–18% slower than librosa/soxr on one core; use
|
|
115
|
+
`resample_quality` to trade accuracy for speed.
|
|
116
|
+
- **Documentation site rebuilt like ctoon's**: `-DBUILD_DOCS=ON` + `--target speech_docs` builds the
|
|
117
|
+
C++ reference (Doxygen, with doxygen-awesome-css), the Python reference (Sphinx, from the package
|
|
118
|
+
staged in the build tree), a route index (`docs/supported_langs.json`) and Markdown pages
|
|
119
|
+
(changelog, C++ API renames, contributing) into `<build>/docs/out/`; `speech_docs_cpp` and
|
|
120
|
+
`speech_docs_python` build one part. Needs `pip install sphinx doxygen-awesome-css markdown-it-py`.
|
|
121
|
+
- The Python bindings' CMake code moved from the top-level `CMakeLists.txt` to
|
|
122
|
+
`src/bindings/python/CMakeLists.txt`; `cmake/generate_stubs.cmake` is gone.
|
|
123
|
+
- Wheels: cibuildwheel 3.4.1 → 4.2.0 with explicit CPython version constraints; delvewheel repair is
|
|
124
|
+
disabled on Windows (it caused a missing `speech.dll`); the test dependencies exclude Intel macOS and
|
|
125
|
+
Python 3.15+ (numba → llvmlite wheel availability).
|
|
126
|
+
- The Python bindings bake the runtime library file names (ONNX Runtime, httpp) into `_about` at build time
|
|
127
|
+
instead of guessing them at import time (which failed because `dlopen` ignores the RPATH).
|
|
128
|
+
- Benchmarks import NumPy in isolation, so the timings are fair.
|
|
129
|
+
|
|
130
|
+
### Fixed
|
|
131
|
+
- **Windows: `SPEECH_LOG(ERROR)` messages were never printed.** `<windows.h>` defines `ERROR` as 0,
|
|
132
|
+
so the macro mapped it to the trace level. The severity is now pasted into a name
|
|
133
|
+
(`SPEECH_LOG_LEVEL_ERROR`) instead of being macro-expanded. Regression test on every platform
|
|
134
|
+
(`log.error_severity_is_not_hijacked_by_a_windows_style_error_macro`).
|
|
135
|
+
- **Windows wheel build: stub generation failed** with `No module named 'libspeech._about'`.
|
|
136
|
+
Multi-config generators (Visual Studio, Xcode, Ninja Multi-Config) append `Release/` to a plain
|
|
137
|
+
`LIBRARY_OUTPUT_DIRECTORY`, so the staged package was missing its modules; the staging directory is
|
|
138
|
+
now a generator expression, which switches that suffix off.
|
|
139
|
+
- `audio_callback` initialised a local `output` from itself (it shadowed the `output` parameter),
|
|
140
|
+
which is undefined behaviour (MSVC C4700).
|
|
141
|
+
- `Denoiser.create(...)` failed with "Unable to convert function return value".
|
|
142
|
+
- Destroying a `Denoiser` aborted the process (`free(): invalid pointer`, multiple-inheritance
|
|
143
|
+
pointer offset).
|
|
144
|
+
- **Facebook denoiser silently dropped everything after ~32 s of input** (the exported graph
|
|
145
|
+
works on a fixed window); longer input is now processed in overlapping, cross-faded windows
|
|
146
|
+
and the output has the input's length.
|
|
147
|
+
- **The Facebook models (`facebook-denoiser-dns48.onnx`, `-dns64.onnx`, `-master64.onnx`) take 4 to 7 s per call whatever the input length.** The graph
|
|
148
|
+
was traced with a 512000-sample example, so its `valid_length` was baked in as the constant
|
|
149
|
+
512085 and every input was zero-padded to ~32 s. A re-published model computes `valid_length`
|
|
150
|
+
from the input length inside the graph (same weights; 38 nodes replace the constant), measured
|
|
151
|
+
on one core, dns64: 0.1 s → 0.03 s, 1 s → 0.23 s, 5 s → 1.0 s, 32 s → ~7 s (dns48 1 s → 0.14 s,
|
|
152
|
+
master64 1 s → 0.17 s). All three had the same baked constant and are patched the same way. Output equals the old
|
|
153
|
+
model for 32 s inputs and differs by ~1e-3 (peak, at the tail) for 1 to 5 s inputs; not
|
|
154
|
+
compared against the PyTorch reference or on real speech. Existing installs keep the old file
|
|
155
|
+
in `~/.libspeech/` until it is deleted.
|
|
156
|
+
- `tests/python/test_logging.py` no longer relies on AudioFlux rejecting `FFT(99)` to produce an
|
|
157
|
+
error line (it failed on Windows CI).
|
|
158
|
+
- The real-FFT STFT path takes its analysis window from `window_calFFTWindow()`, the same function the
|
|
159
|
+
vendored AudioFlux uses, instead of reading it out of the opaque `stftObj_`; regression test for every
|
|
160
|
+
supported window type (`tests/dsp/test_fast_paths.cpp`).
|
|
161
|
+
- Python binding memory leak of `Denoiser` (the C++ object is held through a `shared_ptr` now); `close()`
|
|
162
|
+
frees the model's memory explicitly.
|
|
163
|
+
|
|
164
|
+
### Known issues
|
|
165
|
+
- Not run on Windows/macOS/ARM, or with several cores, while this version was written (Linux, x86-64 only);
|
|
166
|
+
the new download code has never been compiled with MSVC. Check CI.
|
|
167
|
+
- GPU is not used: models run on the CPU (`available_providers()` / `is_cuda_available()` only report).
|
|
168
|
+
- The Facebook denoiser models are licensed CC-BY-NC-4.0 (non-commercial); `data/models.csv` says so
|
|
169
|
+
(`commercial_use=no`), and so does the model's `.readme`.
|
|
170
|
+
- A process killed during a download leaves its `*.new` files in the cache directory (harmless, not reused).
|
|
171
|
+
If two processes take over the same dead lock at the same moment they can write the same `.part` file;
|
|
172
|
+
the checksum catches the damage and the download fails instead of installing it.
|
|
173
|
+
- `STFT` outside n_fft 16..8192 uses the AudioFlux fallback, which is mutex-locked; `FFT` is not
|
|
174
|
+
thread-safe.
|
|
175
|
+
|
|
176
|
+
## 0.3.1 (2026-10-01; the version was bumped, no git tag)
|
|
177
|
+
|
|
178
|
+
### Added
|
|
179
|
+
- Python benchmark suite (`benchmarks/`) comparing libspeech with librosa, audioflux, scipy and soundfile for
|
|
180
|
+
time, memory and install size, with a standalone HTML report (`report/`); the CMake targets skip Python when
|
|
181
|
+
there is no interpreter.
|
|
182
|
+
- `benchmarks/README.md` documents the measured results and the optimized paths: flat spectrogram, block-wise
|
|
183
|
+
MFCC with sparse mel filters, AVX2+FMA resampling dispatch, memory-efficient `load`/`to_numpy`.
|
|
184
|
+
|
|
185
|
+
### Changed
|
|
186
|
+
- README: table of contents, dependency text now names `httpp` (not httplib + Mbed TLS), the STFT/OpenMP
|
|
187
|
+
benchmark explanation separates single-core from multi-core results; the benchmarking section was removed
|
|
188
|
+
from the README (the raw data is kept locally).
|
|
189
|
+
|
|
190
|
+
## 0.3.0 (2026-09-29)
|
|
191
|
+
|
|
192
|
+
### Added
|
|
193
|
+
- Build options for documentation and coverage (`-DBUILD_DOCS=ON`, `-DBUILD_COVERAGE=ON`); coverage of all
|
|
194
|
+
components is merged into one `speech_coverage_total` report; CI builds with `BUILD_PYTHON=ON` so the tests
|
|
195
|
+
are installed and reported.
|
|
196
|
+
|
|
197
|
+
### Removed
|
|
198
|
+
- The `dr_libs` submodule: `miniaudio` already embeds `dr_wav`, `dr_mp3` and `dr_flac`.
|
|
199
|
+
- The command-line tool, and the unused Python files `libspeech/core.py` and `libspeech/__main__.py`
|
|
200
|
+
(0 % coverage, leftovers of an earlier split).
|
|
201
|
+
|
|
202
|
+
## 0.2.0 (2026-09-27)
|
|
203
|
+
|
|
204
|
+
### Fixed
|
|
205
|
+
- The CPython 3.12 wheel got the wrong ABI tag: the `CIBW_ENVIRONMENT_CP312` variable did nothing
|
|
206
|
+
(cibuildwheel ignores Python-version suffixes) and was removed; `tool.cibuildwheel.overrides` now forces
|
|
207
|
+
`cp312-abi3`.
|
|
208
|
+
- Clang's `-Wc23-extensions` warning caused by the vendored miniaudio is silenced.
|
|
209
|
+
|
|
210
|
+
## 0.1.1 (2026-09-26)
|
|
211
|
+
|
|
212
|
+
### Fixed
|
|
213
|
+
- Linux wheels ship and load ONNX Runtime under its SONAME (`libonnxruntime.so.1`) instead of the
|
|
214
|
+
fully-versioned file name; CMake's `install()` followed the symlinks and shipped duplicate ~20 MB copies.
|
|
215
|
+
|
|
216
|
+
## 0.1.0 (2026-09-26)
|
|
217
|
+
|
|
218
|
+
First tagged release. Everything from 2026-08-27 up to the first release:
|
|
219
|
+
|
|
220
|
+
### Added
|
|
221
|
+
- `speech::dsp` as a standalone static library (`speech_dsp`), a direct DCT-II implementation, and an STFT
|
|
222
|
+
of its own; AudioFlux is no longer a submodule (a subset of its C sources lives in `src/third_party/`,
|
|
223
|
+
moved there from `src/vendor/`); `fftObj_idct()`'s input mutation is documented; `resampleObj_setSamplate`
|
|
224
|
+
handles identity resamples.
|
|
225
|
+
- `BUILD_MODELS` (replaces `SPEECH_DSP_ONLY`) to build the DSP layer alone, and a unit-test build option.
|
|
226
|
+
- Python bindings for the speech models (`bind_models`), Python tests, version handling
|
|
227
|
+
(`include/libspeech/version.h`), `CONTRIBUTING.md`, a standalone benchmarking project for STFT.
|
|
228
|
+
- Model downloads use `httpp` (HTTP client with a progress bar), replacing httplib, Mbed TLS and indicators.
|
|
229
|
+
- CI: a matrix build for CMake and an orchestrator for the wheels and the release.
|
|
230
|
+
|
|
231
|
+
### Fixed
|
|
232
|
+
- Windows/MSVC: compilation (`NOMINMAX`, `M_PI`, `setenv`), AudioFlux and ONNX Runtime compatibility,
|
|
233
|
+
public API symbols exported from the DLL, static library members forced into `speech.dll`, ONNX Runtime and
|
|
234
|
+
httpp DLLs copied beside executables, `speech.dll` installed in the wheel, DLL load failures diagnosed.
|
|
235
|
+
- macOS: arm64 suffix for ONNX Runtime, universal2 ONNX Runtime and dylib names, deployment target 13.3,
|
|
236
|
+
wheel repair.
|
|
237
|
+
- Wheels: `$ORIGIN` RPATH and the ONNX Runtime SONAME shipped; musllinux and win32 wheels are skipped (ONNX
|
|
238
|
+
Runtime is glibc-only); the runtime library file names are baked into `_about`; httpp is required
|
|
239
|
+
unconditionally and loaded from pip instead of being bundled; the `pefile` dependency was replaced by an
|
|
240
|
+
inline PE import-table parser and then removed; Python bindings consolidated with explicit install rules for
|
|
241
|
+
the nested package.
|
|
242
|
+
|
|
243
|
+
## Before 0.1.0 (2025-03-14 to 2025-03-31)
|
|
244
|
+
|
|
245
|
+
The first prototype, in the order of the commits:
|
|
246
|
+
- Audio I/O with miniaudio and dr_libs, a `speech` namespace for `Audio`, a fixed `play()`, Python audio
|
|
247
|
+
bindings, `seconds`, a format function and `operator=`.
|
|
248
|
+
- ONNX Runtime support with a base model class, model download with a progress bar (indicators, then a
|
|
249
|
+
generated progress-bar source), and Silero VAD (fixed on 2025-03-17).
|
|
250
|
+
- AudioFlux (first as a submodule, then static) and `resample`; glog replaced by AixLog.
|
|
251
|
+
- A GitHub workflow, a different way to install onnxruntime for CPython, a simple HTML test, README and the
|
|
252
|
+
libspeech logo (many iterations).
|