Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
name: CI

on:
pull_request:
push:
branches: [master]

jobs:
test:
# mlx-whisper only installs on Apple Silicon
runs-on: macos-latest
steps:
- uses: actions/checkout@v4

- uses: astral-sh/setup-uv@v5
with:
enable-cache: true

- name: Install dependencies
run: uv sync --frozen

- name: Lint
run: uv run ruff check

- name: Format check
run: uv run ruff format --check

- name: Test
run: uv run pytest -q
74 changes: 74 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
name: Release

on:
push:
branches: [master]
paths:
- pyproject.toml

concurrency:
group: release
cancel-in-progress: false

jobs:
test:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4

- uses: astral-sh/setup-uv@v5
with:
enable-cache: true

- name: Install dependencies
run: uv sync --frozen

- name: Lint
run: uv run ruff check

- name: Test
run: uv run pytest -q

publish:
needs: test
runs-on: ubuntu-latest
permissions:
contents: write
id-token: write
steps:
- uses: actions/checkout@v4

- uses: astral-sh/setup-uv@v5

- name: Detect version change
id: version
run: |
LOCAL=$(python3 -c "import tomllib; print(tomllib.load(open('pyproject.toml','rb'))['project']['version'])")
PUBLISHED=$(curl -fsSL https://pypi.org/pypi/vox-transcribe/json \
| python3 -c "import json,sys; print(json.load(sys.stdin)['info']['version'])" 2>/dev/null || echo "0.0.0")
echo "local=$LOCAL" >> "$GITHUB_OUTPUT"
if [ "$LOCAL" != "$PUBLISHED" ]; then
echo "changed=true" >> "$GITHUB_OUTPUT"
echo "Version changed: $PUBLISHED -> $LOCAL"
else
echo "changed=false" >> "$GITHUB_OUTPUT"
echo "Version unchanged ($LOCAL), skipping publish"
fi

- name: Build distributions
if: steps.version.outputs.changed == 'true'
run: uv build

- name: Publish to PyPI
if: steps.version.outputs.changed == 'true'
uses: pypa/gh-action-pypi-publish@release/v1

- name: Tag and GitHub Release
if: steps.version.outputs.changed == 'true'
env:
GH_TOKEN: ${{ github.token }}
VERSION: ${{ steps.version.outputs.local }}
run: |
git tag "v$VERSION"
git push origin "v$VERSION"
gh release create "v$VERSION" --title "v$VERSION" --generate-notes
7 changes: 6 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,10 @@ vox doctor
# Download a model ahead of time
vox init -m small

# List available models per backend
vox models
vox models -b openai --format json

# Get API schema (for AI agents)
vox schema transcribe
```
Expand All @@ -80,6 +84,7 @@ vox schema transcribe
| `vox channel <url>` | Batch transcribe a YouTube channel |
| `vox init [-m MODEL]` | Download Whisper model |
| `vox doctor` | Check dependency health |
| `vox models [-b BACKEND]` | List transcription models per backend |
| `vox schema [COMMAND]` | JSON schema for agent introspection |

## Models
Expand Down Expand Up @@ -139,7 +144,7 @@ Input (URL or file)

```bash
uv sync
uv run pytest # Run tests (107 tests)
uv run pytest # Run tests (159 tests)
uv run ruff check --fix # Lint
uv run ruff format # Format
uv run ty check # Type check
Expand Down
19 changes: 13 additions & 6 deletions skills/vox/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,17 +44,18 @@ Apply in this order, highest volume first:
isolated `Merci.`) emitted over silent stretches. Found in 73 of 227 files.
2. **Collapse decoder repetition loops** — detect by run length (≥5 identical
consecutive tokens, pinning at 221–223), never by vocabulary.
3. **Fix domain vocabulary** — brand and instrument names are where Whisper fails,
not general anglicisms.
3. **Fix proper nouns** — brand, product and person names are where Whisper fails,
not general anglicisms. Ask the user for a glossary rather than guessing.
4. **Dedupe segment boundaries** — 1.29% of boundaries repeat a word, and this
leaks into the concatenated `text` field.
5. **Re-punctuate and recapitalize only where measured as degraded** — most files
are fine; a minority have zero periods and no uppercase at all.
6. **Normalize hyphenation and number formats** for consistency.
6. **Restore diacritics and normalize hyphenation and number formats**.

Do NOT strip filler words (Whisper already removes them: 296 `euh` per 1.8M words)
and do NOT apply broad homophone rules (>90% false positives). Insert
`[Speaker Name]:` markers only when speakers are clearly identifiable.
Fix form, never content. Do NOT strip filler words (Whisper already removes them:
296 `euh` per 1.8M words) and do NOT apply broad homophone rules (>90% false
positives). Mark unintelligible passages `[inaudible]` rather than inventing, and
insert `[Speaker Name]:` markers only when speakers are clearly identifiable.

When editing `.srt`, preserve timestamps, sequence numbers and block count.

Expand All @@ -76,6 +77,11 @@ vox channel "https://www.youtube.com/@ChannelName" --years 2025 --summarizer non
```bash
vox schema transcribe
vox schema init
vox schema models

# Which models can I pass to --model?
vox models --format json
vox models -b openai --format json
```

## Commands
Expand All @@ -87,6 +93,7 @@ vox schema init
| `vox channel <url>` | Batch transcribe a YouTube channel |
| `vox init [-m MODEL] [-l LANG]` | Download Whisper model + check deps |
| `vox doctor` | Check dependencies health |
| `vox models [-b BACKEND]` | List models available per backend |
| `vox schema [COMMAND]` | JSON schema for agent introspection |
| `vox --version` | Print the installed version |

Expand Down
Loading
Loading