Haz que hable. Informe Yandex

Las bibliotecas estándar de reconocimiento de voz y conversión de texto a voz en iOS ofrecen muchas posibilidades. Del informeVolkovRomanoaprenderá cómo enseñar a su aplicación a pronunciar texto y personalizar la actuación de voz con la cantidad mínima de código. Roma revisó la API de reconocimiento de voz, sus limitaciones y características, el ciclo de vida de una solicitud de reconocimiento y los métodos para trabajar en modo sin conexión. Encontrará ejemplos de UX, soluciones alternativas a errores existentes y características para trabajar con una sesión de audio.





- Hola a todos, mi nombre es Roman Volkov. Hoy vamos a hablar de cómo enseñar a tu aplicación móvil a comunicarse con tus usuarios.



Antes de empezar, brevemente sobre mí. Antes del desarrollo de iOS, estuve involucrado en el desarrollo de sistemas de integración en el sector bancario y el desarrollo de sistemas analíticos en el sector petrolero. Sé de primera mano cuál es el estándar PCI DSS y, por ejemplo, cómo los ingenieros entienden lo que está sucediendo en un pozo durante la perforación, solo sobre la base de los datos de temperatura.



He estado desarrollando iOS desde 2016. Tengo experiencia tanto de trabajo autónomo como a distancia, experiencia de participar en el lanzamiento de varias startups. También hice una solicitud de marca para Rolls Royce.



En 2018, me uní al equipo de Prisma, desarrollé la aplicación Prisma y participé en el desarrollo y lanzamiento de Lensa Photo Editor. En 2019, me mudé a Yandex como desarrollador de iOS. Desde 2020, he liderado el grupo de desarrollo móvil Yandex.Translator. La aplicación Translator ya no es solo una aplicación para trabajar con texto. Tenemos muchas funciones interesantes como traducción de fotos, modo de diálogo, entrada de voz, actuación de voz y más.



Al comenzar a sumergirme en el tema de trabajar con sonido en iOS, no encontré ningún material compacto que incluyera trabajar con una sesión de audio, y con síntesis, y con reconocimiento de voz. Por eso decidí dar esta charla.







Estará en cuatro partes. Primero, hablaremos de qué es una sesión de audio, cómo trabajar con ella correctamente, cómo afecta el funcionamiento de tu aplicación. A continuación, pasemos a la síntesis de voz. Consideremos cómo puede enviar mensajes de texto a las personas con unas pocas líneas de código directamente en el teléfono. A continuación, pasaremos al reconocimiento de voz. Y en conclusión, veamos cómo se pueden brindar todas estas posibilidades al usuario en modo offline y qué características tiene.







Hay bastantes opciones para usar la actuación de voz y el reconocimiento de voz. Mi favorito es convertir los mensajes de audio de otras personas en texto. Y me alegro de que, por ejemplo, el equipo de Yandex. Messenger haya creado tal característica. Con suerte, otros mensajeros se pondrán al día y lo harán en casa también.



Pasamos sin problemas a la primera parte del informe, esto es AVAudioSession.







La sesión de audio es una capa entre nuestra aplicación y el sistema operativo. Más precisamente, entre su aplicación y el hardware para trabajar con sonido: altavoz y micrófono. En iOS, watchOS y tvOS, cada aplicación tiene una sesión de audio predeterminada preconfigurada. Este ajuste predeterminado varía de un sistema operativo a otro.



Hablando específicamente sobre iOS, la sesión de audio por defecto admite la reproducción de audio, pero prohíbe cualquier grabación. Si el interruptor del modo silencioso está configurado en el modo "silencioso", entonces absolutamente todos los sonidos dentro de su aplicación están silenciados. Y tercero, bloquear el dispositivo detiene la reproducción de todos los sonidos dentro de su aplicación.







La configuración de una sesión de audio consta de tres puntos: esta es la elección de la categoría, el modo y las opciones adicionales. Examinaremos cada uno de los puntos por separado.



