Mark Ku's Blog
v0.23.0 · MIT licensed

AI Music Cut

A desktop rough-cut tool for podcasts and audio. Drop in a recording and it strips fillers and stutters, levels the loudness, keeps the breath at the end of sentences, and lets you audition every splice before export. There is a CLI too, so it fits in CI.

Completely free · MITWindows · macOS · Linux
ai-music-cut · main editor
Main editor: waveform, candidate blocks, transcript and the decisions panel

What it takes off your hands

Not a one-click black box. For every change you can see what moved and why.

🗣

Fillers and stutters

Um, uh, you know, like, plus the parts where you restarted mid-sentence. Naturalness comes first: sentence-opening connectives and fillers that carry rhythm are kept, not scrubbed.

🎚

Loudness levelling

Per-segment BS.1770 measurement, then gain planning (±12 dB, peak guard, 3-tap smoothing, ≤3 dB step limit), then two loudnorm passes plus a limiter. The result lands on the target you chose.

🫁

Breathing room, preserved

Cutting does not mean gluing sentences together. 170 ms mid-sentence, 340 ms at sentence end, 575 ms between paragraphs, and room tone filled in when the silence is too short.

✂️

Cuts on whole waveforms

A cut snaps to the word boundary, then to the lowest-energy point within ±30 ms, then to the nearest rising zero crossing within ±3 ms. Every splice gets a fade: 4 ms in quiet, 24 ms speech-to-speech.

👂

Two agents checking each other

An editor agent proposes; a reviewer agent flags only the cuts that would actually break something. When they disagree it does not decide for you; it marks the cut as contested and hands it over.

Verification after export

Each exported segment's envelope is cross-correlated against the source to catch mis-splices and drift. With a transcript it also re-runs ASR and diffs word by word, listing dropped words, missed cuts and suspect splices.

Everything else it does

AI is optional, not required: waveform, manual editing and export run entirely on your machine with no key at all.

🌊

Waveform on open

No analysis step first. The full waveform and time ruler appear in seconds, ready to play and zoom.

🖱

Edit by hand

Press S for the selection tool, drag a range, then play (looping optional), cut, keep only, mute, fade, or adjust gain. Wave-Editor-style context menu.

📝

Edit from the transcript

Shift-click to select a range, or double-click a single word to cut it.

🥁

Beat grid and snapping

BPM is detected from waveform energy; beat and bar lines are drawn on the timeline and selections snap to them. Wrong guess? Halve or double it, or tap three times along with the track.

Automatic highlight

Pick 15, 30, 60 or 90 seconds and it finds the most chorus-like passage by energy and groove, snapping to bars when a beat grid exists.

🎵

AI background music

Describe a style and get instrumental BGM. Length comes from your current selection and BPM from the detected tempo, so it drops straight into the media list.

🎨

Style transfer

Select a passage and describe the target style (lo-fi, acoustic guitar, cinematic, 8-bit) to run audio2audio against it. A strength slider decides between keeping the melody and going free.

🎤

Vocal removal and stems

Split into vocals plus accompaniment (2 stems) or vocals / drums / bass / other (4 stems). The accompaniment stem is your instrumental, ready to edit.

🤖

AI assistant with a tool loop

Your local claude CLI drives editing decisions through a built-in MCP server: "cut every 'you know' after the ten-minute mark, but keep the ones that open a sentence." Every tool call is shown.

⌨️

Keyboard review mode

One candidate at a time with the cut auto-auditioned; A accepts, R rejects, and it advances on its own. Identical fillers can be decided as a group.

🔍

Three preview modes

Source, cut (live approximation), and cut (rendered). The rendered preview uses the same splicer as the real export, byte-identical to it when levelling is off.

💾

Project files

Saved as *.aicut.json with the transcript, candidates, decisions, effects and the AI judgement cache. Reopening the same audio reuses the cache instead of re-running ASR.

What it looks like

The four-step flow strip sits on top, candidate blocks and beat lines overlay the waveform, and the decisions / assistant / verify rail is on the right.

Main editor: waveform, candidate blocks, transcript and the decisions panel
Main editor: waveform, candidate blocks, transcript and the decisions panel

Three things to know before you start

