Skip to main content

LibSpeech Logo

LibSpeech

Lightweight Speech Processing Library

C++ library with Python bindings for audio I/O, DSP, and ONNX-based speech models -- built to install with nothing but pip, no system dependencies (libcurl, OpenSSL, ...) required.

GitHub release License Python Versions C++ Standard

Build Status Code Quality CodeFactor snyk.io PyPI Downloads

Contents

✨ Key Features

  • 🚀 ONNX Runtime powered models, without a heavy LibTorch dependency
  • 🎙️ Audio I/O (speech::io): load/save WAV/MP3/FLAC, playback, resample, mono-mixing
  • 🧮 DSP (speech::dsp): Resample, window functions, FFT/IFFT, DCT/IDCT, STFT/ISTFT, MFCC -- all with their own C++ unit tests and Python bindings
  • 🔊 Speech models (speech::models): a Denoiser interface (Facebook, SpeechBrain, GTCRN and DPDFNet backends) and Silero VAD
  • 🖥️ Cross-platform: Windows, Linux, macOS
  • 🐍 Python bindings (nanobind) mirroring the C++ API 1:1
  • 📦 Zero system dependencies: no apt install libcurl-dev / OpenSSL needed -- HTTPS model downloads go through httpp (pip install httpp), a separately-installed package with its own prebuilt HTTP(S) client and progress bar

📦 Installation

Python package

pip install libspeech

From source (C++/CMake)

git clone https://github.com/MohammadRaziei/libspeech.git
cd libspeech
git submodule update --init src/third_party/miniaudio

# speech::models (BUILD_MODELS=ON, the default) needs httpp on
# CMAKE_PREFIX_PATH for model downloads (HTTPS client + progress bar) --
# no more Mbed TLS/libcurl to build, just:
pip install httpp

mkdir build && cd build
cmake ..                      # downloads ONNX Runtime automatically on first configure
cmake --build . -j$(nproc)
ctest                         # runs the full test suite (see "Testing" below)

Only want the DSP layer (no ONNX Runtime/network access needed at all)?

cmake .. -DBUILD_MODELS=OFF
cmake --build . -j$(nproc)

🚀 Quick Start

Python

import libspeech

# --- Audio I/O ---
audio = libspeech.Audio()
audio.load("sample.wav")
mono = audio.to_mono()
resampled = mono.resample(16000)
resampled.save("sample_16k_mono.wav")

# --- DSP ---
mfcc = libspeech.MFCC(libspeech.MFCCParams())
coefficients = mfcc.compute(resampled.data(0))   # [num_frames][num_coefficients]

# --- NumPy: float32 in, NumPy out, no list conversion ---
x = resampled.to_numpy()                          # float32 1-D array (any float array works)

# The everyday functions follow librosa: keyword-only n_fft / hop_length / window / center,
# a one-sided complex64 result of shape (bins, frames), center=True padding.
z = libspeech.stft(x, n_fft=512, hop_length=128)  # (257, frames) -- same as librosa.stft(x, ...)
y = libspeech.istft(z, hop_length=128, length=len(x))

# The classes keep a transform around and give you control of the layout:
stft = libspeech.STFT(n_fft=512, hop_length=128)  # or STFT(9, ...): the exponent form
z = stft.stft_complex(x, onesided=True)           # (frames, 257) complex64, written in place
y = stft.istft(z, "weighted")                     # "weighted" (default) or "plain"
re, im = stft.stft(x)                             # the older (re, im) pair; onesided=False = all 512 bins

fft = libspeech.FFT(12)
spectrum = fft.fft(x[:4096])                      # complex64, like np.fft.fft (fft.ifft inverts it)
re, im = fft.forward(x[:4096])                    # the same as a pair; also inverse/dct/idct

# --- Speech models ---
# Denoiser("facebook") uses the backend's standard model (downloaded to ~/.libspeech on first use);
# model="path-or-url.onnx" picks another. `with` frees the model's memory on exit (or call close()).
# Calling it takes a list or a 1-D NumPy array (and returns the same kind) and lets other Python
# threads run meanwhile. num_threads: 1 (default), or 0 = one ONNX Runtime thread per hardware thread.
with libspeech.Denoiser("facebook") as denoiser:
    clean = denoiser(resampled.to_numpy())
    print(denoiser.readme())        # what the model is, who made it, its license (also: .model_path, .sha256)

