diff --git a/README.md b/README.md index d31a575..4358fe7 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,14 @@ All clips are exactly 8 seconds — the standard length for foley sound datasets - **Hardware encoding** — GPU-accelerated export via NVENC, VAAPI, QSV, AMF, or VideoToolbox - **Subject tracking** — auto-adjust crop center using YOLOv8 detection (optional) +### Audio extraction & editing + +- **Extract audio area** — save an exact-length audio slice from the playhead (length steps by 1s, no upper cap) +- **Output format** — WAV / MP3 / FLAC / M4A / OGG / OPUS, remembered between sessions +- **Non-destructive edits** — fade in/out, EBU R128 normalize, and gain, applied via ffmpeg on extract (and audition) +- **Waveform preview** — a read-only strip of the current area (↻ to refresh; decode length-capped so long areas don't stall) +- **Audition** — Play/Stop the current area with the edits applied + ### Audio scanning - **Embedding models** — WAV2VEC2 (base/large), HuBERT (base/large/xlarge), BEATs @@ -43,6 +51,7 @@ All clips are exactly 8 seconds — the standard length for foley sound datasets - **Hard negatives** — mark false positives to refine training - **Model versioning** — timestamped backups with rollback support - **Scan export** — batch export from scan results with spread and minimum duration filtering +- **Location** — scan controls live in the **Audio** tab's *Scan / Classify* pane (formerly the *Scan* tab) ### Scan results panel diff --git a/main.py b/main.py index 2b03989..e77708b 100755 --- a/main.py +++ b/main.py @@ -4471,7 +4471,6 @@ class MainWindow(QMainWindow): # Extract audio area — an exact-length audio slice from the playhead, # saved via a Save As dialog (format follows the chosen extension). - transport_row.addSpacing(12) self._spn_audio_len = QDoubleSpinBox() # No practical upper cap — audio areas can be minutes long; ffmpeg stops # cleanly at end-of-file if the source is shorter. Arrows step by 1s; @@ -4972,9 +4971,21 @@ class MainWindow(QMainWindow): # ── Changelog ──────────────────────────────────────────── - APP_VERSION = "1.2" + APP_VERSION = "1.3" _SPLIT_HEADER_H = 22 # deck split-column header height (keep both deck spots in sync) CHANGELOG: list[tuple[str, list[str]]] = [ + ("1.3", [ + "Audio workspace tab — the Scan control-deck tab is " + "now Audio, a QToolBox with two panes. " + "Extract & Edit has the audio-area length, an output " + "format picker (WAV / MP3 / FLAC / M4A / OGG / OPUS, " + "remembered), non-destructive fade in/out, normalize, and " + "gain applied on extract, a read-only waveform strip " + "(↻ to refresh), and Play/Stop audition of the current area " + "with the edits applied. Scan / Classify keeps the model, " + "threshold, and scan/auto/speech/review controls. The extract " + "length + button moved off the transport row into this tab.", + ]), ("1.2", [ "Per-tab export folder — each file-list tab now remembers " "its own output folder; switching tabs follows that tab's folder. "