Voice control что это в ресторане

Обновлено: 16.05.2024

Функцию «Управление голосом» можно использовать для навигации по устройству и взаимодействия с ним. С помощью голосовых команд можно выполнять жесты касания и смахивания, вводить текст и т. д.

Чтобы использовать управление голосом, вам нужна iOS 13 или более поздней версии либо iPadOS. Прежде чем воспользоваться функцией «Управление голосом», необходимо загрузить файл. По окончании загрузки вам не требуется подключение к сети Wi-Fi, чтобы использовать функцию «Управление голосом». Подключение к сети Wi-Fi рекомендуется перед первым включением функции «Управление голосом».

Функция «Управление голосом» доступна не во всех странах или регионах. Функция «Управление голосом» использует механизм распознавания речи Siri только для английского языка (США).

Настраиваем могучий трейт .adjustable

И последний, особенно важный трейт .adjustable — элемент, который можно регулировать: так работают UIStepper и UISlider . Свайпните такой контрол вверх или вниз, чтобы изменить значение (не забывайте, что свайп влево/вправо переключит фокус на соседний элемент). Если у контрола есть UIPanGestureRecognizer, то можно тапнуть дважды и задержать второй тап, так жест сработает и можно управлять им напрямую, будто VoiceOver выключен.

Примеры применений для .adjustable :

Переключатель теста. Настройка теста состоит из пяти кнопок: три для выбора размера пиццы и две для типа теста. Их стоит сгруппировать и подписать, чтобы вместо пяти осталось две: «Размер, средний. Элемент регулировки» и «Тесто, традиционное. Элемент регулировки».


Нужно сделать в 4 шага:

  1. Сделать контейнер с кнопками доступным.
  2. Поставить трейт .adjustable .
  3. Реализовать методы увеличения и уменьшения.
  4. Возвращать новое значение для .accessibilityValue .

Теперь после свайпа вверх вызовется accessibilityIncrement() , вы увеличите внутренний счётчик, и VoiceOver прочитает новое значение из accessibilityValue.

Счетчик количества всего на свете. В данном блоке мы видим четыре контрола: кнопка минус, количество, кнопка плюс и цена. Можно объединить их в одну view и превратить в один контрол: «Количество, 1, 575 рублей. Элемент регулировки». После вертикального свайпа изменится количество, а затем произнесётся новое значение вместе с ценой.


Горизонтальные UICollectionView . Оказалось, что .adjustable удобно применять и для горизонтальных UICollectionView . Например, выбрать акцию в меню или машину в такси.


Voice Control: управляй голосом

Начиная с iOS 13 телефон можно контролировать голосом. Voice Control упрощает жизнь и даёт новый уровень свободы людям с ограничениями в движении. Посмотрите видео, в нём Apple показывает, как именно это работает:

Ещё более детально об управлении телефоном можно узнать вот в этих видео:

Включив эту функцию, вы сможете отдавать команды телефону. Увы, пока работает только с английским языком. Например, говоришь «tap purchase», — и кнопка купить нажимается. Для управления кнопками с иконками (без названий в виде слов) можно скомандовать «show numbers», и у всех кнопок появятся цифровые подписи. Теперь можно сказать «tap five» и пятая кнопка нажмётся.

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

Доступных жестов очень много. Полное описание всех вы можете посмотреть в настройках телефона: Settings → Accessibility → Voice Control → Customize Commands.

Три примера работы Voice Control: когда показывает надписи, цифры и сетку

Voice Control и VoiceOver: как адаптировать приложение для незрячих или неподвижных

Представь, что ты незрячий. Вот так ты услышишь эту картинку: «Буква D в чёрных очках и с белой палочкой и буква O в инвалидной коляске смотрят на большой телефон. На экране телефона скриншот приложения Додо Пиццы, который проговаривает названия ячейки меню из пицц для VoiceOver. Картинка стилизована под старые компьютеры и выполнена в зелёных цветах. Нажать кнопку «Читать дальше».

Буква D в чёрных очках и с белой палочкой и буква O в инвалидной коляске смотрят на большой телефон. На экране телефона скриншот приложения Додо Пиццы, который проговаривает названия ячейки меню из пицц для Voice Over. Картинка стилизована под старые компьютеры и выполнена в зелёных цветах.

