Робототехника и интеллектуальные системы
Внедрение функций распознавания голоса в Ios с помощью речевой структуры
Table of Contents
Интеграция распознавания голоса в приложения 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 .