XavierChuu/EasyScript

AI-powered transcription & translation desktop app. Real-time speech-to-text with Whisper, speaker diarization, live mic transcription, and 30+ language translation. Optimized for Apple Silicon with Metal GPU.

Python

5

25 commits

updated Oct 14, 2026

See the code

README

EasyScript

Premiere Pro panel for silence cutting, transcription, translation, voice / music separation and beat markers, backed by a local Python server (Whisper, pyannote, Mel-Band RoFormer, numpy beat tracker). Everything runs on your machine, GPU first — macOS (Apple Silicon / Metal) and Windows (NVIDIA CUDA, DirectML on any GPU, or CPU).


Features

Cut

  • Silence & breath detection on the selected clip or the whole sequence, with padding / min-silence / threshold controls and a live preview on the waveform
  • Apply Cut directly on the timeline (frame-exact: cuts are snapped inward to the sequence's frame grid, so they never reach into speech)
  • Export XML cut — rebuilds the sequence as an FCP XML in one pass (much faster than razor-by-razor on hour-long timelines), optionally imported straight back into the project
  • Tag speaker — an edit at every speaker change with clips named and colour-labelled per speaker, built as a new sequence (exact, music / B-roll untouched) or in place

Transcript

  • Whisper transcription — mlx-whisper on Apple Silicon, faster-whisper on CUDA/CPU; Turbo by default (Vietnamese long-form benchmark: same accuracy as Large V3 at ~3× the speed), word-level timestamps, optional vocabulary (names / terms) to bias recognition
  • Music / Song mode — vocal isolation (Mel-Band RoFormer when its model is present, else Demucs) + tunable vocal sensitivity, phrase gap and decode quality
  • Speaker diarization — pyannote community-1, bundled, no HuggingFace token; every word is attributed to its speaker and lines are split where the speaker really changes
  • Voice library — rename a speaker once and they are recognised by voice in later videos; move a line to another speaker or merge two speakers from the speaker tag
  • Translation — local (NLLB / Ollama) or Claude API, multiple target languages side by side
  • Search & replace, display modes (sentence / word / punctuation / max words per line)
  • Captions — export SRT (original or after cuts) and create a Premiere captions track

Voice / music separation

  • Separate voice / music — Mel-Band RoFormer (Kim vocal model, MIT) on a full-quality copy of the loaded range: Voice only for transcription, Music only for beats; switch Original / Voice / Music instantly
  • Runs on Metal (MLX) on Apple Silicon, CUDA or DirectML on Windows; the two stems add back up to the source exactly
  • Import to timeline at the original timecode on the first audio track that is free for the whole range — never overwriting audio; a new track is added when every track is busy there

Beats

  • Beat / downbeat detection with auto or fixed BPM, tempo range and tightness
  • Marker spacing from 1/4 beat up to 4 bars, with meter, downbeat offset and half/double tempo — reviewed on the waveform before applying
  • Markers placed on the sequence timeline or on the clip selected in the timeline (else the clip of the loaded audio, e.g. an imported stem); clear them again in one click

Waveform

  • Canvas renderer with multi-resolution peaks — smooth zoom from a full 3-hour overview down to individual samples
  • Speaker colours, cut regions, beat markers; click to seek Premiere's playhead

Install

Option 1 — installer: run install-mac.command (macOS) or install-win.bat (Windows) from the release folder; it installs the panel and the backend.

Option 2 — manual:

  1. Install EasyScript-Premiere.zxp (one file for macOS and Windows) with a ZXP installer (ZXP Installer by aescripts / Anastasiy's Extension Manager).
  2. Copy the contents of the release's backend/ folder to ~/.easyscript/backend (macOS) or %USERPROFILE%\.easyscript\backend (Windows) — the prebuilt backend needs no build. On macOS then run xattr -dr com.apple.quarantine ~/.easyscript/backend.

Then open Premiere Pro → Window → Extensions → EasyScript; the panel starts the backend automatically. Full guide: release-template/guide.html (VI) / guide-en.html (EN).

Requirements: Premiere Pro 22+ (CEP 9+), macOS 13+ or Windows 10+, 8 GB RAM (16 GB for large models). FFmpeg is bundled.


Development

EasyScript/
├── cep-extension-v2.1/     # Premiere panel (CEP)
│   ├── index.html / index.js / styles.css
│   ├── waveform.js         # canvas waveform
│   ├── beats.js            # beat-marker UI
│   ├── separate.js         # voice / music separation UI
│   ├── bridge.js           # promise wrapper over evalScript
│   ├── host.jsx            # ExtendScript (ES3, JSON polyfilled)
│   └── package_zxp.*       # sign → dist/EasyScript-Premiere.zxp
├── backend/                # FastAPI server (localhost:9876)
│   ├── server.py           # API
│   ├── security.py         # per-launch access token, Host/CORS checks
│   ├── transcriber.py / diarizer.py / translator.py / silence_detector.py
│   ├── waveform.py         # multi-resolution peaks
│   ├── beat_tracker.py     # numpy beat tracker
│   ├── xml_cut.py          # FCP7 XML sequence cutter
│   ├── separator.py        # voice / music stems (roformer.py torch, roformer_mlx.py MLX core)
│   ├── backend_main.py     # PyInstaller entry
│   ├── easyscript_backend.spec
│   └── tests/
├── scripts/
│   ├── build_backend_win.ps1   # Windows backend build (venv: backend/venv-win)
│   ├── build_backend_mac.sh    # macOS backend build (venv: backend/venv)
│   └── make_release.sh         # assemble the release bundle
└── release-template/       # installer files copied into each release

Run the backend

cd backend
python -m venv venv && venv/bin/pip install -r requirements.txt
EASYSCRIPT_TOKEN=dev venv/bin/python server.py

Every request needs the access token (header X-EasyScript-Token, or ?token= for <audio> / WebSocket); only /health is open. The panel reads it from ~/.easyscript/token-<port>. EASYSCRIPT_TOKEN pins it for development.

Panel without Premiere

Serve cep-extension-v2.1/ and open index.html?token=dev (add &port=… for another backend port), or run start_dev.command on macOS. Premiere-only actions are disabled in the browser.

Panel inside Premiere (dev)

Run cep-extension-v2.1/install.bat (Windows) or install.sh (macOS). It enables PlayerDebugMode and copies the panel into the CEP extensions directory; the debugger is at http://localhost:8088.

Build

powershell -ExecutionPolicy Bypass -File scripts\build_backend_win.ps1
./scripts/build_backend_mac.sh

Output: backend/dist_backend/EasyScript-backend/. Step-by-step macOS build and release: docs/BUILD_MAC.md. Windows release zip (panel + backend + guides): scripts/make_release_win.ps1. Package the panel with cep-extension-v2.1/package_zxp.ps1 -ZxpSign <ZXPSignCmd.exe> (or package_zxp.sh). The signing certificate and ZXPSignCmd stay out of git.

Tests

python -m unittest discover -s backend/tests -t backend

License

MIT License

Credits

apple-silicon
desktop-app
fastapi
live-transcription
macos
mlx
pyannote
python
real-time
speaker-diarization
speech-to-text
subtitle-generator
transcription
translation
whisper

XavierChuu/EasyScript

AI-powered transcription & translation desktop app. Real-time speech-to-text with Whisper, speaker diarization, live mic transcription, and 30+ language translation. Optimized for Apple Silicon with Metal GPU.

Python

5

25 commits

updated Oct 14, 2026

See the code

README

EasyScript

Premiere Pro panel for silence cutting, transcription, translation, voice / music separation and beat markers, backed by a local Python server (Whisper, pyannote, Mel-Band RoFormer, numpy beat tracker). Everything runs on your machine, GPU first — macOS (Apple Silicon / Metal) and Windows (NVIDIA CUDA, DirectML on any GPU, or CPU).


Features

Cut

  • Silence & breath detection on the selected clip or the whole sequence, with padding / min-silence / threshold controls and a live preview on the waveform
  • Apply Cut directly on the timeline (frame-exact: cuts are snapped inward to the sequence's frame grid, so they never reach into speech)
  • Export XML cut — rebuilds the sequence as an FCP XML in one pass (much faster than razor-by-razor on hour-long timelines), optionally imported straight back into the project
  • Tag speaker — an edit at every speaker change with clips named and colour-labelled per speaker, built as a new sequence (exact, music / B-roll untouched) or in place

Transcript

  • Whisper transcription — mlx-whisper on Apple Silicon, faster-whisper on CUDA/CPU; Turbo by default (Vietnamese long-form benchmark: same accuracy as Large V3 at ~3× the speed), word-level timestamps, optional vocabulary (names / terms) to bias recognition
  • Music / Song mode — vocal isolation (Mel-Band RoFormer when its model is present, else Demucs) + tunable vocal sensitivity, phrase gap and decode quality
  • Speaker diarization — pyannote community-1, bundled, no HuggingFace token; every word is attributed to its speaker and lines are split where the speaker really changes
  • Voice library — rename a speaker once and they are recognised by voice in later videos; move a line to another speaker or merge two speakers from the speaker tag
  • Translation — local (NLLB / Ollama) or Claude API, multiple target languages side by side
  • Search & replace, display modes (sentence / word / punctuation / max words per line)
  • Captions — export SRT (original or after cuts) and create a Premiere captions track

Voice / music separation

  • Separate voice / music — Mel-Band RoFormer (Kim vocal model, MIT) on a full-quality copy of the loaded range: Voice only for transcription, Music only for beats; switch Original / Voice / Music instantly
  • Runs on Metal (MLX) on Apple Silicon, CUDA or DirectML on Windows; the two stems add back up to the source exactly
  • Import to timeline at the original timecode on the first audio track that is free for the whole range — never overwriting audio; a new track is added when every track is busy there

Beats

  • Beat / downbeat detection with auto or fixed BPM, tempo range and tightness
  • Marker spacing from 1/4 beat up to 4 bars, with meter, downbeat offset and half/double tempo — reviewed on the waveform before applying
  • Markers placed on the sequence timeline or on the clip selected in the timeline (else the clip of the loaded audio, e.g. an imported stem); clear them again in one click

Waveform

  • Canvas renderer with multi-resolution peaks — smooth zoom from a full 3-hour overview down to individual samples
  • Speaker colours, cut regions, beat markers; click to seek Premiere's playhead

Install

Option 1 — installer: run install-mac.command (macOS) or install-win.bat (Windows) from the release folder; it installs the panel and the backend.

Option 2 — manual:

  1. Install EasyScript-Premiere.zxp (one file for macOS and Windows) with a ZXP installer (ZXP Installer by aescripts / Anastasiy's Extension Manager).
  2. Copy the contents of the release's backend/ folder to ~/.easyscript/backend (macOS) or %USERPROFILE%\.easyscript\backend (Windows) — the prebuilt backend needs no build. On macOS then run xattr -dr com.apple.quarantine ~/.easyscript/backend.

Then open Premiere Pro → Window → Extensions → EasyScript; the panel starts the backend automatically. Full guide: release-template/guide.html (VI) / guide-en.html (EN).

Requirements: Premiere Pro 22+ (CEP 9+), macOS 13+ or Windows 10+, 8 GB RAM (16 GB for large models). FFmpeg is bundled.


Development

EasyScript/
├── cep-extension-v2.1/     # Premiere panel (CEP)
│   ├── index.html / index.js / styles.css
│   ├── waveform.js         # canvas waveform
│   ├── beats.js            # beat-marker UI
│   ├── separate.js         # voice / music separation UI
│   ├── bridge.js           # promise wrapper over evalScript
│   ├── host.jsx            # ExtendScript (ES3, JSON polyfilled)
│   └── package_zxp.*       # sign → dist/EasyScript-Premiere.zxp
├── backend/                # FastAPI server (localhost:9876)
│   ├── server.py           # API
│   ├── security.py         # per-launch access token, Host/CORS checks
│   ├── transcriber.py / diarizer.py / translator.py / silence_detector.py
│   ├── waveform.py         # multi-resolution peaks
│   ├── beat_tracker.py     # numpy beat tracker
│   ├── xml_cut.py          # FCP7 XML sequence cutter
│   ├── separator.py        # voice / music stems (roformer.py torch, roformer_mlx.py MLX core)
│   ├── backend_main.py     # PyInstaller entry
│   ├── easyscript_backend.spec
│   └── tests/
├── scripts/
│   ├── build_backend_win.ps1   # Windows backend build (venv: backend/venv-win)
│   ├── build_backend_mac.sh    # macOS backend build (venv: backend/venv)
│   └── make_release.sh         # assemble the release bundle
└── release-template/       # installer files copied into each release

Run the backend

cd backend
python -m venv venv && venv/bin/pip install -r requirements.txt
EASYSCRIPT_TOKEN=dev venv/bin/python server.py

Every request needs the access token (header X-EasyScript-Token, or ?token= for <audio> / WebSocket); only /health is open. The panel reads it from ~/.easyscript/token-<port>. EASYSCRIPT_TOKEN pins it for development.

Panel without Premiere

Serve cep-extension-v2.1/ and open index.html?token=dev (add &port=… for another backend port), or run start_dev.command on macOS. Premiere-only actions are disabled in the browser.

Panel inside Premiere (dev)

Run cep-extension-v2.1/install.bat (Windows) or install.sh (macOS). It enables PlayerDebugMode and copies the panel into the CEP extensions directory; the debugger is at http://localhost:8088.

Build

powershell -ExecutionPolicy Bypass -File scripts\build_backend_win.ps1
./scripts/build_backend_mac.sh

Output: backend/dist_backend/EasyScript-backend/. Step-by-step macOS build and release: docs/BUILD_MAC.md. Windows release zip (panel + backend + guides): scripts/make_release_win.ps1. Package the panel with cep-extension-v2.1/package_zxp.ps1 -ZxpSign <ZXPSignCmd.exe> (or package_zxp.sh). The signing certificate and ZXPSignCmd stay out of git.

Tests

python -m unittest discover -s backend/tests -t backend

License

MIT License

Credits

apple-silicon
desktop-app
fastapi
live-transcription
macos
mlx
pyannote
python
real-time
speaker-diarization
speech-to-text
subtitle-generator
transcription
translation
whisper