Адаптация iOS-приложения — большая тема, в одну статью всё не влезло, поэтому выпускаю их серией.

  1. Voice Control и VoiceOver: как адаптировать приложение для незрячих или неподвижных. .
  2. Разница между реализацией VoiceOver, Voice Control и UI тестов. (In progress)

Телефон давно стал продолжением меня, и я слабо представляю свою жизнь без пары десятков приложений, которыми пользуюсь каждый день. Но как быть тем, кто не может взять телефон в руку или посмотреть на экран? Фичи iOS открывают людям с ограничениями в движении, зрении и слухе эти возможности в обычной жизни. С их помощью можно увеличить размер текста и контраст, сделать моно-аудио, убрать анимации. Можно работать с интерфейсом без экрана — на слух (для незрячих) или вообще управлять только голосом (если человек ограничен в движении).

Адаптировать можно любое приложение и даже некоторые игры. Сегодня я расскажу как iOS-разработчикам сделать первые шаги в этом направлении.

Пока на этом всё

Мы адаптировали один экран. Программировать нужно совсем немного, поддерживать доступность на базовом уровне легко.

Но за кадром осталось многое: разные accessibilityTraits , набор текста, навигация в приложении, custom actions , порядок фокусировки, accessibility notifications , ротор и клавиатуру Брайля. Об этом в следующий раз.

Если уже сейчас хотите узнать больше, то можно почитать:

Чтобы не пропустить следующую статью, подписывайтесь на канал Dodo Pizza Mobile.

Заключение

В этот раз мы разобрали трейты: их типы, состояния и поведение. Это стандартный набор для типовых задач. Для сложных контролов можно использовать .adjustable.

В следующий раз посмотрим на решение типовых проблем: порядок обхода, модальные окна, индикаторы загрузки.

А ещё у нас сейчас открыта одна вакансия в мобильном направлении. Так что я просто оставлю это здесь: Senior iOS Developer (Нижний Новгород).

Программируем (теория)

Основа доступности — протокол UIAccessibilityElement. Для улучшения работы VoiceOver нужно:

Что-то можно настроить в Interface builder , но часть настроек доступна только в коде.

Пример Interface Builder и настройками для Voice Over

Названия кнопок — .accessibilityLabel

Каждой кнопке надо дать короткое звучное название. VoiceOver подстрахует, если вы забыли — попытается прочитать текст или название иконки на кнопке, но часто получается так себе.

Что нужно подписывать:

  • Кнопки с иконкой, но без текста;
  • UISlider ;
  • UIStepper ;
  • Картинки. Если есть возможность, то лучше подписать, что изображено на картинке. Instagram это умеет.
Значения — .accessibilityValue

Дополнительно к названию можно написать значение. Например, у слайдера будет название «яркость», а значение — «50%». У кнопки «Добавить в корзину» стоит указать количество или итоговую цену, чтобы подытожить действие всего экрана и не купить лишнего.

Подсказки — .accessibilityHint

Если вы хотите дополнительно пояснить действие, то можно записать подсказку в .accessibilityHint . Но сильно полагайтесь на подсказки не стоит: постоянные пояснения надоедают, поэтому некоторые пользователи отключают их через настройки телефона.

Обобщение контролов

По умолчанию проговаривается каждый контрол по отдельности. Это неудобно: зоны нажатий уменьшаются, можно что-то не заметить и т.д. Нужно обобщать. Например, в меню ячейка состоит из картинки, названия, описания и кнопки с ценой. Такая детальность не нужна: маленькую картинку можно скрыть, название и цену прописать в заголовок ячейки, а состав в её значение. Ячейка станет одним целым, а меню превратится в нормальный набор продуктов.

VoiceOver: управляй жестами

