- Olá a todos, meu nome é Roman Volkov. Hoje vamos falar sobre como ensinar seu aplicativo móvel a se comunicar com seus usuários.
Antes de começarmos, vamos falar brevemente sobre mim. Antes do desenvolvimento do iOS, estive envolvido no desenvolvimento de sistemas de integração no setor bancário e no desenvolvimento de sistemas analíticos no setor de petróleo. Sei em primeira mão o que é o padrão PCI DSS e, por exemplo, como os engenheiros entendem o que está acontecendo em um poço durante a perfuração, apenas com base nos dados de temperatura.
Tenho feito desenvolvimento para iOS desde 2016. Tenho experiência tanto em freelancer como em trabalho remoto, experiência de participação no lançamento de várias startups. Também fiz uma inscrição para a marca Rolls Royce.
Em 2018, entrei para a equipe Prisma, desenvolvi o aplicativo Prisma e participei do desenvolvimento e lançamento do Lensa Photo Editor. Em 2019, mudei para Yandex como desenvolvedor iOS. Desde 2020, sou o chefe do grupo de desenvolvimento móvel Yandex.Translator. O aplicativo Tradutor não é mais apenas um aplicativo para trabalhar com texto. Temos muitos recursos interessantes, como tradução de fotos, modo de diálogo, entrada de voz, dublagem e muito mais.
Começando a mergulhar no tópico de trabalhar com som no iOS, não encontrei nenhum material compacto que incluísse o trabalho com uma sessão de áudio, e com síntese, e com reconhecimento de fala. É por isso que decidi fazer esta palestra.
Será em quatro partes. Primeiro, falaremos sobre o que é uma sessão de áudio, como trabalhar com ela corretamente, como ela afeta o funcionamento de seu aplicativo. A seguir, vamos prosseguir para a síntese da fala. Vamos considerar como você pode enviar mensagens de texto para as pessoas em algumas linhas de código diretamente no telefone. A seguir, mudaremos para o reconhecimento de fala. E para concluir, vamos ver como todos esses recursos podem ser fornecidos ao usuário no modo offline e quais recursos ele possui.
Existem algumas opções para usar a atuação de voz e o reconhecimento de fala. Meu favorito é converter mensagens de áudio de outras pessoas em texto. E estou feliz que, por exemplo, a equipe do Yandex. Messenger tenha feito esse recurso. Esperançosamente, outros mensageiros irão alcançá-lo e fazê-lo em casa também.
Estamos avançando suavemente para a primeira parte do relatório, que é AVAudioSession.
A sessão de áudio é uma camada entre nosso aplicativo e o sistema operacional. Mais precisamente, entre a sua aplicação e o hardware para trabalhar com som: altifalante e microfone. No iOS, watchOS e tvOS, cada aplicativo tem uma sessão de áudio padrão pré-configurada. Esta predefinição varia de um sistema operacional para outro.
Falando especificamente sobre o iOS, a sessão de áudio por padrão oferece suporte à reprodução de áudio, mas proíbe qualquer gravação. Se a chave do modo silencioso estiver configurada para o modo "silencioso", absolutamente todos os sons dentro do aplicativo serão silenciados. E terceiro, bloquear o dispositivo interrompe a reprodução de todos os sons dentro do aplicativo.
A configuração de uma sessão de áudio consiste em três pontos: esta é uma escolha de categoria, modo e opções adicionais. Veremos cada um dos pontos separadamente.
Vamos começar com a categoria. Uma categoria é um conjunto de configurações para o comportamento básico de uma sessão de áudio. Uma categoria é um conjunto de parâmetros que permitem que o sistema operacional corresponda o máximo possível, digamos, o nome dessa categoria. Portanto, a Apple recomenda escolher uma categoria para o seu aplicativo que seja o mais próximo possível da disponível. Atualmente, existem seis categorias disponíveis no iOS 13. Há também uma sétima categoria, mas está marcada como obsoleta e não deve ser usada.
Nesta palestra, veremos três categorias: playback, record e playAndRecord. O modo permite complementar os recursos da categoria definida, uma vez que alguns modos estão disponíveis apenas para determinadas categorias.
Por exemplo, no slide você vê o modo de reprodução de filme, e só pode ser definido para a categoria Reprodução.
Definir o modo de reprodução de filme permite que a sessão de áudio melhore automaticamente a qualidade do som de reprodução para os alto-falantes embutidos e para os fones de ouvido. Nesta palestra, usaremos apenas o modo "padrão". Mas quero observar que, se você usar um par incompatível de categoria e modo, o modo padrão será usado.
A terceira são as opções, configurações de pontos para a sessão de áudio. Por exemplo, você pode personalizar como o áudio de seu aplicativo se mistura com o áudio de outros aplicativos, configurar a desativação adequada da sessão de áudio para que outros aplicativos possam saber que seu aplicativo terminou de trabalhar com áudio.
Primeiro, veremos como definir a categoria de reprodução, ou seja, reprodução. Esta é uma das categorias apenas de áudio. Se estiver definida, a ativação da sessão de áudio interrompe a reprodução de outro áudio, por exemplo, de outros aplicativos.
Também é importante que o áudio seja reproduzido mesmo que o botão mudo esteja em mudo.
Também existe a opção de reproduzir no estado de fundo para esta categoria, mas para isso seu aplicativo deve ter Áudio, AirPlay e Imagem em Imagem habilitados.
Vejamos duas opções que estão visíveis no slide. O primeiro é mixWithOthers. Se você ativar a sessão de áudio com esta opção, a reprodução de som dentro de seu aplicativo será misturada com o som de reprodução atual, por exemplo, com música, em um nível de volume. Mas se você quiser que seu som prevaleça em termos de volume sobre a reprodução atual, você pode usar a opção duckOthers. Ele abaixa o volume do som reproduzido em segundo plano e o retorna quando o som reproduzido dentro do aplicativo termina.
Por exemplo, isso pode ser observado em aplicativos de navegação: para um anúncio de rota, o que você está ouvindo agora é silenciado, o anúncio é reproduzido e então tudo retorna ao seu estado original.
Vamos considerar a opção de configurar uma sessão de áudio para reconhecimento de um microfone. A categoria Gravar silencia todo áudio reproduzido enquanto uma sessão de áudio com esta categoria está ativa no aplicativo. O registro não pode silenciar os sons do sistema, como chamadas, alarmes - em geral, sons padrão que têm uma prioridade mais alta.
Você também pode adicionar a opção allowBluetoothA2DP, que permite usar fones de ouvido como AirPods para gravar som de um microfone e reproduzir som neles. Existe uma opção mais antiga para isso, que soa como allowBluetooth, mas diminui muito a qualidade do som.
Costumávamos usar a opção antiga, e havia reclamações de usuários de que não estavam satisfeitos com a qualidade do som reproduzido e gravado dentro do aplicativo. Mudamos de opção, tudo melhorou.
Se você deseja usar o reconhecimento de fala e a síntese de fala ao mesmo tempo, use a categoria playAndRecord. Então, dentro da sessão de áudio ativada, você pode usar a gravação e a reprodução do som.
A opção notificarOthersOnDeactivation deve ser considerada separadamente. É usado no método de ativação da sessão de áudio. Por que isso é tão importante?
Se a sessão de áudio foi desativada com esta opção, outros aplicativos receberão a identificação AVAudioSessionInterruptionNotification com o parâmetro AVAudioSessionInterruptionTypeEnded com o parâmetro que a interrupção de sua sessão de áudio terminou e eles podem continuar trabalhando com o som, que foi iniciado antes de serem interrompidos.
Este cenário é possível se você usar a categoria de reprodução em um aplicativo sem a opção mixWithOthers, porque caso contrário você não interromperá o som de outro aplicativo, seu áudio será simplesmente mixado com outro aplicativo.
Usar esta opção e lidar com a modificação corretamente permite que você forneça aos usuários uma experiência de usuário confortável ao trabalhar com seu aplicativo.
No slide, você pode ver um exemplo de como lidar adequadamente com a notificação de que seu aplicativo foi interrompido por outro na sessão de áudio e a situação quando a interrupção terminou. Ou seja, subscrevemos uma determinada notificação e, talvez, de dois tipos: quando a interrupção apenas começou e quando terminou.
No primeiro caso, você pode salvar o estado e, no segundo, pode continuar reproduzindo o som que foi interrompido por outro aplicativo.
Aqui está um exemplo de como isso pode funcionar:
O vídeo será reproduzido a partir do momento em que o exemplo é mostrado.Neste
exemplo, a música foi tocada em outro aplicativo, ou seja, no VLC, então iniciei a dublagem dentro do nosso aplicativo. A música foi interrompida, a fala sintetizada foi tocada e a música reiniciou automaticamente a reprodução.
Gostaria de salientar que nem todos os aplicativos lidam corretamente com a situação quando seu som é interrompido. Por exemplo, alguns mensageiros instantâneos populares não retomam a reprodução de som.
Vamos resumir. Analisamos o princípio da sessão de áudio. Examinamos as possibilidades de configurar a sessão de áudio de acordo com os requisitos de seus aplicativos e aprendemos como ativar e desativar convenientemente a sessão de áudio para o usuário.
Ir em frente. Síntese da fala.
O slide mostra um diagrama das classes envolvidas no processo de síntese da fala. As classes principais são AVSpeechSynthesiser, AVSpeechUtterance e AVSpeechSynthesisVoice com suas configurações.
Separadamente, observo que há um AVSpeechSynthesizerDelegate que permite receber notificações sobre o ciclo de vida de toda a solicitação. Como o som do texto está reproduzindo o som, o AVAudioSession discutido anteriormente será uma dependência implícita aqui.
Você pode fazer uma solicitação de reconhecimento sem configurar uma sessão de áudio, mas para qualquer aplicativo de produção, é importante entender como configurá-lo. Falamos sobre isso antes.
O exemplo mais curto de como você pode fazer uma solicitação de síntese de fala rapidamente. Você precisa criar um objeto da classe AVSpeechUtterance, onde você especifica o texto que deseja falar, a voz e o idioma desejados. Se você não especificar uma localidade de idioma ao criar uma voz, a localidade padrão do seu telefone será usada. Mas falaremos sobre a escolha das vozes e como trabalhar com elas nos próximos slides.
Em seguida, você cria um objeto da classe AVSpeechSynthesizer e chama o método speak. Tudo. Depois disso, o texto será sintetizado e reproduzido, você ouvirá o resultado.
Mas, na verdade, este é apenas o começo. A síntese de voz tem muito mais possibilidades, das quais falaremos agora.
Primeiro, você pode definir a velocidade ao receber o som. A velocidade é especificada como um número real no intervalo de zero a um. A taxa real varia de zero a um se você definir a propriedade da taxa em um intervalo de 0 a 0,5.
Se você definir o valor da taxa no intervalo de 0,5 a 1, a taxa muda proporcionalmente em valores de 1X a 4X.
Um exemplo de como você pode trabalhar com velocidade.
No AVFoundation, há um AVSpeechUtteranceDefault constante, que na verdade é 0,5, o que é equivalente à velocidade normal de reprodução de áudio.
Você também pode especificar uma velocidade com a metade da velocidade normal, você precisa especificar um valor de 0,25. Se você especificar 0,75, a velocidade aumentará 2,5 vezes a velocidade normal. Além disso, por conveniência, existem constantes para a velocidade mínima e máxima.
Agora vou dar alguns exemplos:
O vídeo será reproduzido a partir do momento em que
for mostrado o exemplo.Este foi um exemplo de como um Macintosh falou pela primeira vez com sua própria voz em uma apresentação da Apple. E esse foi um exemplo de velocidade normal de voz sintetizada.
Isso é 2 vezes mais lento.
Isso é 2,5 vezes mais rápido.
Separadamente, com as últimas linhas, trouxe as propriedades preUtteranceDelay e postUtteranceDelay. Este é o atraso antes de o som começar a ser reproduzido e o atraso após o término da reprodução. É conveniente usar quando você mistura seu aplicativo com o som de outros aplicativos e deseja que o volume abaixe, depois de um tempo e você perde o resultado. Em seguida, eles esperaram mais um tempo e só depois disso o volume em outro aplicativo voltou à posição original.
Vamos ver o próximo parâmetro - seleção de voz. As vozes para síntese de voz são divididas principalmente por local, idioma e qualidade. AVFoundation oferece várias maneiras de criar ou obter um objeto AVSpeechSynthesisVoice. O primeiro é por ID de voz. Cada voz tem seu próprio ID exclusivo e uma lista de todas as vozes disponíveis pode ser encontrada acessando a propriedade estática SpeechVoice. A obtenção dessa propriedade possui algumas peculiaridades, falaremos sobre elas mais adiante.
É importante notar que se você passar um identificador inválido para o construtor, o construtor retornará "não".
A segunda opção é obtê-lo por idioma ou código de localidade. Também quero observar que a Apple diz que as vozes do Siri não estão disponíveis, mas isso não é totalmente verdade: conseguimos obter os IDs de algumas das vozes que são usadas no Siri em alguns dispositivos. Talvez seja um bug.
As vozes têm duas qualidades - padrão e aprimorada. Para algumas vozes, você pode baixar uma versão melhorada, falaremos sobre isso na última seção, discutiremos como você pode baixar as vozes necessárias.
Um exemplo de como você pode selecionar uma voz específica. A primeira forma - por um identificador específico, a segunda - pela linha que indica o código do idioma, a terceira - por um local específico.
Agora quero reproduzir dois exemplos de dublagem do mesmo texto com localidades diferentes.
O vídeo será reproduzido a partir do momento em que o exemplo for demonstrado.A
segunda opção, me parece, está mais próxima da pronúncia russa.
O gênero também apareceu no iOS 13. E esta propriedade está disponível apenas no iOS 13 e superior, ela só funciona para vozes que foram adicionadas no iOS 13. Portanto, Gênero é definido como enum e tem três propriedades: Feminino, Masculino e Não especificado.
Em nosso aplicativo, você pode selecionar o gênero da voz com a qual o texto será lido. Para as vozes antigas, nós mesmos fizemos uma lista e a mantemos em nosso aplicativo. Separando qual voz consideramos masculina e qual feminina, para aquelas vozes para as quais o sistema retorna Não especificado.
No iOS 13.1, a lista de votos pode retornar uma lista vazia na primeira chamada. Solução: você pode consultar novamente a lista inteira uma vez em um determinado número de segundos. Assim que retornar não vazio, acreditamos que finalmente recebemos uma lista de votos atualizada.
Esse bug foi corrigido nas versões subsequentes do iOS, mas não se surpreenda se vir isso em seus aplicativos.
Um ponto interessante que descobri ao pesquisar a documentação: há uma propriedade estática AVSpeechSynthesisVoiceAlexIdentifier. Este é um identificador muito interessante, porque, em primeiro lugar, nem todos os dispositivos podem criar uma voz com este identificador. Em segundo lugar, não está claro para mim por que ele está localizado separadamente. Em terceiro lugar, se você obtiver uma voz com esse identificador, essa voz terá uma classe única e distinta.
Ao mesmo tempo, o estudo dos cabeçalhos do framework não me trouxe nada de útil e interessante. Se você souber de alguma informação sobre este identificador - por que é necessário, por que apareceu, diga-me. Não consegui encontrar uma resposta para esta pergunta.
Aqui você pode ver um exemplo de como fizemos na interface a escolha da voz com base no local, gênero e como oferecemos a capacidade de especificar a velocidade da dublagem para um determinado idioma.
Falarei brevemente sobre o sistema de signos para registrar a transcrição com base na língua latina. Ao fornecer um texto para atuação de voz, você pode especificar a pronúncia de palavras específicas dentro dele. No iOS, isso é feito por meio de NSAttributedString, com uma chave especial. A geração desta pronúncia está disponível diretamente no dispositivo iOS na seção Acessibilidade. Mas, para grandes volumes, parece-me que isso é muito inconveniente, e você pode automatizar a geração da transcrição fonética de outras maneiras.
Por exemplo, aqui está um repositório para inglês que possui um grande dicionário de correlação de palavras e pronúncia.
O slide mostra um exemplo de como você pode substituir a pronúncia de uma palavra específica por um local. Nesse caso, é | təˈmɑːtəʊ |, tomate.
O vídeo será reproduzido a partir do momento em que o exemplo
for demonstrado, agora a opção foi reproduzida com o atributo definido para pronúncia e sem.
No total, examinamos maneiras de criar uma solicitação de síntese de fala. Aprendi a trabalhar com vozes. Vimos uma solução alternativa para um dos bugs que você pode encontrar e vimos a transcrição fonética para saber como usá-la.
Vamos prosseguir para o reconhecimento de fala. Ele é apresentado no iOS na forma de uma estrutura chamada Fala, e permite o reconhecimento de voz diretamente em seus dispositivos.
Aproximadamente 50 idiomas e dialetos são suportados, disponíveis a partir do iOS 10. O reconhecimento de fala geralmente requer uma conexão com a Internet. Mas, para alguns dispositivos e idiomas, o reconhecimento pode funcionar offline. Falaremos sobre isso na quarta parte da minha palestra.
O reconhecimento de fala está disponível no microfone e no arquivo de áudio. Se você deseja dar ao usuário a capacidade de reconhecer a fala do microfone, o usuário deve dar permissão para duas permissões. O primeiro é pelo acesso ao microfone, o segundo é pelo fato de sua fala ser transmitida aos servidores da Apple para reconhecimento.
Infelizmente, onde você só pode usar o reconhecimento offline, é impossível não solicitar essa permissão. Deve ser solicitado de qualquer maneira.
A lista foi retirada do site da Apple. Estes são os idiomas e localidades disponíveis para reconhecimento de fala. Mas, na verdade, esta é uma lista de idiomas e localidades disponíveis para ditado em um teclado padrão. E a API do framework Speech nos bastidores refere-se à implementação do ditado do teclado padrão.
O reconhecimento de voz é gratuito para nós, desenvolvedores, mas tem um limite de uso. O primeiro é o limite de dispositivos e solicitações por dia. O segundo é o limite total do aplicativo. E terceiro - você pode reconhecer no máximo um minuto. A única exceção é o modo offline. Nele você pode fazer o reconhecimento de longas mensagens de áudio gravadas.
A Apple, é claro, não diz números específicos sobre os limites e, como foi escrito ou dito no relatório do WWDC, você precisa estar preparado para lidar com erros e escrever para eles se você frequentemente, digamos, esbarrar nesses limites. Mas não temos esse problema. Para o idioma russo, usamos o SpeechKit como um mecanismo de reconhecimento de voz. E a maioria de nossos usuários fala russo, então não encontramos os limites.
Além disso, lembre-se de pensar sobre privacidade. Não permita atuação de voz em dados - senhas, dados de cartão de crédito. Qualquer informação sensível ou privada não deve estar disponível para reconhecimento.
No slide, você pode ver um diagrama condicional das classes envolvidas no processo de reconhecimento de fala. Da mesma forma que a síntese, trabalhar com reconhecimento é trabalhar com um ferro de áudio, então aqui também, AVAudioSession é uma dependência explícita.
Apoio, suporte. Para obter um conjunto de todas as localidades com suporte, você precisa acessar a propriedade da página supportedLocales. O suporte para um determinado local geralmente não garante que o reconhecimento de voz esteja disponível no momento para aquele local. Por exemplo, pode ser necessária uma conexão persistente com servidores Apple.
O suporte de local para reconhecimento corresponde à lista de localidades para ditado no teclado no iOS. Aqui está uma lista completa . Para garantir que uma determinada localidade possa ser tratada agora, você pode usar a propriedade isAvailable.
No reconhecimento de voz no iOS, não há prioridade de local para cada idioma, ao contrário da síntese. Portanto, se pegarmos o primeiro local de um idioma específico da lista de todos os locais, pode haver algum local que não seja o mais popular. Portanto, para alguns idiomas no Tradutor, definimos uma prioridade de local específica para um idioma específico.
Por exemplo, para inglês, usamos en-US. Na primeira vez que um usuário tenta reconhecer algo em inglês, usamos a localidade americana.
Solicitação de reconhecimento do arquivo. Tudo é simples aqui. Você precisa obter e vincular ao arquivo, criar um objeto SFSpeechRecognizer indicando a localidade que deseja usar. Verifique se o reconhecimento está disponível no momento. Crie SFSpeechURLRecognitionRequest usando construções onde você passa o caminho do arquivo. E inicie a tarefa de reconhecimento.
Como resultado, você receberá um erro de reconhecimento ou um resultado. O resultado tem uma propriedade isFinal, o que significa que esse resultado é final e pode ser usado posteriormente.
Aqui está um exemplo um pouco mais complexo - um pedido de reconhecimento de um microfone. Para isso, precisamos também de um objeto AVAudioEngine, que é responsável por trabalhar com o microfone. Não entraremos em detalhes de como isso funciona. Você define a categoria desejada - .record ou .playRecord. Ligue a sessão de áudio. Configure AudioEngine e se inscreva para receber buffers de áudio do microfone. Você os adiciona à solicitação de reconhecimento e, quando terminar de reconhecer, pode sair do microfone.
É importante notar que a propriedade shouldReportPartialResults, que é responsável por emitir resultados de reconhecimento temporário, está definida como true. Vamos dar uma olhada nas opções: a aparência de um aplicativo com e sem o sinalizador shouldReportPartialResults.
O vídeo será reproduzido a partir do momento em que o exemplo for demonstrado.
No exemplo à esquerda, deixei a resposta do microfone ao som, para alterar o volume. Pode-se ver que estou dizendo algo. Mas até eu terminar de falar, você não vê nada. Demora muito para o usuário obter o resultado do que ditou.
Se você definir shouldReportPartialResults como true e tratá-lo corretamente, o usuário verá o que ele está dizendo enquanto fala. Isso é muito conveniente e é a maneira certa de fazer a interface em termos de ditado.
Aqui está um exemplo de como lidamos com o trabalho com uma sessão de áudio. Dentro do Translator, usamos não apenas o trabalho com o som que escrevemos, mas também outros frameworks que podem fazer algo com a sessão de áudio.
Escrevemos um controlador que, em primeiro lugar, verifica se as configurações e categorias são as que precisamos e, em segundo lugar, não faz o que liga e desliga constantemente a sessão de áudio.
Mesmo antes do desenvolvimento do modo de diálogo, a entrada de voz e a dublagem nós mesmos ligamos e desligamos a sessão de áudio. Quando começamos a fazer o modo de diálogo, descobrimos que esses modos liga-desliga adicionam um atraso extra entre o momento em que você diz algo e a dublagem.
Para uma consulta de reconhecimento de fala, você pode especificar uma dica - o tipo de fala a ser reconhecido. Pode ser não especificado, ditado, pesquisa ou confirmação curta. Na maioria das vezes, se o usuário vai dizer algo longo, ditar é melhor.
A partir do iOS 13, a análise de áudio está disponível para nós. O slide mostra os parâmetros que podem ser obtidos como resultado da fala reconhecida. Ou seja, você receberá como resultado não apenas o que o usuário disse, mas também com que voz ele o disse.
Não vamos insistir nisso por muito tempo. Aqui está um exemplo de como você pode obter análises como resultado de um texto reconhecido.
No total, estudamos os recursos da estrutura de fala para reconhecimento de fala, aprendemos como dar dicas para reconhecimento de fala e examinamos rapidamente os recursos de análise.
E por último, mas não menos importante: trabalho offline. A primeira coisa que quero falar é uma lista de idiomas off-line para síntese de voz. Em nenhum lugar da documentação encontrei uma menção de como você pode baixar vozes explicitamente para trabalhar offline. Tanto os relatórios quanto a documentação dizem que essas vozes podem ser baixadas, mas não estão escritas.
Pesquisei no sistema e descobri que se você for em Configurações, na seção Acessibilidade, depois em "Conteúdo oral" e "Vozes", você verá, primeiro, uma lista dos idiomas para os quais está disponível. Em segundo lugar, ao mudar para um idioma específico, você pode baixar novas vozes.
E essa lista corresponde claramente ao que AVSpeechSynthesisVoice.speechVoices retorna dentro do aplicativo. Isso significa que você pode ensinar a seus usuários que eles podem baixar os idiomas de que precisam para usar a conversão de texto em voz offline.
Lista de idiomas offline para reconhecimento. Não é indicado explicitamente em qualquer lugar da documentação, mas a julgar por diferentes fóruns e pelo que encontramos, esta é a lista de idiomas e localidades para eles que podem funcionar offline sem acesso à Internet.
Deve-se observar que o reconhecimento offline está disponível em dispositivos com chip A9 e mais antigos.
Agora vem a parte divertida. Lista de idiomas offline para reconhecimento de fala. Ao contrário da síntese, geralmente não há como fazer o download de idiomas explicitamente para você. Se você adicionar um idioma ao teclado padrão, um pacote offline pode ser baixado para ele. Infelizmente, isso não é determinístico. Vamos em Ajustes> Geral> Teclado> Ditado. Por exemplo, adicionei espanhol. Depois disso, sob o "Ditado" aparece uma pequena dica de que o ditado pode estar disponível para esses idiomas. O espanhol apareceu lá.
Depois fui até nosso aplicativo, desliguei a internet e, para minha alegria, o reconhecimento offline em espanhol funcionou.
Infelizmente, isso só pode ser influenciado indiretamente, a única maneira é adicionar o idioma ao teclado padrão. Mas isso não garante que o pacote de reconhecimento offline será baixado.
No iOS, mesmo que você tenha acesso à Internet no seu telefone, você pode ligar o dispositivo e fazer o reconhecimento de voz nele, se o reconhecimento estiver disponível, é claro.
Existe uma propriedade supportedOnDeviceRecognition, que está disponível desde o iOS 13. Mas esta propriedade não funciona corretamente, mostrei uma captura de tela do erro no canto inferior direito. O bug só foi corrigido no 13.2. A propriedade sempre retorna falso na primeira solicitação. De acordo com a Apple, ele retornará o valor correto após alguns segundos.
Além disso, essa propriedade pode fornecer false, mas, ao mesmo tempo, definir o sinalizador requiresOnDeviceRecognition como true funciona com sucesso. Isso significa que o reconhecimento funciona completamente no dispositivo, mesmo se esse sinalizador de teste retornar falso.
Pode haver várias soluções aqui. Primeiro, você só pode fazer reconhecimento offline no iOS 13.2. Em segundo lugar, você pode escolher um determinado número de segundos para solicitar novamente essa propriedade e atualizar a interface do usuário. E em terceiro lugar, você pode esquecer esta propriedade: tente reconhecer a voz offline, e em caso de erro, apenas mostre ao usuário.
Vimos como você pode baixar explicitamente pacotes de síntese de voz offline e encontramos uma maneira de tentar forçar o iOS a baixar pacotes de reconhecimento de voz offline.
Agora você sabe adicionar rapidamente síntese e reconhecimento de fala aos seus aplicativos. Eu tenho tudo, obrigado pela atenção.