|
| 1 | +# Final MPS Acceleration Findings - Complete Analysis |
| 2 | + |
| 3 | +## Critical Discoveries |
| 4 | + |
| 5 | +### 1. WhisperX Does NOT Support MPS ❌ |
| 6 | +**Error:** `ValueError: unsupported device mps` |
| 7 | + |
| 8 | +**Root Cause:** WhisperX uses `faster-whisper` → `ctranslate2` → only supports CPU and CUDA |
| 9 | + |
| 10 | +### 2. PyTorch Whisper MPS Support is Broken ❌ |
| 11 | +**Error:** `NotImplementedError: Could not run 'aten::_sparse_coo_tensor_with_dims_and_tensors' with arguments from the 'SparseMPS' backend` |
| 12 | + |
| 13 | +**Root Cause:** PyTorch's MPS backend doesn't support sparse tensor operations required by Whisper model |
| 14 | + |
| 15 | +This is a known limitation in PyTorch 2.x MPS implementation. |
| 16 | + |
| 17 | +## What Actually Works on Apple Silicon |
| 18 | + |
| 19 | +### Option 1: Whisper.cpp with Metal ✅ FASTEST |
| 20 | +**Implementation:** C++ with Metal acceleration |
| 21 | + |
| 22 | +**Performance:** |
| 23 | +- 30-50x faster than CPU |
| 24 | +- ~2-3 minutes per 90-minute episode |
| 25 | +- Total for 373 episodes: ~2-3 days |
| 26 | + |
| 27 | +**Limitations:** |
| 28 | +- ❌ NO word-level timestamps |
| 29 | +- Requires C++ compilation |
| 30 | +- Need separate alignment step (MFA) |
| 31 | + |
| 32 | +**Setup:** |
| 33 | +```bash |
| 34 | +git clone https://github.com/ggerganov/whisper.cpp |
| 35 | +cd whisper.cpp |
| 36 | +WHISPER_METAL=1 make -j |
| 37 | +bash ./models/download-ggml-model.sh large-v3 |
| 38 | +./main -m models/ggml-large-v3.bin -f audio.wav -l de |
| 39 | +``` |
| 40 | + |
| 41 | +### Option 2: MLX Whisper ✅ RECOMMENDED |
| 42 | +**Implementation:** Apple's MLX framework (optimized for Apple Silicon) |
| 43 | + |
| 44 | +**Performance:** |
| 45 | +- 15-25x faster than CPU |
| 46 | +- ~4-6 minutes per 90-minute episode |
| 47 | +- Total for 373 episodes: ~3-4 days |
| 48 | + |
| 49 | +**Advantages:** |
| 50 | +- ✅ Python interface (easy to use) |
| 51 | +- ✅ Native Apple Silicon optimization |
| 52 | +- ✅ Active development by Apple |
| 53 | +- ❌ NO word-level timestamps (need MFA) |
| 54 | + |
| 55 | +**Setup:** |
| 56 | +```bash |
| 57 | +pip install mlx-whisper |
| 58 | + |
| 59 | +# Python usage |
| 60 | +import mlx_whisper |
| 61 | +result = mlx_whisper.transcribe( |
| 62 | + audio_path, |
| 63 | + path_or_hf_repo="mlx-community/whisper-large-v3-mlx", |
| 64 | + language="de" |
| 65 | +) |
| 66 | +``` |
| 67 | + |
| 68 | +### Option 3: WhisperX on CPU ✅ SLOWEST BUT COMPLETE |
| 69 | +**Implementation:** WhisperX with CPU backend |
| 70 | + |
| 71 | +**Performance:** |
| 72 | +- No acceleration |
| 73 | +- ~200 minutes per 90-minute episode |
| 74 | +- Total for 373 episodes: ~52 days |
| 75 | + |
| 76 | +**Advantages:** |
| 77 | +- ✅ Word-level timestamps included |
| 78 | +- ✅ All features work |
| 79 | +- ✅ No additional alignment needed |
| 80 | + |
| 81 | +**Disadvantages:** |
| 82 | +- ❌ Very slow (no GPU acceleration) |
| 83 | + |
| 84 | +## Recommended Solution: MLX Whisper + MFA |
| 85 | + |
| 86 | +### Why MLX Whisper? |
| 87 | + |
| 88 | +1. **Python-based** - Easy integration with existing pipeline |
| 89 | +2. **Apple-optimized** - Built specifically for Apple Silicon |
| 90 | +3. **Good performance** - 15-25x speedup |
| 91 | +4. **Stable** - Maintained by Apple |
| 92 | +5. **Simple setup** - Just `pip install mlx-whisper` |
| 93 | + |
| 94 | +### Complete Pipeline |
| 95 | + |
| 96 | +**Step 1: Transcribe with MLX Whisper** |
| 97 | +```python |
| 98 | +import mlx_whisper |
| 99 | +import json |
| 100 | + |
| 101 | +def transcribe_episode(audio_path, output_path): |
| 102 | + result = mlx_whisper.transcribe( |
| 103 | + audio_path, |
| 104 | + path_or_hf_repo="mlx-community/whisper-large-v3-mlx", |
| 105 | + language="de", |
| 106 | + verbose=False |
| 107 | + ) |
| 108 | + |
| 109 | + with open(output_path, 'w') as f: |
| 110 | + json.dump(result, f, indent=2, ensure_ascii=False) |
| 111 | + |
| 112 | + return result |
| 113 | +``` |
| 114 | + |
| 115 | +**Estimated time:** 4-6 minutes per 90-minute episode |
| 116 | + |
| 117 | +**Step 2: Add word timestamps with MFA** |
| 118 | +```python |
| 119 | +import subprocess |
| 120 | + |
| 121 | +def align_with_mfa(audio_path, transcript_path, output_dir): |
| 122 | + # Create MFA corpus |
| 123 | + corpus_dir = "mfa_corpus" |
| 124 | + # ... setup code ... |
| 125 | + |
| 126 | + cmd = [ |
| 127 | + "mfa", "align", |
| 128 | + corpus_dir, |
| 129 | + "german_mfa", |
| 130 | + "german_mfa", |
| 131 | + output_dir, |
| 132 | + "--clean" |
| 133 | + ] |
| 134 | + subprocess.run(cmd, check=True) |
| 135 | +``` |
| 136 | + |
| 137 | +**Estimated time:** 5-10 minutes per episode |
| 138 | + |
| 139 | +**Total per episode:** 9-16 minutes |
| 140 | +**Total for 373 episodes:** 3-4 days |
| 141 | + |
| 142 | +## Performance Comparison Table |
| 143 | + |
| 144 | +| Solution | Transcription | Alignment | Total/Episode | Total/373 | Word Timestamps | |
| 145 | +|----------|--------------|-----------|---------------|-----------|-----------------| |
| 146 | +| WhisperX CPU | 200 min | Built-in | 200 min | 52 days | ✅ Yes | |
| 147 | +| WhisperX MPS | ❌ Not supported | - | - | - | - | |
| 148 | +| PyTorch Whisper MPS | ❌ Broken | - | - | - | - | |
| 149 | +| **MLX Whisper + MFA** | **4-6 min** | **5-10 min** | **9-16 min** | **3-4 days** | ✅ Yes (via MFA) | |
| 150 | +| Whisper.cpp + MFA | 2-3 min | 5-10 min | 7-13 min | 2-3 days | ✅ Yes (via MFA) | |
| 151 | + |
| 152 | +## Implementation Plan |
| 153 | + |
| 154 | +### Phase 1: Install MLX Whisper |
| 155 | +```bash |
| 156 | +pip install mlx-whisper |
| 157 | +``` |
| 158 | + |
| 159 | +### Phase 2: Test on 10 Episodes |
| 160 | + |
| 161 | +Create test script: |
| 162 | +```python |
| 163 | +#!/usr/bin/env python3 |
| 164 | +import mlx_whisper |
| 165 | +import time |
| 166 | +from pathlib import Path |
| 167 | + |
| 168 | +def test_mlx_whisper(episode_num): |
| 169 | + audio_files = list(Path(CLEANED_DIR).glob(f"episode_{episode_num:03d}_*_cleaned.wav")) |
| 170 | + audio_path = str(audio_files[0]) |
| 171 | + |
| 172 | + start = time.time() |
| 173 | + result = mlx_whisper.transcribe( |
| 174 | + audio_path, |
| 175 | + path_or_hf_repo="mlx-community/whisper-large-v3-mlx", |
| 176 | + language="de" |
| 177 | + ) |
| 178 | + elapsed = time.time() - start |
| 179 | + |
| 180 | + print(f"Episode {episode_num}: {elapsed:.1f}s") |
| 181 | + return result |
| 182 | + |
| 183 | +# Test episodes 1-10 |
| 184 | +for ep in range(1, 11): |
| 185 | + test_mlx_whisper(ep) |
| 186 | +``` |
| 187 | + |
| 188 | +### Phase 3: Full Pipeline |
| 189 | + |
| 190 | +1. Transcribe all 373 episodes with MLX Whisper |
| 191 | +2. Run MFA alignment on all episodes |
| 192 | +3. Validate random samples |
| 193 | +4. Generate final dataset |
| 194 | + |
| 195 | +## Why Not Other Options? |
| 196 | + |
| 197 | +### CoreML Whisper |
| 198 | +- ❌ No word timestamps |
| 199 | +- ❌ More complex setup |
| 200 | +- ❌ Not significantly faster than MLX |
| 201 | + |
| 202 | +### Native PyTorch Whisper |
| 203 | +- ❌ MPS support broken (sparse tensor issue) |
| 204 | +- ❌ Would need CPU fallback anyway |
| 205 | + |
| 206 | +### Faster-Whisper |
| 207 | +- ❌ No MPS support (ctranslate2 limitation) |
| 208 | +- ❌ Only CPU or CUDA |
| 209 | + |
| 210 | +## Conclusion |
| 211 | + |
| 212 | +**MLX Whisper + MFA is the best solution** for this project: |
| 213 | + |
| 214 | +1. ✅ **Works on Apple Silicon** (unlike WhisperX MPS and PyTorch Whisper MPS) |
| 215 | +2. ✅ **Good performance** (15-25x speedup, 3-4 days total) |
| 216 | +3. ✅ **Python-based** (easy integration) |
| 217 | +4. ✅ **Word timestamps** (via MFA) |
| 218 | +5. ✅ **Proven technology** (maintained by Apple) |
| 219 | + |
| 220 | +**Alternative:** Whisper.cpp is slightly faster (2-3 days) but requires C++ compilation and is more complex to integrate. |
| 221 | + |
| 222 | +## Next Steps |
| 223 | + |
| 224 | +1. Install MLX Whisper: `pip install mlx-whisper` |
| 225 | +2. Test on 10 episodes to validate performance |
| 226 | +3. Compare transcripts with originals |
| 227 | +4. If successful, process all 373 episodes |
| 228 | +5. Run MFA alignment |
| 229 | +6. Validate final dataset quality |
| 230 | + |
| 231 | +--- |
| 232 | + |
| 233 | +**Created:** 2026-06-19 |
| 234 | +**Status:** WhisperX MPS and PyTorch Whisper MPS both fail on Apple Silicon |
| 235 | +**Solution:** Use MLX Whisper (Apple's framework) + MFA for word timestamps |
| 236 | +**Expected completion:** 3-4 days for 373 episodes |
0 commit comments