Чтобы вашим приложением могли пользоваться незрячие люди, его нужно адаптировать с помощью VoiceOver. Несколько отличий от обычного использования:

  1. Вместо взгляда по экрану скользит палец. Когда палец оказывается на кнопке, телефон говорит её название и наводит на неё фокус в виде чёрной рамки. После этого можно нажать дважды в любом месте, кнопка нажмётся. Ещё можно переключаться между соседними элементами свайпом влево или вправо.
  2. Доступны дополнительные жесты: для навигации, для важных действий, для сложных элементов управления, например, слайдеров.
  3. Экран можно выключить, ведь он не нужен. Для этого тапните тремя пальцами трижды.

Включение функции «Управление голосом»

  1. Перейдите в меню «Настройки» и выберите раздел «Универсальный доступ».
  2. Выберите «Управление голосом», а затем — «Настроить "Управление голосом"». Загрузка начнется в фоновом режиме.

По окончании загрузки в строке состояния устройства отобразится микрофон ( ), который будет указывать выполняет ли функция «Управление голосом» прослушивание или нет.


Действия на экране

Чтобы использовать элементы на экране, назовите действие, а затем — название элемента, например «Нажать "Универсальный доступ"».

Отображение названий


Если не уверены в названии элемента, можете сказать «Показать названия», чтобы отобразить область просмотра с названиями элементов.

Отображение номеров


Если у элемента нет названия или вы предпочитаете использовать номера, можно сказать «Показать номера», чтобы отобразить порядковые номера каждого элемента на экране.

Отображение сетки

Если взаимодействие требует большей точности или пространства, можно сказать «Показать сетку», чтобы отобразить область просмотра в виде пронумерованной сетки. Если назвать номер из сетки, соответствующая область в ней увеличится и в ней будет представлен новый набор номеров, благодаря которому будет легче выбрать нужный элемент. Сетку можно также использовать при перетаскивании элементов на экране — выбирать, где их расположить, а также для жестов либо произвольных действий.


Когда вы произнесете следующую команду, сетка исчезнет. Чтобы использовать сетку для нескольких команд, скажите «Показывать сетку постоянно».

Другие возможности использования экрана

  • Чтобы скрыть области просмотра, скажите «Скрыть [названия, номера, сетку]».
  • Чтобы повторить действия, например касания и смахивания, скажите «Повторить это». Можно также указывать, сколько раз повторять действие. Например, можно сказать «Смахнуть вправо. Повторить трижды».
  • Чтобы вернуться на предыдущий экран или в предыдущее меню, скажите «Вернуться назад».


Использование функции «Управление голосом»

Включив функцию «Управление голосом», можно произносить команды, вместо того чтобы выполнять действия касаниями. Например, чтобы запустить Spotlight на экране «Домой», скажите «Смахнуть вниз». А чтобы в определенных приложениях попасть в меню, доступные с помощью длительного нажатия, скажите «Нажать и удерживать [название приложения]». Функция «Управление голосом» не влияет на то, как ваше устройство реагирует на касания.

Чтобы просмотреть список доступных команд для различных ситуаций, скажите «Показать, что сказать».

Чтобы просмотреть полный список доступных команд, выполните следующие действия.

  1. Перейдите в меню «Настройки» и выберите раздел «Универсальный доступ».
  2. Выберите «Управление голосом», а затем — «Настроить команды».

Другие возможности функции «Управление голосом»

  • Чтобы включить функцию «Управление голосом» после первоначальной настройки, можно воспользоваться функцией «Привет, Siri», быстрыми командами или перейти в меню «Настройки» > «Универсальный доступ» > «Управление голосом».
  • Чтобы заблокировать устройство, скажите «Заблокировать экран».
  • Чтобы вывести устройство из режима сна, скажите «Привет, Siri. Включи управление голосом».
  • Чтобы включить прослушивание, можно сказать «Проснуться», а чтобы перевести его в режим сна — «Спать». При этом функция прослушивания не отключается, но переводит микрофон в режим сна на время, пока вы не произнесете команду пробуждения.


Программируем (демо и практика)

Этих знаний достаточно, чтобы начать улучшать собственную программу. Разберём на примере меню с пиццами.

Неадаптированная версия для незрячего выглядит так:

На чёрном экране написаны подписи элементов Voice Over на примере приложения Додо Пиццы

