Как сделать голосового ассистента
Как просто и непросто создать своего голосового помощника
Голосовой помощник – стремительно развивающийся тренд. Контакты своего голосового помощника скоро будут давать также, как раньше давали контакты секретаря или офиса. Некоторые платформы предлагают создать себе голосовых помощников самостоятельно и будто бы для этого не нужны навыки программирования.
Предыстория
У меня уже есть опыт создания голосовых роботов разного уровня сложности.
Это занимает 5 минут на привычном десктопе с большим экраном. Когда же в кафе зашли со смартфона – все совсем не так, действительно ничего не понятно.
Похоже на то, как если человек давно живет в своей квартире и хорошо в ней ориентируется, то при выключенном свете он также найдет кухню, чайник, посуду. Но если он пришел в гости первый раз, и выключили свет, то уже сложности.
Так и здесь. Хорошо, что я реально знал, где что находится, и по визуальной памяти соединил несколько квадратиков. И то с огромными усилиями, ругательствами, и минут за 40, а не легко и просто за 5.
Итак, что же у нас есть распространенного, чтобы обычный человек, непрограммист, мог «легко и просто» создать себе голосового помощника.
AimyLogic
Платформа с визуальным «безкодовым» редактором.То есть на экране есть квадратики, в них можно вносить различные данные, и соединять квадратики стрелочками.
На большом экране все очень удобно и понятно.
Голосового помощника уровня «привет – как дела – пока» создать действительно легко.
Созданного помощника можно подключать ко многим провайдерам телефонии и другим каналам.
Наличие бесплатного тарифа, регистрируешься и осваиваешься.
Экрана смартфона явно не хватает на виджеты платформы.
Если делать помощника посложнее, например, хотя бы просто много вопросов и много ответов, то нужно или очень большие квадратики, или много квадратиков, или добавлять считывание из базы, циклы, сравнения, а это уже относится к навыкам программирования
Связываться с другим сервисом через http-запрос – удобно программисту, довольно непревычно непрограммисту.
Обзвоны создаются легко, хотя обращение со списком номеров и отправление результатов диалогов себе в базу данных требует навыков программирования.
Огромный плюс: можно публиковать помощника/бота практически во все существующие каналы – телефон, telegram, Алиса и так далее.
Дальше можно погружаться в функционал платформы. Есть подключение синтеза голосов, распознавания речи, воспроизведение файлов, обучение нейронной сети и прочее, но это уже для тех, кто погрузился. Для программистов – удобно. Для непрограммистов – скорее сложно, чем легко и просто.
Платформа с визуальным «безкодовым» редактором. Сам визуальный редактор очень похож на AimyLogic, даже особо нечего и обозревать.
Минус в том, что (возможно, но не точно) платформа предназначена для увеличения телефонного трафика МТТ со всеми соответствующими последствиями, то есть созданный помощник/бот остается в МТТ, не публикуется в другие каналы, никуда не переносится, и для начала работы нужно внести аванс порядка 20 000 рублей. Довольно дорого, чтобы просто человеку, не компании и не корпорации, что-то начать, попробовать, потестировать.
BotWinnik
Все предельно просто при создании и применении.
Используются telegram и гугл-таблица, то есть удобно и со смартфонов.
В общем-то пока не совсем понятно, для чего именно такой голосовой помощник нужен, хотя уже прослеживается применение – вместо операторов отвечает на простые вопросы.
Вывод
Искусственный интеллект постепенно набирает обороты, инструменты создания голосовых помощников уже создаются и развиваются.
Все движется к тому, что в самое ближайшее время мы увидим аналогию с созданием сайтов – простого голосового помощника сможет создавать любой человек, просто задавая шаблон на конструкторе и добавляя контент и функционал. И конечно, управлять таким конструктором будет возможно голосом.
Создание голосового ассистента на Python, часть 1
Добрый день. Наверное, все смотрели фильмы про железного человека и хотели себе голосового помощника, похожего на Джарвиса. В этом посте я расскажу, как сделать такого ассистента с нуля. Моя программа будет написана на python 3 в операционной системе windows. Итак, поехали!
Работать наш ассистент будет по такому принципу:
Нам нужно поставить библиотеку pyttsx3 для синтеза речи:
Затем можно запустить тестовую программу и проверить правильность её выполнения.
2) Распознавание речи
Существует много инструментов для распознавания речи, но они все платные. Поэтому я пытался найти бесплатное решение для моего проекта и нашёл её! Это библиотека speech_recognition.
Также для работы с микрофоном нам необходима библиотека PyAudio.
У некоторых людей возникает проблема с установкой PyAudio, поэтому следует перейти по этой ссылке и скачать нужную вам версию PyAudio. Затем ввести в консоль:
Затем запускаете тестовую программу. Но перед этим вы должны исправить в ней device_index=1 на своё значение индекса микрофона. Узнать индекс микрофона можно с помощью этой программы:
Тест распознавания речи:
Если всё отлично, переходим дальше.
Если вы хотите, чтобы ассистент просто общался с вами (без ИИ), то это можно сделать с помощью бесплатного инструмента DialogFlow от Google. После того, как вы залогинетесь, вы увидите экран, где уже можно создать своего первого бота. Нажмите Create agent. Придумайте боту имя (Agent name), выберете язык (Default Language) и нажмите Create. Бот создан!
Чтобы добавить новые варианты ответов на разные вопросы, нужно создать новый intent. Для этого в разделе intents нажмите Create intent. Заполните поля «Название» и Training phrases, а затем ответы. Нажмите Save. Вот и всё.
Чтобы управлять ботом на python, нужно написать такой код. В моей программе бот озвучивает все ответы.
На сегодня всё. В следующей части я расскажу как сделать умного бота, т.е. чтобы он мог не только отвечать, но и что-либо делать.
Краткое руководство. Создание пользовательского голосового помощника
Вы можете просмотреть или скачать все примеры для пакета SDK службы «Речь» для C# на сайте GitHub.
Предварительные требования
Перед началом работы нужно сделать следующее:
Ознакомьтесь со списком поддерживаемых регионов для голосовых помощников и убедитесь, что ваши ресурсы развернуты в одном из этих регионов.
Откройте проект в Visual Studio.
Сначала необходимо убедиться, что проект открыт в Visual Studio.
Добавление стандартного кода
Добавим код, который выступает в качестве основы для нашего проекта.
В представлении XAML конструктора замените все содержимое следующим фрагментом кода, который определяет элементарный пользовательский интерфейс:
Конструктор обновляется для отображения пользовательского интерфейса приложения.
using инструкции для Speech и Speech.Dialog пространства имен
простая реализация доступа к микрофону с привязкой к обработчику кнопки;
базовые вспомогательные функции пользовательского интерфейса для представления сообщений и ошибок в приложении;
целевая точка для пути кода инициализации, который будет добавлен позже;
вспомогательное приложение для воспроизведения текста, преобразованного в речь (без поддержки потоковой передачи данных);
пустой обработчик кнопки воспроизведения, который будет заполнен позже.
Ознакомьтесь со списком поддерживаемых регионов для голосовых помощников и убедитесь, что ваши ресурсы развернуты в одном из этих регионов.
Для получения сведений о настройке бота см. документацию по Bot Framework для канала Direct Line Speech.
В текст метода ListenButton_ButtonClicked в классе MainPage добавьте следующее. Этот код настраивается DialogServiceConnector для прослушивания, так как вы уже установили конфигурацию и зарегистрировали обработчики событий.
Создание и запуск приложения
Теперь можно приступать к созданию приложения и проверке пользовательского голосового помощника, используя службу «Речь».
Выберите Отладка начать отладку (или нажмите клавишу F5), чтобы запустить приложение. Откроется окно helloworld.
Выберите Включить микрофон, а когда появится запрос на разрешение доступа, выберите Да.
Щелкните Talk to your bot (Разговор с ботом) и произнесите фразу или предложение на английском языке в микрофон устройства. Ваша речь передастся в канал «Речь Direct Line» и преобразуется в текст, который появится в том же окне.
Дальнейшие действия
Вы можете просмотреть или скачать все примеры для пакета SDK службы «Речь» для Java на сайте GitHub.
Выберите целевую среду
Предварительные требования
Перед началом работы нужно сделать следующее:
Ознакомьтесь со списком поддерживаемых регионов для голосовых помощников и убедитесь, что ваши ресурсы развернуты в одном из этих регионов.
Создание и настройка проекта
В средстве запуска Eclipse в поле Рабочая область введите имя нового каталога. Затем выберите Запустить.
После этого отобразится главное окно интегрированной среды разработки Eclipse. Если отобразится экран приветствия, закройте его.
в строке меню Eclipse создайте новый проект, выбрав файл создать Project.
После этого запустится мастер создания проектов Java. В поле Имя проекта введите quickstart и в качестве среды выполнения выберите JavaSE-1.8. Нажмите кнопку Готово.
Если появится окно Open Associated Perspective? (Открыть связанную перспективу?), выберите Open Perspective (Открыть перспективу).
В обозревателе пакетов щелкните правой кнопкой мыши проект quickstart. выберите настройка преобразовать в Maven Project из контекстного меню.
Откроется окно Create new POM (Создать новый POM). В поле Идентификатор группы введите com.microsoft.cognitiveservices.speech.samples, а в поле Идентификатор артефакта — quickstart. Выберите Готово.
Откройте файл pom.xml и измените его.
В конце файла перед закрывающим тегом
создайте элемент repositories со ссылкой на репозиторий Maven для пакета SDK службы «Речь», как показано ниже.
Также добавьте dependencies элемент с пакетом SDK для распознавания речи версии 1.19.0 в качестве зависимости:
Кроме того, для включения ведения журнала обновите файл pom.xml, чтобы добавить следующие зависимости.
Добавление примеров кода
Чтобы добавить новый пустой класс в проект Java, выберите файл создать класс.
В окне New Java Class (Новый класс Java) введите speechsdk.quickstart в поле Пакет и Main в поле Имя.
Откройте только что созданный класс Main и замените содержимое файла Main.java следующим начальным кодом.
Ознакомьтесь со списком поддерживаемых регионов для голосовых помощников и убедитесь, что ваши ресурсы развернуты в одном из этих регионов.
Соединитель DialogServiceConnector использует несколько событий, чтобы сообщать о работе бота, результатах распознавания речи и других данных. Далее добавьте эти прослушиватели событий.
Чтобы поддержать воспроизведение ответа, добавьте дополнительный класс, который преобразовывает объект PullAudioOutputStream, возвращенный из API getAudio(), в InputStream для Java, чтобы упростить обработку. ActivityAudioStream — это специализированный класс, который обрабатывает аудиоотклик из канала «Речь Direct Line». Он предоставляет методы доступа для получения сведений о звуковом формате для обработки воспроизведения. Для этого выберите файл создать класс.
В окне New Java Class (Новый класс Java) введите speechsdk.quickstart в поле Пакет и ActivityAudioStream — в поле Имя.
Откройте только что созданный класс ActivityAudioStream и замените его содержимое следующим кодом.
Создание и запуск приложения
Дальнейшие действия
Предварительные требования
Перед началом работы нужно сделать следующее:
Пишем голосового ассистента на Python
Введение
Технологии в области машинного обучения за последний год развиваются с потрясающей скоростью. Всё больше компаний делятся своими наработками, тем самым открывая новые возможности для создания умных цифровых помощников.
В рамках данной статьи я хочу поделиться своим опытом реализации голосового ассистента и предложить вам несколько идей для того, чтобы сделать его ещё умнее и полезнее.
Что умеет мой голосовой ассистент?
Описание умения | Работа в offline-режиме | Требуемые зависимости |
Распознавать и синтезировать речь | Поддерживается | pip install PyAudio (использование микрофона) |
pip install pyttsx3 (синтез речи)
Для распознавания речи можно выбрать одну или взять обе:
Шаг 1. Обработка голосового ввода
Начнём с того, что научимся обрабатывать голосовой ввод. Нам потребуется микрофон и пара установленных библиотек: PyAudio и SpeechRecognition.
Подготовим основные инструменты для распознавания речи:
Теперь создадим функцию для записи и распознавания речи. Для онлайн-распознавания нам потребуется Google, поскольку он имеет высокое качество распознавания на большом количестве языков.
А что делать, если нет доступа в Интернет? Можно воспользоваться решениями для offline-распознавания. Мне лично безумно понравился проект Vosk.
На самом деле, необязательно внедрять offline-вариант, если он вам не нужен. Мне просто хотелось показать оба способа в рамках статьи, а вы уже выбирайте, исходя из своих требований к системе (например, по количеству доступных языков распознавания бесспорно лидирует Google).
Теперь, внедрив offline-решение и добавив в проект нужные языковые модели, при отсутствии доступа к сети у нас автоматически будет выполняться переключение на offline-распознавание.
Замечу, что для того, чтобы не нужно было два раза повторять одну и ту же фразу, я решила записывать аудио с микрофона во временный wav-файл, который будет удаляться после каждого распознавания.
Таким образом, полученный код выглядит следующим образом:
Возможно, вы спросите «А зачем поддерживать offline-возможности?»
Я считаю, что всегда стоит учитывать, что пользователь может быть отрезан от сети. В таком случае, голосовой ассистент всё еще может быть полезным, если использовать его как разговорного бота или для решения ряда простых задач, например, посчитать что-то, порекомендовать фильм, помочь сделать выбор кухни, сыграть в игру и т.д.
Шаг 2. Конфигурация голосового ассистента
Поскольку наш голосовой ассистент может иметь пол, язык речи, ну и по классике, имя, то давайте выделим под эти данные отдельный класс, с которым будем работать в дальнейшем.
Для того, чтобы задать нашему ассистенту голос, мы воспользуемся библиотекой для offline-синтеза речи pyttsx3. Она автоматически найдет голоса, доступные для синтеза на нашем компьютере в зависимости от настроек операционной системы (поэтому, возможно, что у вас могут быть доступны другие голоса и вам нужны будут другие индексы).
Также добавим в в main-функцию инициализацию синтеза речи и отдельную функцию для её проигрывания. Чтобы убедиться, что всё работает, сделаем небольшую проверку на то, что пользователь с нами поздоровался, и выдадим ему обратное приветствие от ассистента:
На самом деле, здесь бы хотелось самостоятельно научиться писать синтезатор речи, однако моих знаний здесь не будет достаточно. Если вы можете подсказать хорошую литературу, курс или интересное документированное решение, которое поможет разобраться в этой теме глубоко — пожалуйста, напишите в комментариях.
Шаг 3. Обработка команд
Теперь, когда мы «научились» распознавать и синтезировать речь с помощью просто божественных разработок наших коллег, можно начать изобретать свой велосипед для обработки речевых команд пользователя 😀
В моём случае я использую мультиязычные варианты хранения команд, поскольку у меня в демонстрационном проекте не так много событий, и меня устраивает точность определения той или иной команды. Однако, для больших проектов я рекомендую разделить конфигурации по языкам.
Для хранения команд я могу предложить два способа.
1 способ
Можно использовать прекрасный JSON-подобный объект, в котором хранить намерения, сценарии развития, ответы при неудавшихся попытках (такие часто используются для чат-ботов). Выглядит это примерно вот так:
Такой вариант подойдёт тем, кто хочет натренировать ассистента на то, чтобы он отвечал на сложные фразы. Более того, здесь можно применить NLU-подход и создать возможность предугадывать намерение пользователя, сверяя их с теми, что уже есть в конфигурации.
Подробно этот способ мы его рассмотрим на 5 шаге данной статьи. А пока обращу ваше внимание на более простой вариант
2 способ
Можно взять упрощенный словарь, у которого в качестве ключей будет hashable-тип tuple (поскольку словари используют хэши для быстрого хранения и извлечения элементов), а в виде значений будут названия функций, которые будут выполняться. Для коротких команд подойдёт вот такой вариант:
Для его обработки нам потребуется дополнить код следующим образом:
В функции будут передаваться дополнительные аргументы, сказанные после командного слова. То есть, если сказать фразу «видео милые котики«, команда «видео» вызовет функцию search_for_video_on_youtube() с аргументом «милые котики» и выдаст вот такой результат:
Пример такой функции с обработкой входящих аргументов:
Ну вот и всё! Основной функционал бота готов. Далее вы можете до бесконечности улучшать его различными способами. Моя реализация с подробными комментариями доступна на моём GitHub.
Ниже мы рассмотрим ряд улучшений, чтобы сделать нашего ассистента ещё умнее.
Шаг 4. Добавление мультиязычности
Чтобы научить нашего ассистента работать с несколькими языковыми моделями, будет удобнее всего организовать небольшой JSON-файл с простой структурой:
В моём случае я использую переключение между русским и английским языком, поскольку мне для этого доступны модели для распознавания речи и голоса для синтеза речи. Язык будет выбран в зависимости от языка речи самого голосового ассистента.
Для того, чтобы получать перевод мы можем создать отдельный класс с методом, который будет возвращать нам строку с переводом:
В main-функции до цикла объявим наш переводчик таким образом: translator = Translation()
Теперь при проигрывании речи ассистента мы сможем получить перевод следующим образом:
Как видно из примера выше, это работает даже для тех строк, которые требуют вставки дополнительных аргументов. Таким образом можно переводить «стандартные» наборы фраз для ваших ассистентов.
Шаг 5. Немного машинного обучения
А теперь вернёмся к характерному для большинства чат-ботов варианту с JSON-объектом для хранения команд из нескольких слов, о котором я упоминала в пункте 3. Он подойдёт для тех, кто не хочет использовать строгие команды и планирует расширить понимание намерений пользователя, используя NLU-методы.
Грубо говоря, в таком случае фразы «добрый день«, «добрый вечер» и «доброе утро» будут считаться равнозначными. Ассистент будет понимать, что во всех трёх случаях намерением пользователя было поприветствовать своего голосового помощника.
С помощью данного способа вы также сможете создать разговорного бота для чатов либо разговорный режим для вашего голосового ассистента (на случаи, когда вам нужен будет собеседник).
Для реализации такой возможности нам нужно будет добавить пару функций:
А также немного модифицировать main-функцию, добавив инициализацию переменных для подготовки модели и изменив цикл на версию, соответствующую новой конфигурации:
Однако, такой способ сложнее контролировать: он требует постоянной проверки того, что та или иная фраза всё ещё верно определяется системой как часть того или иного намерения. Поэтому данным способом стоит пользоваться с аккуратностью (либо экспериментировать с самой моделью).
Заключение
На этом мой небольшой туториал подошёл к концу.
Мне будет приятно, если вы поделитесь со мной в комментариях известными вам open-source решениями, которые можно внедрить в данный проект, а также вашими идеями касательно того, какие ещё online и offline-функции можно реализовать.
Документированные исходники моего голосового ассистента в двух вариантах можно найти здесь.
P.S: решение работает на Windows, Linux и MacOS с незначительными различиями при установке библиотек PyAudio и Google.
Кстати, тех, кто планирует строить карьеру в IT, я буду рада видеть на своём YouTube-канале IT DIVA. Там вы сможете найти видео по тому, как оформлять GitHub, проходить собеседования, получать повышение, справляться с профессиональным выгоранием, управлять разработкой и т.д.
Разрабатываем своего первого голосового ассистента на iOS
За последнее время значимость голосовых функций и звука заметно выросла. Примером тому может служить уже громкая история запуска приложения Clubhouse, голосовых ассистентов Сбера и общего оживления интереса со стороны пользователей, компаний и инвесторов к звуку на мобильных устройствах.
В этой статье я бы хотел рассмотреть пример разработки голосового помощника на платформе iOS, используя язык Swift.
Почему голос и звук?
На мой взгляд, звук как интерфейс между пользователем и приложениями изначально был недооценен, однако с появлением технологий искусственного интеллекта, высокой информационной нагрузки и нехватки времени, польза аудио становится очевиднее.
Например, в этой статье представлены интересные факты об использовании голоса за последние 4 года и вывод:
The key, however, is the device letting the human think and speak like a human. Once we get there, this whole voice thing will become the predominant mode for input. We’re likely five to ten years away from getting there. However, many businesses are seeing great success building their own personal assistant apps (aka Alexa Skills or Actions on Google apps) and developing a great deal of positive attention and visibility for their organizations.
То есть, звук и голос как интерфейс имеют шанс стать преобладающим интерфейсом через 5-10 лет когда голосовые ассистенты будут достаточно умными и способными поддерживать разговор как человек. Исследования и развитие технологий в области ИИ в перспективе открывают перед нами подобные возможности.
Технологии синтеза и распознавания речи на iOS
Сегодня есть достаточно большой выбор среди речевых технологий распознавания и синтеза речи. В качестве примера можно привести доступные речевые библиотеки Apple и Yandex.
В Apple Speech Kit синтез и распознавание речи доступны «из коробки» для iOS 10 и выше, а для его использования необходимо подключить Speech.framework в проект. Распознавание речи на достойном уровне, а вот насчет синтеза не могу этого сказать.
В компании Яндекс есть собственные технологии синтеза и распознавания речи — репозитории для iOS и Android с подробными примерами их использования.
Пишем голосовой Hello World!
Напишем своё первое приложение, в котором используем перечисленные выше библиотеки. Создадим новый XCode проект, и поскольку мы будем пока тестировать различные SDK, то определим два таргета: speechkit_apple и speechkit_yandex.
В качестве системы управления зависимостями будем использовать Cocoapods, поэтому в корне проекта необходимо создать Podfile:
Переходим в корень проекта и выполняем pod install чтобы все зависимости установились:
Pod install output
Оба таргета будут использовать общие ресурсы из папки speechkit_demo_ios и иметь свои реализации SpeechViewController:
Для работы с микрофоном необходимо разрешение NSMicrophoneUsageDescription, а для распознавания речи NSSpeechRecognitionUsageDescription. Эти ключи и текстовые описания к ним нужно сразу добавить в Info.plist проекта:
В итоге, получится примерно следующее:
Работа с речевым технологиями Apple
В случае Apple в проект необходимо подключить библиотеку Speech и использовать SFSpeechRecognizer, SFSpeechRecognitionTask и AVSpeechSynthesizer для распознавания и синтеза голоса. Для каждой новой сессии распознавания необходимо проделать следующие шаги:
Cоздать новый запрос:
Cоздать задачу распознавания:
Cоздать и запустить захват аудио буфера из AVAudioEngine в запрос распознавания:
Для синтеза речи необходимо инициализировать и запустить AVSpeechSynthesizer:
Синтез речи Apple Speech
Готовый пример приложения можно скачать здесь: chapter1_ios, проект speechkit_demo_ios, таргет speechkit_apple.
Работа с Yandex SpeechKit
Если вы используете Swift, то для подключения Yandex SpeechKit потребуется использовать Bridging-header для связи с Objective-C кодом, который использует эта библиотека. Самый простой способ быстро подключить Bridging-header — создать любой *.m файл в нужном таргете, а затем можно удалить этот файл. В нашем случае к проекту добавится speechkit_yandex-Bridging-Header.h, в котором нужно указать ссылку на header от Objective-C библиотеки компании Yandex:
Далее в Swift коде уже не нужно подключать специально эту библиотеку через конструкцию виде import. Основные шаги инициализации:
указание API ключа. Ключ необходимо создать в личном кабинете Yandex Cloud. Более подробную информацию можно найти в документации:
активация аудиосессии не в главном потоке приложения (поскольку это может занимать некоторое время и блокировать UI):
создание и инициализация экземпляров синтезатора и менеджера распознавания речи:
синтез или старт распознавания речи:
В нашем случае ViewController (у вас это может быть View Model или VIPER модуль) должен реализовать протоколы YSKVocalizerDelegate и YSKRecognizerDelegate для возможности получения событий от библиотеки: старт записи, конец записи, окончание распознавания, получения ошибок и т.д.
Готовый пример приложения можно найти здесь: chapter1_ios, проект speechkit_demo_ios, таргет speechkit_yandex.
Создаём своего голосового ассистента
Сделаем несложный голосовой ассистент, который умеет управлять светом, воспроизведением музыки, поддерживать приветствие и отвечать на различные запросы пользователя. Например, может рассказать анекдот, прочитать цитату или прогноз погоды.
Чтобы сделать возможным использование любого речевого SDK используем абстракцию и определим протоколы синтеза и распознавания речи, которые должны будут реализовать конкретные речевые SDK:
Протоколы синтеза и распознавания речи
Например, в случае Apple Speech реализация класса синтеза будет следующая:
Apple speech synthesizer
Из первой части статьи мы также знаем, как использовать распознавание речи, используя Apple Speech, поэтому реализуем класс VBAppleSpeechRecognizer в соответствии с протоколом VBSpeechRecognizerProtocol.
Чтобы распознавать окончание записи голоса, сделаем отдельный класс VBVoiceLevelDetector, который реализует протокол VBVoiceLevelDetectorProtocol и будет заниматься отслеживанием начала и окончания записи голосовых фраз. При первом запуске этот класс производит калибровку уровня звука на основе 32 аудио-фреймов.
Для абстракции от музыкального сервиса также опишем протокол:
и сделаем соответствующую его реализацию в VBAppleMusicPlayer.
Реализация через протоколы очень желательна, поскольку в какой-то момент вы можете захотеть использовать, например, SpotifySDK или Mubert API, а в целях совместимости вам не придется ломать жесткие зависимости от Apple Player в приложении и переход будет проще.
Теперь нам понадобится главный класс, который будет обрабатывать текстовые запросы от пользователя и выдавать результат. Создадим такой класс VoiceBoxManager, который реализует протокол VoiceBoxManagerProtocol, а в качестве коммуникации он будет работать с классом-делегатом, который должен реализовывать протокол VoiceBoxManagerDelegate.
В нашем случае таким делегатом будет выступать VoiceViewModel — View модель для UI контроллера VoiceViewController, который отвечает за визуализацию сообщений и интерфейс пользователя:
Итого, VoiceBoxManager — это общий контейнер или конфигуратор для навыков нашего ассистента:
, который реализует протокол:
Voice Box Banager protocol
Массив _assistantProcessors содержит реализации протокола VBProcessingProtocol, то есть навыки нашего голосового ассистента:
Как можно заметить, классы, реализующие навыки через VBProcessingProtocol, должны отвечать словарём, который содержит «type» — тип ответа и «data». Это сделано чтобы унифицировать ответ навыков и иметь возможность запрашивать любые данные через сторонние API.
Таким образом, мы можем добавлять новые навыки нашему ассистенту, просто добавляя в этот массив новую реализацию протокола VBProcessingProtocol.
Обратите внимание, что обработкой обычных фраз пользователя занимается класс VBLocalVoiceProcessing, который для простоты реализации берёт текстовые значения из файла Resources/voiceProcessigPhrases.plist:
Чтобы добавить обычные реплики ассистента достаточно добавить ответы в этом файле. Конечно, это не искусственный интеллект, однако вам ничего не мешает создать свой класс VBAIVoiceProcessing, который реализует протокол VBProcessingProtocol и, например, будет общаться со своим сервером, использующий для обработки фраз русскоязычную модель GPT-3. Тогда ответы ассистента станут намного интереснее и умнее.
Пример получения афоризмов и цитат можно посмотреть в реализации VBQuotaProcessing, а новостей в VBNewsProcessing. Навыки умного дома реализует класс VBHomeKitProcessing, который в свою очередь использует VBHomeKitManager для управления устройствами Apple HomeKit.
Посмотреть видео-демонстрацию работы приложения можно здесь.
Резюме
В этой статье мы создали мобильные приложение на iOS с использование сторонних речевых SDK. На практике, основные проблемы интеграций речевых технологий заключаются в дополнительных разрешениях, предъявляемых к приложению, получении API ключа и работе с аудио-сессиями. Также попробовали создать собственный голосовой ассистент с абстракцией от используемых речевых технологий и возможностью расширять навыки.
В коде примера chapter2_ios добавлены заготовки для навыков получения курсов валют VBCurrencyProcessing и погоды VBWeatherProcessing. В качестве дополнительной тренировки можно реализовать эти навыки самостоятельно, используя любые открытые API сервисов, например, ЦБ, openweather или другие. Вы также можете добавить собственные навыки, которые считаете интересными и поделиться ими. Для этого сделайте форк репозитория, добавьте навыки и отправьте pull запрос, будет любопытно посмотреть.
Надеюсь, данная статья была полезна, и вы теперь сможете создавать голосовые помощники для своих проектов или даже создать цифровой продукт, который изменит мир =)
Жду ваши примеры реализаций навыков и желаю будущих достижений в области голосовых технологий!