iOS 26 SpeechAnalyzer Live Mic: Configuração, Resultados e Solução de Problemas
Esta página é uma tradução automática do original em inglês. Ler o original em inglês
Para um pipeline de microfone iOS 26 ao vivo, verifique o suporte ao dispositivo e a localidade, prepare os ativos do modelo, obtenha um formato PCM compatível e consuma resultados de reconhecimento durante a alimentação de áudio. Trate a conclusão normal separadamente do cancelamento para que as últimas palavras possam se tornar finais. Este guia segue a documentação API do Apple e a atual SimpleMemo live-mic sample; também inclui um auxiliar de preparação para download separado.
Comece com a amostra completa e, em seguida, inspecione a tubulação
O repositório licenciado pelo MIT expõe o SpeechSession como um pacote Swift para um aplicativo host iOS 26. Adicione o repositório nas dependências do pacote do Xcode e vincule o produto SpeechAnalyzerLiveMic. Seu README mostra uma visualização SwiftUI que exibe finalizedText, renderiza volatileText separadamente e desativa o Start enquanto a sessão está se preparando.
Para um projeto de aplicativo completo, siga a rota XcodeGen do README. Como alternativa, copie as fontes do aplicativo fornecidas para um novo aplicativo iOS 26. Use uma rota de integração para não definir os mesmos tipos duas vezes. O pacote não implementa armazenamento de notas, entrega de e-mail ou integração Obsidian.
A amostra vinculada solicita autorização de microfone e reconhecimento de fala. Seu aplicativo host deve fornecer NSMicrophoneUsageDescription e NSSpeechRecognitionUsageDescription; adicionar o pacote não pode fornecer essas descrições de host. Explique o uso da permissão, mostre os estados de negação e preparação e deixe o usuário escolher quando gravar. O ajudante abaixo não solicita permissão ou inicia o microfone.
O exemplo oficial de transcrição ao vivo e a sessão da WWDC25 da Apple são referências úteis para a arquitetura. O SpeechAnalyzer coordena módulos: é uma API adicional para sistemas compatíveis, e não um motivo para presumir que todo o código existente de SFSpeechRecognizer esteja obsoleto.
Prepare suporte, ativos e formato antes de gravar
SpeechTranscriber fornece verificações de dispositivos de tempo de execução e de localidade. Uma verificação de versão iOS por si só é insuficiente. O auxiliar a seguir retorna um transcritor, analisador e formato de áudio configurados ou lança um erro de preparação específico.
Baixe o auxiliar de preparação completo do Swift. O arquivo completo inclui importações, tipos de resultados e erros, e o ajudante de dicas do DictationTranscriber discutido abaixo. Este é um componente de configuração, não um aplicativo de gravação completo.
@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 gerencia modelos de sistema compartilhados. Um modelo já pode estar instalado pelo sistema ou outro aplicativo. Uma solicitação de instalação retorna nil quando nenhuma instalação é necessária; caso contrário, ele pode reservar a localidade e iniciar um download. Os limites de reserva também podem produzir um erro. Gerencie reservas em todos os recursos do seu aplicativo e libere uma localidade quando não for mais necessária, em vez de lançar um modelo ainda em uso em outro lugar do seu aplicativo.
Antes de ficar offline, prepare a localidade necessária e verifique a prontidão. Os ativos do modelo vivem fora do pacote de aplicativos, mas ainda consomem armazenamento no sistema e podem mudar ao longo do tempo. Mostrar o progresso e o cancelamento do download na interface do usuário do host. “Reconhecimento no dispositivo” não significa “nenhuma preparação ou acesso à rede é necessário”.
Feed PCM no formato que o analisador aceita
AVAudioEngine microphone tap
-> owned PCM / conversion for the selected format
-> AsyncStream<AnalyzerInput>
-> SpeechAnalyzer + SpeechTranscriber
-> result consumer and UI state
Depois de ativar a sessão de áudio, inspecione o formato real do nó de entrada. Não codifique uma taxa de amostragem porque um dispositivo ou rota frequentemente usava essa taxa antes. Passe um formato natural para bestAvailableAudioFormat(compatibleWith:considering:) quando apropriado e desembrulhe seu resultado opcional. Apple documenta que o analisador não reamostra ou converte a entrada de forma transparente.
O AudioBufferConverter do repositório retorna um buffer já correspondente inalterado e usa AVAudioConverter quando os formatos diferem. A conversão é necessária para formatos incompatíveis, não como uma etapa extra geral para cada buffer. Verifique o comprimento do quadro de saída e relate erros de conversão; deixar cair silenciosamente cada buffer com falha pode fazer com que uma interface do usuário de gravação pareça saudável enquanto não produz texto.
Dê ao áudio na fila uma política de propriedade explícita. O conversor de amostra atualizado retorna o armazenamento PCM independente mesmo quando os formatos já correspondem, para que a reutilização posterior da entrada não substitua o áudio na fila. Um buffer fornecido por um retorno de chamada de áudio não deve ser assumido como permanecendo imutável após o retorno de chamada. Se você enfileirá-lo para uso posterior, organize uma cópia de propriedade adequada ou um pipeline cuja vida útil do buffer seja controlada. Mantenha as mutações da interface do usuário por buffer fora do retorno de chamada de áudio. Para a produção, decida também como você amarra o trabalho em fila e lida com sobrecarga ou alterações de rota.
Em Swift 6, capturar variáveis locais não prova por si só que um pipeline é seguro para threads. O conversor da amostra atual tem um contrato de thread de processamento único e um suporte @unchecked Sendable protegido por bloqueio privado para um retorno de chamada do conversor. Isso não torna todos os buffers PCM ou o conversor geralmente seguros para compartilhar entre threads. Leia esse contrato antes de adaptar a amostra.
Substitua resultados voláteis; termine a entrada antes de finalizar
Com resultados progressivos ativados, um resultado volátil pode revisar o texto para um intervalo de áudio. Não anexe todos os resultados parciais como uma nova frase. A amostra simples mantém o texto finalizado e uma cauda volátil substituível. Para uma edição mais rica, alinhe as atualizações com os intervalos de áudio e preserve os segmentos finais separadamente. Apple descreve esse comportamento na parte resultados da sessão da WWDC.
- Em uma ação de parada normal, pare de produzir um novo áudio do microfone e remova o toque uma vez.
- Termine a continuação de entrada
AsyncStreampara que o analisador possa ver o final da entrada. - Aguarde
finalizeAndFinishThroughEndOfInput(), enquanto a tarefa do consumidor de resultados permanece viva. - Adera a conclusão do consumo do resultado, depois confirme o texto final e libere os recursos da sessão.
A finalização aguarda o término e o consumo de entrada. Chamá-lo enquanto o produtor nunca termina pode sair Pare de esperar. Cancelar a tarefa de resultado imediatamente também pode perder a cauda que você pretendia salvar. Uma ação de cancelamento que descarta um enunciado deve usar um caminho de cancelamento deliberado em vez de fingir que era um resultado finalizado normal.
O pacote público continua sendo uma amostra de aprendizado. Seu stop() atual finaliza e, em seguida, cancela o consumidor; ele não expõe um reconhecimento separado de conclusão do consumidor. Se reter todos os resultados finais é importante, adapte esse ciclo de vida e teste-o. Também teste Stop enquanto a preparação está em andamento, toques repetidos, visualização de demissão, interrupção e reinicialização após um erro.
O suporte ao vocabulário depende do módulo transcritor
É impreciso dizer que o novo Discurso API não tem suporte de vocabulário contextual. Documentos Apple AnalysisContext.contextualStrings para DictationTranscriber. A documentação recomenda frases breves e, no máximo, frases 100 em todas as tags. Isso não é uma promessa de que as mesmas dicas personalizem SpeechTranscriber.
// For an analyzer configured with DictationTranscriber.
let context = AnalysisContext()
context.contextualStrings[.general] = ["Obsidian", "Yurica"]
try await analyzer.setContext(context)
setContext(_:) substitui o contexto atual, portanto, preserve ou mescle qualquer contexto de aplicativo existente quando necessário. O ajudante para download rejeita mais do que frases 100 em vez de truncá-las silenciosamente. As dicas de frase são distintas da opção de modelo de idioma personalizada também documentada para o DictationTranscriber, e nenhuma garante o reconhecimento correto de cada nome. Escolha e teste o módulo e o idioma necessários para o seu aplicativo.
Quando a gravação não produzir texto, localize o estágio de falha
| Sintoma | Verifique a seguir | Evidência útil |
|---|---|---|
| Falha na preparação | Suporte ao dispositivo, local normalizado, status do ativo e erros de reserva/download | SO e dispositivo, local solicitado/selecionado, domínio de erro e código |
| A interface do usuário do microfone está ativa, sem buffers | Permissão, ativação de sessão de áudio, rota, partida do motor e ciclo de vida da torneira | Se os retornos de chamada chegam; taxa de amostragem de entrada e contagem de canais |
| Os buffers chegam, sem texto | Formato Compatível, saída do conversor diferente de zero, entradas de rendimento e tarefa de resultados ativos | Contagens de quadros de entrada/saída e o primeiro erro real do pipeline |
| Palavras repetidas | Se as revisões voláteis estão sendo anexadas em vez de substituídas | Faixas de áudio de resultados e sinalizadores finais/voláteis |
| As últimas palavras desaparecem | Conclusão da entrada e vida útil do consumidor durante a finalização | Hora da última entrada, conclusão da finalização e recebimento do resultado final |
| Falha no lançamento offline | Prontidão do modelo necessária nesse dispositivo e localidade | Status do ativo antes da desconexão e o erro de configuração apareceu |
Para diagnósticos, comece com os tempos de estágio, contagens de quadros, local e informações de erro. Gravações brutas e texto reconhecido não são necessários para todas as entradas de log. Se um usuário compartilhar uma reprodução, peça uma frase de teste curta e não sensível e a configuração relevante em vez de uma conversa privada.
O que foi verificado e o que medir em um dispositivo
Este artigo foi verificado com a documentação Apple e Xcode 26.6 em setembro 9, 2026. O auxiliar para download passa na verificação do tipo Swift 6 com total concorrência estrita para um alvo do Simulador iOS 26. Ele não grava áudio, e essa verificação não demonstra precisão da fala, instalação bem-sucedida de ativos ou uma sessão de microfone de ponta a ponta.
A amostra pública na revisão 1befcce passou em quatro testes de conversor de PCM e uma construção do Simulador iOS em setembro 9. Dois testes reutilizam o buffer de origem após a conversão e confirmam que o flutuador mono e a saída inteira estéreo intercalada permanecem intactos; ambos falham em relação à implementação de passagem de formato de correspondência anterior. Seu README diz explicitamente que o refator do pacote não foi testado novamente em um dispositivo físico iOS. Os números históricos de latência anteriormente nesta página não são uma referência para o pacote atual.
Para seu próprio aplicativo, dispositivo de gravação, sistema operacional, localidade, rota de áudio, prontidão do modelo e os limites exatos de tempo. Meça o primeiro texto volátil, o primeiro texto final e a conclusão de parada normal separadamente. Compare uma sessão com ativos prontos com uma sessão que requer preparação. Repita uma frase insensível fixa e inspecione as palavras finais ausentes ou duplicadas, bem como a velocidade. Não infere o comportamento do Neural Engine ou um limite de hardware a partir de um resultado de tempo.
No Apple Watch, use um fluxo de entrada de texto do sistema separado se ele se encaixar no seu aplicativo. TextFieldLink abre a interface do sistema; ele não estabelece que o ditado já está sendo gravado. O SpeechAnalyzer não está disponível no watchOS, e o pacote iOS não é uma implementação de microfone Watch.
Perguntas frequentes
O SpeechAnalyzer funciona offline?
SpeechTranscriber processa áudio no dispositivo, mas o modelo necessário deve estar disponível. Os ativos já podem estar presentes antes do primeiro lançamento do seu aplicativo. Verifique e prepare-os antes de uma sessão offline; não assuma que cada primeiro lançamento deve ser baixado ou que um modelo instalado anteriormente permanecerá sempre disponível.
Posso adicionar vocabulário personalizado?
Apple documenta AnalysisContext.contextualStrings para DitctationTranscriber, e esse módulo também expõe uma dica de conteúdo de linguagem personalizada. Esta não é a documentação do mesmo recurso para SpeechTranscriber. Escolha o módulo deliberadamente e teste as palavras e o local que você precisa.
Por que o aplicativo grava, mas não mostra texto?
Verifique o suporte ao dispositivo e à localidade, o status do ativo, a entrada do microfone, o formato do analisador opcional, a saída do conversor, a sequência de entrada e o consumidor do resultado. Mostre o erro real em vez de tratar todos os resultados vazios como um problema de formato.
Como faço para manter as últimas palavras ao parar?
Pare de produzir áudio, termine a continuação de entrada e deixe o analisador finalizar até o final da entrada. Mantenha o consumidor do resultado vivo para receber os resultados finais. O cancelamento é um caminho de descarte separado, não um substituto para a conclusão normal.
Esta amostra é executada no Apple Watch?
Não. A sessão de microfone vinculada é um exemplo iOS 26, e o SpeechAnalyzer não está disponível no watchOS. Um aplicativo Watch pode usar a entrada de texto do sistema, como o TextFieldLink; que apresenta uma interface de entrada do sistema e não prova que a gravação do ditado começou.
O que foi validado para a amostra?
O repositório vinculado registra quatro testes de conversor e uma compilação do Simulador iOS em setembro 9, 2026, incluindo duas regressões para armazenamento de buffer de origem reutilizado. Nenhum reteste de dispositivo físico é reivindicado. O ajudante de preparação deste guia foi verificado com Xcode 26.6 no Swift 6 modo completo de concorrência estrita em setembro 9. Essas verificações não estabelecem a precisão do microfone, o comportamento de download do modelo ou a latência.
Como isso se relaciona com Simple Memo
Este guia e a amostra grátis são mantidos pelo desenvolvedor SimpleMemo. O guia de entrada de voz do aplicativo descreve o fluxo de trabalho do produto. A amostra em si não envia nenhum e-mail e não salva nada no Obsidian. No Simple Memo, o e-mail requer configuração e verificação do destinatário, e o salvamento do Obsidian requer configurações de integração e destino. O reconhecimento de fala local não descreve a privacidade ou o comportamento de entrega de qualquer ação posterior que seu aplicativo execute.
Relacionado: arquitetura de memorando offline-first. O próximo passo para um desenvolvedor é executar a amostra completa com uma frase de teste e verificar a preparação, os resultados e a parada no dispositivo e na localidade que planejam suportar.