# Every model is downloaded together with <model>.onnx.sha256 (fetched first, checked, then the model is
# hashed and compared) and <model>.onnx.readme. A cached model is verified on every load.
# ignore_cache=True downloads everything again. data/models.csv lists all models and their licenses.
denoiser = libspeech.Denoiser("gtcrn", ignore_cache=True)
path = libspeech.fetch_model("dpdfnet2.onnx")       # just download + verify, returns the file path
text = libspeech.model_readme("silero-vad.onnx")
digest = libspeech.sha256_file(path)                # also libspeech.sha256(data)

vad = libspeech.SileroVad()
vad.process(resampled.data(0))
for segment in vad.get_speech_timestamps():
    print(f"speech from {segment.start_s:.2f}s to {segment.end_s:.2f}s")

C++

#include "libspeech/audio.h"
#include "libspeech/dsp/mfcc.h"
#include "libspeech/models/denoiser.h"

speech::io::audio audio;
audio.load("sample.wav");
auto resampled = audio.to_mono().resample(16000);

speech::dsp::mfcc::params params;
params.sample_rate = 16000;
speech::dsp::mfcc mfcc(params);
auto coefficients = mfcc.compute(resampled.data(0));

auto denoiser = speech::models::denoiser::create("facebook", "facebook_denoiser.onnx");
auto clean = denoiser->process(resampled.data(0));   // also: process(const float*, size_t)
denoiser->close();                                    // optional: frees the model now, not at destruction

See examples/ for complete, runnable programs.

Views for C++ (no copies, no allocations)

speech::span<T> (a pointer and a length; a C++17 stand-in for std::span) and speech::frame_view<T> (a buffer cut into frames) bundle what the raw-buffer calls otherwise take as loose arguments. A std::vector converts to a span automatically; the pointer forms of every call stay available.

#include "libspeech/dsp/stft.h"
speech::dsp::stft analysis(9, speech::dsp::window_type::hann, 128);

// Frames of a signal, as the stft cuts them (no copy), and a spectrogram frame by frame:
for (speech::span<const float> frame : analysis.frames(signal)) { /* N samples */ }
auto spec = analysis.spectrogram(signal.data(), signal.size(), /*onesided=*/true);
for (auto frame : spec.frames())              // one spectrum
    for (std::complex<float> bin : frame)     // one bin: two references, nothing allocated
        energy += std::norm(bin);

// Straight into interleaved std::complex<float> (= NumPy complex64), then back:
const int frames = analysis.cal_time_length(signal.size()), bins = analysis.num_bins(true);
std::vector<std::complex<float>> out(frames * bins);
analysis.stft_onesided_into(signal, speech::frame_view<std::complex<float>>(out.data(), frames, bins));
auto back = analysis.istft(speech::frame_view<const std::complex<float>>(out.data(), frames, bins));

Complex data comes in two layouts, and both iterate without allocating. Interleaved storage (complex64, std::complex<float>[]) is a plain reinterpret_cast (speech::as_complex()), so its iterator yields real std::complex<float>&. Split planes (all real parts, then all imaginary parts, as in complex_spectrogram) cannot be reinterpreted, so split_complex_span hands out a two-reference proxy that converts to and from std::complex<float>.

Logging

libspeech is quiet by default: it only writes warnings and errors to stderr. Turn the detail up (or everything off) from Python, C++, or the environment:

import libspeech
libspeech.set_log_level("debug")   # trace | debug | info | warning (default) | error | off
libspeech.get_log_level()          # "debug"
#include "libspeech/utils/log.h"
speech::utils::set_log_level(speech::utils::log_level::off);
LIBSPEECH_LOG=debug python my_script.py   # the starting level; set_log_level() overrides it

Lines look like 2026-10-09 12:00:00.123 [debug] (speech::dsp::FFT) Created FFT: ....

🧪 Testing

Tests are organized by language and module (speech_test_<language>_<module>), all discoverable via cmake --build build --target help:

speech_test                       # everything
├── speech_test_cpp
│   ├── speech_test_cpp_dsp       # speech::dsp (C++), no network/ONNX needed
│   └── speech_test_cpp_models    # speech::models (C++)
└── speech_test_python
    ├── speech_test_python_audio  # libspeech.Audio
    ├── speech_test_python_dsp    # libspeech.Resample/FFT/STFT/MFCC/...
    ├── speech_test_python_numpy_api       # NumPy in/out fast paths
    ├── speech_test_python_simd            # SIMD backend selection and agreement
    ├── speech_test_python_librosa_compat  # load/save/resample/STFT/MFCC vs librosa
    └── speech_test_python_models # libspeech.Denoiser/SileroVad

