Local Mac CLI for single-video Qwen3-ASR transcription.
Project description
qwen-transcribe
Local Mac CLI for transcribing one video file with Qwen3-ASR or selected FunASR backends. A successful run writes a .txt transcript, a timed .srt, and a subtitled review MP4.
Environment
This project uses uv and the project-root .venv.
uv venv .venv
uv sync
Run project commands through uv:
uv run qwen-transcribe --help
Do not use the system python3 command as the project runtime.
Default Models
The default ASR model is:
mlx-community/Qwen3-ASR-1.7B-8bit
SRT output also uses this ForcedAligner model:
Qwen/Qwen3-ForcedAligner-0.6B
The CLI is designed for Apple Silicon Macs with 16GB memory. If the default ASR model is too slow or memory-heavy, pass a different model with --model. The aligner model is internal for now and is prepared by init.
Two FunASR backend aliases are also supported:
funasr:sensevoice
funasr:paraformer-zh
Install the optional FunASR dependencies before using them:
uv sync --extra funasr
funasr:sensevoice uses iic/SenseVoiceSmall with fsmn-vad; it is the better FunASR choice for multilingual audio. SenseVoice does not always return sentence timestamps, so qwen-transcribe falls back to FunASR VAD windows for subtitle timing when needed.
funasr:paraformer-zh uses paraformer-zh with fsmn-vad and ct-punc; it is Chinese-only. For Chinese lecture or course videos, this is the recommended FunASR backend because it provides native sentence timing and generally produces more readable subtitle segmentation.
FunASR subtitles never use the Qwen ForcedAligner. Qwen ForcedAligner is used only by the default MLX/Qwen ASR path.
ffmpeg
ffmpeg must be installed separately. The CLI checks for it during setup and does not install system packages.
brew install ffmpeg
Setup
Prepare the local environment and model cache:
uv run qwen-transcribe init
To validate without preparing missing model files:
uv run qwen-transcribe init --check-only
Transcribe
Transcribe one video. A successful run writes three artifacts next to the source video:
VIDEO.txt- plain transcriptVIDEO.srt- playback subtitles generated from the selected backend's timing pathVIDEO.subtitled.mp4- a copy of the source video with the subtitles added as a selectable subtitle track
uv run qwen-transcribe transcribe path/to/video.mp4
The source video is never modified. The review MP4 keeps the original video and audio streams and only adds the subtitle track, so you can open it in a local player and toggle the generated subtitles to inspect ASR quality in context.
Use an explicit transcript path. --output names only the .txt; the .srt and review MP4 stay next to the source video:
uv run qwen-transcribe transcribe path/to/video.mp4 --output transcript.txt
Override source language when automatic detection is not desired:
uv run qwen-transcribe transcribe path/to/video.mp4 --language English
Use a FunASR backend:
uv run qwen-transcribe init --model funasr:sensevoice
uv run qwen-transcribe transcribe path/to/video.mp4 --model funasr:sensevoice --overwrite
For Chinese-only Paraformer:
uv run qwen-transcribe init --model funasr:paraformer-zh
uv run qwen-transcribe transcribe path/to/video.mp4 --model funasr:paraformer-zh --language Chinese --overwrite
Replace existing generated artifacts. Without --overwrite the command fails before any work if any of the .txt, .srt, or review MP4 already exists:
uv run qwen-transcribe transcribe path/to/video.mp4 --overwrite
If forced alignment or subtitle formatting fails, the command reports that stage clearly rather than writing guessed subtitles. If MP4 packaging fails after the .txt and .srt are written, those files remain on disk and the command reports a packaging failure.
Limits
For long media, the pipeline cuts the extracted audio into 15-minute ASR windows and merges the resulting transcript and timing offsets before subtitle generation. Local runtime speed and success still depend on the Mac, available memory, model behavior, and source media. SRT generation is slower than .txt because it runs ASR, forced alignment, and subtitle formatting. The first version does not resume from partial ASR or alignment output after failure.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file qwen_transcribe-0.1.5.tar.gz.
File metadata
- Download URL: qwen_transcribe-0.1.5.tar.gz
- Upload date:
- Size: 18.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
996035de27b7aa30e97c1152ec2874fff1b7878489fa5d079ba2e84dc6b2cbc7
|
|
| MD5 |
3d34fdbbaa96269844a91f7a88208f67
|
|
| BLAKE2b-256 |
3659bda150a37b145131a8bea95f704f3324d965cbe5ea741a039aff79f6b05b
|
Provenance
The following attestation bundles were made for qwen_transcribe-0.1.5.tar.gz:
Publisher:
publish-to-pypi.yml on 1WorldCapture/qwen-transcribe
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
qwen_transcribe-0.1.5.tar.gz -
Subject digest:
996035de27b7aa30e97c1152ec2874fff1b7878489fa5d079ba2e84dc6b2cbc7 - Sigstore transparency entry: 2116108175
- Sigstore integration time:
-
Permalink:
1WorldCapture/qwen-transcribe@05a8761525e532a5d009ee0c97956c3e698df90a -
Branch / Tag:
refs/tags/v0.1.5 - Owner: https://github.com/1WorldCapture
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-to-pypi.yml@05a8761525e532a5d009ee0c97956c3e698df90a -
Trigger Event:
push
-
Statement type:
File details
Details for the file qwen_transcribe-0.1.5-py3-none-any.whl.
File metadata
- Download URL: qwen_transcribe-0.1.5-py3-none-any.whl
- Upload date:
- Size: 24.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bdb3d5354270795867787ff2e10d446df850994661ecdd2afae18c510ce2be12
|
|
| MD5 |
c4b529176c7a81a71d8c0d36094ae35d
|
|
| BLAKE2b-256 |
255442f2313c4b0cc569f507d5f76775cb123b4d229054ba01267b6b32197c48
|
Provenance
The following attestation bundles were made for qwen_transcribe-0.1.5-py3-none-any.whl:
Publisher:
publish-to-pypi.yml on 1WorldCapture/qwen-transcribe
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
qwen_transcribe-0.1.5-py3-none-any.whl -
Subject digest:
bdb3d5354270795867787ff2e10d446df850994661ecdd2afae18c510ce2be12 - Sigstore transparency entry: 2116108210
- Sigstore integration time:
-
Permalink:
1WorldCapture/qwen-transcribe@05a8761525e532a5d009ee0c97956c3e698df90a -
Branch / Tag:
refs/tags/v0.1.5 - Owner: https://github.com/1WorldCapture
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-to-pypi.yml@05a8761525e532a5d009ee0c97956c3e698df90a -
Trigger Event:
push
-
Statement type: