Интеграция распознавания голоса в приложения iOS трансформирует взаимодействие пользователей, предлагая бесконтактное управление, более быстрый ввод данных и улучшенную доступность. Рамки речи Apple обеспечивают надежные возможности речи на устройстве для текста, которые уважают конфиденциальность пользователей и обеспечивают надежную транскрипцию в реальном времени. Эта статья охватывает все, от базовой настройки до продвинутых моделей реализации, включая оптимизацию производительности, многоязычную поддержку и обработку ошибок. лучшие практики.

Понимание архитектуры речевых рамок

Платформа Speech (введена в iOS 10) работает с тремя основными компонентами:

  • SFSpeechRecognizer — основной интерфейс, который координирует распознавание для конкретного языка и локализации. Он может быть сконфигурирован для использования на устройстве или на сервере.
  • SFSpeechRecognitionRequest — представляет собой аудиовход.Два основных подкласса: для предварительно записанных аудиофайлов и для живых аудиопотоков.
  • SFSpeechRecognitionTask — управляет процессом распознавания, предоставляя обновления прогресса и конечные результаты.

Фреймворк обрабатывает аудио через механизм автоматического распознавания речи (ASR). По умолчанию iOS 15+ использует распознавание на устройстве для всех поддерживаемых языков, что снижает задержку и гарантирует, что данные никогда не покидают устройство. Распознавание на основе сервера по-прежнему доступно для старых устройств или конкретных языков, но требует активного подключения к Интернету и согласия пользователя.

Ключевые особенности и возможности

  • Передача в реальном времени — Голос транскрибируется по мере того, как пользователь говорит, с периодическими частичными результатами.
  • Альтернативные транскрипции — Каждый результат включает в себя несколько интерпретаций с уверенностью, забивающей через и .
  • Контекстные фразы — разработчики могут предоставлять пользовательские фразы через , чтобы повысить точность для терминов, специфичных для домена.
  • Поддерживаемые языки — Более 60 языков и региональных акцентов. Используйте , чтобы получить текущий список.

Настройка разрешений и конфигурация проекта

Всегда запрашивайте авторизацию явно. Без надлежащих разрешений система отклонит запросы на распознавание.

Info.plist Требования

Добавить ключ (Privacy - Speech Recognition Usage Description) с четким, обращенным к пользователю объяснением.

<key>NSSpeechRecognitionUsageDescription</key>
<string>This app uses speech recognition to transcribe your voice commands for hands-free navigation.</string>

Если ваше приложение также записывает аудио (обычное для распознавания в реальном времени), добавьте .

Запрашивая разрешение

Звонок в начале жизненного цикла приложения, как правило, на контроллере просмотра . Обратный вызов возвращает один из четырех статусов:

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
 }
 }
}

Примечание: фреймворк может вернуться , если устройство управляется профилем родительского контроля или если распознавание речи отключено через Screen Time.

Реализация распознавания живой речи

Для захвата голоса в реальном времени вам нужен для потоковой передачи аудио буферов в запрос на распознавание. Следующий код демонстрирует готовую к производству реализацию с надлежащей очисткой.

Шаг 1: Настройка аудио-сессии

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)")
 }
}

Опция снижает громкость фоновой музыки, что повышает точность транскрипции в шумных средах. Для приложений только для голоса рассмотрите , чтобы маршрутизировать аудио через динамик устройства вместо наушника.

Шаг 2: Создайте распознавателя и запрос

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)")
 }
}

Шаг 3: Убирайтесь красиво

func stopRecognition() {
 recognitionTask?.cancel()
 audioEngine.stop()
 audioEngine.inputNode.removeTap(onBus: 0)
 request.endAudio()
 // Optionally deactivate audio session
 try? AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation)
}

Всегда отменяйте задачу распознавания перед остановкой аудиодвигателя.Забывание снять нажатие на входной узел может вызвать сохранение циклов и предотвратить выпуск микрофона.

Обработка многоязычных и пользовательских локализаций

Фреймворк Speech поддерживает динамическое обнаружение локализации.Вы можете позволить пользователям переключать языки или даже распознавать несколько языков за один сеанс, создавая отдельные экземпляры .

