Skip to main content

echoalign-asr-mlx logo

echoalign-asr-mlx

CI PyPI Python License: MIT

easr is a local Apple Silicon CLI that turns audio and video files into subtitle files (.srt, .vtt) and timestamp-aligned JSON.

Use it when you want local speech recognition, forced alignment, readable subtitles, and machine-friendly timing data without running a server.

Current scope:

  • runtime target: macOS on Apple Silicon
  • backend: MLX with Qwen3 ASR and Qwen3 ForcedAligner
  • output: SRT, WebVTT, and JSON
  • license: MIT
  • not included yet: translation, speaker diarization, Linux/Windows support

What You Get

For each supported media file, easr writes:

  • <name>.srt for subtitle players and editors
  • <name>.vtt for web video workflows
  • <name>.json for downstream tools that need segments, tokens, timestamps, language metadata, and provider metadata
  • <name>.metrics.json when --verbose is enabled

easr accepts files, directories, and glob patterns. Directory scans are non-recursive by default, and recursive processing is opt-in with --recursive.

Requirements

  • macOS on Apple Silicon
  • Python >=3.14,<3.15
  • ffmpeg and ffprobe available on PATH
  • uv if you run from a source checkout
  • network access on first run so the models can be downloaded from Hugging Face

Install the media tools with Homebrew:

brew install ffmpeg

Default provider models:

Installation

Install from PyPI:

python3.14 -m pip install "echoalign-asr-mlx[mlx]"
easr --help

Run from a source checkout:

uv sync --extra mlx
uv run --python 3.14 --extra mlx easr --help

If you use the source checkout flow, prefix examples in this README with:

uv run --python 3.14 --extra mlx easr ...

Quick Start

Transcribe one file:

easr ./demo.mp4

Write outputs to a custom directory:

easr ./demo.mp4 --output-dir ./subtitles

Process a directory:

easr ./media

Process a directory recursively:

easr ./media --recursive

Process a glob pattern:

easr "./media/**/*.mp4" --recursive

Export token-level subtitle and JSON views:

easr ./demo.mp4 --granularity token

Show detailed progress and write metrics:

easr ./demo.mp4 --verbose

Supported Formats

Audio:

  • wav
  • mp3
  • m4a
  • flac
  • aac

Video:

  • mp4
  • mov
  • m4v
  • mkv
  • webm

Output Layout

Default output directory name: outputs.

When the input is a single file, outputs are written next to that file:

/project/media/demo.mp4
/project/media/outputs/demo.srt
/project/media/outputs/demo.vtt
/project/media/outputs/demo.json

When the input is a directory or the current directory, outputs are written under that input root:

/project/media/
  a.mp4
  nested/b.wav

/project/media/outputs/
  a.srt
  a.vtt
  a.json
  nested/b.srt
  nested/b.vtt
  nested/b.json

Use --output-dir to choose another output root.

JSON Output

The JSON export keeps the readable transcript and the alignment data used to create subtitle views.

Common top-level fields:

  • source_path
  • provider_name
  • detected_language
  • segments
  • source_media
  • granularity
  • items

Each segment includes text, start/end timestamps, language metadata, optional speaker metadata, and token timing when available. source_media includes the prepared audio path, VAD metadata, and provider diagnostics such as processing strategy, duration, window counts, quality pass counts, and window diagnostics.

CLI Options

Option Meaning
inputs File, directory, or glob pattern. Defaults to the current directory.
--recursive Recursively scan directory inputs.
--output-dir PATH Override the default output directory root.
--granularity sentence Use segment boundaries for subtitle entries and JSON items. This is the default.
--granularity token Use token timing for subtitle entries and JSON items.
--no-vad Disable voice activity detection preprocessing.
--verbose Print detailed progress and write <name>.metrics.json.
--version Show the installed package version.
--help Show CLI help.

VAD Preprocessing

Voice activity detection is enabled by default. easr scans the prepared audio, finds likely speech ranges, groups them into padded chunks, and asks the provider to process only those ranges. Final subtitle timestamps remain on the original media timeline.

Disable VAD when you want full-duration provider processing:

easr ./demo.mp4 --no-vad

If VAD fails, easr falls back to full-duration processing. If VAD succeeds and finds no speech, easr writes successful empty subtitle outputs.

Shell Completion

Fish shell users can generate or install completions:

easr completion fish
easr completion install fish

The install command writes:

~/.config/fish/completions/easr.fish

Existing completion files at that path are overwritten.

Runtime Behavior

  • exit code 0: all discovered files processed successfully
  • exit code 1: no supported input was found, environment preflight failed, or at least one file failed in a batch
  • batch files are processed one by one
  • failures are reported per file to stderr
  • other files continue processing after a per-file failure
  • the first run may be slower because model files are downloaded and cached

Troubleshooting

Missing ffmpeg or ffprobe

Install the media tools and make sure they are visible from the shell running easr:

brew install ffmpeg
which ffmpeg
which ffprobe

MLX or Metal preflight failed

Check that you are on Apple Silicon, using the expected Python environment, and installed the MLX runtime extra:

python3.14 -m pip install "echoalign-asr-mlx[mlx]"

For a source checkout:

uv sync --extra mlx
uv run --python 3.14 --extra mlx easr --help

First run is slow

This is expected when the Qwen3 model files are downloaded and the local cache is warmed. Later runs should be faster.

Current Limitations

  • Translation is not implemented.
  • Speaker diarization is not implemented.
  • Subtitle segmentation quality depends on model and alignment behavior.
  • The public CLI does not expose provider selection.

Development and Community

Metadata

Release files for echoalign-asr-mlx 0.6.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for echoalign-asr-mlx 0.6.0
File Size Uploaded
echoalign_asr_mlx-0.6.0.tar.gz 852.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for echoalign-asr-mlx 0.6.0
File Interpreter ABI Platform
echoalign_asr_mlx-0.6.0-py3-none-any.whl Python 3 none any Details

Total release size: 899.2 kB

Release files / echoalign_asr_mlx-0.6.0.tar.gz

Download URL echoalign_asr_mlx-0.6.0.tar.gz
Size 852.7 kB
Tags Source
SHA-256 checksum
How to use checksums
ca51be39b28aeb36392dd65bf8138913ffd5661d6e093572e39d462c2327e84a
BLAKE2b-256 checksum
How to use checksums
d45cb91b75d661c41632302220441da20872b8722c3ffeba3424edec1fd6ec62
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on May 26, 2026.

Transparency log

Release files / echoalign_asr_mlx-0.6.0-py3-none-any.whl

Download URL echoalign_asr_mlx-0.6.0-py3-none-any.whl
Size 46.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a2f1c1749713c4c30a2c03922da5dc2cdf11b0fadfe659dd3d5af91af7a9a52e
BLAKE2b-256 checksum
How to use checksums
d9bc2f61cbebda9c147da8987d0b217d24795576aec1f7f5e1ad266442fabaf6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on May 26, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.6.0 This release

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.3

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page