Несколько очевидных проблем, которые предстоит решить:

  • Непонятное значение 24 в правом верхнем углу.
  • Пустое место слева и сверху.
  • Слишком много элементов.
  • Неправильное произношение цены («от двести сорок пять знак рубля» вместо «от двести сорок пять рублей»).
Добавляем значения

24 в правом верхнем углу — это количество додо-рублей.
Так и надо подписать:

Этот код можно разместить в любом месте, где у вас есть актуальное значение для value.

Для кнопки города можно сделать нечто похожее: лейбл — ваш город, значение — Москва. Но можно и не делать, вроде и так понятно. Не переусердствовать — тоже важная задача.

Убираем пустое место сверху

Акции вверху — это горизонтальный UICollectionView . Внутри ячейки есть лейбл, именно его находит VoiceOver .

  1. Сделать всю ячейку доступным контролом. По умолчанию все view выступают только контейнерами для других элементов, VoiceOver их игнорирует. Чтобы пометить view , как конечный элемент, нужно поставить ячейке isAccessibilityElement = true . Это можно сделать в методе awakeFromNib() . После этого выделяться начнёт вся ячейка, пустое место больше не мешает.
  2. Дать ячейке название. На лейбле больше нельзя сфокусироваться, поэтому нужно вручную указать текст. accessibilityLabel = specialOffer.title

Настроить можно в методе cellForItemAt :

Упрощаем табличную ячейку

У ячейки с продуктом две проблемы: много элементов и неправильное описание цены.

Объединяем контролы

Сейчас у ячейки несколько полей: название, описание, цена и картинка, 4 контрола на ячейку. Если в меню 10 продуктов, то это уже 40 маленьких контролов. Надо обобщить, чтобы было 10 продуктов, так получается ближе к смыслу.

Ячейка меню, в которой элементы не сгруппированы

  1. Сделать всю ячейку доступным контролом. Это мы уже умеем: ставим ячейке isAccessibilityElement = true
  2. В accessibilityLabel записать самое важное: название и цену. Разделим запятой, VoiceOver учитывает пунктуацию.
  3. В accessibilityValue указать дополнительную информацию, в нашем случае это состав.
  4. Указать, что ячейку можно нажать, т.е. по сути это кнопка. accessibilityTraits = .button

Ячейка меню, которая работает как одно целое для Voice Over

Метод внутри ячейки, подставляет нужные значения:

Группировать можно не только ячейки, но и все связанные смыслом контролы. Например, переключатель количества и цену стоит обрабатывать вместе: изменили количество — сказали новую цену. Тогда вместо четырёх глупых контролов появится один нормальный.

Пример объединения четырёх контролов: кнопки минус, надписи с количеством, кнопки плюс и цены за все продукты

Склоняем «рубли»

Для правильного написания «рублей» мы генерируем правильную строку и ставим её в accessibilityLabel для кнопки.

Пример локализации для множественных чисел

Навигация жестами

Для навигации есть два вспомогательных жеста: скрабл и меджик тап.

Скрабл возвращает на предыдущий экран. Чтобы его выполнить, проведите по экрану двумя пальцами, будто пишите букву Z. Ещё скраблом можно заканчивать ввод текста.

Меджик тап вызывает главную функцию текущего экрана. Нужно тапнуть дважды двумя пальцами. Можно включить песню в плеере или ответить на звонок.

У меджик тапа есть UX-проблема — неочевидно, что он делает. Для себя мы решили так: если скрабл переходит на экран назад, то пусть меджик тап переводит на следующий экран по сценарию. На карточке пиццы это добавит её в корзину, если вы были в корзине, то перейдёте на экран доставки, а с доставки переключитесь на оплату.

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

Адаптируем навигацию

Если нажать на акцию или кнопку додо-рублей, откроется модальный экран. Если бы мы использовали UINavigationController , то ничего делать было бы не нужно. Но для модальных экранов нужно описать, как они реагируют на дополнительные жесты.

Пример всплывающего окна

Добавляем скрабл

После того, как пользователь нарисует Z, вызовется метод accessibilityPerformEscape у firstResponder . Обычно, это текущий UIViewController .