Empecemos por la categoría. Una categoría es un conjunto de configuraciones para el comportamiento básico de una sesión de audio. Una categoría es un conjunto de parámetros que permiten que el sistema operativo coincida tanto como sea posible, digamos, el nombre de esta categoría. Por lo tanto, Apple recomienda elegir una categoría para su aplicación que sea lo más cercana posible a la disponible. Actualmente hay seis categorías disponibles en iOS 13. También hay una séptima categoría, pero está marcada como obsoleta y no debe usarse.



En esta charla veremos tres categorías: reproducción, grabación y playAndRecord. El modo le permite complementar las capacidades de la categoría establecida, ya que algunos modos están disponibles solo para ciertas categorías.







Por ejemplo, en la diapositiva, verá el modo de reproducción de películas y solo se puede configurar para la categoría Reproducción.



Configurar el modo MoviePlayback permite que la sesión de audio mejore automáticamente la calidad del sonido de reproducción para los altavoces incorporados y los auriculares. En esta charla, solo usaremos el modo "predeterminado". Pero quiero señalar que si usa un par incompatible de categoría y modo, se usará el modo predeterminado.







El tercero son las opciones, ajustes de puntos para la sesión de audio. Por ejemplo, puede personalizar cómo se mezcla el audio de su aplicación con el audio de otras aplicaciones, configurar la desactivación adecuada de la sesión de audio para que otras aplicaciones puedan saber que su aplicación está lista con audio.







Primero, veremos cómo configurar la categoría de reproducción, es decir, reproducción. Esta es una de las categorías de solo audio. Si está configurado, la activación de la sesión de audio interrumpe otra reproducción de audio, por ejemplo, de otras aplicaciones.



También es importante que el audio se reproduzca incluso si el interruptor de silencio está en silencio.



También hay una opción para reproducir en segundo plano para esta categoría, pero para ello su aplicación debe tener habilitado Audio, AirPlay e Imagen en imagen.



Considere las dos opciones que están visibles en la diapositiva. El primero es mixWithOthers. Si activa la sesión de audio con esta opción, la reproducción de sonido dentro de su aplicación se mezclará con el sonido de reproducción actual, por ejemplo, con música, a un nivel de volumen. Pero si desea que su sonido prevalezca en términos de volumen sobre la reproducción actual, puede usar la opción duckOthers. Reduce el volumen del sonido que se reproduce en segundo plano y lo devuelve cuando el sonido dentro de su aplicación ha terminado de reproducirse.



Por ejemplo, esto se puede observar en las aplicaciones de navegación: para un anuncio de ruta, lo que está escuchando ahora se silencia, el anuncio se reproduce y luego todo vuelve a su estado original.







Consideremos la opción de configurar una sesión de audio para el reconocimiento desde un micrófono. La categoría Grabar silencia todo el audio en reproducción mientras hay una sesión de audio con esta categoría activa en la aplicación. La grabación no puede silenciar los sonidos del sistema como llamadas, alarmas; en general, los sonidos estándar que tienen una prioridad más alta.



También puede agregar la opción allowBluetoothA2DP, esto le permite usar auriculares como AirPods para grabar sonido desde un micrófono y reproducir sonido en ellos. Hay una opción más antigua para esto, que suena como allowBluetooth, pero reduce mucho la calidad del sonido.



Solíamos usar la opción anterior y los usuarios se quejaron de que no estaban satisfechos con la calidad del sonido reproducido y grabado dentro de la aplicación. Cambiamos de opción, todo mejoró.



Si desea utilizar el reconocimiento de voz y la síntesis de voz al mismo tiempo, use la categoría playAndRecord. Luego, dentro de la sesión de audio activada, puede usar tanto la grabación como la reproducción de sonido.



La opción notifyOthersOnDeactivation debe considerarse por separado. Se utiliza en el método para activar la sesión de audio. por que es tan importante?







Si se desactivó la sesión de audio con esta opción, entonces otras aplicaciones recibirán la identificación AVAudioSessionInterruptionNotification con el parámetro AVAudioSessionInterruptionTypeEnded con el parámetro de que la interrupción de su sesión de audio ha finalizado y pueden seguir trabajando con el sonido, que se inició antes de que fueran interrumpidas.