The librosa cross-checks need the test extra (pip install "libspeech[test]" installs librosa, soundfile, scipy and numpy); without them that module skips itself.

Run everything with cmake --build build --target speech_test, or just ctest for the same suites without the extra build-tool chatter.

Docs & coverage

cmake .. -DBUILD_DOCS=ON && cmake --build . --target speech_docs   # -> build/docs/out/index.html (C++ via Doxygen, Python via Sphinx)

Coverage follows the same layout as ctoon: one target per component, a merged total, and a dashboard tying the reports together.

cmake .. -DBUILD_PYTHON=ON -DBUILD_COVERAGE=ON   # + `pip install coverage`, lcov/genhtml on PATH
cmake --build . --target speech_coverage         # everything below, then the merge + dashboard
Target Covers Output (under build/coverage/)
speech_coverage_cpp_dsp speech::dsp (utest.h suite) cpp_dsp/
speech_coverage_cpp_models speech::models + download utils cpp_models/
speech_coverage_python the Python package's .py files (coverage.py) python/
speech_coverage_total lcov merge of all of the above total/

Open build/coverage/index.html for the dashboard. Each component (and the total) also leaves a plain coverage.lcov next to its HTML, which is what CI uploads to Codecov. BUILD_COVERAGE is off by default: it instruments speech_dsp/speech_models with --coverage, which you don't want in a normal build. Without BUILD_PYTHON you just get the C++ components.

🔧 Architecture

libspeech is split into three independent C++ libraries (each with its own CMake target/namespace/Python module), aggregated by an umbrella speech library:

Namespace CMake target Python module Depends on
speech::dsp speech_dsp speech_dsp_py nothing but a vendored subset of AudioFlux's C sources
speech::io speech_io speech_io_py speech::dsp (for resampling), miniaudio
speech::models speech_models speech_models_py ONNX Runtime, httpp (for downloading model weights)

