Robot y Inteligente Sistemas
Implementar las funciones de reconocimiento de voz en los temas con el marco de voz
Table of Contents
Integrar el reconocimiento de voz en aplicaciones iOS transforma cómo interactúan los usuarios, ofreciendo control sin manos, una entrada de datos más rápida y una mejor accesibilidad. El marco de voz de Apple ofrece capacidades de lenguaje a texto robustas y de dispositivos que respetan la privacidad de los usuarios y proporcionan una transcripción confiable en tiempo real. Este artículo cubre todo desde la configuración fundamental hasta patrones de implementación avanzados, incluyendo optimización de rendimiento, soporte multilingüe y manejo de errores mejores prácticas.
Comprender la arquitectura marco del discurso
El marco de la expresión (introducido en iOS 10) funciona a través de tres componentes básicos:
- SFSpeechRecognizer – La interfaz primaria que coordina el reconocimiento de un idioma y un local específico. Puede configurarse para utilizar el reconocimiento basado en dispositivos o servidor.
- SFSpeechRecognitionRequest] – Representa la entrada de audio. Dos subclas principales: para archivos de audio pregrabados y para streams de audio en vivo.
- SFSpeechRecognitionTask – Gestiona el proceso de reconocimiento, proporcionando actualizaciones de progreso y resultados finales. Apoya la cancelación y el pausing.
El marco procesa el audio a través de un motor automático de reconocimiento de voz (ASR). Por defecto, iOS 15+ utiliza el reconocimiento en el dispositivo para todos los idiomas compatibles, lo que reduce la latencia y asegura que los datos nunca salgan del dispositivo. El reconocimiento basado en el servidor está disponible para dispositivos antiguos o idiomas específicos, pero requiere una conexión a Internet activa y el consentimiento del usuario.
Características clave y capacidades
- Transmisión de tiempo real] – La voz se transcribe como habla el usuario, con resultados parciales periódicos.
- transcripciones alternadas] – Cada resultado incluye múltiples interpretaciones con confianza anotando a través de y .
- Frases contextuales] – Los desarrolladores pueden proporcionar frases personalizadas a través de para mejorar la precisión de los términos específicos de dominio.
- Idiomas suplementarios] – Más de 60 idiomas y acentos regionales. Use para recuperar la lista actual.
Configuración de Permisos y Configuración de Proyectos
Siempre solicite autorización explícitamente. Sin permisos adecuados, el sistema rechazará las solicitudes de reconocimiento.
Información.plist Requisitos
Agregue la clave (Privacidad – Recreo de Reconocimiento de Palabras Descripción) con una explicación clara y orientada al usuario. Ejemplo:
<key>NSSpeechRecognitionUsageDescription</key>
<string>This app uses speech recognition to transcribe your voice commands for hands-free navigation.</string>
Si su aplicación también registra audio (común para el reconocimiento en vivo), añadir también.
Solicitar autorización
Llamar temprano en el ciclo de vida de la aplicación, típicamente en el controlador de visión . El callback devuelve uno de los cuatro estados:
import Speech
SFSpeechRecognizer.requestAuthorization { authStatus in
DispatchQueue.main.async {
switch authStatus {
case .authorized:
// Enable microphone and recognition UI
case .denied, .restricted:
// Show error and disable features
print("Speech recognition not available")
case .notDetermined:
// Handle if the user hasn't seen the dialog (rare)
@unknown default:
break
}
}
}
Nota: El marco puede regresar si el dispositivo es gestionado por un perfil de control parental o si el reconocimiento del discurso se desactiva a través del tiempo de pantalla.
Implementación del Reconocimiento del Discurso en Vivo
Para captar voz en tiempo real, necesita un para transmitir los amortiguadores de audio en la solicitud de reconocimiento. El siguiente código muestra una implementación lista para la producción con una limpieza adecuada.
Paso 1: Configure Audio Session
let audioEngine = AVAudioEngine()
let request = SFSpeechAudioBufferRecognitionRequest()
var recognitionTask: SFSpeechRecognitionTask?
func configureAudioSession() {
let audioSession = AVAudioSession.sharedInstance()
do {
try audioSession.setCategory(.record, mode: .measurement, options: .duckOthers)
try audioSession.setActive(true, options: .notifyOthersOnDeactivation)
} catch {
print("Audio session config failed: \(error.localizedDescription)")
}
}
La opción reduce el volumen de música de fondo, lo que mejora la precisión de transcripción en entornos ruidosos. Para aplicaciones de voz, considere para el audio de la ruta a través del altavoz del dispositivo en lugar del auricular.
Paso 2: Crear el Reconocimiento y la Solicitud
func startRecognition() {
guard let recognizer = SFSpeechRecognizer(locale: Locale(identifier: "en-US")),
recognizer.isAvailable else {
handleError("Recognizer unavailable or not supported")
return
}
configureAudioSession()
request.shouldReportPartialResults = true
let inputNode = audioEngine.inputNode
let recordingFormat = inputNode.outputFormat(forBus: 0)
recognitionTask = recognizer.recognitionTask(with: request) { result, error in
if let result = result {
let transcribedText = result.bestTranscription.formattedString
// Update UI or process command
print("Partial: \(transcribedText)")
if result.isFinal {
self.stopRecognition()
// Handle final transcription
}
}
if let error = error {
self.stopRecognition()
self.handleError(error.localizedDescription)
}
}
inputNode.installTap(onBus: 0, bufferSize: 1024,
format: recordingFormat) { buffer, _ in
self.request.append(buffer)
}
audioEngine.prepare()
do {
try audioEngine.start()
} catch {
handleError("Audio engine start failed: \(error.localizedDescription)")
}
}
Paso 3: Limpiar con gratitud
func stopRecognition() {
recognitionTask?.cancel()
audioEngine.stop()
audioEngine.inputNode.removeTap(onBus: 0)
request.endAudio()
// Optionally deactivate audio session
try? AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation)
}
Siempre cancela la tarea de reconocimiento antes de detener el motor de audio. Olvídate de quitar el toque en el nodo de entrada puede causar ciclos de retención y evitar que el micrófono sea liberado.
Manejo de locales multilingües y personalizados
El marco de la expresión es compatible con la detección local dinámica. Puede permitir que los usuarios cambien idiomas o incluso reconozcan varios idiomas en una sola sesión creando instancias separadas .
let locales = ["en-US", "fr-FR", "zh-CN"]
let recognizers = locales.compactMap { SFSpeechRecognizer(locale: Locale(identifier: $0)) }
// Use recognizers[0] for English, etc.
Para el reconocimiento en dispositivos, cada reconocidor consume memoria proporcional a su modelo de lenguaje. Prueba el rendimiento en dispositivos antiguos al apoyar varios idiomas.
Vocabulario personalizado y condiciones de dominio
Mejorar la precisión para términos específicos de la industria mediante el uso de la propiedad en :
request.contextualStrings = ["Directus", "CMS", "headless", "REST API"]
Esto insinúa al reconocido a favorecer estas frases, reduciendo el mal reconocimiento de términos poco comunes.
Estrategias de manejo y eliminación de errores
El reconocimiento de voz puede fallar por muchas razones: problemas de red (si se utiliza con servidor), interrupciones de audio, micrófonos deshabilitados o presión de memoria. Implementar un controlador robusto:
enum RecognitionError: LocalizedError {
case noPermission
case unavailable
case audioSessionFailure
case internalError(Error)
var errorDescription: String? {
switch self {
case .noPermission:
return "Speech recognition permission denied"
case .unavailable:
return "Recognizer is busy or not available"
case .audioSessionFailure:
return "Could not start audio capture"
case .internalError(let error):
return error.localizedDescription
}
}
}
func handleError(_ message: String) {
// Show alert, retry button, or fallback to text input
DispatchQueue.main.async {
// Show toast or log
}
}
Monitor de la tarea de reconocimiento del estado cambia a través de propiedad de para detectar cancelaciones o timeouts.
Optimización del rendimiento y mejores prácticas
- Preferir el reconocimiento de dispositivos – Ya que iOS 15, el reconocimiento en dispositivo es el predeterminado y ofrece menor latencia. Evite forcing server-based unless you need a language not yet supported offline. Compruebe para verificar la disponibilidad.
- Limitar resultados parciales] – Configurar reduce la sobrecarga si sólo necesitas la transcripción final.
- Manejar vida útil de reconocimiento – Cancelar tareas de largo plazo cuando el usuario deja de hablar. Use un tiempo de espera (por ejemplo, 2 segundos de silencio) para terminar automáticamente la sesión.
- Batería y memoria – Las tareas de reconocimiento y motor de audio consumen recursos significativos. Pausa o deja de reconocer cuando la aplicación va al fondo.
- Testing with mock data – Use pre-recorded audio files () durante el desarrollo para evitar las dependencias de micrófono.
Interrupciones de manejo
Las llamadas telefónicas, alarmas o Siri pueden interrumpir una sesión de reconocimiento activa. Suscribirse a para pausar y reanudar con gracia:
NotificationCenter.default.addObserver(
self,
selector: #selector(handleInterruption),
name: AVAudioSession.interruptionNotification,
object: nil
)
@objc func handleInterruption(_ notification: Notification) {
guard let userInfo = notification.userInfo,
let type = userInfo[AVAudioSessionInterruptionTypeKey] as? UInt else { return }
if type == AVAudioSession.InterruptionType.began.rawValue {
stopRecognition()
} else if type == AVAudioSession.InterruptionType.ended.rawValue {
// Optionally restart recognition
}
}
Consideraciones de accesibilidad
El reconocimiento de voz mejora la accesibilidad para los usuarios con discapacidad motor o visual.
- Proporciona una respuesta de audio clara cuando la escucha comienza/stops.
- Soporta VoiceOver utilizando etiquetas de accesibilidad en botones de reconocimiento.
- Ofrece un método de entrada basado en texto alternativo en caso de que el reconocimiento falla.
- Respeta la privacidad del usuario al no almacenar datos de audio sin consentimiento explícito.
Pruebas y depuración
Los simuladores no incluyen un micrófono; prueba en dispositivos físicos. Use ] El log de diagnóstico de reconocimiento de voz deXcode] bajo y agregue con el valor ] para permitir la tala de verbosa. Simula diferentes ambientes de ruido y acentos durante QA.
Casos de uso real-mundial
- Los comandos de voz en una aplicación CMS] – Permitir a los editores dictar contenido o navegar por menús sin manos. Por ejemplo, “Crear un nuevo artículo” activa un flujo de trabajo específico.
- Dictación para aplicaciones de toma de notas] – transcripción en tiempo real con reconocimiento de puntuación.
- Navegación centrada en la accesibilidad – Los usuarios pueden decir “Regresar” o “Abrir ajustes” sin tocar la pantalla.
- transcripción médica o jurídica – Usar cadenas contextuales para terminología específica de dominio y combinar con el reconocimiento de dispositivos para la privacidad.
Conclusión
El marco de voz de Apple proporciona una base sólida para agregar reconocimiento de voz a las aplicaciones iOS. Al entender la arquitectura, manejar los permisos correctamente, gestionar las sesiones de audio y optimizar el rendimiento, puede crear una experiencia sin problemas de voz que respete la privacidad de los usuarios. Siempre prueba en dispositivos reales, considere mecanismos de retroceso y mantenga el contexto del usuario en mente para ofrecer una característica que realmente mejora la usabilidad.
Para más lectura, consulte la documentación de marco de Apple ], la AVAudioGuía de la Sesión], y la SFSpeechRecognizer class reference].