Este escenario es posible si usa la categoría de reproducción en una aplicación sin la opción mixWithOthers, porque de lo contrario no interrumpirá el sonido de otra aplicación, su audio simplemente se mezclará con otra aplicación.



Usar esta opción y manejar la modificación correctamente le permite brindar a los usuarios una experiencia de usuario cómoda al trabajar con su aplicación.







En la diapositiva, puede ver un ejemplo de cómo manejar correctamente la notificación de que su aplicación fue interrumpida por otra persona dentro de la sesión de audio y la situación en la que terminó la interrupción. Es decir, nos suscribimos a una determinada notificación y, quizás, de dos tipos: cuando acaba de empezar la interrupción y cuando acabó.



En el primer caso, puede guardar el estado y, en el segundo, puede continuar reproduciendo el sonido que fue interrumpido por otra aplicación.



Aquí hay un ejemplo de cómo podría funcionar esto:



El video se reproducirá desde el momento en que se demuestra el ejemplo



En este ejemplo, la música se reprodujo en otra aplicación, es decir, en VLC, luego comencé la voz actuando dentro de nuestra aplicación. Se interrumpió la música, se reprodujo el discurso sintetizado y luego la música se reanudó automáticamente.



Me gustaría señalar que no todas las aplicaciones manejan correctamente la situación cuando su sonido se interrumpe. Por ejemplo, algunos mensajeros instantáneos populares no reanudan la reproducción de audio.







Resumamos. Hemos analizado el principio de la sesión de audio. Examinamos las posibilidades de configurar la sesión de audio según los requisitos de sus aplicaciones y aprendimos cómo activar y desactivar convenientemente la sesión de audio para el usuario.



Siga adelante. Síntesis del habla.







La diapositiva muestra un diagrama de las clases involucradas en el proceso de síntesis de voz. Las clases principales son AVSpeechSynthesiser, AVSpeechUtterance y AVSpeechSynthesisVoice con sus configuraciones.



Por separado, observo que hay un AVSpeechSynthesizerDelegate que le permite recibir notificaciones sobre el ciclo de vida de toda la solicitud. Dado que el sonido del texto está reproduciendo el sonido, la AVAudioSession discutida anteriormente será una dependencia implícita aquí.



Puede realizar una solicitud de reconocimiento sin configurar una sesión de audio, pero para cualquier aplicación de producción es importante comprender cómo configurarla. Hablamos de esto antes.







El ejemplo más breve de cómo puede realizar rápidamente una solicitud de síntesis de voz. Debe crear un objeto de la clase AVSpeechUtterance, donde especifica el texto que desea hablar, la voz y el idioma deseados. Si no especifica una configuración regional de idioma al crear una voz, se utilizará la configuración regional predeterminada de su teléfono. Pero hablaremos sobre la elección de voces y cómo trabajar con ellas en las próximas diapositivas.



A continuación, crea un objeto de la clase AVSpeechSynthesizer y llama al método speak. Todos. Después de eso, el texto se sintetizará y reproducirá, escuchará el resultado.



Pero, de hecho, esto es solo el comienzo. La síntesis de voz tiene muchas más posibilidades, de las que ahora hablaremos.







Primero, puede configurar la velocidad al recibir sonido. La velocidad se especifica como un número real en el rango de cero a uno. La tasa real varía de cero a uno si establece la propiedad de tasa en un rango de 0 a 0,5.



Si establece el valor de la tasa en el rango de 0,5 a 1, la tasa cambia proporcionalmente en valores de 1X a 4X.



Un ejemplo de cómo se puede trabajar con rapidez.







En AVFoundation, hay un AVSpeechUtteranceDefault constante, que en realidad es 0.5, que es equivalente a la velocidad normal de reproducción de audio.



También puede especificar una velocidad que sea la mitad de la velocidad habitual, debe especificar un valor de 0,25. Si especifica 0,75, la velocidad aumentará 2,5 veces la velocidad normal. Además, por conveniencia, existen constantes para la velocidad mínima y máxima.



Ahora reproduciré algunos ejemplos:



El video se reproducirá desde el momento en que