Вам достаточно реализовать этот метод, закрыть в нём экран и вернуть true, показав, что жест обработан и можно не проходить responder chain дальше:

Похожим образом можно реагировать на меджик тап. Например, применить акцию из карточки:

VoiceOver на iOS: каждый контрол ведёт себя по-разному

Привет, Хабр! Недавно я говорил про адаптацию приложений для незрячих и неподвижных людей. И не договорил!

Сегодня расскажу, как изменить поведение контролов с помощью accessibilityTraits и сделать жизнь незрячих чуть удобней. Знать работу этих трейтов (traits) важно, чтобы не писать свои костыли.




Адаптация iOS-приложения — большая тема, в одну статью всё не влезло, поэтому выпускаю их серией.

  1. Voice Control и VoiceOver: как адаптировать приложение для незрячих или неподвижных.
  2. Разница между реализацией VoiceOver, Voice Control и UI тестов. (In progress)

В первой части мы начали разбираться с адаптацией приложений для незрячих с помощью VoiceOver: подписали контролы, сгруппировали их, исправили навигацию. В этой статье пойдём дальше и рассмотрим «особенности», которые можно дать контролам, чтобы улучшить их работу для незрячих людей и в целом повысить удобство использования приложения.

Изменение настроек функции «Управление голосом»

Можно изменить несколько настроек функции «Управление голосом». Вот список некоторых настроек, которые можно изменить.

Как сделать ваше приложение доступным

Voice Control и VoiceOver работают на одной технологии, поэтому адаптировав одно, мы получаем поддержку второго.

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

Где включить: включать/отключать можно через Siri или через настройки (Settings → Accessibility → VoiceOver).

Как настроить шорткат: для быстрого доступа включите шорткат на тройное нажатие кнопки «домой» (или «выключить» для X моделей): Settings → Accessibility → Accessibility Shortcut → Поставить галочку рядом с VoiceOver .

Управление голосом в приложениях на Android


Началось все с того, что я посмотрел неплохой обзор (сравнение) Siri и Google Now. Кто из них лучше, спорить не буду, однако у меня лично планшет на Андроиде. Я подумал, а что если написать калькулятор полностью на голосовом управлении (удобно ли будет?). Но для начала пришлось немного разобраться с самим голосовым управление, точнее говоря с голосовым вводом (управления еще добиться надо). Кроме того, я только что скачал Android Studio, и мне не терпелось скорей опробовать ее на практике (ну на минипроекте). Что ж, начнем.

Кидаем на активность ListView и Button. В ЛистВью будем сохранять сами команды, точнее варианты одной команды, а кнопка будет вежливо спрашивать, чего мы желаем. Да, программа логикой не будет обладать, с ее помощью просто посмотрим саму реализацию.


Добавим так же в Манифест одно разрешение


И все, теперь можно переходить непосредственно к программированию. «Находим необходимые компоненты»:

Прописываем обработчик нажатия для кнопки, который вызовет метод startSpeak(), о котором мы поговорим далее:

Ну наконец закончилась «вода». Начинаем «говорить»:


Пришло время дать волю фантазии и решить какие команды использовать. Сам я сначала хотел показать на примере тетрисного танчика: диктовали бы ему «up», «down», «left», «fire» и так далее, но это сложно оставляю вам. Я же отдавал команды по смене цвета кнопки, выходу из приложения, открытию страниц в браузере, запуску карт и перезагрузке устройства. Что касается последнего, reboot, это команда будет работать, как я понял, только на рутованных устройствах. На телефоне у меня есть права СП и все хорошо работает, а вот на планшете, он просто игнорирует эту команду. В записи команд нет ничего сложного, думаю комментариев будет достаточно:

Так выглядит окно записи команд:


Скажем с красивым английским акцентом «maps». Вызвали Google Maps:



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

Ну и на «finish», я закончил беседу с бездушной (или нет?) машиной.

Надеюсь моя небольшая статья побудит кого-нибудь на создание (не, не терминатора) какого-либо перспективного проекта, который упростит повседневную жизнь людям, а вам принесет миллионы, ну или хотя бы окажется полезной. Дерзайте!

Как находить проблемы

