FluidAudio: Ejecuta Modelos de Audio AI de Última Generación Localmente en Dispositivos Apple con CoreML
FluidAudio es un SDK de Swift para ejecutar reconocimiento de voz, síntesis de texto a voz, diarización de hablantes y detección de actividad de voz completamente en el dispositivo utilizando el Neural Engine de Apple. Este artículo explora sus capacidades, arquitectura y cómo integrarlo en tus aplicaciones.
Por qué FluidAudio es Importante para Desarrolladores de Apple
Durante años, integrar audio AI avanzado en aplicaciones de Apple significaba una de dos cosas: enviar datos de audio a una API en la nube (con todas las implicaciones de latencia, privacidad y costo) o luchar para ejecutar modelos hinchados de PyTorch en el dispositivo con bajo rendimiento. FluidAudio cambia esto al proporcionar un SDK de Swift pulido que descarga la inferencia al Apple Neural Engine (ANE), ofreciendo audio AI rápido, eficiente en energía y completamente local.
El SDK incluye modelos de código abierto de última generación (licencia MIT/Apache 2.0) para:
- Reconocimiento Automático del Habla (ASR) — transcripción por lotes y en streaming
- Texto a Voz (TTS) — síntesis paralela y en streaming con clonación de voz
- Diarización de Hablantes — identificar "quién habló cuándo" en conversaciones
- Detección de Actividad de Voz (VAD) — detectar segmentos de habla en audio
Todos los modelos están preconvertidos a CoreML y optimizados para el ANE, lo que significa que utilizan un mínimo de CPU y evitan por completo GPU/MPS. Esto hace que FluidAudio sea ideal para procesamiento en segundo plano, computación ambiental y cargas de trabajo siempre activas.
Primeros Pasos: Instalación
FluidAudio se integra a través de Swift Package Manager. Añádelo a tu Package.swift:
dependencies: [
.package(url: "https://github.com/FluidInference/FluidAudio.git", from: "0.12.4"),
],
Luego añade el producto a tu destino:
.product(name: "FluidAudio", package: "FluidAudio")
En Xcode, usa Archivo → Agregar Paquetes y pega la URL del repositorio. CocoaPods también es compatible mediante pod 'FluidAudio', '~> 0.12.4', aunque los mantenedores recomiendan cocoapods-spm para una mejor integración.
Capacidades Principales en Profundidad
1. Reconocimiento Automático del Habla (ASR)
El ASR de FluidAudio está impulsado por los modelos Parakeet TDT de NVIDIA, convertidos a CoreML. Hay dos versiones disponibles:
- v3: Multilingüe, compatible con 25 idiomas europeos más japonés
- v2: Solo inglés, optimizado para la máxima recuperación
Rendimiento: En un M4 Pro, la transcripción por lotes logra un factor de tiempo real de ~190x — lo que significa que una hora de audio se procesa en aproximadamente 19 segundos. El streaming es compatible mediante SlidingWindowAsrManager para casos de uso en tiempo real.
Inicio Rápido — Transcripción por Lotes:
import FluidAudio
Task {
let models = try await AsrModels.downloadAndLoad(version: .v3)
let asrManager = AsrManager(config: .default)
try await asrManager.loadModels(models)
// `samples` es [Float] a 16kHz
let result = try await asrManager.transcribe(samples)
print("Transcripción: \(result.text)")
}
Equivalente en CLI:
swift run fluidaudiocli transcribe audio.wav
swift run fluidaudiocli transcribe audio.wav --model-version v2 # Solo inglés
2. Diarización de Hablantes
FluidAudio ofrece tres pipelines de diarización, cada uno con diferentes compensaciones:
Pipeline Desconectado (Pyannote Community-1)
Mejor para el procesamiento posterior de reuniones grabadas. Utiliza segmentación de conjunto de potencia + embeddings WeSpeaker + agrupamiento VBx. Proporciona alta precisión pero no es adecuado para uso en tiempo real.
let config = OfflineDiarizerConfig()
let manager = OfflineDiarizerManager(config: config)
try await manager.prepareModels()
let samples = try AudioConverter().resampleAudioFile(path: "meeting.wav")
let result = try await manager.process(audio: samples)
for segment in result.segments {
print("\(segment.speakerId) \(segment.startTimeSeconds)s → \(segment.endTimeSeconds)s")
}
LS-EEND (Streaming)
Diarización neuronal de extremo a extremo con CoreML. Soporta hasta 10 hablantes, actualizaciones de cuadro de 100ms con vista previa tentativa de 900ms. Esta es la opción predeterminada recomendada para diarización en línea.
Sortformer (Streaming)
Modelo Sortformer de NVIDIA, que ofrece mejor estabilidad de identidad del hablante que LS-EEND pero limitado a 4 hablantes. Licenciado bajo la Licencia de Modelo Abierto de NVIDIA.
Cuándo usar cada uno:
- LS-EEND: Predeterminado para diarización en vivo — alta capacidad de hablantes, buenos puntos de referencia
- Sortformer: Cuando la estabilidad de identidad importa más que el número de hablantes
- Pipeline Pyannote: Cuando necesitas control modular sobre las etapas de segmentación y agrupamiento
3. Detección de Actividad de Voz (VAD)
Impulsado por Silero VAD, el detector de FluidAudio proporciona tanto segmentación desconectada como APIs de streaming. El modo desconectado devuelve probabilidades a nivel de fragmento cada salto de 256ms:
let results = try await manager.process(samples)
for (index, chunk) in results.enumerated() {
print(String(format: "Fragmento %02d: prob=%.3f", index, chunk.probability))
}
Para una integración de nivel superior, usa segmentSpeech con duraciones mínimas de habla/silencio configurables:
var segmentation = VadSegmentationConfig.default
segmentation.minSpeechDuration = 0.25
segmentation.minSilenceDuration = 0.4
let segments = try await manager.segmentSpeech(samples, config: segmentation)
4. Texto a Voz (TTS)
FluidAudio incluye dos motores TTS:
| Característica | PocketTTS | Kokoro |
|---|---|---|
| Generación | Autorregresiva cuadro por cuadro (80ms) | Paralela (todos los cuadros a la vez) |
| Streaming | Sí | No |
| Clonación de voz | Sí (muestra de 1–30s) | No |
| Control de pronunciación | No | Sí (SSML, léxico personalizado) |
| Idiomas | EN, DE, ES, FR, IT, PT | EN, ES, FR, HI, JA, PT, ZH, IT |
Ejemplo de PocketTTS:
let manager = PocketTtsManager(language: .spanish)
try await manager.initialize()
let audioData = try await manager.synthesize(text: "Hola, mundo.")
try audioData.write(to: URL(fileURLWithPath: "out.wav"))
Ejemplo de Kokoro (optimizado para ANE):
let manager = KokoroAneManager()
try await manager.initialize()
let samples = try await manager.synthesize(text: "Hello from FluidAudio.")
// `samples` es PCM Float32 mono a 24 kHz
Configuración para Implementaciones Empresariales
FluidAudio maneja las descargas de modelos desde HuggingFace automáticamente, pero los entornos empresariales a menudo necesitan personalización:
Registro de Modelos Personalizado
Si tienes un espejo local o un entorno aislado:
ModelRegistry.baseURL = "https://your-mirror.example.com"
Configuración de Proxy
Para cortafuegos corporativos:
export https_proxy=http://proxy.company.com:8080
swift run fluidaudiocli transcribe audio.wav
Modo Solo Desconectado
Para aplicaciones sensibles a la privacidad que envían modelos empaquetados:
ModelHub.offlineMode = true
let asr = try await AsrModels.load(from: bundledModelURL, configuration: config)
Cuando el modo desconectado está habilitado, cualquier recuperación de red lanza DownloadError.networkDisabled en lugar de intentar una descarga.
Impacto en el Mundo Real: El Escaparate
El ecosistema de FluidAudio ha crecido rápidamente, con docenas de aplicaciones que utilizan el SDK. Ejemplos notables incluyen:
- Voice Ink: AI local para transcripción instantánea y privada
- Spokenly: Dictado en Mac con transcripción en tiempo real y de archivos
- Slipbox: Asistente de reuniones centrado en la privacidad
- Talat: Aplicación de notas de reuniones con AI (destacada en TechCrunch)
- BoltAI: Creación de contenido utilizando modelos Parakeet
- Hedy: Entrenador de reuniones en tiempo real, completamente en el dispositivo, en iOS, macOS, Android y Windows
Estas aplicaciones demuestran la amplitud de casos de uso que FluidAudio permite — desde dictado simple hasta análisis complejo de reuniones con múltiples hablantes.
Por qué el Apple Neural Engine es Importante
La decisión de FluidAudio de apuntar al ANE en lugar de GPU/MPS es deliberada. El ANE ofrece:
- Menor consumo de energía: Ideal para cargas de trabajo siempre activas y en segundo plano
- Hardware dedicado: No compite con la GPU para gráficos o tareas de cómputo
- Rendimiento consistente: Tiempos de inferencia predecibles entre generaciones de dispositivos
Esto hace que FluidAudio sea particularmente adecuado para:
- Transcripción de reuniones ejecutándose en segundo plano
- Interfaces controladas por voz en dispositivos con batería
- Subtitulado en tiempo real y funciones de accesibilidad
Conclusión
FluidAudio representa un avance significativo para el audio AI en dispositivos Apple. Al combinar modelos de última generación con inferencia CoreML optimizada para ANE, ofrece un rendimiento que antes solo era alcanzable con APIs en la nube — todo mientras mantiene los datos privados y locales.
Ya sea que estés construyendo una aplicación de dictado, un asistente de reuniones o una interfaz controlada por voz, FluidAudio proporciona los componentes básicos con un código mínimo. El diseño modular del SDK, la documentación completa y la comunidad activa lo hacen accesible tanto para desarrolladores independientes como para equipos empresariales.
Comienza hoy: Clona el repositorio de GitHub, consulta la documentación y únete a la comunidad de Discord para obtener soporte y actualizaciones.