se muestre el ejemplo Este fue un ejemplo de cómo un Macintosh habló por primera vez con su propia voz en una presentación de Apple. Y ese fue un ejemplo de velocidad normal del habla sintetizada.





Esto es 2 veces más lento.





Esto es 2,5 veces más rápido.



Por separado, con las últimas líneas, destaqué las propiedades preUtteranceDelay y postUtteranceDelay. Este es el retraso antes de que el sonido comience a reproducirse y el retraso después de que ha terminado. Es conveniente de usar cuando mezclas tu aplicación con sonido de otras aplicaciones y quieres que el volumen baje, después de un tiempo y pierdes el resultado. Luego esperaron un poco más, y solo después de eso, el volumen en otra aplicación volvió a su posición original.







Veamos el siguiente parámetro: selección de voz. Las voces para la síntesis de voz se dividen principalmente por ubicación, idioma y calidad. AVFoundation ofrece varias formas de crear u obtener un objeto AVSpeechSynthesisVoice. El primero es mediante identificación de voz. Cada voz tiene su propia ID única, y se puede encontrar una lista de todas las voces disponibles accediendo a la propiedad estática SpeechVoice. Obtener esta propiedad tiene algunas peculiaridades, hablaremos más de ellas.



Vale la pena señalar que si pasa un identificador no válido al constructor, el constructor devolverá "no".



La segunda opción es obtenerlo por idioma o código local. También quiero señalar que Apple dice que las voces de Siri no están disponibles, pero esto no es del todo cierto: logramos obtener los ID de algunas de las voces que se usan en Siri en algunos dispositivos. Quizás esto sea un error.



Las voces tienen dos cualidades: predeterminada y mejorada. Para algunas voces, puede descargar una versión mejorada, hablaremos de esto en la última sección, discutiremos cómo puede descargar las voces necesarias.







Un ejemplo de cómo puede seleccionar una voz específica. La primera forma, mediante un identificador específico, la segunda, mediante la línea que indica el código de idioma, la tercera, mediante una configuración regional específica.



Ahora quiero reproducir dos ejemplos de doblaje del mismo texto con diferentes configuraciones regionales.



El vídeo se reproducirá desde el momento en que se demuestre el ejemplo, la



segunda opción, me parece, se acerca más a la pronunciación rusa.







El género también apareció en iOS 13. Y esta propiedad solo está disponible en iOS 13 y superior, solo funciona para voces que se agregaron en iOS 13. Por lo tanto, Sexo se establece como enumeración y tiene tres propiedades: Femenino, Masculino y No especificado.



En nuestra aplicación, puede seleccionar el género de la voz con la que se leerá el texto. Para las viejas voces, hicimos una lista nosotros mismos y la guardamos en nuestra aplicación. Separando qué voz consideramos masculina y cuál femenina, para aquellas voces para las que el sistema devuelve Unspecified.







En iOS 13.1, la lista de votos puede devolver una lista vacía en la primera convocatoria. Solución: puede volver a consultar la lista completa una vez cada cierto número de segundos. Tan pronto como regrese no vacío, creemos que finalmente hemos recibido una lista de votos actualizada.



Este error se ha corregido en versiones posteriores de iOS, pero no se sorprenda si ve esto en sus aplicaciones.



Un punto interesante que encontré mientras investigaba la documentación: hay una propiedad estática AVSpeechSynthesisVoiceAlexIdentifier. Este es un identificador muy interesante, porque, en primer lugar, no todos los dispositivos pueden crear una voz con este identificador. En segundo lugar, no me queda claro por qué se ubica por separado. En tercer lugar, si obtiene una voz con este identificador, entonces esta voz tiene una clase única y diferente.



Al mismo tiempo, el estudio de los encabezados de framework no me aportó nada útil e interesante. Si conoce alguna información sobre este identificador, por qué es necesario, por qué apareció, por favor dígame. No he podido encontrar una respuesta a esta pregunta.







Aquí puede ver un ejemplo de cómo hicimos la elección de la voz en función de la ubicación, el género en la interfaz y cómo otorgamos la capacidad de especificar la velocidad de la actuación de voz para un idioma específico.