See checklist.md for the detailed, up-to-date state of the project (what's done, what's in progress, known issues), and audioflux_issues.md for a couple of real bugs found in AudioFlux while vendoring it (with repro steps and fixes, in case they're useful upstream).

SIMD and portability

Kernels that benefit from explicit SIMD (today the polyphase resampler, ~2.3x over its portable twin on AVX2) have a portable C++ implementation plus vectorized twins that are selected at run time from the CPU, never from build flags -- so one wheel or one default CMake build is correct on every machine of its architecture and fast on the capable ones. No -march=native, no per-ISA build variants. The real-input FFT behind STFT/MFCC is plain portable C++ that the compiler vectorizes for the baseline ISA: a hand-targeted AVX2 clone of it was measured (n_fft 64-8192) and was never faster, so it was dropped.

Target Fast path Compilers Notes
x86 / x86-64 AVX2 + FMA (CPUID and OS YMM-state checked) GCC, Clang, MSVC MSVC path is written but not yet built in CI -- see below
ARM64 (Linux, macOS, Windows) NEON GCC, Clang, MSVC
anything else (32-bit ARM, RISC-V, ...) portable C++ any C++17 compiler the compiler may still auto-vectorize it
import libspeech
libspeech.simd_backend()        # 'avx2+fma' | 'neon' | 'generic'
libspeech.set_simd_enabled(False)   # run-time switch (objects/calls created afterwards)
  • Environment: LIBSPEECH_SIMD=off forces the portable kernels (LIBSPEECH_DISABLE_AVX2=1 still works).
  • All backends are cross-checked against each other and against independent references in tests/dsp/test_fast_paths.cpp. The suite is run on x86-64 (GCC and Clang), 32-bit x86, AArch64 (under QEMU), and with SIMD disabled at run time.
  • MSVC: the AVX2 resampler and the CPUID/XGETBV detection are written against MSVC's intrinsics but have not been compiled with cl yet (no Windows toolchain was available when this was written). If anything misbehaves there, LIBSPEECH_SIMD=off falls back to the portable code at run time.
  • Layout for contributors: support is decided in the sources, not the build system. src/dsp/simd_internal.h holds every architecture/compiler macro (LS_HAVE_X86_AVX2, LS_HAVE_ARM_NEON, LS_TARGET_AVX2, ...): #if LS_HAVE_X86_AVX2 the AVX2 kernel is compiled and used when the CPU has it, otherwise the portable one is. Kernels never test __x86_64__/_MSC_VER directly.

🤝 Contributing

We welcome contributions! Please see CONTRIBUTING.md.

📄 License

This project is licensed under the Apache License 2.0 - see LICENSE and NOTICE. The ONNX models it downloads have their own licenses (see data/models.csv; the Facebook denoiser models are non-commercial, CC BY-NC 4.0).

Stars

Metadata

Release files for libspeech 0.4.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for libspeech 0.4.0
File Size Uploaded Provenance
libspeech-0.4.0.tar.gz 390.5 kB Without provenance Details

Built distributions (wheels)

Table of built distributions (wheels) for libspeech 0.4.0
File
libspeech-0.4.0-cp312-abi3-win_amd64.whl CPython 3.12 abi3 Windows x86-64 Details
libspeech-0.4.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.12 abi3 Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 Details
libspeech-0.4.0-cp312-abi3-macosx_13_0_universal2.whl CPython 3.12 abi3 macOS 13.0+ universal2 (ARM64, x86-64) Details
libspeech-0.4.0-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details
libspeech-0.4.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 Details
libspeech-0.4.0-cp311-cp311-macosx_13_0_universal2.whl CPython 3.11 CPython 3.11 macOS 13.0+ universal2 (ARM64, x86-64) Details
libspeech-0.4.0-cp310-cp310-win_amd64.whl CPython 3.10 CPython 3.10 Windows x86-64 Details
libspeech-0.4.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.27+ x86-64, Linux glibc 2.28+ x86-64 Details
libspeech-0.4.0-cp310-cp310-macosx_13_0_universal2.whl CPython 3.10 CPython 3.10 macOS 13.0+ universal2 (ARM64, x86-64) Details
libspeech-0.4.0-cp39-cp39-win_amd64.whl CPython 3.9 CPython 3.9 Windows x86-64 Details
libspeech-0.4.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.9 CPython 3.9 Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 Details
libspeech-0.4.0-cp39-cp39-macosx_13_0_universal2.whl CPython 3.9 CPython 3.9 macOS 13.0+ universal2 (ARM64, x86-64) Details

Total release size: 146.1 MB

Release files / libspeech-0.4.0.tar.gz

Download URL libspeech-0.4.0.tar.gz
Size 390.5 kB
Tags Source
SHA-256 checksum
How to use checksums
d997bd69cf54f428227a1da0dca6072884a3714c45549fa3b66998b174a1eaa3
BLAKE2b-256 checksum
How to use checksums
5d307cffd5d2fa74d7cadcad8db6cf651e9f111a69acf8295bb95d61d2a31c2a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / libspeech-0.4.0-cp312-abi3-win_amd64.whl

Download URL libspeech-0.4.0-cp312-abi3-win_amd64.whl
Size 5.8 MB
Tags CPython 3.12 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
18678f0a493cc652fbd31e84a6c53fa3039c034d668626ddf834062e33a8f847
BLAKE2b-256 checksum
How to use checksums
3cbd72128a0a92f2dff24c5e646126d8ed7b13b5f774c3caf9284173ccf4ddb7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / libspeech-0.4.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL libspeech-0.4.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 9.2 MB
Tags CPython 3.12 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
b91e9f1adefa470001ac499f7c37ec3e7fc6ce266ce3908a6458796984f3e220
BLAKE2b-256 checksum
How to use checksums
d089825d4642ea51f99d03fe606a9b22040a6b0a8e2b88348bd70f13847ff5b1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / libspeech-0.4.0-cp312-abi3-macosx_13_0_universal2.whl

Download URL libspeech-0.4.0-cp312-abi3-macosx_13_0_universal2.whl
Size 21.5 MB
Tags CPython 3.12 abi3 macOS 13.0+ universal2 (ARM64, x86-64)
SHA-256 checksum
How to use checksums
a3eb608b62b870e3951cfde706175cbd5d0b3c20b550a091d62d7fd1ef268fa5
BLAKE2b-256 checksum
How to use checksums
afe83eff1d3f1c7a75960f5ab532fcfc6889df197a7be0a7d039069418dd5a47
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / libspeech-0.4.0-cp311-cp311-win_amd64.whl

Download URL libspeech-0.4.0-cp311-cp311-win_amd64.whl
Size 5.8 MB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
a8f164756f8bd97b59e1eb3c1c137017fc22587354747c8536dc51ca9dc313de
BLAKE2b-256 checksum
How to use checksums
ed5720a16fc612efc7c52ef45b33e17b4a392e2c98e725681cd29f440f3a9ac1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / libspeech-0.4.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL libspeech-0.4.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 9.3 MB
Tags CPython 3.11 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
28c1c08daed4b7a34f119669b7bd8972122255b9c931afd88f0ef6d3b7987757
BLAKE2b-256 checksum
How to use checksums
163e221fe62d10a7fbc8963eef5ac470733d76c7626544c146ff48c6a1f0a9e8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / libspeech-0.4.0-cp311-cp311-macosx_13_0_universal2.whl

Download URL libspeech-0.4.0-cp311-cp311-macosx_13_0_universal2.whl
Size 21.5 MB
Tags CPython 3.11 macOS 13.0+ universal2 (ARM64, x86-64)
SHA-256 checksum
How to use checksums
ffafb073f7fbb80740488c7577cb7cc5339ae660fa66b0bd4e61b6a0386a5876
BLAKE2b-256 checksum
How to use checksums
8f82b9e91e442717e941af1e6580d90c57eb7aa29901ef383c946c013ab41e1f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / libspeech-0.4.0-cp310-cp310-win_amd64.whl

Download URL libspeech-0.4.0-cp310-cp310-win_amd64.whl
Size 5.8 MB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
6ccd912beb467d61ed4edbf9ed176503819b4157987523aa52bbf6859798e277
BLAKE2b-256 checksum
How to use checksums
9836b80bf8e4d3cae15bda9d68e2289fff7643a027e11d8bbfaddd28925deff3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / libspeech-0.4.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL libspeech-0.4.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 9.3 MB
Tags CPython 3.10 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
23c56b44257f8f988abef92525c6cf6636a7afd6e4656200a8e6644079ea1b0c
BLAKE2b-256 checksum
How to use checksums
023d842ac88d9f607454c3667e987c34be17cd5f6557ac3b07b74eb11ce97142
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / libspeech-0.4.0-cp310-cp310-macosx_13_0_universal2.whl

Download URL libspeech-0.4.0-cp310-cp310-macosx_13_0_universal2.whl
Size 21.5 MB
Tags CPython 3.10 macOS 13.0+ universal2 (ARM64, x86-64)
SHA-256 checksum
How to use checksums
fa59ebe5fb9cfba540d5aac548cb711fba8c984c69789e506c4f8df97a132ac2
BLAKE2b-256 checksum
How to use checksums
cd98829453b88ebb2ac55586ede80e609804ad63c55ae04fcace68c7635c7d8c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / libspeech-0.4.0-cp39-cp39-win_amd64.whl

Download URL libspeech-0.4.0-cp39-cp39-win_amd64.whl
Size 5.6 MB
Tags CPython 3.9 Windows x86-64
SHA-256 checksum
How to use checksums
7905c31f4336062fcd02db933e46fadf5cd0b8ac91eabfee030b2cc5bb09f5bd
BLAKE2b-256 checksum
How to use checksums
1817009f42964de5174e35aeb826243863bf4bd5ed824ac0139827255821929d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / libspeech-0.4.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL libspeech-0.4.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 9.2 MB
Tags CPython 3.9 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
d445f2844106e77b1b46a03a2e1151c840f9bdcc49e9be684ccf971d7173dfbe
BLAKE2b-256 checksum
How to use checksums
8d072340d99601a019e3d24183966a191ca5fede8a47e1f96df0464d0dce25c6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / libspeech-0.4.0-cp39-cp39-macosx_13_0_universal2.whl

Download URL libspeech-0.4.0-cp39-cp39-macosx_13_0_universal2.whl
Size 21.4 MB
Tags CPython 3.9 macOS 13.0+ universal2 (ARM64, x86-64)
SHA-256 checksum
How to use checksums
dc0ef900f930d1d1e98084f1c55d00e34966909053b2b6d0c480e76f66afb8ec
BLAKE2b-256 checksum
How to use checksums
53cd5dc77c37c7c9267fb7d81e5eebf36b0fff89a2fc5accd44e3f0e3cb84ced
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Security for libspeech 0.4.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page