Alex
|
7e51dc6903
|
refactor(parakeet): Improve consistency across ASR managers (#494)
This PR addresses three high-priority consistency improvements in the
Parakeet ASR folder from issue #457.
## Summary
- ✅ **Task 1:** Standardized lifecycle method names across all managers
(13 files)
- ✅ **Task 2:** Consolidated ~230 lines of duplicate token deduplication
logic
- ✅ **Task 3:** Extracted shared streaming code into reusable utilities
## Changes
### 1. Lifecycle Method Standardization
Unified naming conventions to eliminate confusion:
| Manager | Old Method | New Method |
|---------|-----------|------------|
| `AsrManager` | `loadModels(_:)` | `configure(models:)` |
| `SlidingWindowAsrSession` | `initialize()` | `loadModels()` |
| `SlidingWindowAsrManager` | `start()` | `startStreaming()` |
| `StreamingEouAsrManager` | `loadModelsFromHuggingFace()` |
`loadModels()` |
**Files updated:** 5 managers + 8 CLI commands
### 2. Token Deduplication Consolidation
Extracted duplicate matching algorithms into generic, type-safe
utilities:
**New Files:**
- `SequenceMatch.swift` - Data structure for sequence matches
- `SequenceMatcher.swift` - 5 reusable matching algorithms:
- `findSuffixPrefixMatch()` - O(n) greedy boundary detection
- `findBoundedSubstringMatch()` - Windowed search
- `findLongestCommonSubsequence()` - O(n²) LCS via DP
- `findContiguousMatches()` - Longest consecutive run
- `consolidateMatches()` - Merge adjacent matches
- `TokenDeduplicationRegressionTests.swift` - 12 comprehensive tests
**Refactored:**
- `AsrManager+TokenProcessing.swift` - Reduced from ~65 to ~40 lines
(-38%)
- `ChunkProcessor.swift` - Removed ~77 lines of duplicate code
### 3. Streaming Code Extraction
Created utilities for common patterns in both `StreamingEouAsrManager`
and `StreamingNemotronAsrManager`:
**New Utilities:**
- `EncoderCacheManager` - Cache initialization and extraction
- `StreamingAsrUtils` - Audio buffering, state reset, token decoding
## Impact
| Metric | Result |
|--------|--------|
| **Duplicate code eliminated** | ~230 lines |
| **New reusable utilities** | 430 lines |
| **Test coverage** | +12 regression tests |
| **API consistency** | Unified lifecycle naming |
| **Performance** | No regression ✅ |
| **WER** | 0.4% (verified) ✅ |
| **RTFx** | 43.3x (verified) ✅ |
| **Tests** | 25/25 passing ✅ |
## Testing
```bash
# Token deduplication regression tests
swift test --filter TokenDeduplicationRegressionTests
# ✅ 12/12 tests passing
# Nemotron streaming tests
swift test --filter StreamingNemotronAsrManagerTests
# ✅ 16/16 tests passing
# ASR benchmark (no WER regression)
swift run -c release fluidaudiocli asr-benchmark --max-files 10
# ✅ WER: 0.4%, RTFx: 43.3x
```
## Breaking Changes
⚠️ This PR contains breaking API changes:
- Renamed lifecycle methods (no deprecation wrappers)
- All call sites updated in this PR
Closes #457
<!-- devin-review-badge-begin -->
---
<a href="https://app.devin.ai/review/fluidinference/fluidaudio/pull/494"
target="_blank">
<picture>
<source media="(prefers-color-scheme: dark)"
srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
<img
src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
alt="Open with Devin">
</picture>
</a>
<!-- devin-review-badge-end -->
---------
|
2026-04-07 19:30:58 -04:00 |
|
Alex
|
f3dba78a23
|
Reorganize ASR directory by model family and add StreamingAsrEngine protocol (#440)
## Summary
- **Split ASR/ into Parakeet/ and Qwen3/** model families — they share
zero code, so this separation makes the architecture clearer
- **Reorganize Parakeet** into `Shared/`, `Decoder/`, `SlidingWindow/`,
and `Streaming/` subdirectories reflecting the two processing approaches
- **Rename StreamingAsrManager → SlidingWindowAsrManager** since it uses
sliding window processing with overlapping chunks, not true streaming
- **Add StreamingAsrEngine protocol** with `StreamingModelVariant` enum
and factory for EOU and Nemotron engines
- **Mirror source structure in CLI commands**
(`ASR/Parakeet/SlidingWindow/`, `ASR/Parakeet/Streaming/`, `ASR/Qwen3/`)
and tests
### New directory structure
```
Sources/FluidAudio/ASR/
├── Parakeet/
│ ├── Shared/ (AsrManager, AsrModels, AsrTypes, AudioBuffer, ChunkProcessor, etc.)
│ ├── Decoder/ (TdtDecoderV2, V3, TdtConfig, TdtHypothesis, BlasIndex, etc.)
│ ├── SlidingWindow/ (SlidingWindowAsrManager, SlidingWindowAsrSession, CTC/, CustomVocabulary/)
│ └── Streaming/ (StreamingAsrEngine, StreamingEouAsrManager, NemotronStreamingAsrManager, etc.)
└── Qwen3/ (Qwen3AsrManager, Qwen3AsrConfig, Qwen3Tokenizer, etc.)
```
## Test plan
- [x] `swift build` — no compile errors
- [x] `swift test` — all 1356 tests pass
- [x] `swift format lint` — clean
- [x] ASR benchmark — 100 files, 2.6% WER, 74.8x RTFx on Parakeet TDT v3
Closes #434
good point
https://github.com/FluidInference/FluidAudio/issues/442
<!-- devin-review-badge-begin -->
---
<a href="https://app.devin.ai/review/fluidinference/fluidaudio/pull/440"
target="_blank">
<picture>
<source media="(prefers-color-scheme: dark)"
srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
<img
src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
alt="Open with Devin">
</picture>
</a>
<!-- devin-review-badge-end -->
|
2026-03-28 02:00:11 -04:00 |
|