Hablaré brevemente sobre el sistema de signos para grabar transcripciones basadas en la lengua latina. Cuando da un texto para la actuación de voz, puede especificar la pronunciación de palabras específicas dentro de él. En iOS, esto se hace a través de NSAttributedString, con una clave especial. La generación de esta pronunciación está disponible directamente en el dispositivo iOS en la sección Accesibilidad. Pero para grandes volúmenes, me parece que esto es muy inconveniente, y puede automatizar la generación de transcripción fonética de otras formas.



Por ejemplo, aquí hay un repositorio de inglés que tiene un gran diccionario de correlación y pronunciación de palabras.







La diapositiva muestra un ejemplo de cómo se puede reemplazar la pronunciación de una palabra en particular para un lugar. En este caso, es | təˈmɑːtəʊ |, tomate.



El video se reproducirá desde el momento en que



se muestra el ejemplo, ahora se ha reproducido la opción con configurar el atributo a pronunciación y sin.







En total, buscamos formas de crear una solicitud de síntesis de voz. Aprendí a trabajar con voces. Buscamos una solución para uno de los errores que puede encontrar y analizamos la transcripción fonética, cómo puede usarla.







Pasemos al reconocimiento de voz. Se presenta en iOS en forma de un marco llamado Speech y permite el reconocimiento de voz directamente en sus dispositivos.



Se admiten aproximadamente 50 idiomas y dialectos, disponibles a partir de iOS 10. El reconocimiento de voz generalmente requiere una conexión a Internet. Pero para algunos dispositivos y para algunos idiomas, el reconocimiento puede funcionar sin conexión. Hablaremos de esto en la cuarta parte de mi charla.



El reconocimiento de voz está disponible tanto desde el micrófono como desde el archivo de audio. Si desea otorgar al usuario la capacidad de reconocer la voz del micrófono, entonces el usuario debe otorgar permiso para dos permisos. El primero es para acceder al micrófono, el segundo es por el hecho de que su discurso será transmitido a los servidores de Apple para su reconocimiento.



Desafortunadamente, donde solo puede usar el reconocimiento fuera de línea, es imposible no solicitar este permiso. Debe solicitarse de todos modos.







La lista se tomó del sitio web de Apple. Estos son los idiomas y configuraciones regionales disponibles para el reconocimiento de voz. Pero, de hecho, esta es una lista de idiomas y configuraciones regionales disponibles para dictar en un teclado estándar. Y la API del marco de voz bajo el capó se refiere a la implementación del dictado desde el teclado estándar.







El reconocimiento de voz es gratuito para nosotros como desarrolladores, pero tiene un límite de uso. El primero es el límite de dispositivos y solicitudes por día. El segundo es el límite total de la aplicación. Y tercero, puede reconocer un máximo de un minuto. La única excepción es el modo fuera de línea. En él puede hacer el reconocimiento de mensajes de audio largos grabados.



Apple, por supuesto, no dice números específicos para los límites, y como se escribió o dijo en el informe de la WWDC, debe estar preparado para manejar los errores y escribirles si a menudo, digamos, se topa con estos límites. Pero no tenemos ese problema. Para el idioma ruso, usamos SpeechKit como motor de reconocimiento de voz. Y la mayoría de nuestros usuarios hablan ruso, por lo que no hemos encontrado los límites.



Además, asegúrese de pensar en la privacidad. No permita que la voz actúe sobre datos: contraseñas, datos de tarjetas de crédito. Cualquier información confidencial o privada no debe estar disponible para su reconocimiento.







En la diapositiva, puede ver un diagrama condicional de las clases involucradas en el proceso de reconocimiento de voz. De manera similar a la síntesis, trabajar con reconocimiento es trabajar con una plancha de audio, por lo que aquí, también, AVAudioSession es una dependencia explícita.







Apoyo. Para obtener un conjunto de todas las configuraciones regionales compatibles, debe acceder a la propiedad de la página SupportLocales. La compatibilidad con una configuración regional en particular generalmente no garantiza que el reconocimiento de voz esté disponible para esa ubicación. Por ejemplo, es posible que se requiera una conexión permanente a los servidores de Apple.



