You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
* Pin CUDA device order in service startup
Set CUDA_DEVICE_ORDER=PCI_BUS_ID in the service package __init__ (before
any submodule imports torch), matching the CLI. Without it, CUDA's
default FASTEST_FIRST ordering made REFINERY_DEVICE=cuda:N select a
different physical GPU than nvidia-smi index N on multi-GPU hosts, so
the service could load models onto the wrong card.
* Fix and expand service-mode operations docs
Correct the tmpfs example to --mount type=tmpfs,dst=/scratch,
tmpfs-mode=1777 in service.md and deployment.md; a bare --tmpfs
/scratch mounts root-owned and fails every job with PermissionError.
Add a GPU-selection section, an end-to-end local-directory batch
runbook, and troubleshooting entries (tmpfs perms, wrong-GPU, batch
cap) to service.md.
* Add project banner to README
Add the Audio Refinery banner (118 KB JPG) centered at the top of the
README. The image lives in docs/images/ because the repo-root assets/
tree is gitignored.
* Prepare release v0.2.1
Patch release: service GPU-ordering fix plus service-mode doc
corrections and the README banner. Bump version and add the CHANGELOG
entry.
* Reference side-effect import in service init test
Assert on src.service.__name__ so the deliberate side-effect import
(which triggers the CUDA_DEVICE_ORDER default) is no longer flagged as
unused by CodeQL, and drop the now-unnecessary noqa.
* Log alignment fallback and note default model
Log the WhisperX forced-alignment failure at debug level (with the
detected language and device) before falling back to transcription-only
segments, instead of swallowing the exception silently. Document the
default large-v3 model in the module docstring.
* Normalize HuggingFace to Hugging Face
Use the official two-word company name consistently across docs, source
docstrings/help text, error messages, and tests. Error-string changes
in diarizer.py and their test assertions move together.
* Bump vulnerable transitive and dev dependencies
Upgrade aiohttp 3.13.3 -> 3.13.5, requests 2.32.5 -> 2.34.2, Pygments
2.19.2 -> 2.20.0, and pytest 9.0.2 -> 9.0.3 to their patched versions,
closing 13 Dependabot alerts. torch and transformers stay pinned
(WhisperX); those alerts wait for v0.3.0.
* Clarify CUDA_DEVICE_ORDER defaults and harden its test
Reword "pins" to "defaults ... (respecting an explicit override)" in the
service __init__ comment, service.md, and the CHANGELOG to match the
os.environ.setdefault behavior. Rewrite the test with monkeypatch +
importlib.reload so it deterministically covers both the default-when-
unset and respect-explicit-override branches.
Copy file name to clipboardExpand all lines: CHANGELOG.md
+18-1Lines changed: 18 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -5,6 +5,23 @@ All notable changes to this project will be documented in this file.
5
5
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
8
+
## [0.2.1] - 2026-05-21
9
+
10
+
### Fixed
11
+
12
+
- Service mode now defaults `CUDA_DEVICE_ORDER` to `PCI_BUS_ID` at startup (matching the CLI, respecting an explicit override), so `REFINERY_DEVICE=cuda:N` selects the GPU at `nvidia-smi` index N rather than CUDA's default FASTEST_FIRST ordering. Previously a multi-GPU host could load models onto the wrong card.
13
+
- WhisperX forced-alignment failures are now logged at debug level (with the detected language and device) before falling back to transcription-only segments, instead of being swallowed silently.
14
+
15
+
### Documentation
16
+
17
+
- Corrected the service-mode tmpfs example to `--mount type=tmpfs,dst=/scratch,tmpfs-mode=1777`. A bare `--tmpfs /scratch` mounts root-owned, so the non-root `refinery` user could not write scratch and every job failed with `PermissionError`. Applied the same fix in `docs/deployment.md`.
18
+
- Added service-mode GPU-selection guidance, an end-to-end local-directory batch runbook, and troubleshooting entries (tmpfs permissions, wrong-GPU selection, batch-size cap) to `docs/service.md`.
19
+
- Added the project banner to the README.
20
+
21
+
### Security
22
+
23
+
- Upgraded vulnerable transitive and dev dependencies to patched versions: `aiohttp` 3.13.3 → 3.13.5, `requests` 2.32.5 → 2.34.2, `Pygments` 2.19.2 → 2.20.0, and `pytest` 9.0.2 → 9.0.3. Closes 13 Dependabot alerts (10 `aiohttp` plus `requests`, `Pygments`, `pytest`). The `torch` and `transformers` alerts remain deferred to v0.3.0, when WhisperX removal lifts the `torch==2.1.2` / `transformers<4.40` pins.
24
+
8
25
## [0.2.0] - 2026-05-20
9
26
10
27
### Added
@@ -54,7 +71,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
54
71
- Centralized Demucs scratch directory resolution in CLI — RAM disk detection and fallback confirmation now happen in one place
55
72
- Worker status reporting and failure aggregation in `pipeline-parallel` refactored for improved accuracy
56
73
-`python-dotenv` import in Slack notifier is now conditional — avoids import-time failure when the package is absent
Copy file name to clipboardExpand all lines: README.md
+19-15Lines changed: 19 additions & 15 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,3 +1,7 @@
1
+
<palign="center">
2
+
<imgsrc="docs/images/audio-refinery-banner.jpg"alt="Audio Refinery — whimsical audio processing for AI"width="820">
3
+
</p>
4
+
1
5
# Audio Refinery
2
6
3
7
GPU-accelerated audio processing pipeline: vocal separation (Demucs), speaker diarization (Pyannote), transcription (WhisperX), and text sentiment analysis. Its primary use case is building AI-ready audio databases — transforming raw recordings into structured, speaker-attributed JSON with word-level timestamps that feed directly into RAG pipelines, vector stores, and fine-tuning datasets. The pipeline uses a Ghost Track strategy: AI models run against a clean, music-free vocal stem to maximize accuracy, then the resulting metadata is applied back to the original audio, preserving its acoustic character. Designed to run on 24 GB consumer GPUs with all models resident in VRAM simultaneously, it processes large corpora in batch with no model reload overhead between files.
@@ -48,7 +52,7 @@ source .venv/bin/activate
48
52
# Install all deps (uv sync, whisperx, CUDA torch wheels, pre-commit hooks)
49
53
make dev-setup
50
54
51
-
# Copy the env template and add your HuggingFace token
55
+
# Copy the env template and add your Hugging Face token
52
56
cp .env.example .env
53
57
# Edit .env and set HF_TOKEN=hf_your_token_here
54
58
@@ -65,11 +69,11 @@ audio-refinery --help
65
69
66
70
## Prerequisites
67
71
68
-
### HuggingFace access token (required for diarization)
72
+
### Hugging Face access token (required for diarization)
69
73
70
-
Pyannote speaker diarization models are gated on HuggingFace. This applies to **both** CLI and service mode. Complete these steps once:
74
+
Pyannote speaker diarization models are gated on Hugging Face. This applies to **both** CLI and service mode. Complete these steps once:
71
75
72
-
1. Create a HuggingFace account at [huggingface.co](https://huggingface.co) if you don't have one.
76
+
1. Create a Hugging Face account at [huggingface.co](https://huggingface.co) if you don't have one.
73
77
2. Accept the license for each gated model (must be logged in):
|[Deployment](docs/deployment.md)| Production patterns, async workers, Docker, monitoring |
125
+
|[Development](docs/development.md)| Dev setup, testing, contributing, release process |
122
126
123
127
---
124
128
@@ -150,4 +154,4 @@ See [docs/development.md](docs/development.md) for the full developer guide, inc
150
154
151
155
**audio-refinery** is released under the [MIT License](LICENSE).
152
156
153
-
**Dependency note:** The Pyannote model weights (`pyannote/speaker-diarization-3.1` and `pyannote/segmentation-3.0`) are gated on HuggingFace under separate terms. If you run this tool in a commercial data product, verify that your HuggingFace account's accepted terms cover your use case. The MIT license on this software does not extend to the model weights — those are governed by their respective HuggingFace model cards.
157
+
**Dependency note:** The Pyannote model weights (`pyannote/speaker-diarization-3.1` and `pyannote/segmentation-3.0`) are gated on Hugging Face under separate terms. If you run this tool in a commercial data product, verify that your Hugging Face account's accepted terms cover your use case. The MIT license on this software does not extend to the model weights — those are governed by their respective Hugging Face model cards.
0 commit comments