FluidAudio SDK
Swift SDK for fully local audio AI on Apple platforms. All inference runs on Apple Neural Engine (ANE) via CoreML — no cloud, no latency, no data leaves the device.
Repository: https://github.com/FluidInference/FluidAudio.git
Version: 0.12.1+
Platforms: macOS 14.0+ / iOS 17.0+ (arm64 only, Apple Silicon)
Quick Start
import FluidAudio
// ASR — batch transcription
let models = try await AsrModels.downloadAndLoad(version: .v3) // multilingual, 25 languages
let asr = AsrManager(config: .default)
try await asr.initialize(models: models)
let result = try await asr.transcribe(audioURL)
print(result.text)
Models auto-download from HuggingFace on first use, then cache at ~/.cache/fluidaudio/Models/.
Installation (SPM)
dependencies: [
.package(url: "https://github.com/FluidInference/FluidAudio.git", from: "0.12.1")
]
// Product: "FluidAudio" (core, Apache 2.0) or "FluidAudioTTS" (+ Kokoro TTS, GPL-3.0)
Components & Performance
| Component |
Manager |
RTFx (M4 Pro) |
Key Metric |
| ASR (batch) |
AsrManager |
~190x |
WER 3.21% |
| ASR (streaming) |
StreamingEouAsrManager |
real-time |
160ms–1.6s EOU latency |
| Diarization (offline) |
OfflineDiarizerManager |
~150x |
DER 13.89% |
| Diarization (online) |
DiarizerManager |
~150x |
DER 17.7% |
| VAD |
VadManager |
~1000x+ |
F1 0.85 |
| TTS (PocketTTS) |
PocketTTS |
— |
~80ms latency |
| TTS (Kokoro) |
KokoroModel |
— |
High quality, SSML |
All audio auto-converts to 16kHz mono Float32 via AudioConverter.
Detailed References
Read the appropriate reference file based on your task:
- ASR (batch + streaming transcription): See references/asr.md — models, batch/streaming APIs, configuration, EOU detection, token merging, CLI
- Speaker diarization: See references/diarization.md — offline/online pipelines, Sortformer, configuration, CLI
- Voice activity detection: See references/vad.md — batch/streaming VAD, segmentation config, CLI
- Text-to-speech: See references/tts.md — PocketTTS vs Kokoro, SSML, licensing
- Infrastructure (install, models, audio, platform): See references/infrastructure.md — SPM/CocoaPods setup, model management, caching, AudioConverter, ANE optimization, package structure
Key Integration Patterns
Typical macOS Voice-to-Text App
import FluidAudio
class TranscriptionService {
private var asrManager: AsrManager?
func setup() async throws {
let models = try await AsrModels.downloadAndLoad(version: .v3)
let manager = AsrManager(config: .default)
try await manager.initialize(models: models)
self.asrManager = manager
}
func transcribe(url: URL) async throws -> String {
guard let manager = asrManager else { throw TranscriptionError.notInitialized }
let result = try await manager.transcribe(url)
return result.text
}
}
Real-Time Streaming with EOU Detection
let streaming = StreamingEouAsrManager(config: .streaming)
try await streaming.start(models: models)
Task {
for await update in await streaming.transcriptionUpdates {
if update.isConfirmed {
// Final text — safe to paste/display
} else {
// Volatile — may change, show as preview
}
}
}
// Feed microphone audio
for chunk in microphoneBufferStream {
await streaming.streamAudio(chunk)
}
let final = try await streaming.finish()
Combined ASR + Diarization
let samples = try AudioConverter().resampleAudioFile(path: "meeting.wav")
// Transcribe
let asrResult = try await asrManager.transcribe(samples)
// Identify speakers
let diarizer = OfflineDiarizerManager(config: OfflineDiarizerConfig())
try await diarizer.prepareModels()
let diarResult = try await diarizer.process(audio: samples)
1---2name: fluidaudio3description: Integrate FluidAudio Swift SDK for fully local, on-device audio AI on Apple platforms. FluidAudio provides ASR (NVIDIA Parakeet TDT models), speaker diarization, VAD, and TTS — all running on Apple Neural Engine via CoreML with zero cloud dependency. Use when implementing: (1) offline/local speech-to-text transcription on macOS/iOS, (2) real-time streaming ASR with end-of-utterance detection, (3) speaker diarization (who spoke when), (4) voice activity detection, (5) text-to-speech synthesis, (6) any FluidAudio SDK integration, FluidInference models, or Parakeet CoreML models. Triggers on mentions of FluidAudio, FluidInference, parakeet-tdt, on-device transcription with CoreML, local ASR on Apple Silicon, or offline speech recognition for macOS/iOS apps.4---56# FluidAudio SDK78Swift SDK for fully local audio AI on Apple platforms. All inference runs on Apple Neural Engine (ANE) via CoreML — no cloud, no latency, no data leaves the device.910**Repository**: `https://github.com/FluidInference/FluidAudio.git`11**Version**: 0.12.1+12**Platforms**: macOS 14.0+ / iOS 17.0+ (arm64 only, Apple Silicon)1314## Quick Start1516```swift17import FluidAudio1819// ASR — batch transcription20let models = try await AsrModels.downloadAndLoad(version: .v3) // multilingual, 25 languages21let asr = AsrManager(config: .default)22try await asr.initialize(models: models)23let result = try await asr.transcribe(audioURL)24print(result.text)25```2627Models auto-download from HuggingFace on first use, then cache at `~/.cache/fluidaudio/Models/`.2829## Installation (SPM)3031```swift32dependencies: [33 .package(url: "https://github.com/FluidInference/FluidAudio.git", from: "0.12.1")34]35// Product: "FluidAudio" (core, Apache 2.0) or "FluidAudioTTS" (+ Kokoro TTS, GPL-3.0)36```3738## Components & Performance3940| Component | Manager | RTFx (M4 Pro) | Key Metric |41|-----------|---------|---------------|------------|42| ASR (batch) | `AsrManager` | ~190x | WER 3.21% |43| ASR (streaming) | `StreamingEouAsrManager` | real-time | 160ms–1.6s EOU latency |44| Diarization (offline) | `OfflineDiarizerManager` | ~150x | DER 13.89% |45| Diarization (online) | `DiarizerManager` | ~150x | DER 17.7% |46| VAD | `VadManager` | ~1000x+ | F1 0.85 |47| TTS (PocketTTS) | `PocketTTS` | — | ~80ms latency |48| TTS (Kokoro) | `KokoroModel` | — | High quality, SSML |4950All audio auto-converts to 16kHz mono Float32 via `AudioConverter`.5152## Detailed References5354Read the appropriate reference file based on your task:5556- **ASR (batch + streaming transcription)**: See [references/asr.md](references/asr.md) — models, batch/streaming APIs, configuration, EOU detection, token merging, CLI57- **Speaker diarization**: See [references/diarization.md](references/diarization.md) — offline/online pipelines, Sortformer, configuration, CLI58- **Voice activity detection**: See [references/vad.md](references/vad.md) — batch/streaming VAD, segmentation config, CLI59- **Text-to-speech**: See [references/tts.md](references/tts.md) — PocketTTS vs Kokoro, SSML, licensing60- **Infrastructure (install, models, audio, platform)**: See [references/infrastructure.md](references/infrastructure.md) — SPM/CocoaPods setup, model management, caching, AudioConverter, ANE optimization, package structure6162## Key Integration Patterns6364### Typical macOS Voice-to-Text App6566```swift67import FluidAudio6869class TranscriptionService {70 private var asrManager: AsrManager?7172 func setup() async throws {73 let models = try await AsrModels.downloadAndLoad(version: .v3)74 let manager = AsrManager(config: .default)75 try await manager.initialize(models: models)76 self.asrManager = manager77 }7879 func transcribe(url: URL) async throws -> String {80 guard let manager = asrManager else { throw TranscriptionError.notInitialized }81 let result = try await manager.transcribe(url)82 return result.text83 }84}85```8687### Real-Time Streaming with EOU Detection8889```swift90let streaming = StreamingEouAsrManager(config: .streaming)91try await streaming.start(models: models)9293Task {94 for await update in await streaming.transcriptionUpdates {95 if update.isConfirmed {96 // Final text — safe to paste/display97 } else {98 // Volatile — may change, show as preview99 }100 }101}102103// Feed microphone audio104for chunk in microphoneBufferStream {105 await streaming.streamAudio(chunk)106}107let final = try await streaming.finish()108```109110### Combined ASR + Diarization111112```swift113let samples = try AudioConverter().resampleAudioFile(path: "meeting.wav")114115// Transcribe116let asrResult = try await asrManager.transcribe(samples)117118// Identify speakers119let diarizer = OfflineDiarizerManager(config: OfflineDiarizerConfig())120try await diarizer.prepareModels()121let diarResult = try await diarizer.process(audio: samples)122```