El soporte de configuración regional para el reconocimiento coincide con la lista de configuraciones regionales para dictar en el teclado en iOS. Aquí tienes una lista completa . Para asegurarse de que una configuración regional determinada se pueda manejar en este momento, puede usar la propiedad isAvailable.







En el reconocimiento de voz en iOS, no hay prioridad de configuración regional para cada idioma, a diferencia de la síntesis. Por lo tanto, si tomamos la primera configuración regional de un idioma específico de la lista de todas las configuraciones regionales, es posible que algunas no sean las más populares. Por lo tanto, para algunos idiomas en Translator, hemos dado prioridad a una configuración regional específica para un idioma específico.



Por ejemplo, para inglés usamos en-US. La primera vez que un usuario intenta reconocer algo en inglés, usamos la configuración regional estadounidense.







Solicitud de reconocimiento de archivo. Aquí todo es sencillo. Debe obtener y vincular al archivo, crear un objeto SFSpeechRecognizer que indique la configuración regional que desea usar. Compruebe que el reconocimiento esté disponible en este momento. Cree SFSpeechURLRecognitionRequest utilizando construcciones donde pasa la ruta del archivo. Y comienza la tarea de reconocimiento.



Como resultado, recibirá un error de reconocimiento o un resultado. El resultado tiene una propiedad isFinal, lo que significa que este resultado es final y se puede utilizar más.







Aquí hay un ejemplo un poco más complejo: una solicitud de reconocimiento de un micrófono. Para ello, también necesitamos un objeto AVAudioEngine, que se encarga de trabajar con el micrófono. No entraremos en detalles sobre cómo funciona esto. Establece la categoría que desea, ya sea .record o .playRecord. Encienda la sesión de audio. Configure AudioEngine y suscríbase para recibir búferes de audio desde el micrófono. Los agrega a la solicitud de reconocimiento y cuando haya terminado de reconocer, puede salir del micrófono.



Vale la pena señalar que la propiedad shouldReportPartialResults, que es responsable de emitir resultados de reconocimiento temporales, se establece en true. Echemos un vistazo a las opciones: cómo se vería una aplicación con y sin el indicador shouldReportPartialResults.



El video se reproducirá desde el momento en que se demuestra



el ejemplo. En el ejemplo de la izquierda, dejé la respuesta del micrófono al sonido, al cambio de volumen. Se puede ver que estoy diciendo algo. Pero hasta que no termino de hablar, no ves nada. El usuario tarda mucho tiempo en obtener el resultado de lo que dicta.



Si establece shouldReportPartialResults en true y lo maneja correctamente, el usuario verá lo que está diciendo mientras habla. Esto es muy conveniente y esta es la forma correcta de hacer la interfaz en términos de dictado.







Aquí tienes un ejemplo de cómo manejamos el trabajo con una sesión de audio. Dentro del Traductor, usamos no solo trabajar con el sonido que escribimos, sino también otros frameworks que pueden hacer algo con la sesión de audio.



Escribimos un controlador que, en primer lugar, comprueba que la configuración, las categorías son las que necesitamos y, en segundo lugar, no hace lo que constantemente enciende y apaga la sesión de audio.



Incluso antes del desarrollo del modo de diálogo, entrada de voz y doblaje, nosotros mismos activamos y desactivamos la sesión de audio. Cuando comenzamos a hacer el modo de diálogo, resultó que estos encendidos / apagados agregan un retraso adicional entre el momento en que dijiste algo y la voz.







Para una consulta de reconocimiento de voz, puede especificar una pista: el tipo de voz que se reconocerá. Puede ser sin especificar, puede ser un dictado, una búsqueda o una breve confirmación. La mayoría de las veces, si su usuario va a decir algo largo, es mejor usar el dictado.







A partir de iOS 13, disponemos de análisis de audio. La diapositiva muestra los parámetros que se pueden obtener como resultado del habla reconocida. Es decir, recibirás como resultado no solo lo que dijo el usuario, sino también con qué voz lo dijo.







