Update FluidAudio from v0.7.7 (2dd0bd1) to v0.7.8 (8136bd0)
Performance improvements:
- 5% faster ASR inference
- 10% fewer missing words on long audio files
- 0.5% improved WER for v2 and v3 models
Stability improvements:
- Fixed ANE concurrency crashes (<3% latency impact)
- Switched ASR to stateless for better batching support
- Improved concurrency safety
This is a backward-compatible update with no API breaking changes.
No code changes required - all existing Parakeet integration works as-is.
Full changelog: https://github.com/FluidInference/FluidAudio/compare/v0.7.7...v0.7.8
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
- Remove try! force operation that could crash on in-memory container failure
- Implement cascading fallback strategy with 3 initialization attempts:
1. Persistent storage (normal operation)
2. In-memory storage with user warning
3. Ultra-minimal default container
- Add containerInitializationFailed flag to track critical failures
- Extract container creation into static helper methods for better error handling
- Show user-friendly error dialog and graceful termination on total failure
- Only use preconditionFailure as absolute last resort after all attempts fail
Addresses AI code reviewer feedback about unsafe force operations.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
- Replace force-unwrapped URLs in cloud transcription services with safe guard statements
* GroqTranscriptionService: Add URL validation before use
* ElevenLabsTranscriptionService: Add URL validation before use
* MistralTranscriptionService: Add URL validation before use
* OpenAICompatibleTranscriptionService: Add URL validation before use
- Replace fatalError in VoiceInk.swift with graceful degradation
* Implement in-memory fallback when persistent storage fails
* Add user notification for storage issues
* Use proper logging instead of fatal crash
- Fix dictionary force unwrap in WhisperPrompt.swift
* Add safe fallback when default language prompt missing
* Prevent potential crash on dictionary access
- Wrap debug print statement in #if DEBUG directive
* Eliminate production logging overhead in VoiceInk.swift
These changes prevent 6+ potential crash scenarios while maintaining
full functionality with graceful error handling.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Add atomic guards using ManagedAtomic to ensure continuations are resumed
exactly once in TaskDelegate, downloadFileWithProgress, and unzipCoreMLFile
functions. This resolves crashes during model downloads and transcription
when multiple callback paths race to resume the same continuation.
Changes:
- Import Atomics framework for atomic operations
- Add ManagedAtomic guards to prevent double resume
- Implement finishOnce helper pattern for consistent error handling
- Add proper cancellation handling in downloadFileWithProgress
Fixes crashes with stack trace: EXC_BREAKPOINT → _assertionFailure →
CheckedContinuation.resume(returning:) → VoiceInk [0x102dbfcc4, 0x102dc1174]
- Update FluidAudio to f47209a which includes ESpeakNG framework fix
- Fix VadConfig API compatibility: threshold -> defaultThreshold
- Add WorkspaceSettings to allow FluidAudio's unsafe build flags
This resolves the dyld crash: "Library not loaded: ESpeakNG.framework/Versions/A/ESpeakNG"
Fixed upstream in FluidInference/FluidAudio#159 and FluidInference/FluidAudio#160
Tested: All 4 UI tests pass