STT nativo vs Deepgram: ¿qué motor de voz elegir?
Cuando lancé TAMSIV, todo el reconocimiento de voz pasaba por Deepgram. Un servicio en la nube excelente, preciso, rápido. ¿El español? Impecable. ¿Los acentos regionales? Gestionados. ¿La puntuación automática? Perfecta. Solo había un detalle: cada segundo de audio transcrito tenía un precio. Y cuando tu aplicación se basa completamente en la voz, ese precio sube rápidamente.
Así que tuve que tomar una decisión estratégica: o mantengo Deepgram para todos y repercuto el costo en las suscripciones, o encuentro una alternativa gratuita para el plan Free y reservo Deepgram para los usuarios de pago. Elegí la segunda opción. Así es como construí una arquitectura dual STT nativo + Deepgram, y lo que aprendí al comparar ambos en condiciones reales.
Puntos clave a recordar:
- El STT nativo (Google/Apple) es gratuito, local y suficiente para dictados cortos
- Deepgram sigue siendo superior en precisión, especialmente en entornos ruidosos y con acentos
- Una arquitectura dual permite ofrecer un plan gratuito viable sin sacrificar la calidad premium
- La abstracción del frontend hace que los componentes ignoren qué motor está funcionando
- La elección STT nativo vs. nube es configurable por el administrador sin necesidad de actualizar la aplicación
¿Por qué el reconocimiento de voz es tan central en una aplicación de productividad?
TAMSIV no es una aplicación de productividad clásica donde escribes listas. Es una aplicación donde hablas. Dictas una tarea, una nota, un evento. El asistente de voz entiende lo que dices, crea el elemento y te responde. Todo pasa por la voz.
Esto significa que la calidad de la transcripción impacta directamente la experiencia. Si el STT entiende mal "comprar pan" y transcribe "comprar baño", el usuario pierde la confianza. Si la puntuación está ausente, la nota se convierte en un bloque de texto ilegible. El STT no es un gadget, es la base de toda la experiencia del usuario.
Por eso dediqué tiempo a construir cuidadosamente el pipeline de voz completo. El STT es la primera etapa de la cadena: Audio → STT → Texto → LLM → Function Calling → TTS → Audio. Si la primera etapa falla, todo lo demás se derrumba.
¿Cómo funciona el STT nativo en Android e iOS?
Cada smartphone moderno incorpora un motor de reconocimiento de voz. En Android, es el SpeechRecognizer de Google. En iOS, es el Speech framework de Apple. Estos motores están integrados en el sistema operativo y funcionan localmente; ningún dato sale del teléfono.
Las ventajas son claras:
- Gratuito: Sin costo por segundo, sin límite de solicitudes, sin facturas sorpresa.
- Local: Los datos de voz permanecen en el dispositivo. Perfecto para la privacidad.
- Rápido: Sin latencia de red. La transcripción comienza casi instantáneamente.
- Sin conexión: Funciona incluso sin conexión a internet (con los modelos descargados).
Pero hay límites. El STT nativo no está diseñado para casos de uso profesionales. La puntuación a menudo está ausente o es aproximada. La precisión disminuye significativamente en un entorno ruidoso. Y para el español con acentos (latinoamericanos, caribeños, etc.), los resultados varían mucho.
¿Qué aporta Deepgram adicionalmente?
Deepgram es un servicio de STT en la nube especializado. Su modelo Nova-2 está entrenado con miles de millones de horas de audio y ofrece una precisión notable. Esto es lo que lo distingue del STT nativo:
- Puntuación automática: Las frases están correctamente puntuadas, lo que hace que las notas sean inmediatamente legibles.
- VAD (Voice Activity Detection): Deepgram detecta cuándo hablas y cuándo haces una pausa. No transcribe el ruido ambiental.
- Streaming WebSocket: El audio se transcribe en tiempo real a través de WebSocket, palabra por palabra. El usuario ve su dictado aparecer a medida que habla.
- Multilingüe nativo: El español, incluso con acentos, está bien soportado.
- Endpointing inteligente: Deepgram sabe cuándo has terminado de hablar, lo que activa el procesamiento LLM en el momento adecuado.
¿El costo? Aproximadamente $0.0043 por minuto de audio en streaming. Parece poco, pero para una aplicación de voz donde cada interacción dura de 10 a 30 segundos, se acumula rápidamente con cientos de usuarios activos.
¿Cómo diseñé la arquitectura dual en TAMSIV?
El objetivo era claro: ofrecer dos motores STT intercambiables, sin que el código de la interfaz necesitara saber cuál estaba funcionando. El patrón es el de la abstracción: una interfaz común, dos implementaciones.
En el frontend (React Native), expongo una interfaz unificada:
// Interfaz común
interface STTEngine {
start(): void;
stop(): void;
onResult(callback: (text: string) => void): void;
onError(callback: (error: Error) => void): void;
}
// Dos implementaciones
class NativeSTTEngine implements STTEngine { ... }
class DeepgramSTTEngine implements STTEngine { ... }
La elección del motor está determinada por dos factores:
- El plan del usuario: Free → nativo, Pro/Team → Deepgram (configurable).
- La configuración del administrador: A través de la tabla
app_configen Supabase, puedo forzar un motor para todos los usuarios. Útil para pruebas A/B o en caso de problemas con un proveedor.
Los componentes de la interfaz de usuario (el Dictáfono, la pantalla de conversación) no saben qué motor está funcionando. Llaman a start(), stop() y reciben texto. Este es el principio de responsabilidad única aplicado al pipeline de voz.
¿Cuáles son los resultados de la comparación en condiciones reales?
Probé ambos motores en tres escenarios concretos, con el mismo contenido dictado en español:
| Escenario | STT nativo | Deepgram |
|---|---|---|
| Entorno tranquilo | ~92% | ~98% |
| Ruido de fondo (cafetería, calle) | ~75% | ~94% |
| Español con acentos | ~80% | ~95% |
| Dictado rápido (>150 palabras/min) | ~70% | ~93% |
El veredicto es claro: Deepgram es objetivamente superior en todos los escenarios. La diferencia se acentúa particularmente en entornos ruidosos y con acentos. La puntuación automática de Deepgram es una ventaja enorme para las notas de voz; una nota sin puntuación es un bloque de texto tedioso de releer.
Pero, y esta es la importante matización, para dictar una tarea corta ("Comprar leche mañana por la mañana"), el STT nativo es suficiente. En un entorno tranquilo, el 92% de precisión en una frase de 5 palabras funciona. El usuario siempre puede editar el texto después de la creación por voz.
¿Cómo esta arquitectura sirve al modelo económico?
La arquitectura dual no es solo una proeza técnica, es una elección de negocio. Permite tres cosas:
- Un plan Free viable: El usuario gratuito puede usar la voz sin que me cueste nada en STT. El costo es cero porque el procesamiento es local.
- Un argumento para el premium: "¿Quieres mayor precisión, especialmente en el ruido? Pásate a Pro." El usuario que ha probado el nativo y quiere algo mejor tiene una razón concreta para pagar. Es el mismo principio que aplico a las suscripciones de RevenueCat.
- Un respaldo de seguridad: Si Deepgram tiene una interrupción (sucede), puedo cambiar a todos los usuarios al nativo cambiando un valor en
app_config. No se necesita una actualización de la aplicación. Es el mismo patrón de respaldo que uso para el LLM a través de OpenRouter.
¿Cuáles son las dificultades técnicas de la integración de STT nativo en React Native?
Integrar el STT nativo en React Native no es trivial. Estos son los problemas que encontré:
- APIs diferentes Android/iOS: El SpeechRecognizer de Android y el Speech framework de iOS tienen APIs completamente diferentes. La librería de React Native que utilizo abstrae parte de estas diferencias, pero no todas.
- Gestión del ciclo de vida: En Android, el SpeechRecognizer debe limpiarse correctamente cuando la aplicación pasa a segundo plano. De lo contrario, sigue escuchando y consume batería. Tuve que añadir listeners al AppState para gestionar esto.
- Tiempo de espera de seguridad: El STT nativo puede quedarse bloqueado en estado "listening" indefinidamente. Añadí un tiempo de espera de 30 segundos (el mismo patrón que en el AudioPlayerService) con limpieza automática.
- Sin streaming fiable: A diferencia de Deepgram, que envía las palabras a medida que se pronuncian, el STT nativo devuelve resultados parciales que pueden ser contradictorios. Tuve que implementar un debounce para evitar el "parpadeo" del texto mostrado.
¿Cómo configurar la elección de STT de forma remota sin implementar?
Una de las ventajas de esta arquitectura es la configurabilidad remota. En Supabase, tengo una tabla app_config que almacena parámetros globales de la aplicación. La elección del motor STT es uno de ellos.
Cuando la aplicación se inicia, lee la configuración de Supabase (o de la caché, gracias al ContentCacheService). Si la configuración dice "nativo para todos", incluso los usuarios Pro utilizan el nativo. Esto es útil en varios casos:
- Fallo de Deepgram: Cambiar instantáneamente sin necesidad de actualización.
- Pruebas A/B: Comparar las métricas de retención entre los dos motores en un panel de usuarios.
- Reducción temporal de costos: Si el presupuesto de la nube es ajustado en un mes determinado, puedo desactivar Deepgram temporalmente.
El panel de control de administración muestra las métricas de uso por motor STT, lo que permite tomar decisiones informadas.
¿Cuál es el futuro del STT en las aplicaciones móviles?
El panorama del STT evoluciona rápidamente. Whisper de OpenAI ha democratizado los modelos STT de código abierto de alta calidad. Proyectos como whisper.cpp permiten ejecutar Whisper directamente en dispositivos móviles, con una calidad cercana a Deepgram y cero costo en la nube.
Estoy siguiendo de cerca esta evolución. El día en que un modelo Whisper funcione lo suficientemente bien en un smartphone estándar con soporte para español en tiempo real, el STT en la nube se volverá opcional para todos. Mientras tanto, la arquitectura dual que he implementado está perfectamente posicionada para integrar un tercer motor sin tocar los componentes de la interfaz de usuario.
Preguntas Frecuentes
¿El STT nativo funciona sin conexión?
Sí, siempre y cuando el modelo de idioma esté descargado en el dispositivo. En Android, Google ofrece la descarga de modelos de voz en la configuración. En iOS, los modelos suelen estar ya presentes. La calidad sin conexión es ligeramente inferior a la versión en línea.
¿Es Deepgram el mejor servicio de STT en la nube?
Deepgram Nova-2 se encuentra entre los mejores en cuanto a relación calidad/precio. Google Cloud Speech-to-Text y AWS Transcribe son alternativas serias. Elegí Deepgram por su API WebSocket nativa y su facturación por segundo (no por minuto).
¿Puede el usuario elegir su motor STT?
Actualmente, la elección está ligada al plan (Free = nativo, Pro = Deepgram). A la larga, planeo añadir un interruptor en la configuración para que el usuario Pro pueda elegir el nativo si prefiere la privacidad local.
¿Cómo gestionar idiomas distintos del español?
TAMSIV soporta 6 idiomas. Tanto el STT nativo como Deepgram soportan todos estos idiomas. La detección del idioma se basa en la configuración de la aplicación (no en la detección automática), lo que evita confusiones entre idiomas similares.
¿El STT nativo consume mucha batería?
Menos que el STT en la nube, ya que no hay transferencia de red. Pero el procesamiento local utiliza el procesador del teléfono. En un dictado corto (30 segundos), el impacto es insignificante. En un dictado largo (más de 5 minutos), el STT nativo puede consumir más batería que el de la nube porque el procesador funciona continuamente.