No nos detendremos en esto por mucho tiempo. A continuación, se muestra un ejemplo de cómo puede obtener análisis como resultado de un texto reconocido.







En total, estudiamos las capacidades del marco de voz para el reconocimiento de voz, aprendimos cómo dar pistas para el reconocimiento de voz y examinamos rápidamente las capacidades de la analítica.



Y por último, pero no menos importante: trabajo sin conexión. Lo primero de lo que quiero hablar es de una lista de idiomas sin conexión para la síntesis de voz. En ninguna parte de la documentación encontré una mención de cómo se pueden descargar explícitamente voces para trabajar sin conexión. Tanto los informes como la documentación dicen que estas voces se pueden descargar, pero donde no está escrito.



Busqué en el sistema y descubrí que si vas a Configuración, a la sección Accesibilidad, luego a "Contenido oral" y "Voces", verás, primero, una lista de idiomas para los que está disponible. En segundo lugar, al cambiar a un idioma específico, puede descargar nuevas voces.



Y esa lista coincide claramente con lo que AVSpeechSynthesisVoice.speechVoices devuelve dentro de la aplicación. Esto significa que puede enseñar a sus usuarios que pueden descargar los idiomas que necesitan para usar la conversión de texto a voz sin conexión.







Lista de idiomas fuera de línea para el reconocimiento. No se indica explícitamente en ninguna parte de la documentación, pero a juzgar por los diferentes foros y por lo que hemos encontrado, esta es la lista de idiomas y configuraciones regionales para ellos que pueden funcionar sin conexión sin acceso a Internet.



Cabe señalar que el reconocimiento fuera de línea está disponible en dispositivos con un chip A9 y anteriores.







Ahora viene la parte divertida. Lista de idiomas sin conexión para el reconocimiento de voz. A diferencia de la síntesis, generalmente no hay forma de descargar idiomas explícitamente para usted. Si agrega un idioma al teclado estándar, se puede descargar un paquete sin conexión para él. Desafortunadamente, esto no es determinista. Vayamos a Configuración> General> Teclado> Dictado. Por ejemplo, agregué español. Después de eso, bajo "Dictado" aparece una pequeña pista de que el dictado puede estar disponible para estos idiomas. El español apareció allí.



Luego fui a nuestra aplicación, apagué Internet y, para mi deleite, el reconocimiento fuera de línea en español funcionó.



Desafortunadamente, esto solo se puede influir indirectamente, la única forma es agregar el idioma al teclado estándar. Pero esto no garantiza que se descargará el paquete de reconocimiento fuera de línea.







En iOS, incluso si tiene acceso a Internet en su teléfono, puede encender el dispositivo y hacer reconocimiento de voz en él, si el reconocimiento está disponible, por supuesto.



Hay una propiedad supportsOnDeviceRecognition, está disponible desde iOS 13. Pero esta propiedad no funciona correctamente, mostré una captura de pantalla del error en la parte inferior derecha. El error solo se corrigió en 13.2. La propiedad siempre devuelve falso en la primera solicitud. Según Apple, devolverá el valor correcto después de unos segundos.



Además, esta propiedad puede dar falso, pero al mismo tiempo, establecer el indicador requireOnDeviceRecognition en verdadero funciona correctamente. Esto significa que el reconocimiento funciona completamente en el dispositivo, incluso si este indicador de prueba devuelve falso.



Puede haber varias soluciones aquí. Primero, solo puede realizar el reconocimiento sin conexión en iOS 13.2. En segundo lugar, puede elegir una cierta cantidad de segundos para volver a solicitar esta propiedad y actualizar la interfaz de usuario. Y en tercer lugar, puede olvidarse de esta propiedad: intente reconocer la voz fuera de línea y, en caso de error, muéstresela al usuario.







Analizamos cómo puede descargar explícitamente paquetes de síntesis de voz sin conexión y encontramos una manera de intentar forzar a iOS a descargar paquetes de reconocimiento de voz sin conexión.



Ahora sabe cómo agregar rápidamente síntesis y reconocimiento de voz a sus aplicaciones. Lo tengo todo, gracias por tu atención.



All Articles