iOS 26 SpeechAnalyzer Live Mic: Configuración, resultados y solución de problemas
Esta página es una traducción automática del original en inglés. Leer el original en inglés
Para una canalización de micrófonos iOS 26 en vivo, compruebe el dispositivo y el soporte de configuración regional, prepare los activos del modelo, obtenga un formato PCM compatible y consuma los resultados de reconocimiento mientras alimenta el audio. Trate la finalización normal por separado de la cancelación para que las últimas palabras puedan ser definitivas. Esta guía sigue la documentación API de Apple y la muestra actual de micrófono en vivo SimpleMemo; también incluye un ayudante de preparación descargable por separado.
Comience con la muestra completa, luego inspeccione la tubería
El repositorio con licencia MIT expone SpeechSession como un paquete Swift para una aplicación host iOS 26. Agregue el repositorio bajo las dependencias de paquetes de Xcode y vincule el producto SpeechAnalyzerLiveMic. Su README muestra una vista de SwiftUI que muestra finalizedText, representa volatileText por separado y desactiva Start mientras se prepara la sesión.
Para un proyecto de aplicación completo, siga la ruta XcodeGen de README. Alternativamente, copie las fuentes de la aplicación suministradas en una nueva aplicación iOS 26. Utilice una ruta de integración para no definir los mismos tipos dos veces. El paquete no implementa el almacenamiento de notas, la entrega de correo electrónico o la integración Obsidian.
La muestra vinculada solicita autorización de micrófono y reconocimiento de voz. Su aplicación host debe suministrar NSMicrophoneUsageDescription y NSSpeechRecognitionUsageDescription; agregar el paquete no puede proporcionar esas descripciones de host. Explique el uso del permiso, muestre los estados de denegación y preparación, y deja que el usuario elija cuándo grabar. El ayudante de abajo no solicita permiso ni arranca el micrófono.
El ejemplo oficial de transcripción en directo de Apple y la sesión de WWDC25 son referencias útiles para la arquitectura. SpeechAnalyzer coordina los módulos; es una API adicional para sistemas compatibles, no un motivo para considerar obsoleto todo el código existente de SFSpeechRecognizer.
Preparar soporte, activos y formato antes de grabar
SpeechTranscriber proporciona comprobaciones de dispositivos y configuración regional en tiempo de ejecución. Una comprobación de la versión de iOS por sí sola es insuficiente. El siguiente ayudante devuelve un transcriptor, analizador y formato de audio configurados, o lanza un error de preparación específico.
Descargue el ayudante de preparación completo de Swift. El archivo completo incluye importaciones, tipos de resultados y errores, y el ayudante de sugerencias de DictationTranscriber que se analiza a continuación. Este es un componente de configuración, no una aplicación de grabación completa.
@available(iOS 26.0, *)
@MainActor
public func prepareSpeechAnalyzer(
requestedLocale: Locale,
naturalFormat: AVAudioFormat? = nil
) async throws -> PreparedSpeechAnalyzer {
guard SpeechTranscriber.isAvailable else {
throw SpeechPreparationError.deviceUnavailable
}
guard let locale = await SpeechTranscriber.supportedLocale(
equivalentTo: requestedLocale
) else {
throw SpeechPreparationError.unsupportedLocale
}
let transcriber = SpeechTranscriber(
locale: locale,
preset: .progressiveTranscription
)
// The system may already have the asset; nil means no install is needed.
// A request can automatically reserve the locale or throw if no slot is free.
if let request = try await AssetInventory.assetInstallationRequest(
supporting: [transcriber]
) {
try await request.downloadAndInstall()
}
try Task.checkCancellation()
guard await AssetInventory.status(forModules: [transcriber]) == .installed else {
throw SpeechPreparationError.assetsNotInstalled
}
guard let format = await SpeechAnalyzer.bestAvailableAudioFormat(
compatibleWith: [transcriber], considering: naturalFormat
) else {
throw SpeechPreparationError.noCompatibleFormat
}
let analyzer = SpeechAnalyzer(modules: [transcriber])
try await analyzer.prepareToAnalyze(in: format)
return PreparedSpeechAnalyzer(
locale: locale, transcriber: transcriber,
analyzer: analyzer, audioFormat: format
)
}
AssetInventory gestiona modelos de sistema compartidos. Es posible que un modelo ya esté instalado por el sistema u otra aplicación. Una solicitud de instalación devuelve nil cuando no se necesita instalación; de lo contrario, puede reservar la configuración regional e iniciar una descarga. Los límites de reserva también pueden producir un error. Administre las reservas en todas las funciones de su aplicación y libere una configuración regional cuando ya no sea necesaria en lugar de lanzar un modelo que aún esté en uso en otra parte de su aplicación.
Antes de desconectarte, prepara la configuración regional requerida y verifica la preparación. Los activos del modelo viven fuera del paquete de aplicaciones, pero aún consumen almacenamiento del sistema y pueden cambiar con el tiempo. Mostrar el progreso y la cancelación de la descarga en la interfaz de usuario del host. "Reconocimiento en el dispositivo" no significa que "no se necesite preparación ni acceso a la red".
Feed PCM en el formato que el analizador acepta
AVAudioEngine microphone tap
-> owned PCM / conversion for the selected format
-> AsyncStream<AnalyzerInput>
-> SpeechAnalyzer + SpeechTranscriber
-> result consumer and UI state
Después de activar la sesión de audio, inspeccione el formato real del nodo de entrada. No codifique una frecuencia de muestreo porque un dispositivo o ruta a menudo usaba esa tasa antes. Pase un formato natural a bestAvailableAudioFormat(compatibleWith:considering:) cuando sea apropiado y desenvuelva su resultado opcional. Apple documenta que el analizador no vuelve a muestrear o convierte la entrada de forma transparente.
El AudioBufferConverter del repositorio devuelve un búfer que ya coincide sin cambios y utiliza AVAudioConverter cuando los formatos difieren. La conversión es necesaria para formatos que no coinciden, no como un paso adicional general para cada búfer. Compruebe la longitud del fotograma de salida e informe de los errores de conversión; dejar caer silenciosamente cada búfer fallido puede hacer que una interfaz de usuario de grabación parezca saludable sin producir texto.
Dale al audio en cola una política de propiedad explícita. El convertidor de muestra actualizado devuelve el almacenamiento PCM independiente incluso cuando los formatos ya coinciden, por lo que la reutilización posterior de la entrada no sobrescribe el audio en cola. No se debe suponer que un búfer suministrado por una devolución de llamada de audio permanece inmutable después de que regrese la devolución de llamada. Si lo pone en cola para usarlo más tarde, organice una copia de propiedad adecuada o una canalización cuya vida útil del búfer esté controlada. Mantenga las mutaciones de la interfaz de usuario por búfer fuera de la devolución de llamada de audio. Para la producción, también decida cómo encuadernar el trabajo en cola y manejar la sobrecarga o los cambios de ruta.
En Swift 6, la captura de variables locales no prueba por sí sola que una tubería sea segura para subprocesos. El convertidor de la muestra actual tiene un contrato de hilo de procesamiento único y un soporte @unchecked Sendable protegido por bloqueo privado para una devolución de llamada del convertidor. No hace que todos los búferes PCM o el convertidor generalmente sean seguros para compartir a través de subprocesos. Lea ese contrato antes de adaptar la muestra.
Reemplace los resultados volátiles; termine la entrada antes de finalizar
Con los resultados progresivos habilitados, un resultado volátil puede revisar el texto para un rango de audio. No añadas cada resultado parcial como una nueva oración. La muestra simple mantiene el texto finalizado y una cola volátil reemplazable. Para una edición más rica, alinee las actualizaciones con los rangos de audio y conserve los segmentos finales por separado. Apple describe este comportamiento en la parte resultados de la sesión de WWDC.
- En una acción de parada normal, deja de producir nuevo audio del micrófono y retira el toque una vez.
- Termine la continuación de la entrada
AsyncStreampara que el analizador pueda ver el final de la entrada. - Espera
finalizeAndFinishThroughEndOfInput(), mientras la tarea de resultado-el consumidor permanece viva. - Espera a que se complete el consumo de resultados, luego confirma el texto final y libera los recursos de la sesión.
La finalización espera la terminación de la entrada y el consumo. Llamarlo mientras el productor nunca termina puede irse. Deja de esperar. Cancelar la tarea de resultados inmediatamente también puede perder la cola que pretendía guardar. Una acción de cancelación que descarta una expresión debería usar una ruta de cancelación deliberada en lugar de fingir que era un resultado final normal.
El paquete público sigue siendo una muestra de aprendizaje. Su actual stop() finaliza y luego cancela al consumidor; no expone un acuse de recibo de finalización del consumidor por separado. Si es importante retener todos los resultados finales, adapte ese ciclo de vida y pruébelo. También prueba Stop mientras la preparación está en curso, toques repetidos, vista el despido, la interrupción y reinicio después de un error.
El soporte de vocabulario depende del módulo transcriptor
Es inexacto decir que el nuevo discurso API no tiene soporte de vocabulario contextual. Apple documentos AnalysisContext.contextualStrings para DictationTranscriber. La documentación recomienda frases breves y, como máximo, frases 100 en todas las etiquetas. Eso no es una promesa de que las mismas pistas personalicen SpeechTranscriber.
// For an analyzer configured with DictationTranscriber.
let context = AnalysisContext()
context.contextualStrings[.general] = ["Obsidian", "Yurica"]
try await analyzer.setContext(context)
setContext(_:) reemplaza el contexto actual, por lo que conserva o fusiona cualquier contexto de aplicación existente cuando sea necesario. El ayudante descargable rechaza más de frases 100 en lugar de truncarlas silenciosamente. Las sugerencias de frase son distintas de la opción de modelo de idioma personalizada también documentada para DictationTranscriber, y ninguna garantiza el reconocimiento correcto de cada nombre. Elija y pruebe el módulo y el idioma que necesita su aplicación.
Cuando la grabación no produce texto, localice la etapa que falla
| Síntoma | Comprobar a continuación | Evidencia útil |
|---|---|---|
| La preparación falla | Soporte del dispositivo, configuración regional normalizada, estado del activo y errores de reserva/descarga | SO y dispositivo, configuración regional solicitada/seleccionada, dominio y código de error |
| La interfaz de usuario de Mic está activa, sin búferes | Permiso, activación de sesiones de audio, ruta, arranque del motor y ciclo de vida del toque | Si llegan las devoluciones de llamada; tasa de muestreo de entrada y recuento de canales |
| Los búferes llegan, no hay texto | Formato compatible, salida de convertidor distinta de cero, entradas de salida y tarea de resultados activos | Recuentos de marcos de entrada/salida y el primer error real de la canalización |
| Las palabras se repiten | Si las revisiones volátiles se están agregando en lugar de reemplazarlas | Resulta los rangos de audio y las banderas finales/volátiles |
| Las últimas palabras desaparecen | Finalización de la entrada y vida útil del consumidor durante la finalización | Hora de la última entrada, finalización de la finalización y recibo del resultado final |
| Falla el inicio sin conexión | Prequerido listo para el modelo en ese dispositivo y configuración regional | Estado del activo antes de desconectarse y el error de configuración que apareció |
Para los diagnósticos, comience con los tiempos de etapa, el recuento de fotogramas, la configuración regional y la información de errores. Las grabaciones sin procesar y el texto reconocido no son necesarios para cada entrada de registro. Si un usuario comparte una reproducción, pida una frase de prueba corta y no sensible y la configuración relevante en lugar de una conversación privada.
Qué se comprobó y qué medir en un dispositivo
Este artículo se comprobó con la documentación Apple y Xcode 26.6 en septiembre 9, 2026. El ayudante descargable pasa la comprobación del tipo Swift 6 con completa concurrencia estricta para un objetivo de simulador iOS 26. No graba audio, y esta comprobación no demuestra la precisión del habla, la instalación exitosa del activo o una sesión de micrófono de extremo a extremo.
La muestra pública en revisión 1befcce pasó cuatro pruebas de convertidor PCM y una compilación del simulador iOS en septiembre 9. Dos pruebas reutilizan el búfer de origen después de la conversión y confirman que el flotador mono y la salida entera estéreo entrelazada permanecen intactas; ambas fallan en comparación con la implementación anterior de paso de formato de coincidencia. Su README dice explícitamente que el refactor del paquete no ha sido probado de nuevo en un dispositivo físico iOS. Los números de latencia histórica anteriormente en esta página no son un punto de referencia para el paquete actual.
Para su propia aplicación, dispositivo de grabación, sistema operativo, configuración regional, ruta de audio, preparación del modelo y los límites de tiempo exactos. Mida el primer texto volátil, el primer texto final y la finalización de la parada normal por separado. Compare una sesión con activos listos con una sesión que requiere preparación. Repita una frase no sensible fija e inspeccione las palabras finales que faltan o duplicadas, así como la velocidad. No infiera el comportamiento de la Neural Engine o un límite de hardware a partir de un resultado de tiempo.
En Apple Watch, use un flujo de entrada de texto del sistema separado si se ajusta a su aplicación. TextFieldLink abre la interfaz del sistema; no establece que el dictado ya se esté grabando. SpeechAnalyzer no está disponible en watchOS, y el paquete iOS no es una implementación de micrófono de reloj.
Preguntas frecuentes
¿SoceAnalyzer funciona sin conexión?
SpeechTranscriber procesa el audio en el dispositivo, pero su modelo requerido debe estar disponible. Los activos ya pueden estar presentes antes del primer lanzamiento de su aplicación. Compruébelos y prepárelos antes de una sesión fuera de línea; no asuma que cada primer lanzamiento debe descargarse o que un modelo previamente instalado siempre permanecerá disponible.
¿Puedo añadir vocabulario personalizado?
Apple documenta AnalysisContext.contextualStrings para DictationTranscriber, y ese módulo también expone una pista de contenido de lenguaje personalizado. Esta no es documentación de la misma característica para SpeechTranscriber. Elija el módulo deliberadamente y pruebe las palabras y la configuración regional que necesita.
¿Por qué la aplicación graba pero no muestra texto?
Compruebe el soporte del dispositivo y la configuración regional, el estado del activo, la entrada del micrófono, el formato del analizador opcional, la salida del convertidor, la secuencia de entrada y el consumidor de resultados. Aflore el error real en lugar de tratar cada resultado vacío como un problema de formato.
¿Cómo mantengo las últimas palabras cuando me detengo?
Deje de producir audio, termine la continuación de la entrada y deje que el analizador finalice hasta el final de la entrada. Mantenga vivo al consumidor de resultados para recibir los resultados finales. La cancelación es un camino de descarte separado, no un sustituto de la finalización normal.
¿Esta muestra se ejecuta en Apple Watch?
No. La sesión de micrófono vinculado es un ejemplo de iOS 26, y SpeechAnalyzer no está disponible en watchOS. Una aplicación Watch puede usar la entrada de texto del sistema como TextFieldLink; que presenta una interfaz de entrada del sistema y no prueba que la grabación del dictado haya comenzado.
¿Qué se ha validado para la muestra?
El repositorio vinculado registra cuatro pruebas de convertidor y una compilación de simulador iOS en septiembre 9, 2026, incluidas dos regresiones para el almacenamiento de fuente-búfer reutilizado. No se reclama ninguna prueba de nuevo dispositivo físico. El ayudante de preparación de esta guía se comprobó con Xcode 26.6 en Swift 6 modo de concurrencia estricta completa en septiembre 9. Estas comprobaciones no establecen la precisión del micrófono, el comportamiento de descarga del modelo o la latencia.
Cómo se relaciona esto con Simple Memo
Esta guía y el ejemplo gratuito los mantiene el desarrollador de SimpleMemo. La guía de entrada por voz explica el flujo de uso del producto. El ejemplo por sí solo no envía correos ni guarda nada en Obsidian. En Simple Memo, el correo requiere configurar y verificar el destinatario, y guardar en Obsidian requiere configurar la integración y el destino. Que el reconocimiento de voz sea local no describe la privacidad ni la entrega de acciones posteriores que realice tu aplicación.
Relacionado: arquitectura de notas fuera de línea. El siguiente paso para un desarrollador es ejecutar la muestra completa con una frase de prueba y verificar la preparación, los resultados y la parada en el dispositivo y la configuración regional que planean admitir.