{"id":51326832,"url":"https://github.com/darylalim/whisper-transcribe","last_synced_at":"2026-07-01T19:02:29.954Z","repository":{"id":331135350,"uuid":"1117862851","full_name":"darylalim/whisper-transcribe","owner":"darylalim","description":"Streamlit application for transcription and translation using OpenAI Whisper on Apple Silicon with MLX.","archived":false,"fork":false,"pushed_at":"2026-06-26T18:57:27.000Z","size":1449,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-26T20:21:38.603Z","etag":null,"topics":["apple-silicon","automatic-speech-recognition","mlx-whisper","openai-whisper","speech-to-text","streamlit","subtitles","transcription","translation","whisper-large-v3-turbo"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/darylalim.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-12-16T23:32:47.000Z","updated_at":"2026-06-26T18:57:31.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/darylalim/whisper-transcribe","commit_stats":null,"previous_names":["darylalim/asr-pipeline","darylalim/whisper-pipeline","darylalim/whisper-transcribe"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/darylalim/whisper-transcribe","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/darylalim%2Fwhisper-transcribe","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/darylalim%2Fwhisper-transcribe/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/darylalim%2Fwhisper-transcribe/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/darylalim%2Fwhisper-transcribe/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/darylalim","download_url":"https://codeload.github.com/darylalim/whisper-transcribe/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/darylalim%2Fwhisper-transcribe/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35019037,"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-01T02:00:05.325Z","response_time":130,"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":["apple-silicon","automatic-speech-recognition","mlx-whisper","openai-whisper","speech-to-text","streamlit","subtitles","transcription","translation","whisper-large-v3-turbo"],"created_at":"2026-07-01T19:02:29.304Z","updated_at":"2026-07-01T19:02:29.941Z","avatar_url":"https://github.com/darylalim.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Whisper Transcribe\n\n[![CI](https://github.com/darylalim/whisper-transcribe/actions/workflows/ci.yml/badge.svg)](https://github.com/darylalim/whisper-transcribe/actions/workflows/ci.yml)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n[![Python 3.12+](https://img.shields.io/badge/Python-3.12%2B-blue.svg)](https://www.python.org/downloads/)\n\nTranscribe and translate audio and video **locally on your Mac** — no cloud, no uploads, no cost. This Streamlit application is powered by OpenAI's Whisper and accelerated on Apple Silicon with MLX (Apple's machine-learning framework). Bring your own files, record straight from the browser, or paste a YouTube or media URL.\n\n![Whisper Transcribe — the app's four input tabs (Upload, Record, YouTube, URL) with language, translation, subtitle, and advanced transcription controls](docs/screenshot.png)\n\n## Features\n\n- **[OpenAI Whisper large-v3-turbo](https://huggingface.co/mlx-community/whisper-large-v3-turbo)** via [mlx-whisper](https://pypi.org/project/mlx-whisper/), accelerated on Apple Silicon\n- **On-device processing** — audio is transcribed entirely on your machine; nothing is uploaded (only the YouTube and URL input modes — plus the one-time model-weights download on first run — use the network)\n- **100-language transcription** with auto-detect or manual selection\n- **Translate non-English audio to English**\n- **Four input modes** — multi-file upload (up to 500 MB per file), in-browser recording, YouTube links, and direct audio/video file URLs\n- **Editable subtitle preview**, exportable as SRT (the standard subtitle file format)\n- **No verbatim** — removes filler words, false starts, and repetitions\n- **Decode segments independently** — more robust on noisy or music-heavy audio\n- **Time-range clipping** — transcribe only selected portions (comma-separated `start,end` pairs in seconds)\n- **Keyterms** — bias decoding toward proper nouns and jargon (up to 50 terms)\n- **Instant repeat results** — identical file-and-settings combinations are served from cache\n- **Light and dark theme** with Material Symbol icons, switchable in the app's settings menu\n\n## How it works\n\nYou provide audio or video through one of four tabs (upload, record, YouTube, or URL). The app writes the audio to a temporary file and runs `mlx_whisper.transcribe()` with the Whisper large-v3-turbo model locally on Apple Silicon via MLX. The result is cached, rendered as editable plain text (or SRT when subtitles are enabled), and can be downloaded as `.txt` or `.srt`. See [CLAUDE.md](CLAUDE.md) for the full architecture.\n\n![A completed transcription in Whisper Transcribe — the editable transcript for an uploaded file, with a Download button to save it as .txt or .srt](docs/screenshot-result.png)\n\n## Requirements\n\n- macOS on Apple Silicon (M1 / M2 / M3 / M4)\n- Python 3.12+\n- [FFmpeg](https://formulae.brew.sh/formula/ffmpeg)\n- [uv](https://docs.astral.sh/uv/)\n\n## Setup\n\n```bash\ngit clone https://github.com/darylalim/whisper-transcribe.git\ncd whisper-transcribe\nbrew install ffmpeg\nuv sync\n```\n\n## Usage\n\n```bash\nuv run streamlit run streamlit_app.py\n```\n\nUpload one or more files (audio: `aac, aiff, ogg, mp3, opus, wav, flac, m4a`; video: `mp4, avi, mkv, mov, wmv, flv, webm, mpeg, 3gpp`), record audio in-browser, paste a YouTube URL, or paste an audio/video file URL, then click **Transcribe**.\n\n\u003e **First run:** the first time you transcribe, the Whisper large-v3-turbo weights (~1.5 GB) are downloaded from Hugging Face and cached locally, so the first transcription takes longer and needs an internet connection. Subsequent transcriptions run offline.\n\nOptional controls:\n\n- **Primary language** — auto-detected by default\n- **Translate to English** — translate non-English audio\n- **Include subtitles** — show an editable SRT subtitle preview; the **Download** button then serves a `.srt` file instead of `.txt`\n- **No verbatim** — remove filler words, false starts, and repetitions\n- **Decode segments independently** — disable prior-window context; more robust on noisy or music-heavy audio, at the cost of slightly choppier wording where 30 s windows meet\n- **Time range** — transcribe only selected portions; comma-separated `start,end` pairs in seconds (e.g., `30,90` for one clip, `0,60,120,180` for multiple); invalid ranges are flagged inline\n- **Keyterms** — bias decoding toward specific terms (proper nouns, jargon)\n\n**Decode segments independently**, **Time range**, and **Keyterms** are grouped under an **Advanced options** expander.\n\n## Development\n\nAfter `uv sync`, the project's checks run through uv:\n\n```bash\nuv run pytest             # run the test suite\nuv run ruff check .       # lint\nuv run ruff format .      # format\nuv run ty check           # type-check\n```\n\nCI runs the same tools on every push to `main` and on pull requests — it uses `ruff format --check .` to *verify* formatting rather than apply it, so run `ruff format .` locally before committing. The workflow targets a **macos-14 (Apple Silicon) runner**, since `mlx-whisper` ships no Linux wheels. Please make sure `ruff`, `ty`, and `pytest` pass before opening a pull request.\n\n## Troubleshooting\n\n- **`ffmpeg` not found** — install it with `brew install ffmpeg` and verify with `ffmpeg -version`. FFmpeg is required for decoding audio and video.\n- **Intel Mac / non–Apple Silicon** — `mlx-whisper` requires Apple Silicon and will not run on Intel Macs.\n- **Long pause on the first transcription** — the model weights (~1.5 GB) are downloading from Hugging Face (see the *First run* note above); this needs a network connection and only happens once.\n- **YouTube download fails** — this usually means `yt-dlp` is out of date; update it with `uv lock --upgrade-package yt-dlp \u0026\u0026 uv sync`.\n- **URL download rejected** — direct audio/video URLs are capped at 500 MB.\n\n## License\n\nThis project is licensed under the [MIT License](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdarylalim%2Fwhisper-transcribe","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdarylalim%2Fwhisper-transcribe","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdarylalim%2Fwhisper-transcribe/lists"}