yt-dbl 1.0.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.
Files changed (64) hide show
  1. yt_dbl-1.0.0/.coveragerc +14 -0
  2. yt_dbl-1.0.0/.env.example +4 -0
  3. yt_dbl-1.0.0/.github/workflows/ci.yml +68 -0
  4. yt_dbl-1.0.0/.github/workflows/release.yml +43 -0
  5. yt_dbl-1.0.0/.gitignore +14 -0
  6. yt_dbl-1.0.0/.pre-commit-config.yaml +50 -0
  7. yt_dbl-1.0.0/CHANGELOG.md +474 -0
  8. yt_dbl-1.0.0/PKG-INFO +364 -0
  9. yt_dbl-1.0.0/README.md +331 -0
  10. yt_dbl-1.0.0/justfile +87 -0
  11. yt_dbl-1.0.0/mypy.ini +52 -0
  12. yt_dbl-1.0.0/pyproject.toml +76 -0
  13. yt_dbl-1.0.0/pytest.ini +16 -0
  14. yt_dbl-1.0.0/ruff.toml +91 -0
  15. yt_dbl-1.0.0/src/yt_dbl/__init__.py +4 -0
  16. yt_dbl-1.0.0/src/yt_dbl/cli.py +281 -0
  17. yt_dbl-1.0.0/src/yt_dbl/config.py +169 -0
  18. yt_dbl-1.0.0/src/yt_dbl/models/__init__.py +12 -0
  19. yt_dbl-1.0.0/src/yt_dbl/models/manager.py +152 -0
  20. yt_dbl-1.0.0/src/yt_dbl/models/registry.py +128 -0
  21. yt_dbl-1.0.0/src/yt_dbl/pipeline/__init__.py +23 -0
  22. yt_dbl-1.0.0/src/yt_dbl/pipeline/assemble.py +321 -0
  23. yt_dbl-1.0.0/src/yt_dbl/pipeline/base.py +114 -0
  24. yt_dbl-1.0.0/src/yt_dbl/pipeline/download.py +167 -0
  25. yt_dbl-1.0.0/src/yt_dbl/pipeline/runner.py +197 -0
  26. yt_dbl-1.0.0/src/yt_dbl/pipeline/separate.py +161 -0
  27. yt_dbl-1.0.0/src/yt_dbl/pipeline/synthesize.py +383 -0
  28. yt_dbl-1.0.0/src/yt_dbl/pipeline/transcribe.py +458 -0
  29. yt_dbl-1.0.0/src/yt_dbl/pipeline/translate.py +266 -0
  30. yt_dbl-1.0.0/src/yt_dbl/py.typed +0 -0
  31. yt_dbl-1.0.0/src/yt_dbl/schemas.py +179 -0
  32. yt_dbl-1.0.0/src/yt_dbl/utils/__init__.py +0 -0
  33. yt_dbl-1.0.0/src/yt_dbl/utils/audio.py +105 -0
  34. yt_dbl-1.0.0/src/yt_dbl/utils/audio_processing.py +227 -0
  35. yt_dbl-1.0.0/src/yt_dbl/utils/languages.py +81 -0
  36. yt_dbl-1.0.0/src/yt_dbl/utils/logging.py +248 -0
  37. yt_dbl-1.0.0/src/yt_dbl/utils/memory.py +45 -0
  38. yt_dbl-1.0.0/tests/__init__.py +1 -0
  39. yt_dbl-1.0.0/tests/conftest.py +309 -0
  40. yt_dbl-1.0.0/tests/e2e/__init__.py +5 -0
  41. yt_dbl-1.0.0/tests/e2e/conftest.py +17 -0
  42. yt_dbl-1.0.0/tests/e2e/test_e2e_download.py +143 -0
  43. yt_dbl-1.0.0/tests/e2e/test_e2e_pipeline.py +102 -0
  44. yt_dbl-1.0.0/tests/e2e/test_e2e_separate.py +137 -0
  45. yt_dbl-1.0.0/tests/e2e/test_e2e_transcribe.py +126 -0
  46. yt_dbl-1.0.0/tests/integration/__init__.py +1 -0
  47. yt_dbl-1.0.0/tests/integration/test_cli.py +240 -0
  48. yt_dbl-1.0.0/tests/integration/test_download.py +203 -0
  49. yt_dbl-1.0.0/tests/integration/test_runner.py +353 -0
  50. yt_dbl-1.0.0/tests/unit/__init__.py +1 -0
  51. yt_dbl-1.0.0/tests/unit/test_assemble.py +632 -0
  52. yt_dbl-1.0.0/tests/unit/test_audio.py +162 -0
  53. yt_dbl-1.0.0/tests/unit/test_audio_processing.py +241 -0
  54. yt_dbl-1.0.0/tests/unit/test_config.py +160 -0
  55. yt_dbl-1.0.0/tests/unit/test_logging.py +206 -0
  56. yt_dbl-1.0.0/tests/unit/test_memory.py +55 -0
  57. yt_dbl-1.0.0/tests/unit/test_model_manager.py +119 -0
  58. yt_dbl-1.0.0/tests/unit/test_model_registry.py +127 -0
  59. yt_dbl-1.0.0/tests/unit/test_schemas.py +229 -0
  60. yt_dbl-1.0.0/tests/unit/test_separate.py +236 -0
  61. yt_dbl-1.0.0/tests/unit/test_synthesize.py +391 -0
  62. yt_dbl-1.0.0/tests/unit/test_transcribe.py +605 -0
  63. yt_dbl-1.0.0/tests/unit/test_translate.py +373 -0
  64. yt_dbl-1.0.0/uv.lock +2586 -0
@@ -0,0 +1,14 @@
1
+ [run]
2
+ source = yt_dbl
3
+ branch = true
4
+
5
+ [report]
6
+ show_missing = true
7
+ skip_empty = true
8
+ fail_under = 80
9
+ exclude_lines =
10
+ pragma: no cover
11
+ if TYPE_CHECKING:
12
+ if __name__
13
+ @overload
14
+ \.\.\.
@@ -0,0 +1,4 @@
1
+ YT_DBL_ANTHROPIC_API_KEY=
2
+ YT_DBL_HF_TOKEN=
3
+ YT_DBL_SEPARATION_SEGMENT_SIZE=256
4
+ YT_DBL_SEPARATION_BATCH_SIZE=1
@@ -0,0 +1,68 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [master]
6
+ pull_request:
7
+ branches: [master]
8
+ workflow_call:
9
+
10
+ concurrency:
11
+ group: ${{ github.workflow }}-${{ github.ref }}
12
+ cancel-in-progress: true
13
+
14
+ env:
15
+ UV_TORCH_BACKEND: cpu
16
+
17
+ jobs:
18
+ quality:
19
+ name: Lint & Type Check
20
+ runs-on: ubuntu-latest
21
+ steps:
22
+ - uses: actions/checkout@v4
23
+
24
+ - uses: astral-sh/setup-uv@v5
25
+ with:
26
+ enable-cache: true
27
+ cache-dependency-glob: uv.lock
28
+
29
+ - name: Install dependencies
30
+ run: uv sync --python 3.12 --frozen
31
+
32
+ - name: Ruff lint
33
+ run: uv run ruff check src/ tests/
34
+
35
+ - name: Ruff format
36
+ run: uv run ruff format --check src/ tests/
37
+
38
+ - name: Mypy
39
+ run: uv run mypy src/ tests/
40
+
41
+ test:
42
+ name: Test
43
+ runs-on: ubuntu-latest
44
+ steps:
45
+ - uses: actions/checkout@v4
46
+
47
+ - uses: astral-sh/setup-uv@v5
48
+ with:
49
+ enable-cache: true
50
+ cache-dependency-glob: uv.lock
51
+
52
+ - name: Install dependencies
53
+ run: uv sync --python 3.12 --frozen
54
+
55
+ - name: Run unit & integration tests
56
+ run: >-
57
+ uv run pytest tests/unit/ tests/integration/
58
+ -n auto
59
+ --cov --cov-report=xml --cov-report=term-missing
60
+ -p no:randomly
61
+
62
+ - name: Upload coverage
63
+ if: ${{ !cancelled() }}
64
+ uses: actions/upload-artifact@v4
65
+ with:
66
+ name: coverage-report
67
+ path: coverage.xml
68
+ retention-days: 7
@@ -0,0 +1,43 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ branches: [master]
6
+
7
+ concurrency:
8
+ group: release
9
+ cancel-in-progress: false
10
+
11
+ jobs:
12
+ ci:
13
+ name: CI
14
+ uses: ./.github/workflows/ci.yml
15
+
16
+ release:
17
+ name: Semantic Release
18
+ needs: ci
19
+ runs-on: ubuntu-latest
20
+ permissions:
21
+ id-token: write
22
+ contents: write
23
+ steps:
24
+ - uses: actions/checkout@v4
25
+ with:
26
+ fetch-depth: 0
27
+ token: ${{ secrets.GITHUB_TOKEN }}
28
+
29
+ - uses: actions/setup-python@v5
30
+ with:
31
+ python-version: "3.12"
32
+
33
+ - uses: astral-sh/setup-uv@v5
34
+
35
+ - name: Semantic Release
36
+ id: release
37
+ uses: python-semantic-release/python-semantic-release@v9.21.0
38
+ with:
39
+ github_token: ${{ secrets.GITHUB_TOKEN }}
40
+
41
+ - name: Publish to PyPI
42
+ if: steps.release.outputs.released == 'true'
43
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,14 @@
1
+ .env
2
+ __pycache__/
3
+ *.pyc
4
+ .ruff_cache/
5
+ .pytest_cache/
6
+ .mypy_cache/
7
+ .coverage
8
+ coverage.xml
9
+ htmlcov/
10
+ dist/
11
+ *.egg-info/
12
+ work/
13
+ /models/
14
+ .venv/
@@ -0,0 +1,50 @@
1
+ repos:
2
+ - repo: https://github.com/astral-sh/ruff-pre-commit
3
+ rev: v0.15.0
4
+ hooks:
5
+ - id: ruff
6
+ args: [--fix]
7
+ - id: ruff-format
8
+
9
+ - repo: https://github.com/pre-commit/mirrors-mypy
10
+ rev: v1.19.1
11
+ hooks:
12
+ - id: mypy
13
+ additional_dependencies:
14
+ - pydantic>=2.12.5
15
+ - pydantic-settings>=2.12
16
+ - typer>=0.21.1
17
+ - rich>=14.3.2
18
+ - anthropic>=0.78
19
+ - numpy>=2.3
20
+ - soundfile>=0.13
21
+ args: [--config-file=mypy.ini]
22
+ pass_filenames: false
23
+
24
+ - repo: https://github.com/pre-commit/pre-commit-hooks
25
+ rev: v6.0.0
26
+ hooks:
27
+ - id: trailing-whitespace
28
+ - id: end-of-file-fixer
29
+ - id: check-yaml
30
+ - id: check-json
31
+ - id: check-merge-conflict
32
+ - id: debug-statements
33
+
34
+ - repo: https://github.com/compilerla/conventional-pre-commit
35
+ rev: v4.3.0
36
+ hooks:
37
+ - id: conventional-pre-commit
38
+ stages: [commit-msg]
39
+ args:
40
+ - feat
41
+ - fix
42
+ - refactor
43
+ - style
44
+ - build
45
+ - ci
46
+ - docs
47
+ - test
48
+ - perf
49
+ - chore
50
+ - revert
@@ -0,0 +1,474 @@
1
+ # CHANGELOG
2
+
3
+
4
+ ## v1.0.0 (2026-02-06)
5
+
6
+ ### Bug Fixes
7
+
8
+ - Add missing __init__.py to models package
9
+ ([`e4c4b5b`](https://github.com/brolnickij/yt-dbl/commit/e4c4b5be5ab1a9b7ebeef2a205aa1facfd0d5c37))
10
+
11
+ - Add sidechain ducking and limiter to reduce robotic artifacts in mixed audio
12
+ ([`ac60ce0`](https://github.com/brolnickij/yt-dbl/commit/ac60ce081a49693dd56514c2ae2a4e86b0a50f2d))
13
+
14
+ - Allow lazy torch import in model manager lint config
15
+ ([`110a3ca`](https://github.com/brolnickij/yt-dbl/commit/110a3ca23573a55e72decb68d69a4ebb54921c13))
16
+
17
+ - Correct TTS sample rate from 12kHz to 24kHz (critical audio fix)
18
+ ([`693e5db`](https://github.com/brolnickij/yt-dbl/commit/693e5dbdbf4643b12a657f5013ffd84524a0f409))
19
+
20
+ The Qwen3-TTS model outputs audio at 24000 Hz (model.sample_rate), but we were writing WAV files at
21
+ 12000 Hz. This caused all synthesized audio to play at half speed with pitched-down 'morphed'
22
+ voices.
23
+
24
+ Also: - Revert TTS params to model defaults (temp=0.9, top_k=50, top_p=1.0) - Remove dead speed
25
+ pre-calculation logic (model.generate speed param is documented as 'not directly supported yet') -
26
+ Update tests to match corrected sample rate and defaults
27
+
28
+ - Improve TTS quality with proper Qwen3-TTS parameters
29
+ ([`73a9cbb`](https://github.com/brolnickij/yt-dbl/commit/73a9cbb21631b55479bff407102003bc9f2b299e))
30
+
31
+ - Set temperature to 0.6 (model default) instead of 0.9 - Add top_k=20, top_p=0.8,
32
+ repetition_penalty=1.05 params - Use native 'speed' param in model.generate() to pre-fit
33
+ translated text into original segment duration, reducing reliance on quality-degrading post-hoc
34
+ ffmpeg atempo - Add _estimate_speaking_rate() and _estimate_tts_speed() methods for intelligent
35
+ speed pre-calculation - Add unit tests for new config defaults and speed estimation
36
+
37
+ - Resolve relative paths in _rename_outputs, add E2E tests
38
+ ([`7edc5f8`](https://github.com/brolnickij/yt-dbl/commit/7edc5f87f2d8bc20620be0a094889371ec165818))
39
+
40
+ - Fix _rename_outputs to resolve relative paths against step_dir (audio-separator returns filenames,
41
+ not absolute paths) - Add test_e2e_separate.py: 4 E2E tests for real BS-RoFormer separation - Add
42
+ unit test for relative path handling in _rename_outputs - Update E2E pipeline tests: require
43
+ audio_separator_available fixture - CI: restrict test job to tests/unit/, remove e2e job -
44
+ Justfile: run E2E with -n0 to prevent concurrent model downloads
45
+
46
+ All checks pass: lint ✓ format ✓ mypy ✓ 115 unit/integration ✓ 10 E2E ✓
47
+
48
+ - Strip ANSI codes in CLI help test for narrow CI terminals
49
+ ([`b4ac57b`](https://github.com/brolnickij/yt-dbl/commit/b4ac57b3f0055ddd58f015f290d00289e8185d16))
50
+
51
+ - Update environment variable names for clarity and consistency
52
+ ([`fdfa808`](https://github.com/brolnickij/yt-dbl/commit/fdfa8081583bad2b796522fee69ba18e2173b509))
53
+
54
+ - **release**: Use python -m build in semantic-release Docker container
55
+ ([`0ad5354`](https://github.com/brolnickij/yt-dbl/commit/0ad5354a3112c02ec4ff0b8b72a8f3cdd87c388b))
56
+
57
+ ### Build System
58
+
59
+ - Add conventional commits enforcement via pre-commit
60
+ ([`fbcd057`](https://github.com/brolnickij/yt-dbl/commit/fbcd057c245395cec621c8a20618a866d441364c))
61
+
62
+ - Add justfile for development tasks
63
+ ([`3a056f8`](https://github.com/brolnickij/yt-dbl/commit/3a056f8543b0b2817a8c17e3229cf4d8632ff8fc))
64
+
65
+ - Bump all dependencies to latest versions
66
+ ([`733472a`](https://github.com/brolnickij/yt-dbl/commit/733472a11f95630c8422399e524312e6d4fac8f6))
67
+
68
+ - Bump all dependency minimum versions to latest
69
+ ([`ce66a82`](https://github.com/brolnickij/yt-dbl/commit/ce66a82257164c2e50226b2507f85b8ff9f54cdd))
70
+
71
+ - anthropic: >=0.52 -> >=0.78 - rich: >=14.0 -> >=14.3.2 - pydantic: >=2.12 -> >=2.12.5 - yt-dlp:
72
+ >=2026.0 -> >=2026.2 - audio-separator: >=0.41 -> >=0.41.1 - mlx-audio: >=0.3 -> >=0.3.1 - typer:
73
+ >=0.21 -> >=0.21.1 - mypy: >=1.19 -> >=1.19.1 - pytest: >=9.0 -> >=9.0.2 - pytest-randomly: >=4.0
74
+ -> >=4.0.1 - pre-commit: >=4.5 -> >=4.5.1 - pre-commit hooks additional_dependencies synced
75
+
76
+ - Update lockfile with new dependencies
77
+ ([`53a9ca8`](https://github.com/brolnickij/yt-dbl/commit/53a9ca82409c706193ea10a83be494fa37d9a614))
78
+
79
+ ### Chores
80
+
81
+ - Add TC002 to test per-file-ignores in ruff config
82
+ ([`ecef19b`](https://github.com/brolnickij/yt-dbl/commit/ecef19b52c0594b1ef17332354e848f061f0366a))
83
+
84
+ - Enhance pyproject.toml
85
+ ([`aedd66f`](https://github.com/brolnickij/yt-dbl/commit/aedd66f56a823be10e41da1362feb5b11025905e))
86
+
87
+ - Remove unused network marker and dead _HAS_MLX variable
88
+ ([`c7e00c2`](https://github.com/brolnickij/yt-dbl/commit/c7e00c26cb41340bb9927f463d3747ddef3f093d))
89
+
90
+ - Stable version
91
+ ([`0518d3e`](https://github.com/brolnickij/yt-dbl/commit/0518d3eee2339fdb710eac6e11b464c86f939075))
92
+
93
+ - Update .gitignore with coverage and mypy cache
94
+ ([`7325c43`](https://github.com/brolnickij/yt-dbl/commit/7325c4309f88a2891f0de64cd78af52ed981454f))
95
+
96
+ ### Code Style
97
+
98
+ - Use parameterless raise for typer.Exit
99
+ ([`51e8ca7`](https://github.com/brolnickij/yt-dbl/commit/51e8ca73b33a796943ab1909a3eefae5684a776d))
100
+
101
+ ### Continuous Integration
102
+
103
+ - Add GitHub Actions workflow for lint, typecheck, and tests
104
+ ([`cf3f0d3`](https://github.com/brolnickij/yt-dbl/commit/cf3f0d348292236fac3ab117ac74a8b0a0139f5a))
105
+
106
+ - Add platform marker for mlx-audio, set UV_TORCH_BACKEND=cpu in CI
107
+ ([`ed01b02`](https://github.com/brolnickij/yt-dbl/commit/ed01b022b1fe33d9456b292ef7d513bfb13a973e))
108
+
109
+ - Drop Python version matrix in favor of single 3.12
110
+ ([`b9b7063`](https://github.com/brolnickij/yt-dbl/commit/b9b7063174e635ece70f1fe7282c3914f336cf7e))
111
+
112
+ - Force E2E tests to run sequentially (xdist_group)
113
+ ([`bdd201f`](https://github.com/brolnickij/yt-dbl/commit/bdd201fcf4a55cb3cc0f9641d387168ac9e61ffc))
114
+
115
+ GPU-heavy models (VibeVoice-ASR 9B, BS-RoFormer) kill the machine when loaded in parallel. All E2E
116
+ tests now share a single xdist group via conftest hook + --dist loadgroup in pytest.ini.
117
+
118
+ - Include integration tests
119
+ ([`fb72eee`](https://github.com/brolnickij/yt-dbl/commit/fb72eee65eb39ec9d6b8baf26779b2f5964c1f16))
120
+
121
+ ### Documentation
122
+
123
+ - Bump
124
+ ([`0812074`](https://github.com/brolnickij/yt-dbl/commit/081207411751992b400907a09b86713b0f081e27))
125
+
126
+ - Bump
127
+ ([`10c1d62`](https://github.com/brolnickij/yt-dbl/commit/10c1d62a8edf9e28c55e1eda90a342292492b344))
128
+
129
+ - Bump readme.md
130
+ ([`1ad90a2`](https://github.com/brolnickij/yt-dbl/commit/1ad90a2429ce33193eccc4904b67a3252c51792c))
131
+
132
+ - Bump readme.md
133
+ ([`e2679d7`](https://github.com/brolnickij/yt-dbl/commit/e2679d775790e6f9d79ae37dd93203e9ed4f4b13))
134
+
135
+ - Bump readme.md
136
+ ([`e8cf40e`](https://github.com/brolnickij/yt-dbl/commit/e8cf40e9bf3919e850f25c92e114359dfb2424ff))
137
+
138
+ - Cleanup
139
+ ([`baf712e`](https://github.com/brolnickij/yt-dbl/commit/baf712ebe2da3c851ed7dd05ce38792da0bb5a40))
140
+
141
+ - Cleanup
142
+ ([`a87505a`](https://github.com/brolnickij/yt-dbl/commit/a87505a6a3fb8d042633173da9fab3b17b055242))
143
+
144
+ - Fix repository URL
145
+ ([`392b214`](https://github.com/brolnickij/yt-dbl/commit/392b214db46bce01fb433732e8d3c6d7235a41dd))
146
+
147
+ - Improve formatting and clarity in README.md
148
+ ([`0cd95a7`](https://github.com/brolnickij/yt-dbl/commit/0cd95a7e3d709dacabd695678d96ea835edbfb8c))
149
+
150
+ - Update README
151
+ ([`eb2e9ab`](https://github.com/brolnickij/yt-dbl/commit/eb2e9ab142c3cc7ce2459a91d1b3d3988c1a90d0))
152
+
153
+ - Update requirements & install
154
+ ([`9d1d826`](https://github.com/brolnickij/yt-dbl/commit/9d1d8261d74f2ec57fcc4ddaa26f58a7c5f1117e))
155
+
156
+ - **separate**: Document ModelManager exclusion for separator models
157
+ ([`c15487f`](https://github.com/brolnickij/yt-dbl/commit/c15487fd9edc0cd1f1a8517813af57031e114de1))
158
+
159
+ ### Features
160
+
161
+ - Add LRU model manager
162
+ ([`b577721`](https://github.com/brolnickij/yt-dbl/commit/b577721e9a83d7696f3b909206dfde90cf57ea2f))
163
+
164
+ - Add Rich progress bars to transcribe and synthesize steps
165
+ ([`ebb2d43`](https://github.com/brolnickij/yt-dbl/commit/ebb2d43bdc456c7def2a857ea02a969f56950f60))
166
+
167
+ - ASR: animated spinner with status during long model.generate() call - Alignment: progress bar
168
+ showing segment N/M - TTS synthesis: progress bar per segment - Postprocessing: progress bar for
169
+ speed/loudnorm
170
+
171
+ - Add stress marks to Russian translations for better TTS pronunciation
172
+ ([`c6b9683`](https://github.com/brolnickij/yt-dbl/commit/c6b9683d3b7f1f97e0ec107f85d66d816bc0e240))
173
+
174
+ - Add U+0301 combining acute accent instruction to Claude translation prompt for Russian (ru) and
175
+ Ukrainian (uk) target languages - Stress marks affect Qwen3-TTS tokenization, improving word
176
+ stress and pronunciation naturalness - Disable ruff RUF001/RUF003 (ambiguous Unicode) — Cyrillic
177
+ text is intentional - Zero extra dependencies or API calls (reuses existing Claude translation
178
+ call)
179
+
180
+ - Confidence-weighted voice reference selection for better cloning
181
+ ([`27f9738`](https://github.com/brolnickij/yt-dbl/commit/27f97389331f1343cc27233121230761d953d2ec))
182
+
183
+ - De-ess sibilants in TTS postprocessing chain
184
+ ([`334bb09`](https://github.com/brolnickij/yt-dbl/commit/334bb0959ad3ce1394e0e4f31422ddd627cedd2c))
185
+
186
+ - Enhance TTS guidelines for better pronunciation and clarity
187
+ ([`6688b45`](https://github.com/brolnickij/yt-dbl/commit/6688b4520eb27b0e211f8ede72d40b4d2d090c35))
188
+
189
+ - Equal-power crossfade for constant energy at segment boundaries
190
+ ([`03ed67a`](https://github.com/brolnickij/yt-dbl/commit/03ed67a3825a262b67e2221b4892886a1ea04361))
191
+
192
+ - Highpass + denoise filter on voice reference for cleaner cloning
193
+ ([`393815f`](https://github.com/brolnickij/yt-dbl/commit/393815fee7e43d1cef0eb9b080eba92b51b0d642))
194
+
195
+ - Implement real vocal separation with BS-RoFormer
196
+ ([`8c394f0`](https://github.com/brolnickij/yt-dbl/commit/8c394f0ee7bb85f4bbb0842f8d031d1ca49b205e))
197
+
198
+ - Replace stub SeparateStep with audio-separator integration - Use BS-RoFormer (SDR 12.97) as
199
+ default model - CoreML acceleration for Apple Silicon (M4 Pro) - Configurable model, segment_size,
200
+ overlap via Settings - Idempotency: skip if outputs already exist - Memory cleanup: gc.collect() +
201
+ GPU cache clear after separation - 17 new unit tests for validation, rename, config, error paths -
202
+ Updated pipeline integration tests with mock separation - Added prefill_separate helper to
203
+ conftest
204
+
205
+ - Implement real yt-dlp download step with audio extraction
206
+ ([`2609176`](https://github.com/brolnickij/yt-dbl/commit/260917670e2fba86b3c72ef793b5ea2be0de9585))
207
+
208
+ - Implement single-pass translation via Claude Opus 4.6 (iter 4)
209
+ ([`b78ed00`](https://github.com/brolnickij/yt-dbl/commit/b78ed004c20d7a85b32ff1276d29a3441fb13485))
210
+
211
+ - Add anthropic>=0.52 runtime dependency - TranslateStep: single API call with all segments, JSON
212
+ output - System prompt for dubbing-aware translation (concise for TTS timing) - Idempotent: caches
213
+ translations.json, regenerates subtitles.srt - Parse Claude response with markdown fence handling
214
+ - Config: claude_model='claude-opus-4-6', removed translation_batch_size - 22 unit tests
215
+ (validation, parsing, SRT, persistence, mocked API) - Integration tests updated with
216
+ _pipeline_patches helper - 168 tests, 91.92% coverage, all quality checks pass
217
+
218
+ - Implement transcription with VibeVoice-ASR + ForcedAligner (iter 3)
219
+ ([`decd55c`](https://github.com/brolnickij/yt-dbl/commit/decd55c08ffec0c327d68dd5123e8329842f1275))
220
+
221
+ Two-model pipeline running on Apple Silicon MLX Metal: 1. VibeVoice-ASR (9B) — ASR + diarization +
222
+ segment timestamps 2. Qwen3-ForcedAligner (0.6B) — word-level forced alignment
223
+
224
+ Key changes: - Add mlx-audio>=0.3 dependency (requires prerelease transformers) - Add transcription
225
+ config: asr_model, aligner_model, max_tokens, temperature - Rewrite TranscribeStep from stub to
226
+ full implementation: - _run_asr(): loads VibeVoice, runs generate(), normalises key variants -
227
+ _run_alignment(): per-segment forced alignment with error fallback - _detect_language(): Unicode
228
+ heuristics (ja before zh for kana) - _extract_speakers(): duration aggregation + best reference
229
+ segment - Idempotent with JSON cache, gc.collect() between models - 146 tests (25 new for
230
+ transcription), 90.93% coverage - All quality checks pass: ruff lint, ruff format, mypy strict
231
+
232
+ - Implement TTS synthesis with Qwen3-TTS voice cloning (iter 5)
233
+ ([`c4330e5`](https://github.com/brolnickij/yt-dbl/commit/c4330e528fa25489abc6277e574f0fc319d5760a))
234
+
235
+ - Implement SynthesizeStep: voice reference extraction, TTS generation, speed adjustment (ffmpeg
236
+ atempo), loudness normalization (-16 LUFS) - Model: mlx-community/Qwen3-TTS-12Hz-1.7B-Base-bf16
237
+ via mlx-audio - Voice cloning via ref_audio + ref_text params - Add tts_model, tts_temperature,
238
+ tts_sample_rate to Settings - Add synth_path, synth_speed_factor to Segment schema - Add
239
+ soundfile>=0.13 dependency for WAV writing - Add 20 unit tests for synthesize step (all passing) -
240
+ Update integration tests with TTS mocks - Add prefill_synthesize helper to conftest - 188 tests,
241
+ 91.14% coverage
242
+
243
+ - Init
244
+ ([`68eb169`](https://github.com/brolnickij/yt-dbl/commit/68eb169be5ab510a00d1db0913f20085d89219d1))
245
+
246
+ - Init assemble module
247
+ ([`e88b499`](https://github.com/brolnickij/yt-dbl/commit/e88b499c4e4ec148cae228958b431f762ecbc01e))
248
+
249
+ - Init publish configs
250
+ ([`dee5cbf`](https://github.com/brolnickij/yt-dbl/commit/dee5cbfa0de6c3b4b94787b439c4cb0b6eca6b70))
251
+
252
+ - Initial public release
253
+ ([`d112074`](https://github.com/brolnickij/yt-dbl/commit/d112074bd781c73c438380dd352ab7010a6f0761))
254
+
255
+ BREAKING CHANGE: first stable release of yt-dbl
256
+
257
+ - Make separation batch_size configurable via env
258
+ ([`396ca6c`](https://github.com/brolnickij/yt-dbl/commit/396ca6c31f9570455d8028e3c73054fda08f5a6d))
259
+
260
+ Add YT_DBL_SEPARATION_BATCH_SIZE (default=1, max=16). On M4 Pro with unified memory, higher values
261
+ (2-4) can speed up separation.
262
+
263
+ - Optimize translation prompt for TTS-friendly output
264
+ ([`fe50b79`](https://github.com/brolnickij/yt-dbl/commit/fe50b798137a5ed75140115c284c18a5768f76b5))
265
+
266
+ - Add rules: numbers→words, expand abbreviations, spoken style, no special chars - Fix rule
267
+ numbering bug (duplicate '7.' when stress rule injected) - Add stress-marked example in JSON
268
+ output for ru/uk languages - Rephrase prompt intro to emphasize TTS optimization context
269
+
270
+ - Sinc resampling via scipy to eliminate aliasing artifacts
271
+ ([`9b9886f`](https://github.com/brolnickij/yt-dbl/commit/9b9886f52e437ae3be36a120525c040d501b628e))
272
+
273
+ - Suppress HuggingFace/transformers noise during model loading
274
+ ([`34671fa`](https://github.com/brolnickij/yt-dbl/commit/34671fa191aac3cca65a32e9ee249b68cb98a34d))
275
+
276
+ - Add suppress_library_noise() context manager to logging utils - Silence HF Hub download progress
277
+ bars (HF_HUB_DISABLE_PROGRESS_BARS) - Suppress 'model of type' and tokenizer regex warnings - Mute
278
+ noisy loggers: huggingface_hub, transformers, tqdm, etc. - Wrap all 3 model loads: ASR, aligner,
279
+ TTS
280
+
281
+ - Update TTS mock functions for improved testing and remove mlx dependency
282
+ ([`b929fa8`](https://github.com/brolnickij/yt-dbl/commit/b929fa891b841fcfdeb0f4b51518a0bda315d360))
283
+
284
+ - Use ffmpeg-full with rubberband for higher quality audio
285
+ ([`feac9a9`](https://github.com/brolnickij/yt-dbl/commit/feac9a9662864158848af40592d2c62835477fb6))
286
+
287
+ - Auto-detect ffmpeg-full (brew keg-only) with fallback to system ffmpeg - Rubberband
288
+ pitch-preserving time-stretch instead of atempo - Two-pass loudnorm (measure → apply with
289
+ linear=true) - Voice references at 24kHz (Qwen3-TTS native rate, was 16kHz) - AAC output at
290
+ 320kbps (was default ~128kbps) - Add ffmpeg_path config setting for custom ffmpeg location - Tests
291
+ for _detect_ffmpeg, _detect_ffprobe, has_rubberband
292
+
293
+ - **cli**: Implement real models list and download commands
294
+ ([`b336cbf`](https://github.com/brolnickij/yt-dbl/commit/b336cbfed7f4edf94ea47e30bf2b5445d857f412))
295
+
296
+ - **config**: Auto-detect max_loaded_models based on system RAM
297
+ ([`38ec78f`](https://github.com/brolnickij/yt-dbl/commit/38ec78f2122e55e6466bce203a8627bf08052570))
298
+
299
+ - **logging**: Add memory measurement and enhanced model load/unload logging
300
+ ([`7db825b`](https://github.com/brolnickij/yt-dbl/commit/7db825bc41c07af2b166d6f29ad527abe8aa6686))
301
+
302
+ - **manager**: Add memory tracking and MLX/torch cache cleanup
303
+ ([`9d3f746`](https://github.com/brolnickij/yt-dbl/commit/9d3f746db319a15cf763530b5627ee35ad3d1f96))
304
+
305
+ - **models**: Export public API from models package
306
+ ([`5893660`](https://github.com/brolnickij/yt-dbl/commit/5893660e5df255ee25629aa6336cf1435b9a6539))
307
+
308
+ - **pipeline**: Accept ModelManager in PipelineStep base class
309
+ ([`740dd96`](https://github.com/brolnickij/yt-dbl/commit/740dd96b33bce7ad07a66ed4343a30886099cb47))
310
+
311
+ - **registry**: Add ML model registry with download status checks
312
+ ([`2a3e8f1`](https://github.com/brolnickij/yt-dbl/commit/2a3e8f1d1332967c34d8db5c0e077f52b24f3217))
313
+
314
+ - **runner**: Wire ModelManager and memory status into pipeline runner
315
+ ([`34795ac`](https://github.com/brolnickij/yt-dbl/commit/34795ac7ad5b600a2fbc66f185ccdbb94f24339e))
316
+
317
+ - **schemas**: Add source_language field to PipelineState
318
+ ([`e00b27a`](https://github.com/brolnickij/yt-dbl/commit/e00b27ab871f677c7f683e5cb96327efbc8bf838))
319
+
320
+ - **synthesize**: Integrate ModelManager for TTS model lifecycle
321
+ ([`0cca551`](https://github.com/brolnickij/yt-dbl/commit/0cca551451173f82c81d6766b33250a3fca304d7))
322
+
323
+ - **transcribe**: Integrate ModelManager and expand language detection
324
+ ([`2029b71`](https://github.com/brolnickij/yt-dbl/commit/2029b7109e5048ed791b5171bd4be48860e718bd))
325
+
326
+ - **translate**: Pass source language to Claude translation prompt
327
+ ([`93376bb`](https://github.com/brolnickij/yt-dbl/commit/93376bb40dc8824629e1c9be7fd3def22edef82d))
328
+
329
+ ### Performance Improvements
330
+
331
+ - Cache has_rubberband, unload ASR before aligner, precompute lookups, compact JSON, cleanup
332
+ intermediates
333
+ ([`8422144`](https://github.com/brolnickij/yt-dbl/commit/842214483d4ab75c25e9a73718c0e3dc6d1e36c2))
334
+
335
+ - Enhance RAM-based auto-detection for `max_loaded_models` and `separation_batch_size`
336
+ ([`94f479a`](https://github.com/brolnickij/yt-dbl/commit/94f479af98612efed509ddfeced8bd96bfb44ab1))
337
+
338
+ - Enhance segment postprocessing with parallel execution
339
+ ([`9d1e296`](https://github.com/brolnickij/yt-dbl/commit/9d1e2962a6568dba7b9f6dc088f5410d5e3a4f0c))
340
+
341
+ - **synthesize**: Merge ffmpeg postprocessing into minimal-pass pipeline
342
+ ([`6db80ef`](https://github.com/brolnickij/yt-dbl/commit/6db80ef75ec61140923d3462c96cf85b2dc51521))
343
+
344
+ - **synthesize**: Use np.asarray instead of tolist for mlx-to-numpy conversion
345
+ ([`c6d2bc4`](https://github.com/brolnickij/yt-dbl/commit/c6d2bc469bef586ada386add7d4fb0af6b0ae3f8))
346
+
347
+ - **transcribe**: Load audio once and slice per segment for alignment
348
+ ([`9586e6d`](https://github.com/brolnickij/yt-dbl/commit/9586e6d9f0ef146d3e99c3b24c75fc08e9078022))
349
+
350
+ ### Refactoring
351
+
352
+ - Add __all__ exports to public modules
353
+ ([`aff728c`](https://github.com/brolnickij/yt-dbl/commit/aff728c6b5fdbd740821e61d859853e960fbce27))
354
+
355
+ - Add PEP 561 py.typed marker
356
+ ([`ac757cc`](https://github.com/brolnickij/yt-dbl/commit/ac757cc30cf24aac805221a74470172543cbed99))
357
+
358
+ - Complete pipeline error hierarchy with TranscriptionError and AssemblyError wrapping
359
+ ([`4160359`](https://github.com/brolnickij/yt-dbl/commit/416035944b8d3a260a60de31839ed62ac7710fe8))
360
+
361
+ - Deduplicate atempo chain in speed_up_audio
362
+ ([`4750e44`](https://github.com/brolnickij/yt-dbl/commit/4750e442d55153410cba53411991320693dffa65))
363
+
364
+ - Deduplicate resolve_vocals and GPU cleanup into shared utilities
365
+ ([`ce1be33`](https://github.com/brolnickij/yt-dbl/commit/ce1be3399e521f104c2e4e7e9fc267cbe6bc9d32))
366
+
367
+ - Extract audio processing utilities from SynthesizeStep into utils/audio_processing
368
+ ([`37ae8d1`](https://github.com/brolnickij/yt-dbl/commit/37ae8d113798009249f95fa780259bab3136c5bb))
369
+
370
+ - Extract constants, fix inconsistencies, deduplicate loudnorm targets
371
+ ([`16c815d`](https://github.com/brolnickij/yt-dbl/commit/16c815dc4a0ccd08a3f7bd7c14e5179457342e84))
372
+
373
+ - Extract language maps, lazy imports, early validation, remove dead code
374
+ ([`a193791`](https://github.com/brolnickij/yt-dbl/commit/a19379117a5b62f09fa5d122979006e86045f621))
375
+
376
+ - Extract tool configs into standalone files
377
+ ([`cd98bf8`](https://github.com/brolnickij/yt-dbl/commit/cd98bf818a2d910335bfa9119cf95bb1cc9dac8d))
378
+
379
+ - Fix type safety in assemble, promote private registry API to public
380
+ ([`e9c7c68`](https://github.com/brolnickij/yt-dbl/commit/e9c7c68a208b3057fc388e92da41f81374569553))
381
+
382
+ - Inject ffmpeg path via set_ffmpeg_path instead of importing settings singleton
383
+ ([`eba5647`](https://github.com/brolnickij/yt-dbl/commit/eba564712f7193d6a076f29af473cdecc2f2d3bb))
384
+
385
+ - Introduce unified pipeline exception hierarchy
386
+ ([`4392987`](https://github.com/brolnickij/yt-dbl/commit/4392987b6ad6045a3cb4183cb527c7fbce1f4c09))
387
+
388
+ - Remove commented-out code
389
+ ([`489eeb2`](https://github.com/brolnickij/yt-dbl/commit/489eeb2c946148c0e8a39ec8380ca4b19f73ff95))
390
+
391
+ - Remove dead code (replace_audio, normalize_loudness, deess, TranscriptionError)
392
+ ([`e8dbc81`](https://github.com/brolnickij/yt-dbl/commit/e8dbc81ac70eb3e240ac8fce3d8c2dd908cf2e90))
393
+
394
+ - Remove settings singleton from config module
395
+ ([`6631adf`](https://github.com/brolnickij/yt-dbl/commit/6631adf66ec9f311b156fb59c817dbb10063bd09))
396
+
397
+ - Remove unused model_manager singleton
398
+ ([`3ef4512`](https://github.com/brolnickij/yt-dbl/commit/3ef45129bae837832e5fc6beab4b488bed6f7e85))
399
+
400
+ ### Testing
401
+
402
+ - Add @pytest.mark.parametrize to data-driven tests
403
+ ([`b22efba`](https://github.com/brolnickij/yt-dbl/commit/b22efba1e4502e0873b40f2d69b68b098d1f9051))
404
+
405
+ - Add Arabic, Hindi, Thai language detection coverage
406
+ ([`0307488`](https://github.com/brolnickij/yt-dbl/commit/0307488bad117df8df8f738f16a053058f110b59))
407
+
408
+ - Add Claude API error path tests for translate step
409
+ ([`67a4b38`](https://github.com/brolnickij/yt-dbl/commit/67a4b3898deae6a682bbaff891bfc0db931e8c48))
410
+
411
+ - Add config auto-detection and RAM tier threshold tests
412
+ ([`a1a8f70`](https://github.com/brolnickij/yt-dbl/commit/a1a8f70c13683ba7b25ccaae9fecfbdc0a5442bd))
413
+
414
+ - Add coverage for utils/memory.py GPU cleanup
415
+ ([`6485a01`](https://github.com/brolnickij/yt-dbl/commit/6485a01169565a7822b2e9dea1094254ef160898))
416
+
417
+ - Add E2E tests for transcription step (VibeVoice-ASR + ForcedAligner)
418
+ ([`ee7e449`](https://github.com/brolnickij/yt-dbl/commit/ee7e4495d8a4b85a8fcd5251e496e207807fe165))
419
+
420
+ Real ASR + alignment on 'Me at the zoo' behind --run-slow: - test_transcribe_produces_segments:
421
+ validates segments, words, speakers - test_idempotent_rerun_uses_cache: verifies segments.json
422
+ cache - Update pipeline E2E docstring: transcribe is now real, not stub
423
+
424
+ - Add early API key validation tests for PipelineRunner
425
+ ([`8a9a267`](https://github.com/brolnickij/yt-dbl/commit/8a9a2671b29736c3a49fce0ca989d428b7d851bd))
426
+
427
+ - Add postprocess_segment deess fallback coverage
428
+ ([`74a6cbb`](https://github.com/brolnickij/yt-dbl/commit/74a6cbbef3017f0f4f03a6305e4f5ab58bf4a838))
429
+
430
+ - Add SynthesisError test for empty TTS result
431
+ ([`d589af4`](https://github.com/brolnickij/yt-dbl/commit/d589af4b6941495a77238d034623820594996f28))
432
+
433
+ - Add tests for logging utilities and suppress_library_noise
434
+ ([`bc46a73`](https://github.com/brolnickij/yt-dbl/commit/bc46a730b5ee83e3c29eea7388b0ced55e79a2f7))
435
+
436
+ - Add tests for model registry, manager, memory tracking, and config
437
+ ([`a4a114b`](https://github.com/brolnickij/yt-dbl/commit/a4a114bb25110c6dbd8092a0b33a94779ede49fa))
438
+
439
+ - Add TTS_LANG_MAP validation tests
440
+ ([`e7356ff`](https://github.com/brolnickij/yt-dbl/commit/e7356ff2b7f0ece2912ae793794a7a609f8bbc62))
441
+
442
+ - Isolate Settings from .env and YT_DBL_ env vars in tests
443
+ ([`c9e52f0`](https://github.com/brolnickij/yt-dbl/commit/c9e52f0de8f5fe26296a137a917c36aaed7c7e4b))
444
+
445
+ - Make ffmpeg arg assertions order-agnostic
446
+ ([`d749e50`](https://github.com/brolnickij/yt-dbl/commit/d749e50d8f59432402949521f0d8ec125dd279a2))
447
+
448
+ - Mock model download check in CLI tests and add API key to settings
449
+ ([`4610444`](https://github.com/brolnickij/yt-dbl/commit/4610444a087451ab237b5bc37a02989f9c358b32))
450
+
451
+ - Mock settings in TestStatusCommand
452
+ ([`fc88bde`](https://github.com/brolnickij/yt-dbl/commit/fc88bdef107e3fd6689016a87100fcc137c390bb))
453
+
454
+ - Parametrize language detection and format size tests
455
+ ([`3879d38`](https://github.com/brolnickij/yt-dbl/commit/3879d38bd0dd0cf835284cc92d6b04d1d80d1a0d))
456
+
457
+ - Remove unused mock in TestStatusCommand
458
+ ([`e1dea19`](https://github.com/brolnickij/yt-dbl/commit/e1dea192dce84c5607ba46a189e81d5a4d813150))
459
+
460
+ - Reorganize into unit/integration/e2e pyramid
461
+ ([`44626c3`](https://github.com/brolnickij/yt-dbl/commit/44626c3af3a98bb0564a20779cc7fe159601b3a7))
462
+
463
+ - Update version assertion to match semantic versioning format
464
+ ([`eb2e816`](https://github.com/brolnickij/yt-dbl/commit/eb2e816058d7d87c27305bd436773952a7542f5d))
465
+
466
+ - Update version assertion to use search for regex matching
467
+ ([`4c5d30b`](https://github.com/brolnickij/yt-dbl/commit/4c5d30bc6944b013099012b37d62a623eed18970))
468
+
469
+ - **integration**: Update runner mocks for source_language and TTS
470
+ ([`1985699`](https://github.com/brolnickij/yt-dbl/commit/1985699b0ee6f57f7dabf8c17b5a3f3bca691d57))
471
+
472
+ ### Breaking Changes
473
+
474
+ - First stable release of yt-dbl