Как сделать голосового помощника на компьютер
Голосовые помощники способные управлять смартфоном или планшетом давно вошли в нашу жизнь и упрощают взаимодействие с гаджетом. Google Now и Siri способны искать в интернете информацию, ставить напоминания, вызывать номер из списка контактов, делится фотографиями и даже изменять настройки телефона.
Но что же насчет компьютера? Современные рабочие станции способны за считаные минуты обрабатывать 4К видео, моделировать сложные 3Д элементы и выполнять сложные операции, однако мы редко слышим о голосовых ассистентах для Windows. На самом деле многие компании, в том числе и Microsoft развивают системы голосовых помощников, помогающих при работе с компьютером. Сегодня мы расскажем вам о лучших подобных проектах.
Cortana от Microsoft
Microsoft не анонсировали дату релиза русскоязычной версии Cortana, поэтому использовать комфортно ассистент практически невозможно. Также, из-за специфики акцента у русскоговорящих пользователей, помощник не всегда понимает голосовые команды. Перейдем к другому приложению, поддерживающего русский язык.
Программа Laitis
Программа Laitis позволяет гибко настроить действия в проводнике Windows, браузерах, выбрать управление на различных сайтах соцсетей и других программах. Также вы можете с помощью макросов настроить управление элементами умного дома. Чтобы установить приложение выполните следующие действия:
Приложение Laitis удовлетворит требования любого пользователя, желающего использовать голосовые команды для управления своим компьютером. Программа предлагает гибкую настройку индивидуально под требования каждого пользователя. Если вы не хотите долго настраивать и вникать в настройки приложения, то предлагаем перейти к простому варианту.
Яндекс Алиса для Windows.
Яндекс Алиса, это не полноценное средство управления компьютером, однако она позволит быстро найти требуемую информацию в интернете или на компьютере и поддерживает элементарные функции управления питанием системы – выключить, перезагрузить или завершить сеанс. Главным плюсом отечественной разработки можно назвать простоту использования. К сожалению Яндекс удалили с главного сайта Алису для Windows, там вы найдете только Яндекс браузер со встроенным голосовым помощником, поэтому мы нашли полноценную рабочую версию ассистента. Перейдем к установке приложения.
Подробное описание всех возможностей ассистента от Яндекс вы найдете на специальных вкладках помощника «Навыки» и «Вот что я умею». Помимо этого, Алиса умеет открывать файлы и программы Windows. Такого функционала хватит большинству пользователей, решивших упростить работу с компьютером.
Технологии в области машинного обучения за последний год развиваются с потрясающей скоростью. Всё больше компаний делятся своими наработками, тем самым открывая новые возможности для создания умных цифровых помощников.
В рамках данной статьи я хочу поделиться своим опытом реализации голосового ассистента и предложить вам несколько идей для того, чтобы сделать его ещё умнее и полезнее.
Что умеет мой голосовой ассистент?
Описание умения | Работа в offline-режиме | Требуемые зависимости |
Распознавать и синтезировать речь | Поддерживается | pip install PyAudio (использование микрофона) |
pip install pyttsx3 (синтез речи)
Для распознавания речи можно выбрать одну или взять обе:
- pip install SpeechRecognition (высокое качество online-распознавания, множество языков)
- pip install vosk (высокое качество offline-распознавания, меньше языков)
Шаг 1. Обработка голосового ввода
Начнём с того, что научимся обрабатывать голосовой ввод. Нам потребуется микрофон и пара установленных библиотек: PyAudio и SpeechRecognition.
Подготовим основные инструменты для распознавания речи:
Теперь создадим функцию для записи и распознавания речи. Для онлайн-распознавания нам потребуется Google, поскольку он имеет высокое качество распознавания на большом количестве языков.
А что делать, если нет доступа в Интернет? Можно воспользоваться решениями для offline-распознавания. Мне лично безумно понравился проект Vosk.
На самом деле, необязательно внедрять offline-вариант, если он вам не нужен. Мне просто хотелось показать оба способа в рамках статьи, а вы уже выбирайте, исходя из своих требований к системе (например, по количеству доступных языков распознавания бесспорно лидирует Google).
Теперь, внедрив offline-решение и добавив в проект нужные языковые модели, при отсутствии доступа к сети у нас автоматически будет выполняться переключение на offline-распознавание.
Замечу, что для того, чтобы не нужно было два раза повторять одну и ту же фразу, я решила записывать аудио с микрофона во временный wav-файл, который будет удаляться после каждого распознавания.
Таким образом, полученный код выглядит следующим образом:
Возможно, вы спросите «А зачем поддерживать offline-возможности?»
Я считаю, что всегда стоит учитывать, что пользователь может быть отрезан от сети. В таком случае, голосовой ассистент всё еще может быть полезным, если использовать его как разговорного бота или для решения ряда простых задач, например, посчитать что-то, порекомендовать фильм, помочь сделать выбор кухни, сыграть в игру и т.д.
Шаг 2. Конфигурация голосового ассистента
Поскольку наш голосовой ассистент может иметь пол, язык речи, ну и по классике, имя, то давайте выделим под эти данные отдельный класс, с которым будем работать в дальнейшем.
Для того, чтобы задать нашему ассистенту голос, мы воспользуемся библиотекой для offline-синтеза речи pyttsx3. Она автоматически найдет голоса, доступные для синтеза на нашем компьютере в зависимости от настроек операционной системы (поэтому, возможно, что у вас могут быть доступны другие голоса и вам нужны будут другие индексы).
Также добавим в в main-функцию инициализацию синтеза речи и отдельную функцию для её проигрывания. Чтобы убедиться, что всё работает, сделаем небольшую проверку на то, что пользователь с нами поздоровался, и выдадим ему обратное приветствие от ассистента:
Полный код основы голосового ассистента (синтез и распознавание речи)На самом деле, здесь бы хотелось самостоятельно научиться писать синтезатор речи, однако моих знаний здесь не будет достаточно. Если вы можете подсказать хорошую литературу, курс или интересное документированное решение, которое поможет разобраться в этой теме глубоко — пожалуйста, напишите в комментариях.
Шаг 3. Обработка команд
Теперь, когда мы «научились» распознавать и синтезировать речь с помощью просто божественных разработок наших коллег, можно начать изобретать свой велосипед для обработки речевых команд пользователя :D
В моём случае я использую мультиязычные варианты хранения команд, поскольку у меня в демонстрационном проекте не так много событий, и меня устраивает точность определения той или иной команды. Однако, для больших проектов я рекомендую разделить конфигурации по языкам.
Для хранения команд я могу предложить два способа.
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, проходить собеседования, получать повышение, справляться с профессиональным выгоранием, управлять разработкой и т.д.
Для создания голосового помощника не нужно обладать большими знаниями в программировании, главное понимать каким функционалом он должен владеть. Многие компании создают их на первой линии связи с клиентом для удобства, оптимизации рабочих процессов и наилучшей классификации звонков.
В данной статье представлена программа, которая может стать основой для Вашего собственного чат-бота, а если точнее – голосового помощника для распознавания голоса и последующего выполнения команд. С ее помощью мы сможем понять принцип работы наиболее часто встречаемых голосовых помощников.
Для начала объявим необходимые нам библиотеки:
Также не забудем вести лог файл, который понадобится нам, если же мы все-таки решим улучшить бота для работы с нейронной сетью. Многие компании использую нейронную сеть в своих голосовых помощниках для понимания эмоций клиента и соответствующего реагирования на них. Также стоит не забывать, что с помощью анализа логов, мы сможем понять слабые места алгоритма бота и улучшить взаимодействие с клиентами.
А с помощью такой процедуры в Jupyter Notebook мы можем озвучить через устройство воспроизведения, настроенное по умолчанию, сказанные слова:
Как озвучивать текст мы рассмотрели выше, но как же мы свой голос сможем превратить в текст? Тут нам поможет распознавание речи от Google и некоторые манипуляции с микрофоном.
Что может сделать наш помощник кроме того, чтобы нас слушать? Все ограничено нашей фантазией! Рассмотрим несколько интересный примеров.
Начнем с простого, пусть при команде открыть сайт – он откроет сайт (не ожидали?).
Иногда полезно послушать свои слова, да чужими устами. Пусть бот еще умеет и повторять за нами:
Пусть еще и собеседником будет, но начнем мы пока только со знакомства:
Мы также можем попросить голосового помощника назвать случайное число в выбранных нами пределах в формате: Назови случайное число от (1ое число) до (2ое число).
Для того, чтобы завершить программу, достаточно только попрощаться с ботом:
В этом кратком руководстве вы будете использовать пакет SDK для службы "Речь" для создания пользовательского приложения голосового помощника, которое подключается к боту, который вы уже создали и настроили. Если необходимо создать бот, см. дополнительные сведения в исчерпывающем руководстве.
После выполнения нескольких предварительных требований подключение пользовательского интерфейса пользователя займет всего несколько шагов:
- Создайте объект BotFrameworkConfig , содержащий ключ и регион подписки.
- Создайте объект DialogServiceConnector , используя приведенный выше объект BotFrameworkConfig .
- С помощью объекта DialogServiceConnector запустите процесс прослушивания для одного речевого фрагмента.
- Проверьте возвращенный результат ActivityReceivedEventArgs .
Предварительные требования
Перед началом работы нужно сделать следующее:
Ознакомьтесь со списком поддерживаемых регионов для голосовых помощников и убедитесь, что ваши ресурсы развернуты в одном из этих регионов.
Откройте проект в Visual Studio.
Сначала необходимо убедиться, что проект открыт в Visual Studio.
Добавление стандартного кода
Добавим код, который выступает в качестве основы для нашего проекта.
Откройте MainPage.xaml в обозревателе решений.
В представлении XAML конструктора замените все содержимое следующим фрагментом кода, который определяет элементарный пользовательский интерфейс:
Конструктор обновляется для отображения пользовательского интерфейса приложения.
- В Обозревателе решений откройте исходный файл кода программной части MainPage.xaml.cs . (Он сгруппирован в MainPage.xaml .) Замените содержимое этого файла приведенным ниже, которое включает:
using инструкции для Speech и Speech.Dialog пространства имен
простая реализация доступа к микрофону с привязкой к обработчику кнопки;
целевая точка для пути кода инициализации, который будет добавлен позже;
вспомогательное приложение для воспроизведения текста, преобразованного в речь (без поддержки потоковой передачи данных);
пустой обработчик кнопки воспроизведения, который будет заполнен позже.
Добавьте следующий фрагмент кода в текст метода InitializeDialogServiceConnector . Этот код создает DialogServiceConnector с помощью сведений о подписке.
Ознакомьтесь со списком поддерживаемых регионов для голосовых помощников и убедитесь, что ваши ресурсы развернуты в одном из этих регионов.
Для получения сведений о настройке бота см. документацию по Bot Framework для канала Direct Line Speech.
Замените строки YourSpeechSubscriptionKey , и YourServiceRegion на собственные значения для вашей подписки на службу "Речь" и региона.
Добавьте следующий фрагмент кода в конец текста метода InitializeDialogServiceConnector . Этот код настраивает обработчики событий, на которые полагается DialogServiceConnector для передачи информации о деятельности ботов, результатах распознавания речи и другой информации.
В текст метода ListenButton_ButtonClicked в классе MainPage добавьте следующее. Этот код настраивается DialogServiceConnector для прослушивания, так как вы уже установили конфигурацию и зарегистрировали обработчики событий.
Создание и запуск приложения
Теперь можно приступать к созданию приложения и проверке пользовательского голосового помощника, используя службу "Речь".
В строке меню выберите Сборка > Построить решение, чтобы создать приложение. Теперь код должен компилироваться без ошибок.
Выберите Отладка > Начать отладку(или нажмите клавишу F5), чтобы запустить приложение. Откроется окно helloworld.
Выберите Включить микрофон, а когда появится запрос на разрешение доступа, выберите Да.
Щелкните Talk to your bot (Разговор с ботом) и произнесите фразу или предложение на английском языке в микрофон устройства. Ваша речь передастся в канал "Речь Direct Line" и преобразуется в текст, который появится в том же окне.
Дальнейшие действия
Выберите целевую среду
Предварительные требования
Перед началом работы нужно сделать следующее:
Ознакомьтесь со списком поддерживаемых регионов для голосовых помощников и убедитесь, что ваши ресурсы развернуты в одном из этих регионов.
Создание и настройка проекта
В средстве запуска Eclipse в поле Рабочая область введите имя нового каталога. Затем выберите Запустить.
После этого отобразится главное окно интегрированной среды разработки Eclipse. Если отобразится экран приветствия, закройте его.
В строке меню Eclipse создайте новый проект, выбрав Файл > Создать > Проект.
Откроется диалоговое окно Создание проекта . Выберите Проект Java, а затем щелкните Далее.
Если появится окно Open Associated Perspective? (Открыть связанную перспективу?), выберите Open Perspective (Открыть перспективу).
В обозревателе пакетов щелкните правой кнопкой мыши проект quickstart. В контекстном меню выберите Настроить > Convert to Maven Project (Преобразовать в проект Maven).
Откроется окно Create new POM (Создать новый POM). В поле Идентификатор группы введите com.microsoft.cognitiveservices.speech.samples, а в поле Идентификатор артефакта — quickstart. Выберите Готово.
Откройте файл pom.xml и измените его.
В конце файла перед закрывающим тегом </project> создайте элемент repositories со ссылкой на репозиторий Maven для пакета SDK службы "Речь", как показано ниже.
Кроме того, добавьте элемент dependencies , указав пакет SDK службы "Речь" версии 1.18.0 в виде зависимости.
Кроме того, для включения ведения журнала обновите файл pom.xml, чтобы добавить следующие зависимости.
Добавление примеров кода
Выберите Файл > Создать > Класс, чтобы добавить пустой класс в проект Java.
В окне New Java Class (Новый класс Java) введите speechsdk.quickstart в поле Пакет и Main в поле Имя.
Откройте только что созданный класс Main и замените содержимое файла Main.java следующим начальным кодом.
В методе main сначала настройте DialogServiceConfig и используйте его для создания экземпляра DialogServiceConnector . Этот экземпляр подключается к каналу "Речь Direct Line" для взаимодействия с ботом. Экземпляр AudioConfig также используется для указания источника звуковых входных данных. В этом примере микрофон по умолчанию используется с AudioConfig.fromDefaultMicrophoneInput() .
- Замените строку YourSubscriptionKey своим ключом подписки, который вы можете получить на этом веб-сайте.
- Замените строку YourServiceRegion на регион, связанный с вашей подпиской.
Ознакомьтесь со списком поддерживаемых регионов для голосовых помощников и убедитесь, что ваши ресурсы развернуты в одном из этих регионов.
Соединитель DialogServiceConnector использует несколько событий, чтобы сообщать о работе бота, результатах распознавания речи и других данных. Далее добавьте эти прослушиватели событий.
Подключите DialogServiceConnector к каналу "Речь Direct Line", вызвав метод connectAsync() . Чтобы протестировать свой бот, вы можете вызвать метод listenOnceAsync для отправки звуковых входных данных со своего микрофона. Вы можете также использовать метод sendActivityAsync для отправки пользовательского действия в виде сериализованной строки. Эти пользовательские действия могут предоставить дополнительные данные, которые ваш бот использует в разговоре.
Сохраните изменения в файле Main .
Чтобы поддержать воспроизведение ответа, добавьте дополнительный класс, который преобразовывает объект PullAudioOutputStream, возвращенный из API getAudio(), в InputStream для Java, чтобы упростить обработку. ActivityAudioStream — это специализированный класс, который обрабатывает аудиоотклик из канала "Речь Direct Line". Он предоставляет методы доступа для получения сведений о звуковом формате для обработки воспроизведения. Для этого выберите File (Файл) > New (Создать) > Class (Класс).
В окне New Java Class (Новый класс Java) введите speechsdk.quickstart в поле Пакет и ActivityAudioStream — в поле Имя.
Откройте только что созданный класс ActivityAudioStream и замените его содержимое следующим кодом.
Сохраните изменения в файле ActivityAudioStream .
Создание и запуск приложения
Дальнейшие действия
Предварительные требования
Перед началом работы нужно сделать следующее:
Ознакомьтесь со списком поддерживаемых регионов для голосовых помощников и убедитесь, что ваши ресурсы развернуты в одном из этих регионов.
Создание и настройка проекта
Запустите Android Studio и в окне приветствия выберите Start a new Android Studio project (Создать проект Android Studio).
Откроется окно мастера Выбор проекта. Выберите Phone and Tablet (Телефон и планшет) и Empty Activity (Пустое действие) в поле выбора действия. Выберите Далее.
Android Studio требуется несколько минут, чтобы подготовить новый проект Android. Затем настройте для проекта пакет SDK для службы "Речь" Azure Cognitive Services и использование Java 8.
Скачивая любой пакет SDK для службы "Речь" в Azure Cognitive Services, вы соглашаетесь на использование лицензии. Дополнительные сведения см. в разделе:
Текущая версия пакета SDK для службы "Речь" в составе Cognitive Services — 1.15.0.
Настройте проект для использования пакета SDK службы "Речь". Откройте окно Project Structure (Структура проекта), выбрав в строке меню Android Studio Файл > Project Structure (Структура проекта). В окне Project Structure (Структура проекта) внесите следующие изменения:
На этом же экране слева выберите app (приложение). Затем в верхней части окна выберите вкладку Зависимости. Нажмите зеленый знак плюс ( + ) и выберите в раскрывающемся меню Library dependency (Зависимость библиотек).
Выберите вкладку Свойства. Выберите значение 1.9 для параметров Source Compability (Совместимость источника) и Target Compatibility (Совместимость целевого объекта).
Чтобы закрыть окно Project Structure (Структура проекта) и применить изменения к проекту, нажмите кнопку OК.
Создание пользовательского интерфейса
Затем замените содержимое файла activity_main.xml на код, приведенный ниже.
Этот XML-файл определяет простой пользовательский интерфейс для взаимодействия с ботом.
- Элемент button инициирует взаимодействие и вызывает метод onBotButtonClicked при щелчке.
- Элемент recoText будет отображать результаты преобразования речи в текст при разговоре с ботом.
- Элемент activityText будет отображать полезные данные JSON для последнего действия Bot Framework от бота.
Теперь текстовая и графическая версии пользовательского интерфейса должны выглядеть следующим образом:
Добавление примеров кода
Откройте файл MainActivity.java и замените его содержимое кодом, приведенным ниже.
Метод onCreate содержит код, который запрашивает разрешения на использование микрофона и подключение к Интернету.
Метод onBotButtonClicked , как упоминалось ранее, является обработчиком нажатия кнопки. Нажатие кнопки активирует одно взаимодействие ("включение") с ботом.
Метод registerEventListeners показывает события, используемые DialogServiceConnector , и базовую обработку входящих действий.
В том же файле замените строки конфигурации в соответствии с ресурсами:
Замените YourSpeechSubscriptionKey ключом своей подписки.
Замените YourServiceRegion регионом, связанным с вашей подпиской. Канал Direct Line Speech сейчас поддерживается только в ряде регионов службы "Речь". Дополнительные сведения см. в разделе Регионы.
Создание и запуск приложения
Подключите устройство Android к компьютеру разработки. Убедитесь, что вы включили на устройстве режим разработки и отладку по USB.
Чтобы выполнить сборку приложения, нажмите комбинацию клавиш Ctrl + F9 или выберите в строке меню Сборка > Make Project (Создать проект).
Чтобы запустить приложение, нажмите комбинацию клавиш Shift+F10 или выберите Запуск > Run 'app' (Запустить "приложение").
В отобразившемся окне целей развертывания выберите свое устройство Android.
Дальнейшие действия
Вы можете просмотреть или скачать все примеры для пакета SDK службы "Речь" для Go на сайте GitHub.
С самого выхода Космической одиссеи Стенли Кубрика люди мечтали иметь компьютер, с которым можно было бы общаться так же, как с другим человеком. Прошло уже почти полвека с момента выхода сей культовой картины, а технологии лишь недавно позволили людям приблизиться к технологиям воображаемого будущего. И хотя космические корабли всё ещё слабо бороздят Большой театр просторы Вселенной, говорящие бездушные помощники уже более чем реальность. Такие компании как Google и Amazon уже торгуют своими Home и Echo, хотя далеко не каждый может себе позволить такую колонку. За Google Home компания просит $130, а Amazon за своё детище - все $180.
Не будем забывать, что существует огромный пласт активного населения, которые жить не могут, а им дай поиграть с конфигами заточить всё под себя, да добавлять новые фичи по мере потребности и оживления фантазии.
Параллельно с этим контингентом живут люди с обострённым чувством паранойи волнения за приватность своих данных и отсутствие слежки, которые хотели бы пользоваться чем-то новым и удобным, но отправлять данные на сервера корпорации Добра не хотят.
Как быть? Стало быть, нужен относительно дешёвый вариант, лекго конфигуриремый, с открытыми исходниками, и желательно не вылезающего в Интернет без необходимости. Из ближайшего, что подходит на эту роль - Raspberry PI. Благо, необходимости строить свой велосипед нет, так как уже нашлись умельцы, адаптировавшие всё это добро под Малину. А наша задача - разобраться с этим, настроить и дописать своё. Имя этому - легион Jasper
- Собственно Raspberry (3 в моём случае)
- Динамик
- Микрофон
- Внешняя звуковая карта
Дело в том, что Малина не имеет при себе ничего, что способно оцифровывать сигнал с микрофона, поэтому перед нами два варианта: USB-микрофон (дороговато), либо обычный микрофон с джеком + USBшная звуковая карта (дёшево, сердито).
Если обратить внимание, то все обладатели RPI в сети имеют при себе лишнюю клавиатуру и монитор, чего студент не может себе позволить. Как минимум они считаются необходимыми для первоначальной настройки ОС, а именно, для поднятия wifi и ssh. Когда я изначально пытался настроить это без вышеписанных девайсов, т.е. только при помощи правки конфигов на карте - включения - проверки наличия в локальной сети нового устройства, я столкнулся с проблемой, что в случае отсутствия адекватного устройства вывода нереально сложно отлаживать скрипты конфигурации. В конце концов я добился своего, используя в качестве устройства ввода/вывода файловую систему, но потом оказалось, что.
. разработчики Jasper поставляют образы системы с уже настроенным ssh, так что необходимо было только прописать SSID и пароль в конфиге wpa_supplicant.
Мораль - не спеши, хотя иногда полученный в результате отрицательный опыт тоже бывает полезен
Итак, Официальная документация говорит нам скачать у них образ, записать его на microSD классическим dd, либо можно всё поставить руками, ибо есть даже пакет в AUR.
Подвох в том, что убийца - дворецкий на половине проделанной работы, в поисках ответа на очередную ошибку при установке пакета ты натыкаешься на подобный вопрос на форуме поддержки Jasper, а человеку отвечают загадочной фразой "Посмотрите, что написано на главной странице форума, выделено жёлтым". Следуем этой наводке и видим:
В этом, я бы сказал, одна из больших проблем сего творения: разработчики маленько (на самом деле, довольно сильно) подзабили на поддержку инфраструктуры в актуальном состоянии. Они даже успели сломать обратную совместимость между версиями, поправив только несколько модулей, из-за чего заметную часть полезных пользовательских модулей нужно самому переписывать под новую версию.
Итак, теперь сносим всё и начинаем заново, если успели что-то предпринять раньше. В домашней директории образа нас ждёт папка со скриптами, обещающими установить весь нужный софт с зависимостями без регистрации и смс . Да, здесь тоже подвох, ибо кое-что придётся собирать руками. Но об этом по порядку.
Основной пакет ставится относительно без проблем, а со вспомогательными уже наблюдаются трудности.
Так как мы решили большую часть производить прямо на борту Малины, то и распознавание голоса должно по нашей задумке происходить там же. Нам предлагается несколько вариантов:
- PocketSphinx - локально, на Сях, адаптировано под ARM, создано в университете Карнеги Меллон
- Google STT - то же, что и в мобилках, но необходима сеть, так что отпадает в нашем случае
- AT&T STT - онлайновый
- Wit.ai STT - онлайновый
- Julius - высокопроизводительный, локальный, но нужно тренировать свою аккустическую модель, что настолько сложно и опасно, что сами разработчики Jasper советуют использоать его только самым смелым.
Со сфинксом тоже не всё гладко. Дело в том, зависимостей у него достаточно, а способные установиться пакеты есть не для всего, так что около получаса жизни придётся выделить на компиляцию зависимости.
Теперь для вывода - вариантов TTS предлагается достаточно, начиная от встроенного в Android 1.6 Donut, заканчивая Стивеном Хокингом поделкой от того же университета Карнеги Меллон. Здесь время уйдёт уже на выбор голоса по вкусу.
Как это работает
jasper.py организует вcю работу Джаспера. Он создает экземпляры микрофона, профиля и разговора. Затем экземпляр разговора получает микрофон и профиль в качестве входных данных, из которых он создает уведомитель и мозг. На самом деле, объект Mic отвечает здесь не только за микрофон, а за звук в принципе - через его метод say() можно дать указание машине зачитать текст.
Затем мозг получает микрофон и профиль, и загружает все интерактивные компоненты в память. Мозг по существу является интерфейсом между написанными разработчиком модулями и основной инфраструктурой.
Каждый модуль - файл в директории client/modules/ - должен реализовывать функции isValid() и handle(), а также определять список ключевых слов WORDS = [. ]. isValid() проверяет запрос на соответствие шаблону, handle - выполняет обработку запроса.
Например, модуль, отвечающий на вопрос о смысле жизни может быть таким:
Объект profile - настройки из файла
/.jasper/profile.yml. Там могут быть как служебные данные (пути к файлам голосовых моделей, например), так и любая полезная информация (местоположение для модуля погоды).
Несмотря на то, что в глубинах гитхаба можно найти неплохие модули, большая часть из них либо не рабочая сама по себе, либо устарела и не соответствует API, поэтому всё равно нужно переписывать.
Некоторые полезные мои и переписанные чужие модули можно найти здесь.
Стоит отметить, что расширению легко поддаются не только собственно модули, но и внутрянняя кухня Джаспера. Однажды я понял, что мне не хватает тех двух способов запуска: голосового и текстового, а мне нужнен ещё один: ввод с клавиатуры, ответ в виде текста и звука. И сделать это оказалось очень легко, ведь во время парсинга агрументов командной строки просто импоритруеются "микрофоны" из разных файлов, но с разной реализацией методов.
такой вот своеобразный способ реализации паттернов, но вполне себе рабочий.
Локальное распознавание голоса. Оно, честно говоря, слабовато, то ли из-за самой используемой техники, то ли из-за дешёвого микрофона.
Две с половиной недели назад Google совместно с Raspberry создали то же самое, только с Google Assistant на борту, и практически за те же деньги. Интересное ощущение, когда сначала ты начинаешь делать курсовую, а потом её делает Google.
Читайте также: