Speech Recognition (ASR) es una tecnología de reconocimiento automático del habla que convierte una señal de audio en una secuencia de texto. Los sistemas modernos utilizan deep learning: un codificador (Conformer, Whisper, BiLSTM + CTC) convierte el espectrograma de audio en una secuencia de estados ocultos, y un decodificador (CTC greedy decoding, Beam Search, Transformer decoder) produce el texto. En aplicaciones móviles, Speech Recognition se utiliza para entrada por voz, asistentes de voz, transcripción automática de llamadas y funciones de accesibilidad para personas con limitaciones motoras. Según Google Cloud Speech-to-Text, 2025, el ASR en la nube alcanza un WER del 7% en inglés y del 12% en ruso con SNR > 15 dB.
Puntos Clave
Automatic Speech Recognition (ASR) es un pipeline: audio → preprocesamiento (16 kHz mono, reducción de ruido, VAD — detección de actividad de voz) → extracción de características (MFCC, LogMel FilterBank) → modelo acústico (red neuronal: CTC / RNNT / Transducer) → modelo de lenguaje (LM) → decodificación (texto). Los modelos modernos de extremo a extremo (Whisper, Google USM, Conformer CTC) combinan el modelo acústico y de lenguaje en un solo Transformer, simplificando el pipeline y mejorando la precisión.
Arquitecturas ASR para dispositivos móviles: CTC (Connectionist Temporal Classification) — rápida, no requiere alineamiento audio-texto, se usa en Vosk y Android nativo. RNNT (Recurrent Neural Network Transducer) — ASR en streaming, baja latencia (Google USM). Conformer — híbrido de CNN + Transformer, mejor precisión pero más pesado: Whisper Medium (769M params) — latencia 30–60x. Para en dispositivo, CTC es preferido: los modelos CTC de Vosk ocupan 50–100 MB, latencia 0.3–0.8x tiempo real.
Métricas de ASR: WER (Word Error Rate) — porcentaje de palabras sustituidas, eliminadas e insertadas respecto a la referencia. Google Cloud ASR — 7% WER (EN), 12% (RU). Vosk — 13% (RU), 9% (EN). Whisper Small — 6% (EN), 10% (RU). CER (Character Error Rate) — similar, a nivel de caracteres. Real-Time Factor (RTF) — tiempo de procesamiento / duración del audio. RTF < 1 — más rápido que tiempo real. RTF < 0.3 — ASR en tiempo real. La entrada por voz requiere RTF < 1, la transcripción requiere RTF < 3.
| Solución ASR | WER (EN) | WER (RU) | RTF | En dispositivo |
|---|---|---|---|---|
| Google Cloud ASR | 7% | 12% | 0.3 | No |
| Android SpeechRecognizer | 8% | 13% | 0.5–1 | Sí (híbrido) |
| SFSpeechRecognizer | 7% | 12% | 0.3–0.8 | Sí (desde iOS 17) |
| Vosk (vosk-model-small-ru) | 9% | 13% | 0.3–0.8 | Sí |
| Whisper Small | 6% | 10% | 2–6 | Sí |
VAD (Voice Activity Detection) — detección de actividad de voz, que separa el habla del silencio y el ruido. WebRTC VAD es el estándar para ASR móvil: tramas de 30 ms, tres modos (0, 1, 2 — de conservador a agresivo). VAD reduce el RTF en 1.5–3x (omite segmentos no hablados). Silero VAD (MIT) es un VAD neuronal, más preciso que WebRTC (94% vs 85% ROC AUC), latencia 5–10 ms, TFLite y Core ML. Para ASR en producción, use la cascada VAD → ASR: esto reduce falsos positivos y acelera el procesamiento.
Android SpeechRecognizer es una clase integrada del SDK de Android para reconocimiento de voz. Funciona en dos modos: nube (servidor Google) — alta precisión, requiere internet; en dispositivo (desde Android 10+) — modelo ASR integrado de GBoard, 20+ idiomas, WER 15–18%. SpeechRecognizer devuelve resultados parciales durante el habla y el texto final. Soporta 60+ idiomas mediante RecognizerIntent.EXTRA_LANGUAGE. Recomendado para entrada por voz — integración rápida, gratuito.
API SpeechRecognizer: se crea mediante SpeechRecognizer.createSpeechRecognizer(context). Intent con RecognizerIntent.ACTION_RECOGNIZE_SPEECH con extras: LANGUAGE_MODEL_FREE_FORM (texto libre) o LANGUAGE_MODEL_WEB_SEARCH (consultas de búsqueda). Resultados mediante RecognitionListener: onReadyForSpeech → onBeginningOfSpeech → onRmsChanged → onPartialResults → onResults. Para reconocimiento continuo (modo always-listening) — reinicie el recognizer después de onResults. Para ahorrar batería, use onDeviceOnly = true.
// Android SpeechRecognizer
val recognizer = SpeechRecognizer.createSpeechRecognizer(context)
recognizer.setRecognitionListener(object : RecognitionListener {
override fun onResults(results: Bundle) {
val text = results
.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION)
?.firstOrNull() ?: ""
showResult(text)
}
override fun onPartialResults(partialResults: Bundle) {
val partial = partialResults
.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION)
?.firstOrNull() ?: ""
showPartial(partial)
}
})
val intent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH).apply {
putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM)
putExtra(RecognizerIntent.EXTRA_LANGUAGE, "ru-RU")
}
recognizer.startListening(intent)
En dispositivo vs Nube en Android: en dispositivo funciona sin internet (Android 10+, Pixel 4+, Samsung S20+). La nube es más precisa (Google Neural Network ASM Model) pero tiene mayor latencia (300–800 ms incluida la red). Para entrada por voz, use un enfoque híbrido: nube con fallback a en dispositivo cuando no hay red. Android SpeechRecognizer selecciona automáticamente el modo según RecognizerIntent.EXTRA_PREFER_OFFLINE. Para máxima privacidad — configure onDeviceOnly = true (pero la precisión es 15–18% WER para ruso).
SFSpeechRecognizer es el framework de Apple para reconocimiento de voz en iOS, macOS y watchOS. Disponible desde iOS 10. Modo en dispositivo — desde iOS 17 (modelo local, sin internet). Soporta 60+ idiomas. Precisión: WER 7–12% (en dispositivo — 12–15%). SFSpeechRecognizer está disponible mediante Speech.framework — no requiere SDK adicionales. Solicitud de permiso mediante SFSpeechRecognizer.requestAuthorization.
API SFSpeechRecognizer: SFSpeechRecognizer(locale: Locale(identifier: "ru_RU")) → SFSpeechAudioBufferRecognitionRequest (audio en vivo) o SFSpeechURLRecognitionRequest (archivo de audio). Streaming mediante recognitionTask(with:delegate:) con SFSpeechRecognitionTaskDelegate (didHypothesizeTranscription — parcial, didFinishRecognition — final). Modo en dispositivo: request.requiresOnDeviceRecognition = true. Para iOS 15+: request.shouldReportPartialResults = true (resultado en streaming con baja latencia).
let recognizer = SFSpeechRecognizer(locale: Locale(identifier: "ru_RU"))
guard recognizer.isAvailable else { return }
let request = SFSpeechAudioBufferRecognitionRequest()
request.requiresOnDeviceRecognition = true
request.shouldReportPartialResults = true
recognitionTask = recognizer.recognitionTask(with: request) { result, error in
if let result = result {
let text = result.bestTranscription.formattedString
let isFinal = result.isFinal
DispatchQueue.main.async {
textView.text = text
}
}
}
audioEngine.inputNode.installTap(config: bufferConfig) { buffer, _ in
request.append(buffer)
}
audioEngine.prepare()
try audioEngine.start()
SFSpeechRecognizer vs Android SpeechRecognizer: SFSpeechRecognizer tiene streaming nativo sin reinicio (Android requiere startListening repetido). En dispositivo en iOS está disponible desde iOS 17 (Android desde Android 10). Ambos requieren permiso del usuario (NSMicrophoneUsageDescription + NSSpeechRecognitionUsageDescription para iOS, RECORD_AUDIO para Android). SFSpeechRecognizer es más preciso en inglés (en dispositivo), Android SpeechRecognizer es más preciso en ruso (nube). Para iOS anterior a 17, en dispositivo no está disponible — requiere internet. Para iOS 17+, en dispositivo da WER 12–14% para ruso.
Vosk es una biblioteca ASR de código abierto de Alpha Cephei para reconocimiento de voz sin conexión. Basada en Kaldi ASR toolkit + modelos CTC. Soporta 20+ idiomas: ruso, inglés, alemán, francés, español, chino, árabe. Modelos desde 50 MB (small — 50 MB, ru) hasta 1.2 GB (large — 1.2 GB, en). Vosk funciona en Android (JNI), iOS (wrapper C++), Linux, Windows, Raspberry Pi. RTF: 0.3–0.8 en dispositivos emblemáticos. Vosk es la mejor opción para ASR offline completo.
API de Vosk: VoskWaveformModelLoader (carga de modelo) → VoskWaveformRecognizer (creación del reconocedor) → recognizer.createGrammar(list) o recognizer.getResult() / recognizer.getPartialResult(). Soporte de gramáticas (conjunto finito de comandos) — GrammarRecogniser — ofrece RTF 0.1–0.3 (3x más rápido). Para entrada por voz, use reconocimiento libre (getResult). Para comandos de voz — GrammarRecogniser (99% de precisión en comandos). Vosk también soporta identificación de hablante (análisis vectorial de voz).
// Vosk offline ASR
val model = VoskModel("model/vosk-model-small-ru-0.22")
model.load()
val recognizer = VoskRecognizer(model, 16000.0f)
recognizer.setWords(true)
audioRecord.startRecording()
while (isListening) {
val buffer = ByteArray(3200) // 100ms audio
audioRecord.read(buffer, 0, buffer.size)
if (recognizer.acceptWaveform(buffer)) {
val result = recognizer.result // JSON
text += JSONObject(result).getString("text")
}
}
Vosk vs ASR en la nube: Vosk es completamente offline — privacidad, latencia cero, gratuito. La nube (Google, Yandex) es más precisa en escenarios complejos (ruido, acento) — WER 3–5% menor. Vosk es ideal para: entrada por voz sin internet, aplicaciones de accesibilidad, transcripción de llamadas (privacidad). El ASR en la nube es para asistentes de voz donde la precisión importa más que la privacidad. Recomendación: Vosk para offline, SFSpeechRecognizer (iOS) / SpeechRecognizer (Android) para online — combine enfoques para diferentes escenarios.
Whisper es un modelo de OpenAI para reconocimiento de voz, entrenado con 680,000 horas de audio (multilingüe, 99 idiomas). Disponible en tamaños: tiny (39M, WER 10% EN, 15% RU), small (244M, WER 6% EN, 10% RU), medium (769M, WER 4.5% EN, 8% RU). Whisper funciona en dispositivos móviles mediante Core ML (iOS, ANE) y TFLite (Android, GPU). Whisper tiny: RTF 4–10 en CPU, RTF 0.5–2 en GPU (Android). Whisper small: RTF 2–6 en GPU. Whisper medium — RTF 8–15, solo para no tiempo real.
Whisper en iOS (Core ML): Apple MLX Whisper — una implementación de Whisper para Core ML y MLX (Apple Neural Engine). Whisper tiny Core ML en iPhone 15 Pro: RTF 0.3–0.8 (¡más rápido que tiempo real!). Whisper small Core ML: RTF 1–3. Whisper Core ML usa ANE en A17 Pro (Neural Engine 35 TOPS). Hugging Face Transformers → Exportar a Core ML mediante coremltools-whisper. Para streaming, use WhisperStitcher (fragmentación + unión). Whisper en iOS es el ASR en dispositivo más preciso (WER 6% EN, 10% RU).
// Whisper Core ML on iOS
import MLXWhisper
let model = try WhisperModel(from: "whisper-tiny")
let audio = try AudioUtils.loadAudio(url: audioURL)
let segments = try model.transcribe(audio: Audio, options: TranscribeOptions(
language: "ru",
wordTimestamps: true,
temperature: 0.0
))
for segment in segments {
print(segment.text) // final text with timestamps
}
Whisper vs Vosk: Whisper es más preciso (6% vs 9% WER EN), soporta 99 idiomas, incluye detección de idioma, puntuación y reconocimiento de emociones. Whisper es más pesado (39M–769M vs 50M Vosk), más lento en tiempo real (RTF 0.5–6 vs 0.3–0.8). Whisper tiny es comparable a Vosk en velocidad (RTF 0.5–2 GPU). Vosk es más ligero, más rápido, mejor para streaming en tiempo real. Whisper es para transcripción única donde la precisión es prioritaria sobre la velocidad. Vosk es para entrada de voz en tiempo real. Use Whisper para texto final, Vosk para uso interactivo.
Entrada de texto por voz — el uso más extendido de ASR: dictar mensajes, consultas de búsqueda, notas. Requisito: RTF < 1 (tiempo real), resultados parciales (ver texto mientras se habla). Android Gboard y el teclado iOS tienen ASR integrado (en dispositivo, WER 12–18%). Para implementación personalizada, use Android SpeechRecognizer / SFSpeechRecognizer. Para máxima precisión — ASR en nube + Vosk como fallback. Para entrada por voz con 98% de precisión en ruso — combine Vosk (offline) + Yandex SpeechKit (online).
Transcripción de llamadas y reuniones — ASR para generación automática de transcripciones. Requisitos: sin requisito de latencia, WER < 10%, diarización de hablantes (quién habla). Whisper Small (offline) + pyannote-audio (diarización) es el stack estándar para transcripción. En iOS — Whisper Core ML (RTF 1–3, WER 6–10%). En Android — Whisper TFLite (RTF 2–6, WER 8–12%) o Google Cloud ASR + diarización. Para privacidad (las llamadas no van al servidor) — Whisper en dispositivo. Precisión de diarización: 80–90% DER.
Asistentes de voz — Siri (SFSpeechRecognizer), Google Assistant (Android SpeechRecognizer), Alexa (ASR en dispositivo). Asistente personalizado: ASR → NLU (Natural Language Understanding) → Acción → TTS. ASR es la primera etapa — determina la precisión de toda la cadena. Para NLU, use RASA, Snips NLU (en dispositivo) o NLU en nube (Dialogflow, Amazon Lex). Para TTS: Android TTS / iOS AVSpeechSynthesizer. Un asistente de voz en dispositivo (Vosk + RASA + TTS) es completamente privado, funciona sin internet, latencia < 2 segundos por solicitud.
// Voice assistant with Android SpeechRecognizer + TTS
recognizer.setRecognitionListener(object : RecognitionListener {
override fun onResults(results: Bundle) {
val query = results.getStringArrayList(
SpeechRecognizer.RESULTS_RECOGNITION
)?.firstOrNull() ?: return
val intentResult = nluService.classify(query)
textToSpeech.speak(intentResult.response)
executeAction(intentResult.action)
}
})
Accesibilidad para personas con limitaciones motoras — Speech Recognition permite controlar la aplicación por voz: abrir contactos, enviar un mensaje, marcar un número. Android Voice Access y iOS Switch Control + VoiceOver son soluciones integradas. Para implementación personalizada: GrammarRecogniser (Vosk) con un conjunto fijo de comandos (50–100 frases) — RTF 0.1–0.3, 99% de precisión. Vosk Grammar permite definir la gramática en formato BNF. La velocidad es crítica para la accesibilidad — Vosk Grammar es 5x más rápido que el reconocimiento libre y consume menos batería.
Preguntas Frecuentes
Use supresión de ruido (WebRTC NS — integrado en Android, iOS AVAudioSession). Aplique VAD para eliminar fragmentos no hablados. Aumente la SNR usando un micrófono con beamforming (grabación direccional) o un array de múltiples micrófonos. Whisper es más resistente al ruido (entrenado con 680K horas con ruido). Vosk con supresión de ruido mediante WebRTC da +5% WER con ruido de 50 dB. Para producción, pruebe con las condiciones de ruido de su aplicación.
Sí, desde iOS 17 SFSpeechRecognizer soporta modo en dispositivo (requiresOnDeviceRecognition = true). En iOS 16 y anteriores, en dispositivo no está disponible — se requiere internet para ASR de Siri/Gboard. Alternativas: Vosk mediante wrapper C++ (offline, WER 12–15%), Whisper Core ML (offline, WER 6–10%, latencia 2–6x). Para entrada por voz en iOS 16-, use Vosk. Whisper Core ML es para transcripción de archivos de audio (no tiempo real). Todas las soluciones son completamente privadas y funcionan sin internet.
Android SpeechRecognizer soporta 60+ idiomas mediante RecognizerIntent.EXTRA_LANGUAGE. La lista completa se determina mediante Locale.getAvailableLocales() en el dispositivo. Ruso, inglés, alemán, francés, español, italiano están siempre disponibles. Chino, japonés, coreano dependen del modelo del dispositivo. Modo en dispositivo (Android 10+) — 20+ idiomas. A diferencia de Vosk (20 idiomas) y SFSpeechRecognizer (60 idiomas), Android SpeechRecognizer depende de la versión de Google Play Services.
Use adaptación de modelos: fine-tuning de Whisper en 100+ horas de audio de dominio (Hugging Face Trainer). Vosk — reemplace el modelo de lenguaje (formato ARPA) con un corpus de texto de dominio (100K+ oraciones). Google Cloud ASR — phrase hints (palabras de dominio, DL=0/1/2). SFSpeechRecognizer — SFSpeechRecognitionTaskDelegate con contextualStrings (array de cadenas de sugerencia). La adaptación de dominio mejora la precisión en 15–30% WER para terminología específica. Mínimo: 500 archivos de audio de dominio con transcripciones.
WER = (S + D + I) / N, donde S — sustituciones, D — eliminaciones, I — inserciones, N — número de palabras en el texto de referencia. Ejemplo: referencia = "hola cómo estás", predicción = "hola qué haces" → S=1 (cómo→qué), D=1 (eliminado "estás"?), I=0 → WER = 2/3 = 66%. Use la biblioteca jiwer (Python) o WER Calculator (JavaScript) para el cálculo. CER es similar a nivel de caracteres. Para ruso, CER es 20–30% menor que WER debido a la longitud de las palabras.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también