let locales = ["en-US", "fr-FR", "zh-CN"]
let recognizers = locales.compactMap { SFSpeechRecognizer(locale: Locale(identifier: $0)) }

// Use recognizers[0] for English, etc.

Для распознавания на устройстве каждый распознающий элемент потребляет память, пропорциональную его языковой модели.Проверка производительности на старых устройствах при поддержке нескольких языков.

Пользовательские словари и доменные термины

Улучшить точность для конкретных терминов отрасли, используя свойство на :

request.contextualStrings = ["Directus", "CMS", "headless", "REST API"]

Это намекает распознавателю на то, что он предпочитает эти фразы, уменьшая неправильное распознавание необычных терминов.

Обработка ошибок и стратегии Fallback

Распознавание голоса может выйти из строя по многим причинам: проблемы с сетью (если используется сервер), прерывания звука, отключение микрофона или давление в памяти.

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
 }
}

Мониторинг состояния задачи распознавания через свойство для обнаружения отмен или тайм-аутов.

Оптимизация производительности и лучшие практики

  • Предпочтение распознаванию на устройстве — С iOS 15 распознавание на устройстве по умолчанию и предлагает меньшую задержку. Избегайте принуждения на основе сервера, если вам не нужен язык, еще не поддерживаемый в автономном режиме. для проверки доступности.
  • Ограничить частичные результаты — Настройка уменьшает накладные расходы, если вам нужна только окончательная транскрипция.
  • Управлять сроком службы распознавания — Отменять длительные задачи, когда пользователь перестает говорить. Используйте тайм-аут (например, 2 секунды тишины) для автоматического завершения сеанса.
  • Батарея и память — Аудиодвижок и задачи распознавания потребляют значительные ресурсы.Пауза или остановка распознавания при переходе приложения в фоновое состояние.
  • Тестирование с использованием данных — используйте предварительно записанные аудиофайлы () во время разработки, чтобы избежать зависимостей микрофона.

Устранение перебоев

Телефонные звонки, сигнализация или Siri могут прерывать активную сессию распознавания.Подпишитесь на , чтобы приостановить и возобновить изящно:

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
 }
}

Соображения в отношении доступности

Распознавание голоса повышает доступность для пользователей с двигательными или визуальными нарушениями. Убедитесь в том, что:

  • Обеспечивает четкую аудио обратную связь при начале/остановке прослушивания.
  • Поддерживает VoiceOver, используя ярлыки доступности на кнопках распознавания.
  • Предлагает альтернативный метод ввода текста в случае неудачи распознавания.
  • Уважает конфиденциальность пользователей, не сохраняя аудиоданные без явного согласия.

Тестирование и отладка

Симуляторы не включают микрофон; тест на физических устройствах. Используйте диагностический журнал распознавания речи Xcode под и добавьте со значением , чтобы включить глаголирование.

Реальные случаи использования в мире

  • Голосовые команды в приложении CMS — позволяют редакторам диктовать контент или перемещаться по меню без помощи рук. Например, «Создать новую статью» запускает конкретный рабочий процесс.
  • Дисктирование для приложений для заметок — транскрипция в реальном времени с распознаванием пунктуаций.
  • Навигация, ориентированная на доступность — Пользователи могут сказать «Вернуться» или «Открыть настройки», не касаясь экрана.
  • Медицинская или правовая транскрипция — Используйте контекстные строки для терминологии, относящейся к домену, и комбинируйте их с распознаванием на устройстве для обеспечения конфиденциальности.

Заключение

Рамки Apple Speech обеспечивают прочную основу для добавления распознавания голоса в приложения iOS. Понимая архитектуру, правильно обрабатывая разрешения, управляя аудио сессиями и оптимизируя производительность, вы можете создать бесшовный голосовой интерфейс, который уважает конфиденциальность пользователей. Всегда тестируйте на реальных устройствах, рассматривайте резервные механизмы и учитывайте контекст пользователя, чтобы обеспечить функцию, которая действительно повышает удобство использования.

Для дальнейшего чтения обратитесь к документации Apple Speech Framework , руководству AVAudioSession и ссылке SFSpeechRecognizer класса . Дополнительные лучшие практики для доступности можно найти на веб-сайте Apple Accessibility .