{"id":51472344,"url":"https://github.com/linuxmatters/jive-vocals","last_synced_at":"2026-07-06T19:01:02.233Z","repository":{"id":332648440,"uuid":"1090287143","full_name":"linuxmatters/jive-vocals","owner":"linuxmatters","description":"Raw microphone recordings into broadcast-ready audio in one command. No configuration, and no surprises🕺","archived":false,"fork":false,"pushed_at":"2026-07-05T00:05:05.000Z","size":13504,"stargazers_count":79,"open_issues_count":1,"forks_count":9,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-07-05T00:12:47.957Z","etag":null,"topics":["audio","broadcast","compressor","lufs","noise-reduction","noise-removal","normalization","peak-detection","podcast","pre-processor","youtube"],"latest_commit_sha":null,"homepage":"https://linuxmatters.sh","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/linuxmatters.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":"SUPPORT.md","governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null},"funding":{"github":"flexiondotorg","patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"lfx_crowdfunding":null,"polar":null,"buy_me_a_coffee":null,"custom":null}},"created_at":"2025-11-05T13:18:48.000Z","updated_at":"2026-07-04T20:14:00.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/linuxmatters/jive-vocals","commit_stats":null,"previous_names":["linuxmatters/jivetalking","linuxmatters/jive-vocals"],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/linuxmatters/jive-vocals","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linuxmatters%2Fjive-vocals","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linuxmatters%2Fjive-vocals/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linuxmatters%2Fjive-vocals/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linuxmatters%2Fjive-vocals/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/linuxmatters","download_url":"https://codeload.github.com/linuxmatters/jive-vocals/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linuxmatters%2Fjive-vocals/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35202786,"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-07-06T02:00:07.184Z","response_time":106,"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":["audio","broadcast","compressor","lufs","noise-reduction","noise-removal","normalization","peak-detection","podcast","pre-processor","youtube"],"created_at":"2026-07-06T19:01:01.340Z","updated_at":"2026-07-06T19:01:02.223Z","avatar_url":"https://github.com/linuxmatters.png","language":"Go","funding_links":["https://github.com/sponsors/flexiondotorg"],"categories":[],"sub_categories":[],"readme":"# Jive Vocals 🗣️\n\n\u003e Formerly known as Jivetalking.\n\nRaw microphone recordings into broadcast-ready audio in one command. No configuration, and no surprises.\n\n```bash\njive-vocals LMP-81s-mark.flac LMP-81s-martin.flac LMP-81s-popey.flac\n```\n\nYour files emerge at -16 LUFS / -1 dBTP, the loudness standard for spoken-word podcasts, with room rumble, background hiss, clicks, and harsh sibilance sorted automatically. Multiple files process in parallel, each with its own TUI progress row. Everything needed is embedded in the binary. This is not how audio tools usually work, and that is rather the point.\n\n## Example Output\n\n\u003cdiv align=\"center\"\u003e\u003cimg alt=\"Jive Vocals Demo\" src=\".github/jive-vocals.gif\" width=\"620\" /\u003e\u003c/div\u003e\n\n---\n\n## The Typical Workflow\n\n```\nRecord → Process → Edit → Export\n  │         │         │        │\n  │         │         │        └─ Export\n  │         │         │\n  │         │         └─ Import to Audacity, top/tail, edit\n  │         │\n  │         └─ $ jive-vocals *.flac (-16 LUFS, matched levels)\n  │\n  └─ Each presenter records separately, exports FLAC\n```\n\n---\n\n## Installation\n\nSingle binary. Zero external dependencies. FFmpeg is embedded via ffmpeg-statigo.\n\n### bin (Recommended)\n\nInstall with [bin](https://github.com/marcosnils/bin), a GitHub-aware binary manager:\n\n```bash\nbin install github.com/linuxmatters/jive-vocals\n```\n\nThis picks the correct platform and architecture, drops the binary into `~/.local/bin/`, and handles updates via `bin update`. No root required, no path wrangling.\n\n### Manual Download\n\nFetch from the [releases page](https://github.com/linuxmatters/jive-vocals/releases):\n\n```bash\n# Linux amd64\nchmod +x jive-vocals-linux-amd64\nmv jive-vocals-linux-amd64 ~/.local/bin/jive-vocals\n\n# Linux arm64\nchmod +x jive-vocals-linux-arm64\nmv jive-vocals-linux-arm64 ~/.local/bin/jive-vocals\n\n# macOS Intel\nchmod +x jive-vocals-darwin-amd64\nmv jive-vocals-darwin-amd64 ~/.local/bin/jive-vocals\n\n# macOS Apple Silicon\nchmod +x jive-vocals-darwin-arm64\nmv jive-vocals-darwin-arm64 ~/.local/bin/jive-vocals\n```\n\n---\n\n## The Four-Pass Pipeline\n\nJive Vocals treats audio processing as measurement science, not guesswork. It analyses your recording first, then adapts every filter to match. A dark-voiced narrator gets gentler de-essing, pre-compressed audio gets lighter compression, and a noisy home office gets different treatment than a clean studio.\n\nFour passes carry a raw recording to a broadcast-ready master:\n\n1. **Analyse:** measure loudness, noise floor, and speech; detect the room tone.\n2. **Process:** run the adapted filter chain.\n3. **Measure:** read the processed signal back so normalisation has accurate numbers.\n4. **Normalise:** set the final loudness to -16 LUFS / -1 dBTP.\n\nThe Pass 2 filter chain, each stage handing the next a cleaner signal:\n\n```text\ndownmix → rumble high-pass → band-limit low-pass → noise reduction → speech gate → levelling compressor → de-esser → analysis → resample\n```\n\nFor the full walkthrough, see **[docs/Pipeline.md](docs/Pipeline.md)**: what each stage does, why it sits where it does, how the adaptive tuning works, and how normalisation reaches -16 LUFS honestly, with a diagram.\n\n---\n\n## Quality Ratings\n\nWhen a file finishes, the completion box shows two star ratings: **Recording** (your source capture, the one that varies) and **Processed** (the output against the -16 LUFS target, almost always five stars). The pair tells the story: a two-star capture taken to a five-star master.\n\n```\nJive Vocals 🗣️\n\n╭──────────────────────────────────────────╮\n│ Processing 3 files, 3 complete, 0 failed │\n╰──────────────────────────────────────────╯\n\n 🗸 LMP-83-mark-LUFS-16-processed.flac\n╭──────────────────────────────────────────╮\n│ Time        02:31  ·  ⚡ 19.0×           │\n│ Loudness    -35.2 → -16.1 LUFS  Δ +19.1  │\n│ True peak    -6.2 →  -1.7 ㏈TP  Δ  +4.5  │\n│ Dynamics     15.0 →  13.3 LU    Δ  -1.7  │\n│ Noise floor \u003c -96 ㏈                     │\n│ Recording   ★★★★☆  Great                 │\n│ Processed   ★★★★★  Excellent             │\n╰──────────────────────────────────────────╯\n 🗸 LMP-83-martin-LUFS-16-processed.flac\n╭──────────────────────────────────────────╮\n│ Time        02:38  ·  ⚡ 18.1×           │\n│ Loudness    -27.8 → -16.0 LUFS  Δ +11.8  │\n│ True peak    -4.5 →  -1.8 ㏈TP  Δ  +2.7  │\n│ Dynamics     14.7 →  12.0 LU    Δ  -2.7  │\n│ Noise floor -91 ㏈                       │\n│ Recording   ★★★★☆  Great                 │\n│ Processed   ★★★★★  Excellent             │\n╰──────────────────────────────────────────╯\n 🗸 LMP-83-popey-LUFS-16-processed.flac\n╭──────────────────────────────────────────╮\n│ Time        02:43  ·  ⚡ 17.6×           │\n│ Loudness    -29.8 → -16.0 LUFS  Δ +13.8  │\n│ True peak    -0.1 →  -1.3 ㏈TP  Δ  -1.2  │\n│ Dynamics     12.3 →   8.9 LU    Δ  -3.4  │\n│ Noise floor -86 ㏈                       │\n│ Recording   ★★☆☆☆  Fair                  │\n│ Processed   ★★★★★  Excellent             │\n╰──────────────────────────────────────────╯\n```\n\nSee **[docs/Usage.md](docs/Usage.md#quality-ratings)** for the three axes behind the Recording score and what a low star is telling you to fix.\n\n---\n\n## Usage\n\n```bash\njive-vocals [flags] \u003cfiles...\u003e\n```\n\n### Flags\n\n| Flag | Description |\n|------|-------------|\n| `-v, --version` | Show version and exit |\n| `-a, --analysis-only` | Run analysis only (Pass 1), display results, skip processing |\n| `-d, --debug` | Enable debug logging to `jive-vocals-debug.log` |\n| `--diagnostics` | Write extra diagnostic artefacts: before/after spectrogram PNGs plus `.intervals.jsonl`/`.candidates.jsonl` sidecars. Adds extra FFmpeg passes. Off by default |\n\n\n### Examples\n\n```bash\n# Process multiple presenters in parallel (worker count tracks file count)\njive-vocals presenter1.flac presenter2.flac presenter3.flac\n\n# Inspect recordings without processing\njive-vocals -a presenter1.flac presenter2.flac\n\n# Debug a problematic recording\njive-vocals -d troublesome-recording.flac\n\n# Process all FLAC files in directory\njive-vocals *.flac\n\n# Emit before/after spectrograms and interval sidecars\njive-vocals --diagnostics presenter1.flac\n```\n\nProcessing always writes a Markdown report next to each processed output. For example, `recording-LUFS-16-processed.flac` gets `recording-LUFS-16-processed.md`. The report is empirical: every measurement and the exact adapted filter parameters, with objective metric definitions and no quality verdicts. Analysis-only runs write `\u003cinput\u003e-analysis.md` instead.\n\n### Diagnostics\n\n`--diagnostics` writes before/after spectrogram PNGs and `.intervals.jsonl` / `.candidates.jsonl` sidecars beside the report, for sweeps and side-by-side comparison. It changes no DSP, so the processed audio is byte-identical with the flag on or off.\n\nSee **[docs/Usage.md](docs/Usage.md#diagnostics)** for the spectrogram naming scheme and sidecar formats.\n\n### Analysis-Only Mode\n\nPass `--analysis-only` to run Pass 1 only. It writes `\u003cinput\u003e-analysis.md` next to each input and shows the Recording stars plus a one-line gain verdict on screen, without producing any audio. Useful for checking a capture before you commit to a take.\n\nSee **[docs/Usage.md](docs/Usage.md#analysis-only-mode)** for what the report covers and how to read the gain-advice thermometer.\n\n---\n\n## Development\n\nRequires Go, Nix, and a tolerance for CGO.\n\n```bash\n# Enter development shell (FFmpeg dependencies provided)\nnix develop\n\n# Initialise submodules and download static FFmpeg libraries\njust setup\n\n# Build (never use go build directly - requires CGO + version injection)\njust build\n\n# Run tests\njust test\n\n# Install to ~/.local/bin\njust install\n```\n\nThe full source layout, architecture, and contribution standards live in [AGENTS.md](AGENTS.md).\n\n### Design Documentation\n\n- [Usage Guide](docs/Usage.md): driving Jive Vocals in depth: quality ratings, analysis-only mode, and diagnostics\n- [Audio Pipeline](docs/Pipeline.md): how and why the processing pipeline is built and tuned, with a diagram\n- [The hardware that taught me](docs/Inspiration.md): the influences and heritage behind Jive Vocals' processing approach\n- [Levelator Comparison](docs/Levelator-Comparison-And-Gap-Analysis.md): how Jive Vocals compares to The Levelator, with capabilities and gaps\n- [Spectral Metrics Reference](docs/Spectral-Metrics-Reference.md): how measurements drive adaptation\n- [Normalisation Tuning](docs/Normalisation-Tuning.md): why the loudnorm and limiter constants hold their corpus-derived values\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flinuxmatters%2Fjive-vocals","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flinuxmatters%2Fjive-vocals","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flinuxmatters%2Fjive-vocals/lists"}