Проблемы адаптации находить несложно, стоит только включить VoiceOver , как на вас посыпятся десятки. Но спустя время находить новые проблемы станет сложнее, при этом легко пропустить что-то важное, ведь проблемы приходится находить на слух. Есть пара способов упростить жизнь разработчику.

  1. Включить субтитры. В iOS 13 появилась настройка, которая включает «субтитры»: Settings → Accessibility → VoiceOver → Caption Panel.
  2. Смотреть подписи через Voice Control. При тестировании VoiceOver можно включить Voice Control, тогда все надписи будут видны сразу. Если где-то цифра, то вы забыли прописать .accessibilityLabel .
  3. Accessibility Inspector. Accessibility Inspector даёт возможность посмотреть все accessibility свойства в симуляторе. Ещё он может сделать аудит текущего экрана, так вы узнаете о возможных проблемах: малые области нажатия, неконтрастные элементы, неподписанные кнопки. Если нужно, то может прочитать голосом все элементы.

Особенности элементов управления — Trait collection

VoiceOver имеет стандартный набор «особенностей» UITraitCollection , которые вы можете применять к контролам. Важно знать о них заранее, чтобы не придумывать своих решений. Я поделил их на три типа:


Тип контрола

VoiceOver знает про несколько базовых типов элементов. Часть из них уже настроена в вашем проекте, но всё равно расскажу про них.

Типы контролов используются для навигации: по ним можно быстро перемещаться с помощью ротора.

  • .staticText — для надписей, которые не меняются. Текст просто прочитается.
  • .header — заголовок: Добавить в пиццу, заголовок.
  • .button — кнопка. Основной способ подписывать активные контролы: Изменить состав, кнопка.
  • .image — картинка.
  • .link — ссылка. Редкий гость в приложениях, частый на сайтах.
  • .searchField — поиск.
  1. Указываем заголовок. .staticText ставится автоматически для всех надписей, а вот .header для заголовка нужно поставить вручную. При этом нужен и .header и .staticText .
  2. Отмечаем место под картинку. В прошлый раз все маленькие картинки мы скрыли от VoiceOver, информативность не потеряли. В этот раз картинка большая, ее так просто не скрыть: место станет пустым, это странно. Помечаем картинку как .image и подписываем .accessibilityLabel = "Пицца Пепперони Фреш с перцем" .
Состояние контрола

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


  • .selected — добавляет «выбрано» перед названием контрола. Подходит для всех свитчеров и чекбоксов.
  • .notEnabled — добавляет «недоступно». Эта настройка не видна в Interface Builder и управляется только программно.
Особые свойства контролов

Есть ещё несколько необычных свойств. В нашем случае к экрану с пиццей они не подходят, но я всё равно расскажу про них, потому что информации о них мало. Возможно, это сэкономит вам время.

  • .summaryElement — первое, что скажет приложение после запуска. Например, приложение погоды после запуска может сразу рассказать о температуре, а музыкальный плеер расскажет о включенной песне и исполнителе. В нашем случае можно говорить статус доставки, если заказа уже оформлен.
  • .updatesFrequently — штука для таймеров. Новое значение будет проговариваться раз в несколько секунд.
  • .causesPageTurn — скролит после прочтения. Вызовется accessibilityScroll(.next) у того контрола, который сможет это обработать. Смотрит по .firstResponder .
  • .startsMediaSession — обычно VoiceOver повторяет название нажатой кнопки, чтобы подтвердить действие. Это мешает, если контрол проигрывает звук. Включите этот трейт, чтобы VoiceOver не повторял название контрола.
  • .playsSound — стоит включить, если вы проигрываете собственный звук при фокусировании на контроле (если я всё правильно понял, сам ни разу не использовал).
  • .allowsDirectInteraction — для рисования и обработки жестов. Контрол сразу обрабатывает касание, будто VoiceOver выключен.
  • .keyboardKey — контрол начинает реагировать, как кнопка на клавиатуре. У VoiceOver есть несколько режимов ввода текста для таких случаев:

Достаточно поставить галочку в IB, чтобы добавить поведение. С трейтом .adjustable так просто не получится, о нём отдельно.

Читайте также: