{"id":50653984,"url":"https://github.com/fishaudio/opuscodec","last_synced_at":"2026-06-07T22:36:52.153Z","repository":{"id":342670575,"uuid":"1171391400","full_name":"fishaudio/opuscodec","owner":"fishaudio","description":null,"archived":false,"fork":false,"pushed_at":"2026-06-07T18:25:36.000Z","size":37,"stargazers_count":8,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-07T20:14:14.420Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fishaudio.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-03T07:14:13.000Z","updated_at":"2026-06-07T18:25:27.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/fishaudio/opuscodec","commit_stats":null,"previous_names":["fishaudio/opuscodec"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/fishaudio/opuscodec","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fishaudio%2Fopuscodec","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fishaudio%2Fopuscodec/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fishaudio%2Fopuscodec/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fishaudio%2Fopuscodec/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fishaudio","download_url":"https://codeload.github.com/fishaudio/opuscodec/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fishaudio%2Fopuscodec/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34041089,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-07T02:00:07.652Z","response_time":124,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-07T22:36:51.495Z","updated_at":"2026-06-07T22:36:52.147Z","avatar_url":"https://github.com/fishaudio.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# opuscodec\n\nPython bindings and self-contained Opus CLI builds, with **QEXT enabled by default**.\n\n`opuscodec` packages three things together:\n\n- `OpusBufferedEncoder` / `OpusBufferedDecoder` Python bindings\n- self-contained `opusenc` / `opusdec` release binaries\n- vendored Xiph dependencies, built from source when needed\n\nStable dependency set:\n\n- `opus` `1.6.1`\n- `opus-tools` `0.2`\n- `libogg` `1.3.6`\n- `opusfile` `0.12`\n- `libopusenc` `0.3`\n\n## Why this package\n\n- no system Opus install required by default\n- runtime + build-time QEXT control\n- Python API and CLI assets released from one repo\n- PyPI wheels for supported targets, source build fallback everywhere else\n\n## Installation\n\n### PyPI (recommended)\n\n```bash\npython -m pip install opuscodec==0.1.3\n```\n\n### GitHub Release asset\n\n```bash\npython -m pip install \"https://github.com/fishaudio/opuscodec/releases/download/v0.1.3/\u003cwheel-file-name\u003e.whl\"\n```\n\nExample Linux wheel install commands. Exact manylinux policy tags may include more than one compatible tag.\n\n```bash\npython -m pip install ./opuscodec-0.1.3-cp312-cp312-*x86_64.whl\npython -m pip install ./opuscodec-0.1.3-cp312-cp312-*aarch64.whl\n```\n\n### Source build\n\n```bash\nmake test\n```\n\nCommon commands:\n\n```bash\nmake install    # editable install + test deps\nmake test       # run pytest\nmake wheel      # build wheel into dist/wheels\nmake binaries   # build opusenc/opusdec into dist/bin\nmake clean      # clean build artifacts\n```\n\n## Python example\n\n```python\nimport numpy as np\nimport opuscodec\n\nsr = 48000\nx = (0.1 * np.sin(2 * np.pi * 440 * np.arange(sr) / sr) * 32767).astype(np.int16).reshape(-1, 1)\n\nenc = opuscodec.OpusBufferedEncoder(sample_rate=sr, channels=1)\npacket = enc.write(x) + enc.flush()\n\ndec = opuscodec.OpusBufferedDecoder()\ny = dec.decode(packet)\n\nprint(y.shape, opuscodec.opus_version(), opuscodec.qext_enabled(), enc.qext_enabled())\n```\n\nDisable runtime QEXT for one encoder instance:\n\n```python\nenc = opuscodec.OpusBufferedEncoder(sample_rate=48000, channels=1, qext=False)\n```\n\n## Standalone binary usage\n\nAfter downloading release binaries:\n\n```bash\ntar -xzf opuscodec-v0.1.3-linux-amd64-binaries.tar.gz\ntar -xzf opuscodec-v0.1.3-linux-arm64-binaries.tar.gz\nchmod +x opusenc opusdec\n```\n\n### WAV roundtrip\n\n```bash\n./opusenc input.wav output.opus\n./opusdec output.opus roundtrip.wav\n```\n\n`opusenc` enables QEXT by default in this repository build. Disable it explicitly for comparison tests:\n\n```bash\n./opusenc --set-ctl-int 4056=0 input.wav output-noqext.opus\n```\n\n### Raw PCM roundtrip\n\nEncode raw PCM (`mono`, `48k`, `s16le`) to Opus:\n\n```bash\n./opusenc --raw --raw-bits 16 --raw-rate 48000 --raw-chan 1 input.pcm output.opus\n```\n\nDecode Opus back to PCM:\n\n```bash\n./opusdec output.opus decoded.pcm\n```\n\n## Build configuration\n\nDefaults: vendored dependencies; QEXT enabled.\n\nOptional environment variables:\n\n- `OPUSCODEC_ENABLE_QEXT=0` — disable QEXT\n- `OPUSCODEC_USE_SYSTEM_DEPS=1` — use system libraries instead of vendored build\n- `OPUSCODEC_DEPS_PREFIX=/path/to/prefix` — custom dependency prefix\n\nWhen QEXT is enabled at build time, packaged `opusenc` binaries also enable `OPUS_SET_QEXT(1)` by default.\n\n## Repository layout\n\n```text\n.\n├── .github/workflows/build.yml\n├── Makefile\n├── pyproject.toml\n├── setup.py\n├── src/\n│   └── opuscodec_bindings.cpp\n├── scripts/\n│   ├── build_deps.sh\n│   └── build_binaries.sh\n├── tests/\n│   └── test_bindings.py\n├── opusenc.py\n└── opusdec.py\n```\n\n## Release automation\n\nOn tag push (for example `v0.1.3`), GitHub Actions will:\n\n- run tests on Linux + macOS\n- build PyPI-compatible manylinux wheels for Linux x86_64 + aarch64\n- build macOS arm64 wheels\n- build an `sdist`\n- publish wheel + sdist artifacts to PyPI via OIDC\n- create a GitHub Release and upload wheels + binary tarballs\n\n## License\n\nApache License 2.0. See [LICENSE](./LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffishaudio%2Fopuscodec","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffishaudio%2Fopuscodec","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffishaudio%2Fopuscodec/lists"}