Better said up front than discovered after downloading.

  1. 1

    Half of it works with no key

    Viewing the waveform, editing by hand, applying effects (mute, fades, gain) and exporting to mp3 / m4a / wav all run locally, with no key and no network.

  2. 2

    Speech and music features need a ttls API key

    Transcription (faster-whisper large-v3), vocal separation (demucs) and music generation or style transfer (ACE-Step) go through a self-hosted ttls server, which needs an API key. The key lives only in your OS keychain, never in project files, settings or logs.

  3. 3

    AI judging and the assistant need the Claude Code CLI

    They use the claude CLI you are already signed into locally, defaulting to sonnet (configurable). Skipping it does not affect the two items above.

Stack

The audio heavy lifting is in Rust; the interface is React.

Desktop shellTauri 2
FrontendReact 18 + TypeScript 5 + zustand
Waveformwavesurfer.js 7.12.11
Audio processingRust (ebur128 / hound / blake3)
Transcode and encodeffmpeg (bundled LGPL build on Windows)
AIClaude Code CLI + self-hosted ttls

Download

v0.23.0 ships 9 installers, each with a sha256.

Windows 10 / 11

x64-setup.exe (46.9 MB) · x64_en-US.msi (62.7 MB)

The installer bundles an LGPL ffmpeg build, so it works right after install. An ffmpeg you installed yourself still takes precedence.

macOS

aarch64.dmg · x64.dmg (about 5 MB each)

Separate builds for Apple Silicon and Intel. Install ffmpeg 7 or newer yourself (brew install ffmpeg).

Linux

amd64.deb · x86_64.rpm (5.2 MB each) · amd64.AppImage (78.9 MB)

The deb and rpm declare ffmpeg as a dependency, so your package manager pulls it in. AppImage needs ffmpeg on PATH.

The Windows builds are 40–60 MB larger than the others; that difference is the compressed bundled ffmpeg. There are no Windows ARM64 or Linux aarch64 builds yet; build from source on those platforms.

Build from source

  1. 1

    npm install --legacy-peer-deps: the peer dependencies deliberately use the legacy resolver; without this flag the install fails.

  2. 2

    node scripts/fetch-ffmpeg.mjs (optional): fetches the bundled LGPL ffmpeg. The URL and sha256 are pinned in scripts/ffmpeg-manifest.json and a mismatch fails hard. Skip it and development still works, falling back to ffmpeg on PATH.

  3. 3

    npm run tauri dev: the frontend runs on 1420; the first Rust build takes 5 to 10 minutes, then it is fast.

One-liner (copy and paste into a terminal):

There is a CLI too: aicut

Runs the whole pipeline headless, and verify exits with code 2 on problems so it drops straight into CI.

Bundle to a single file (Node 20+)

npm run cli:build

Transcript only

node dist-cli/aicut.mjs transcribe ep12.m4a

Analyse into a project file (with AI judging)

node dist-cli/aicut.mjs analyze ep12.m4a --judge --project ep12.aicut.json

Cut and export in one step

node dist-cli/aicut.mjs cut ep12.m4a --judge -o ep12_cut.mp3

Remove vocals

node dist-cli/aicut.mjs separate song.mp3 --format wav

Detect BPM and beats

node dist-cli/aicut.mjs beats song.mp3 --bars

Generate BGM

node dist-cli/aicut.mjs music "lofi hip hop, warm" --duration 30 --bpm 90

Verify the export (for CI)

node dist-cli/aicut.mjs verify ep12.m4a ep12_cut.mp3

The key can come from --key, the AICUT_TTLS_API_KEY environment variable, or a .env.local at the repo root; it is never printed and never written to any output. Note that the CLI only does global loudnorm; it has no per-segment levelling like the desktop app.

Licence and third-party components

AI Music Cut itself is MIT. The Windows installer bundles ffmpeg under LGPL-2.1-or-later (n8.1.2; the download URL and sha256 are pinned in scripts/ffmpeg-manifest.json and a mismatch fails the build). It is used as a separate process with dynamic linking, so it is not linked into the main binary and the app is not a derivative work of ffmpeg. You can drop in your own ffmpeg build in the same directory, or point at a different path in Settings. The full notice and the LGPL text are in THIRD-PARTY-NOTICES.txt in the repo.

Read THIRD-PARTY-NOTICES.txt

Get your rough-cut time back

Hand it the mechanical work (fillers, loudness, splices) and keep the judgement about what to say and what to drop. MIT licensed, all the code is there to read.

AI Music Cut: free, open-source AI audio cut tool for podcasts - Mark Ku's Tech Notes