Русский
Русский
English
Статистика
Реклама

Голосовой помощник

Салют от Сбера в Яндекс.Облаке

03.12.2020 02:08:23 | Автор: admin


В сентябре 2020 г. Сбербанк переименовал себя просто в Сбер (т.н. ребрендинг), и на радостях запустил собственную платформу голосовых ассистентов под названием Салют. Особенностью Салюта является наличие сразу трёх голосовых ассистентов на выбор пользователей: Сбер мужчина, стиль обращения на вы, Афина женщина, обращается также на вы, и Джой девушка с дружеским ты.

Сбер (банк, не его тёзка голосовой ассистент) открыл эту платформу для сторонних разработчиков, пригласив их делать для неё приложения, т.н. смартапы аналог навыков голосовой помощницы Алисы, и учредив для них конкурс с весьма щедрым призовым фондом. В этом туториале мы рассмотрим как сделать смартап на Node.js, разместить его код в Яндекс.Облаке (используя функции), и, наконец, создать проект в Салюте, пройти там модерацию, и опубликовать наш смартап, чтобы он стал общедоступным.

А делать мы будем смартап под кодовым названием Умные Мысли. Моя любимая тема, поскольку это уже третья статья. До этого были: Алиса приобретает навык (про Умные Мысли для Алисы), и Строим Telegram-бот в Яндекс.Облаке (про создание @SmartThoughtsBot бота с таким же мирским именем). Итак, вот план на сегодня:
1. Сначала мы склонируем репозиторий с кодом нашего смартапа, и установим необходимые зависимости. Вы также сможете получить дополнительную полезную информацию прямо в комментариях кода.
2. Затем разместим наш код в Яндекс.Облаке, используя функции т.н. технологии serverless.
3. Потом мы создадим проект в SmartApp Studio веб-интерфейсе для создания приложений для Салюта, отправим наш смартап на модерацию, и дождавшись положительного ответа опубликуем его.
4. И наконец, посмотрим как наш смартап работает т.е. протестируем его.
5. Но после конца, будет ещё и заключение. Здесь я поделюсь своим мнением и впечатлением о новой платформе. Но это легко можно будет пропустить, просто не дочитав пару абзацев в конце статьи.

1. Код смартапа


Cклонируйте GitHub-репозиторий, перейдите в корневой каталог проекта, и установите зависимости, как показано ниже:

Необходимое ПО
Подразумевается, что на вашей рабочей машине (т.н. компьютере) должны быть установлены Node.js (версии не ниже 10), npm (по умолчанию устанавливается вместе с Node.js) и Git. Если чего-то не хватает сначала установите, а потом продолжайте. Кроме того, потребуется редактор для работы с кодом. У меня это Visual Studio Code.

git clone https://github.com/stmike/smart-thoughts-salute.git
cd smart-thoughts-salute
npm install

Код этого смартапа написан с использованием открытого SmartApp API и спецификации Yandex Cloud Functions, с которыми, я уверен, вы захотите познакомиться. После развёртывания, примерно вот так этот проект будет выглядеть у вас.

Код смартапа

Обратите внимание, что код испещрён комментариями, словно шумерские таблички клинописью. Думаю, что читать различные пояснения удобнее в контексте кода, чем поочерёдно глядеть то в код, то в текст статьи. Внесите в проект какие-нибудь изменения, например, в файл /src/lexicon-formal где собраны фразы смартапа с обращением на вы для Сбера и Афины, или в файл /src/lexicon-unformal где фразы с обращением на ты для Джой. После этого сделайте ZIP-архив, в который включите: файл index.js, каталог с файлами src, и каталог с файлами node_modules. Этот архив мы скоро зальём в Яндекс.Облако.

2. Яндекс.Облако


Перейдите в Яндекс.Облако. Если вы с ним ещё незнакомы следуйте там инструкциям для создания своего платежного аккаунта и прочих первоначальных настроек. В своей статье Алиса в стране Битрикс я уже подробно касался всего этого, поэтому, чтобы здесь не повторяться отсылаю читателей, которым надо больше информации на эту тему, к этой своей статье. Итак, в Яндекс.Облаке выбираем слева в меню Cloud functions, и нажимаем кнопку Создать функцию. Откроется страница создания функции.

Создание функции

Заполняем поля Имя и Описание и нажимаем на кнопку Создать. Теперь запустится мастер создания функции.

Выбор языка

Выберите Node.js 10-й версии, а также снимите галочку в чекбоксе Добавить файлы с примерами кода. Нажмите кнопку Продолжить.

Заполнение полей функции

На этом шаге мастера выберите опции и заполните поля, показанные на скриншоте, следующим образом:
1. Выберите вкладку ZIP-архив.
2. Нажмите кнопку Выбрать файл, и выберите на своей локальной машине ZIP-архив с нашим смартапом, который мы недавно создали.
3. В поле Точка входа укажите index.skill. Здесь index означает имя файла, а skill имя модуля в нашем index-файле.
4. В поле Таймаут укажите 7, потому что максимум 7 секунд Салют будет ждать ответа от этой функции (для сравнения Алисаждёт максимум 3 секунды).
5. Нажмите кнопку Создать версию.
Через несколько секунд новая функция сгенерируется, и вы окажетесь на странице Обзор.

Создана новая функция

Здесь надо включить переключатель Публичная функция на ON, т.е. сделать так, чтобы Салют мог её без проблем вызывать. Ссылку для вызова и Идентификатор функции держите в тайне, поскольку публичную функцию может вызвать любой, а платить будете вы. Запишите себе на манжете Ссылку для вызова она нам очень скоро потребуется.

3. Создание проекта для Салюта


Проекты для Салюта создаются с помощью SmartApp Studio.
Войдите в эту студию, если у вас уже есть Сбер ID, или зарегистрируйтесь в противном случае. Регистрация процесс тривиальный, останавливаться на этом не будем. Но отмечу важную особенность: осуществляется она по российскому номеру мобильного телефона, и если у вас этого нет (российского номера, мобильного телефона, или ничего из перечисленного), зарегистрироваться, как я понимаю, не получится.

Вход в Смартап студию по Сбер ID

Вошли. В моём аккаунте мы видим уже созданный и пока единственный смартап, кодом и способом создания которого я с вами здесь и сегодня делюсь. Кнопочка Изучить документацию вам, вероятно, понадобится в первую очередь, но для целей нашей статьи, мы всё же нажмём сейчас на Создать смартап.

Список смартапов

На изображении видно, что под названием смартапа имеются надписи Webhook и Запущено. Первая надпись говорит о том, что наше приложение работает на стороннем сервисе (у нас это Яндекс.Облако), а вторая что приложение опубликовано (я бы так и написал вместо Запущено). Перейдём же к созданию своего смартапа. Вводим название (дублировать нельзя, поэтому выберите своё, например, Мудрые фразы). Затем выберите Chat App (да, там есть ещё тип Canvas App и в планах, по-видимому, Native App, но сегодня мы будем делать именно с Chat App, как более простым в изготовлении, а об остальных типах почитайте в документации).

Выбор типа смартапа

Затем в разделе страницы Выбор инструмента, выберите Есть готовое приложение (и это абсолютная правда), а в поле Webhook вставьте Ссылку для вызова нашей функции в Яндекс.Облаке, которую вы совсем недавно записали на своём манжете.

Ввод вебхука

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

Модерация

Обратите также внимание, что вверху на вкладке Каталог присутствует бейджик скоро. Если вы попытаетесь разместить иконку и скриншоты смартапа ничего не выйдет. Когда я подавал свой смартап на модерацию в первой половине ноября 2020 г., после его принятия, сотрудник (возможно это также и модератор в одном лице) просил прислать иконку по почте, а за скриншоты вообще ничего не говорил. Но зато говорил, что скоро такое положение дел изменится, и всё заработает полноценно. Будем надеятся.

Каталог смартапов

4. Тестирование


Пришло время проверить наш смартап в деле. Установите мобильное приложение СБЕР Салют для Android или СБЕР Салют для iOS. Это приложение главным образом предназначено для управления телевизионной приставкой SberBox, но даже без приставки в нём можно полноценно общаться с голосовыми ассистентами, и запускать смартапы сторонних разработчиков. Для этого откройте на своём смартфоне приложение СБЕР Салют, войдите под своим Сбер ID именно тем ID, под которым вы залогинены в SmartApp Studio! Нажмите внизу на круглую иконку, символизирующую голосового ассистента, и прослушайте его приветствие (ассистентом по умолчанию там выбран Сбер). Затем скажите: Включи... или Запусти... и произнесите название, которое вы дали своему смартапу. Повторяю: вы можете тестировать свои неопубликованные смартапы, если Сбер ID, с которым вы вошли в мобильное приложение СБЕР Салют тот же самый, что и Сбер ID, с которым вы входили в SmartApp Studio, когда создавали свой смартап. Если вы ещё ничего своего не создали, но уже хотите посмотреть, что в реальности производит программный код, который вам здесь предлагают, скажите ассистенту: Включи Умные Мысли. Запустится простой смартап, который позволит вам немного с ним пообщаться. Обратите внимание, что в Салюте не обязательно говорить слова смартап или навык, как это необходимо при общении с Алисой, например: Включи смартап Умные Мысли, или Запусти навык Умные Мысли. Эти слова здесь можно опускать, что делает общение с голосовым ассистентом более естественным, а значит приятным.

Умные мысли запущены

Когда немного пообщаетесь со Сбером (ассистентом), скажите: Позови Афину. А затем: Позови Джой. Убедитесь, что каждый из них имеет разный стиль общения: кто-то на вы, а кто-то на ты. Это значит, что ваш смартап (или Умные Мысли) эту фичу Салюта корректно обрабатывет.

5. Заключение


Очевидно (по крайней мере мне), что платформа Салют, находится ещё в детском или, в лучшем случае, отроческом возрасте. Если сравнить те же Умные Мысли здесь и у Алисы у Алисы будет покруче там ещё и музыка, и картинки. В Салюте всё это недоступно. Говорят, что пока. И это похоже на правду уж с очень большой энергией и напором там взялись за голосовых помощников! Кроме того, в Салюте организована необычайно активная и оперативная поддержка для независимых разработчиков часто просто в реальном времени в Telegram-канале SmartApp Studio Community & Support. Подозреваю, что Сбер (банк) задался целью в самое ближайшее время стать в России номером один в рыночной нише голосовых ассистентов. Поэтому, если вы понимаете что такое т.н. окна возможностей и немного авантюристичны по своей природе можете подключаться к процессу. Работать на Салют ещё трудно, но уже реально.

На сегодня это всё. Другие материалы следуют. Кому подобное читать интересно подписывайтесь на уведомления о новых публикациях. Подписаться можно на этом сайте (кнопка Подписаться внизу), или на Telegram-канал IT Туториал Захар, или на одноимённое сообщество в VK, или Twitter @mikezaharov.
Подробнее..

Из песочницы Создание голосового ассистента на Python, часть 1

14.08.2020 12:15:32 | Автор: admin
Добрый день. Наверное, все смотрели фильмы про железного человека и хотели себе голосового помощника, похожего на Джарвиса. В этом посте я расскажу, как сделать такого ассистента с нуля. Моя программа будет написана на python 3 в операционной системе windows. Итак, поехали!

Реализация

Работать наш ассистент будет по такому принципу:

  1. Постоянно слушать микрофон
  2. Распознавать слова в google
  3. Выполнять команду, либо отвечать

1) Синтез речи

Для начала мы установим в систему windows русские голоса. Для этого переходим по ссылке и скачиваем голоса в разделе SAPI 5 -> Russian. Там есть 4 голоса, можно выбрать любой, какой вам понравится. Устанавливаем и идём дальше.

Нам нужно поставить библиотеку pyttsx3 для синтеза речи:

pip install pyttsx3

Затем можно запустить тестовую программу и проверить правильность её выполнения.

import pyttsx3text = 'какой-нибудь текст'tts = pyttsx3.init()rate = tts.getProperty('rate') #Скорость произношенияtts.setProperty('rate', rate-40)volume = tts.getProperty('volume') #Громкость голосаtts.setProperty('volume', volume+0.9)voices = tts.getProperty('voices')# Задать голос по умолчаниюtts.setProperty('voice', 'ru') # Попробовать установить предпочтительный голосfor voice in voices:    if voice.name == 'Anna':        tts.setProperty('voice', voice.id)tts.say(text)tts.runAndWait()

2) Распознавание речи

Существует много инструментов для распознавания речи, но они все платные. Поэтому я пытался найти бесплатное решение для моего проекта и нашёл её! Это библиотека speech_recognition.

pip install SpeechRecognition

Также для работы с микрофоном нам необходима библиотека PyAudio.

pip install PyAudio

У некоторых людей возникает проблема с установкой PyAudio, поэтому следует перейти по этой ссылке и скачать нужную вам версию PyAudio. Затем ввести в консоль:

pip instal название скачанного файла

Затем запускаете тестовую программу. Но перед этим вы должны исправить в ней device_index=1 на своё значение индекса микрофона. Узнать индекс микрофона можно с помощью этой программы:

import speech_recognition as srfor index, name in enumerate(sr.Microphone.list_microphone_names()):    print("Microphone with name \"{1}\" found for `Microphone(device_index={0})`".format(index, name))

Тест распознавания речи:

import speech_recognition as srdef record_volume():    r = sr.Recognizer()    with sr.Microphone(device_index = 1) as source:        print('Настраиваюсь.')        r.adjust_for_ambient_noise(source, duration=0.5) #настройка посторонних шумов        print('Слушаю...')        audio = r.listen(source)    print('Услышала.')    try:        query = r.recognize_google(audio, language = 'ru-RU')        text = query.lower()        print(f'Вы сказали: {query.lower()}')    except:        print('Error')while True:    record_volume()

Если всё отлично, переходим дальше.

Если вы хотите, чтобы ассистент просто общался с вами (без ИИ), то это можно сделать с помощью бесплатного инструмента DialogFlow от Google. После того, как вы залогинетесь, вы увидите экран, где уже можно создать своего первого бота. Нажимаем Create agent. Придумываем боту имя (Agent name), выбираем язык (Default Language) и нажимаем Create. Бот создан!

Чтобы добавить новые варианты ответов на разные вопросы, нужно создать новый intent. Для этого в разделе intents нажимаем Create intent. Заполняем поля Название и Training phrases, а затем ответы. Нажимаем Save. Вот и всё.

Чтобы управлять ботом на python, нужно написать такой код. В моей программе бот озвучивает все ответы.

import apiai, json, reimport pyttsx3import speech_recognition as srtts = pyttsx3.init()rate = tts.getProperty('rate')tts.setProperty('rate', rate-40)volume = tts.getProperty('volume')tts.setProperty('volume', volume+0.9)voices = tts.getProperty('voices')tts.setProperty('voice', 'ru')for voice in voices:    if voice.name == 'Anna':        tts.setProperty('voice', voice.id)def record_volume():    r = sr.Recognizer()    with sr.Microphone(device_index = 1) as source:        print('Настраиваюсь.')        r.adjust_for_ambient_noise(source, duration=1)         print('Слушаю...')        audio = r.listen(source)    print('Услышала.')    try:        query = r.recognize_google(audio, language = 'ru-RU')        text = query.lower()        print(f'Вы сказали: {query.lower()}')        textMessage( text )    except:        print('Ошибка распознавания.')def talk( text ):    tts.say( text )    tts.runAndWait()def textMessage( text ):    request = apiai.ApiAI('ваш токен').text_request() # Токен API к Dialogflow    request.lang = 'ru' # На каком языке будет послан запрос    request.session_id = 'ваш id' # ID Сессии диалога (нужно, чтобы потом учить бота)    request.query = text # Посылаем запрос к ИИ с сообщением от юзера    responseJson = json.loads(request.getresponse().read().decode('utf-8'))    response = responseJson['result']['fulfillment']['speech'] # Разбираем JSON и вытаскиваем ответ    # Если есть ответ от бота - присылаем пользователю, если нет - бот его не понял    if response:        request.audio_output = response        talk(response)    else:        talk('Простите. Я Вас не совсем поняла.')while True:    record_volume()

На сегодня всё. В следующей части я расскажу как сделать умного бота, т.е. чтобы он мог не только отвечать, но и что-либо делать.
Подробнее..

Who is mr. Marvin?

03.09.2020 10:04:27 | Автор: admin
В июне этого года мы выпустили на рынок умную колонку с голосовым помощником по имени Марвин. Она может работать до 2 часов без подзарядки. У колонки шесть микрофонов для обработки голосовых команд. ПО полностью разработано внутри МТС без использования сторонних коммерческих решений. В этом посте разберем основные функции и технические характеристики новинки.



Что может Марвин?


По голосовому запросу виртуальный ассистент Марвин можете отвечать на разные вопросы, позволяет слушать более 60 радиостанций, узнавать прогноз погоды, устанавливать напоминания и будильники, включать голосовые игры, узнавать о последних новостях. Для колонки можно выбрать один из трех режимов контента: 18+ полностью свободный от цензуры в отношении песен, новостей (контент доступен в исходном авторском виде), Без мата режим для взрослых, но с фильтром, блокирующим специфическую лексику, Детский установлены ограничения на выдачу контента для взрослых (песни без мата, без новостей, книги сказки).

Также колонка оборудована встроенным модулем системы Умного дома от МТС и поддерживает ZigBee- и Bluetooth Low Energy-устройства. Для подключения системы не требуется посредник-партнер, не нужны сторонние аппаратные решения. Это первая портативная колонка центр управления умным домом, который, в свою очередь, управляется голосовыми командами, и через приложение МТС Smart Нome.

Что со звуком?


Колонка оснащена цифровым сигнальным процессором для динамической аппаратной эквализации контента, который проигрывает устройство. Это обеспечивает гармоничное, красивое и качественное звучание колонки. DSP-сопроцессор позволяет управлять распределением спектральной мощности сигнала, делает звук динамически сбалансированным, управляет распределением басов. Он искусственным образом улучшает качество звучания за счет постоянного слежения за спектрограммой сигнала и формирует стереосигнал с сохранением эффектов звучания, присущих этой технологии. Такое решение позволяет сохранить качество звучания музыки и другого контента без потери качества распознавания речи.

Для гармоничного воспроизведения аудиоконтента устройство оборудовано стереодинамиками и пассивным источником низких частот. Суммарная средняя мощность звука составляет 10 Ватт.

Колонку можно подключить к любому мобильному устройству или ноутбуку с помощью Bluetooth и Airplay в качестве устройства вывода звука.


Изображение акустического пакета колонки

Про зарядку


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

ПО


Команда Центра искусственного интеллекта интегрировала в умную колонку ПО, которое позволяет активировать Марвина. Программное обеспечение обрабатывает голосовой запрос с массива микрофонов на расстоянии 4-5 метров от человека при включенном контенте, устройство может работать в шумных условиях. ПО было разработано внутри МТС специально для умного устройства без применения методов лицензирования сторонних решений. Команде разработчиков удалось создать полностью сквозное решение по обработке акустического сигнала без передачи данных третьей стороне, что позволяет одновременно управлять колонкой голосовыми командами и использовать ее в режиме Bluetooth-гарнитуры или проигрывать музыку через Airplay.

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

Начинка


Устройство состоит из трех электронных плат и обладает высокой производительностью, общая спецификация представлена в таблице:



Безопасность


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

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

Юзабельность


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

Умную колонку можно подключать сразу к нескольким Wi-Fi-сетям, при этом поддерживаются сети диапазонов 2.4 ГГц и 5 ГГц. При подключении к нескольким сетям активируется программный роуминг, благодаря которому колонку можно перемещать между зонами действия этих сетей устройство будет переключаться между ними автоматически. Такой функционал делает использование устройства удобным при перемещении внутри большого помещения, а также обеспечивает более стабильную работу при загруженности Wi-Fi-канала. При этом активация колонки надежно защищена, она не передает никаких данных акустического спектра в стиле dial-up-модема.

Продолжение следует


Умная колонка МТС это начало нового модельного ряда умных устройств компании. Начинка и программная разработка колонки станут основой для следующих моделей автономного мультимедийного гаджета со встроенным средством мобильной связи и голосовым помощником по имени Марвин. Так что следите за новостями и нашим блогом.

Роман Жуков, начальник отдела разработки AI-утсройств Центра искусственного интеллекта МТС.
Подробнее..

Управление системой NooLite через голосового помощника Алиса с помощью умного пульта Яндекса

21.04.2021 12:06:56 | Автор: admin

Я хочу рассказать о одном из способов управлять беспроводной электрикой NooLite с помощью голосового помощника и смартфона (плюс как бонус с компьютера или любого ИК-пульта без Интернет-шлюза).

Вся электрика в квартире и на даче у меня построена на системе NooLite. Почему именно NooLite? Начну издалека. С продукцией фирмы "Ноотехника" я познакомился еще в прошлом веке. Это были блоки защиты галогенных ламп. Они мне очень понравились - свет включался плавно и лампы служили намного дольше. Но вскоре на смену галогенным лампам пришли люминисцентные и блоки защиты стали неактуальны. Потом в квартире был ремонт, стоивший мне немало седых волос и когда через некоторое время возникла необходимость перенести и добавить выключатели, одна мысль о штроблении стен, пыли, грязи и переклейке обоев просто ввергала меня в ужас. Именно тогда я и познакомился с системой беспроводного управления освещением от NooLite. В то время еще не было Xiaomi, Sonoff, Tuya и других недорогих альтернативных решений. Были системы умного дома от европейских серьезных производителей, но там цена вопроса была просто неадекватной. Я решил все свои проблемы с переносом выключателей, разбиением освещения на зоны, сценариями освещения, проходными выключателями, включением-выключением вентиляции и удаленным управлением светом в сараях и гараже на даче с помощью самых первых NooLite, без шифрования и обратной связи.

Все что я сделал много лет назад работает до сих пор, батарейки в пультах менял 1 или 2 раза, в зависимости от интенсивности пользования. Потом добавился беспроводной датчик движения на двери в туалете, позволяющий маленькому ребенку без страха ходить туда (свет включается уже при начале открывания двери) и автоматически выключающий свет и таймеры в туалете и ванной, включающие вытяжку через заданное время после зажигания света и поддерживающие ее включенной некоторое время после выключения. Одно время я крепко задумался о настоящем "умном доме", купил несколько силовых блоков, пультов, датчики температуры и влажности, продумывал структуру. Но потом передумал, так как понял что в не такой уж большой двухкомнатной квартире мне это не нужно. Я так и остался верен системе NooLite, хотя сейчас хватает альтернатив и некоторые из них дешевле и выглядят, возможно, современнее чем изделия Ноотехники. Но тут у меня есть определенные условия. Во-первых, управление моим освещением и электронными устройствами не должно зависеть от китайского облака и вообще от наличия/отсутствия Интернет, тем более что в последние месяцы у нас в городе практикуется периодическое его отключение или замедление (Интернет и wi-fi только как бонус в управлении). Во-вторых, я не хочу держать постоянно включенными узкоспециализированные шлюзы и компьютеры, и так хватает устройств, которые включены постоянно. В-третьих, для меня очень важны надежность и гарантия, больше чем цена. У меня сами по себе перестали функционировать две розетки SmartPlug от Хiaomi и я не смог их починить. Пришлось выбросить. Вышедшие из строя силовой блок и таймер для санузлов в Ноотехнике мне просто поменяли на новые, не уточняя кончилась ли гарантия и не спрашивая при каких условиях они перестали работать (при проведении экспериментов бывает всякое). Это Lifetime warranty в том виде, в котором она мне нравится. Ну и в-четвертых, дополнять уже работающую и хорошо зарекомендовавшую себя систему, проще и легче чем городить что-то другое.

Сейчас уже вовсю используется новое поколение NooLiteF с обратной связью и шифрованием, но для пользователя мало что поменялось, монтаж, привязка и отвязка такие же простые, надежность тоже вроде на высоте. А обратная связь, прошивка "по воздуху" и возможность считать состояние устройства это бонус, кому-то нужный, кому-то нет.

Вроде все хорошо, но сейчас мне уже хочется, как дополнительную опцию, иметь иногда возможность управления NooLite через Интернет. Такая опция у Ноотехники есть. И даже существуют приложения для смартфонов под Android и iOS. Но для этого нужно докупать Интернет-шлюз PRF-64 или контроллер PR-1132, которые стоят больше $100 и должны быть все время включены. Это еще одно постоянно включенное в розетку устройство с весьма узкими возможностями. А с появлением дома умной колонки с голосовым помощником Алиса, захотелось "подружить" Алису с NooLite.

Раз хочется сделаем. Для начала я забил в поиск Гугла " NooLite и Алиса". Зачем изобретать велосипед, вдруг уже давно все решено? И да, мне выдало несколько уже готовых решений, но все они показались мне излишне сложными. Вот например:

На Хабре есть статья "Обход noolite роутера через mtrf64+esp8266+MQTT Buddy Android app".

Там сказано что модуль mtrf64 подключен по UART к esp8266, которая в свою очередь выходит в интернет через ваш роутер и подключается к MQTT бесплатному брокеру. Вы, как пользователь, через мобильное приложение так же подключаетесь к этому облачному брокеру и начинаете посылать команды в MQTT каналы, которые в свою очередь разбираются на лету и в зависимости от команды передаются по UART MTRF64 модулю. Проблему управления через Интернет без дорогостоящего и узкоспециализированного интернет-шлюза от Ноотехники это решает. Но "бесплатный облачный брокер" в связке с ESP8266 почему-то не вселяет в меня уверенности в надежности. Да и голосовое управление прицепить будет непросто (или невозможно?). А значит мне не подходит.

Второе решение реализовано через цепочку навык "Домовенок Кузя"-IFTTT-IHC-шлюз Broadlink (то есть все равно покупка шлюза)-NooLite.

Перспектива регистрации на всех этих сайтах и прописывания настроек меня как-то не воодушевила. Надежность работы такой дли-и-и-нной цепочки тоже не внушает мне доверия. Да и задержка исполнения 3 сек. и более напрягает. Хочется более простого и изящного решения без такой длинной цепочки.

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

  1. Колонка IRBIS с голосовым помощником Алиса.

  2. Несколько силовых блоков первой серии без обратной связи.

  3. Модули MT1132 и MTRF-64 для управления NooLite и NooLite-F c помощью контроллеров.

  4. Несколько плат Arduino.

Не густо. Логическая цепочка не просматривалась до тех пор пока мне на глаза не попал умный пульт Яндекса. И сразу все встало на свои места. Яндекс напрямую работает со своим пультом, а тот умеет записывать любой ИК-сигнал и передавать его по команде. К Arduino подключены ИК-приемник и модуль управления системой NooLite. По-моему, гениально проще некуда. Умный пульт от Яндекса стоит меньше чем $20 и это устройство универсальное, может использоваться для управления другой техникой (кондиционер, телевизор, ресивер и т.п.), а значит покупка его не бессмысленна. Вероятно, точно также будет работать и универсальный пульт от Tuya, который стоит еще дешевле, но после знакомства с умной колонкой IRBIS (звук и микрофоны у нее довольно посредственные а часть сервисов Яндекса не работает) я убедился что лучше заплатить дороже но взять оригинал, есть вероятность что будет выше качество и меньше глюков. Поэтому пульт выбрал оригинальный от Яндекс, не хочется взять стороннее решение, сэкономить пару долларов и узнать что снова часть функций не работает.

Теперь о модулях управления NooLite. У меня в наличии есть несколько вариантов модулей, которые можно подключить к контроллеру (Arduino).

О модулях MTRF-64 и MTRF-64-USB

По сути MTRF-64 и MTRF-64-USB это одно и то же. Просто у MTRF-64 незапаяна часть деталей и отсутствует корпус и USB разъем, но присутствуют пины.

Модуль MTRF-64, как видно из названия, 64 канальный, может отправлять команды старой системе без обратной связи и отправлять команды и принимать ответ новой системе с шифрованием и обратной связью.

MTRF-64MTRF-64

Технически сделано так, что именно с Arduino MTRF-64 использовать неудобно. Arduino запитывается напряжением 5В а MTRF-64 - 3,3В. Потребуется отдельное питание (на плате не запаян стабилизатор питания 3,3В, хотя место под него есть), отстутствует согласование уровней UART (это ведь не сложно предусмотреть и пара транзисторов практически не увеличила бы цену модуля).

MTRF-64-USB то же самое с запаянной на плате микросхемой переходника USB-UART и еще кое-какими деталями.

MTRF-64-USBMTRF-64-USB

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

Казалось бы, отличная вещь, позволяющая упростить и ускорить процесс отладки проектов. Подключил в USB, посылай из терминала в COM порт последовательности... Но у меня так сделать не получилось. В техдокументации на контроллер такая возможность тоже не описана. Чтобы работать с контроллером есть специальная программа nooLite_ONE. Ее можно скачать с сайта Ноотехники. Но это если найдете, потому что со страницы самого контроллера ссылки на нее на данный момент нет.

Теперь про саму программу. Я не знаю кто ее написал, но она ужасна. Внешний вид и цветовые решения наверняка вызовут у больного эпилепсией приступ. Внутри - куча несуразностей. Такое чувство что просто взяли сервисную программу, которой пользовались разработчики и сообщения которой нужны и понятны только им и прилепили сверху малоинформативную и путаную часть для обычных пользователей. Может поэтому нумерация каналов в "лоховской" части начинается с единицы а в сервисной "профи" с нуля? Да, программой можно кое-как пользоваться приловчившись, но если вы думаете что она поможет вам при написании своей программы, подскажет код отправки контроллеру и посчитает контрольную сумму, то нет.

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

Про программу nooLite_ONE и ее недостатки можно написать много, но лучше от этого она не станет и смысла в ее существовании не прибавится, поэтому не буду больше тратить на это время.

Мысли вслух и хотелки...

Мне вообще непонятен смысл существования двух недомодулей MTRF-64 и MTRF-64-USB. Зачем плодить сущности? Гораздо больше смысла было бы производить и продавать одну полную версию со всеми запаянными деталями и USB-разъемом, пинами и корпусом в комплекте и любой человек, приобретя его, смог бы использовать его по своему усмотрению без "допиливания".

Помечтаем:

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

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

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

Теперь про более старые версии контроллеров (уже сняты с производства).

О модулях MТ1132 и МР1132

MТ1132 - 32 канальный, может только отправлять команды системе без обратной связи.

MT-1132MT-1132

Питание 3 ... 5В, к Arduino подключается напрямую, ничего согласовывать не нужно. Управление модулем осуществляется через стандартный интерфейс UART. Скорость передачи данных - 9600 бит/сек., 8 бит данных, 1 стартовый бит, 1 столовый бит, бит четности - отсутствует. Передача от младшего к старшему биту. Для управления модулем необходимо передать через UART пакет из 12 байт. Описание отправляемых данных есть в техдокументации (не идеальной, но какая есть) к модулю.

МR-1132 - 32 канальный, может только принимать данные от датчиков NooLite.

MR-1132MR-1132

Чтение документации на модуль MTRF-64 и готовых библиотек навеяло на меня печаль. 64 канала для эксперимента мне не нужны, шифрование и обратная связь тоже, так как силовых блоков NooLiteF у меня нет, буду использовать те что были куплены ранее, без обратной связи, в частности SU-111-200. Поэтому выбор был сделан в пользу MT1132, пусть он уже снят с производства, но он у меня-то он есть в наличии. На том же принципе совсем несложно сделать и управление с шифрованием и обратной связью, было бы желание (просто вместо 12 байт, как для MT1132, отправлять 17 байт на MTRF-64).

Наверно основным плюсом для меня было то что на GitHub обнаружилась библиотека ardunoo для управления MT1132 с помощью Arduino от zhum (Сергей Жуматий), за что ему огромное спасибо! Эта библиотека сводит написание программы управления к нескольким строкам. А умеет библиотека все немало: привязывать и отвязывать силовые блоки, включать и выключать свет, записывать и исполнять сценарии, плавно менять яркость источника света.

В комплекте с библиотекой есть пример скетча с комментариями, который при запуске позволяет выполнять все эти действия вводя буквы в штатный Serial Monitor среды Arduino.

О грустном...

Вот если бы Ноотехника ВСЕ свои изделия сопровождала понятной документацией, примерами и библиотеками, как это сделал для них Сергей Жуматий...

Мало сделать отличное "железо", это "железо" нужно продать, убедив покупателя что купив NooLite он не встретит трудностей с внедрением и настройкой! Чтение документации на MTRF-64 и знакомство с программой nooLite_ONE меня в этом не убедили.

Что ж, определились, будем использовать модуль MT1132. Подключаем Arduino к модулю в соответствии со схемой из документации.

Я использовал контактную макетную плату с набором проводов, это очень ускоряет монтаж. TX модуля подключаем к 10 пину а RX к 11 пину Arduino. Для первых экспериментов взял свой "боевой" китайский клон UNO, уже паленый, с усиленным стабилизатором питания (от него же будет питаться и MT1132), когда все заработало заменил UNO на NANO, его удобно разместить прямо на макетной плате. Для приема команд нам понадобится IR приемник. У меня нашелся TSOP2836, если не ошибаюсь (пробовал и другие, разницы в работе особо не заметил, важно только соблюдать распиновку). Подключаем его в соответствии со схемой включения Vcc к 5В, GND к общему проводу а OUT к 2 пину Arduino.

Берем пример скетча из библиотеки ardunoo и исправляем в ней строку с выбором канала на котором будем работать с силовым блоком, выбираем 8-й канал.

 noo.channel(8);     // Let's command 2-th channel

Запускаем скетч, открываем Serial Monitor и введя в него букву "b" привязываем силовой блок. Теперь можно поиграться, вводя "n" зажигаем свет, "f" - гасим, "x"- меняем состояние и т.п. Убедились что все работет? Идем дальше.

Теперь нам понадобится стандартная библиотека IRremote. которая предназначена для упрощения работы с приёмом и передачей ИК сигналов. С помощью этой библиотеки будем принимать команды с пульта, и выводить их в окно Serial Monitor среды Arduino.

Берем любой IR-пульт (я взял от автомобильного трансмиттера).

Нажимая кнопки, в окне монитора последовательного порта видим соответствующие им коды, расшифрованные arduino. Я не знаю коды всех ли пультов сможет расшифровать библиотека IRremote, но всегда можно что-то подобрать, что по командам не будет пересекаться с устройствами в доме.

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

Вписываем коды выбранных кнопок для вызова функций noo.on(), noo.off() и noo.onoff(). При желании можно дописать другие функции и коды.

Проверяем работу от пульта. Свет включается, выключается и переключается, все как и было задумано. Также сохранилось управление, отправкой буквы в серийный порт (мне это не нужно, но не мешает).

Теперь переходим к управлению с помощью голосового помощника Алиса. Запускаем Яндекс, переходим в раздел устройства.

и выбираем Умный пульт Яндекс (его я установил раньше и планирую использовать и с другими устройствами, имеющими IR-порт). Нажимаем кнопку "Добавить устройство". Выбираем "Настроить вручную".

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

Дальше производим обучение пульта. Нажимаем "Добавить команду".

Задаем голосовую команду, выбирая из предложенных вариантов или пишем свою. Следуя подсказкам берем пульт.

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

Так последовательно записываем все команды для выбранных кнопок.

Теперь среди устройств появилось "На полке"

и пульт управления к нему из созданных команд.

Также есть вкладка "Голосовые команды" с подсказками.

Проверяем. Подаем команду из подсказки. Работает, задержки почти нет.

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

Но при желании Arduino и модуль МТ1132 можно разместить в пластиковый корпус, прозрачный для инфракрасных лучей. IR-приемник очень чувствительный а Яндекс-пульт посылает мощный сигнал, поэтому располагать пульт и приемник соосно в прямой видимости не понадобится. При необходимости можно будет добавить еще один или несколько IR-приемников подключив их или паралельно или каждый к отдельному пину Arduino. Но пока и так все работает отлично.

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

  1. компьютера через Serial Monitor;

  2. пульта от любой бытовой техники;

  3. пульта умного дома Яндекс;

  4. голосового помощника Алиса на смартфоне, компьютере или колонке.

Исходники

Ссылка на библиотеку ardunoo

Библиотека IRemote

Программа от zhum c моей вставкой:

/*Let you connect MT1132 to your arduino like this:+---------+               +------------+| MT1132  +-(RX)-----(11)-+ Tx Arduino ||         +-(TX)-----(10)-+ Rx         ||         |               |            |*/#include <SoftwareSerial.h>#include <ardunoo.h>#include <IRremote.h>#define RXpin 10#define TXpin 11IRrecv irrecv(2); // указываем вывод, к которому подключен приемникdecode_results results;ArduNoo noo(RXpin,TXpin);void setup(){  Serial.begin(9600);  irrecv.enableIRIn(); // запускаем прием  noo.channel(8);     // Let's command 8-th channel    // ...}void loop(){  int r;  r=Serial.read();  if(r<='9' && r>='0'){ // change channel    noo.channel(r-'0');    return;  }  switch(r){  case 'n': //on    noo.on();    break;  case 'f': //off    noo.off();    break;  case 'x': // toggle    noo.onoff();    break;  case 'c': //print current channel    Serial.print(noo.channel());    break;  case 'b': //bind    noo.bind();    break;  case 'u': //unbind    noo.unbind();    break;  case '+':    noo.slow_on();    break;  case '-':    noo.slow_off();    break;  case '!':    noo.slow_onoff();    break;  case 'r': // record scene!    noo.record_scene();    break;  case 'R': // run scene!    noo.run_scene();    break;  case 's': // toggle 3-rd channel    noo.onoff();    break;  }    if ( irrecv.decode( &results )) { // если данные пришли    Serial.println( results.value ); // печатаем данные в Serial Monitor    if (results.value == 16753245)  //код кнопки, выбранной для выключения   {           noo.off();    //выключаем свет        }    if (results.value == 16769565)  //код кнопки, выбранной для включения   {      noo.on(); //включаем свет           }   if (results.value == 16736925)  //код кнопки, выбранной для изменения состояния      {           noo.onoff();   //меняем текущее состояние света         }    irrecv.resume(); // принимаем следующую команду  }}

Если кому-нибудь понравится - пользуйтесь.

Подробнее..

Виртуальный аналитик будущее BI?

28.01.2021 12:17:06 | Автор: admin

Наверное, когда появились первые дашборды, это выглядело как магия. Не нужно больше ждать, пока кто-то подготовит отчёт, можно просто интерактивно работать с данными, хоть и в определенных рамках. А какой следующий шаг?

Представьте, что у вас есть контакт в телеграме, которому можно просто отправить голосовое сообщение типа: "Что у нас там с планом продаж в Казани?" или "Сколько мы потратили на смузи транспорт в прошлом месяце?" и он сразу пришлет ответ. Круто?

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

Итак, зачем, все-таки, нужен виртуальный аналитик?

Аналитики Gartner, например, считают1, что уже в ближайшие годы половина запросов к Business Intelligence системам будет сформулирована на естественном языке. Идея в том, что, если такая возможность будет, к анализу данных получат доступ кратно больше людей, чем сейчас. Я думаю, что по срокам они тут слишком оптимистичны, но за этим точно будущее и со временем NLQ (Natural Language Query) станет одним из основных интерфейсов исследования данных. Особенно, когда виртуальный аналитик сможет не только отвечать на вопрос "Что произошло?", но и наш любимый "Что делать?". Ну или, хотя бы, давать полезные советы.

У меня идея создания такого виртуального аналитика появилась давно, но получилось сделать рабочий вариант далеко не с первого раза. С момента создания компании в 2015 году примерно раз в год мы делали "подход к станку". Первые два подхода закончились плохо прототипы хорошо работали на заготовленных вопросах, но как только вопрос задавал неподготовленный человек, все сразу ломалось. В третий раз произошло что-то, похожее на волшебство не на все вопросы, не идеально, но прототип выдавал людям то, что им было нужно.

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

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

Таблица соответствия

Первая идея для ViTalk была достаточно простой. Чтобы запустить виртуального ассистента, можно просто сохранить конкретные фразы в таблице, чтобы в будущем передать на движок ViQube правильные запросы. Решение очевидное но и с очевидными недостатками.

Во-первых, баз данных может быть много даже у одного пользователя, что уж говорить об использовании системы разными клиентами? Неужели надо каждый раз перевбивать эти запросы? К тому же, как правило, человек не ограничивается одним запросом про прибыль. У руководителя может быть большой словарный запас, поэтому заранее внести все фразы в систему не получится.

Вторая проблема заключается в том, что один и тот же вопрос можно задать по-разному. Пользователь не будет запоминать, как именно сформулированы запросы, которые хранятся в базе. Даже такой простой вопрос как Прибыль сегодня можно задать, назвав конкретную дату или день недели. Очень часто пользователи (мы видим это при анализе логов) прибавляют к запросу наша компания, у нас, другие притяжательные местоимения. Слово прибыль можно вообще заменить на доходы, либо сформулировать вопрос в глагольной форме это естественно для человека, но создает кучу сложностей для таблицы, в которую будут записаны сопоставления.

Ключевые слова

Второй подход узнавать запросы по ключевым словам. Можно создать базу таких слов и сразу же искать внутри запроса ключевики, которые есть в нашей базе.

Но и этот подход чреват проблемами. Во-первых, для слов существуют синонимы: вместо KPI можно спросить про производительность, а рабочие дни - назвать буднями. Вариантов таких замен очень много, и прописать все возможные синонимы в базе не получается.

Ищем смыслы

Раз не получается искать по словам, мы будем искать по смыслам! В 2013 году была предложена успешная и очень эффективная реализация представления слов (words embeddings). Если вкратце, то каждому слову мы сопоставляем некоторый набор чисел. Если представить этот набор, как координаты, то слово оказывается точкой в n-мерном пространстве (часто используется 300-мерное). Сопоставление чисел происходит таким образом, чтобы между словами была связь: чем вероятнее соответствующим словам встретиться в одном контексте, тем ближе будут точки в пространстве. Например, король и Луи должны быть рядом друг с другом, хотя бы из-за песни про Луи II. А слова барбекю или автоматизация, естественно, должны быть подальше, потому что встретить их в одном контексте маловероятно.

С тех пор как word2vec (эффективную модель для получения таких представлений) была предложена чешским аспирантом Томашем Миколовым, эмбеддинги получили широкое распространение и начали создаваться не только для английского, но и для других языков и их сочетаний.

Самое замечательное, что некоторые операции с полученными наборами чисел имеют смысл с точки зрения смысла слов!

Например, что будет, если мы от Лондона отнимем Англию и прибавим Россию? Этот пример почти всегда приводят на лекциях по NLP. Лондон относится к Англии в отношении столица страна. Логично, что после выполнения действий получится Страна, столица страны Россия. Как мы помним, это Москва. Если мы проделаем те же самые операции с векторами, соответствующим словам, у нас действительно получится что-то похожее на Москву это точка, ближе всего к которой находится именно Москва.

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

Не только смысл, но и вид

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

Кроме этого, есть такие сущности, которые просто не могут быть в одном запросе. Например, там, где есть рабочие дни, у нас нет отдельного показателя KPI, то есть для рабочих дней KPI не определен. Но есть KPI для рабочих цеха. Что делать при неправильном запросе? Возможно, пользователь ошибся, и логично предложить ему ответ про рабочих цеха? Эти факторы должны быть учтены при поиске значений.

Вероятности

В итоге в качестве первого решения мы выбрали простую вероятностную модель, которая сопоставляла каждому из вариантов запроса некоторую вероятность, что пользователь имел в виду именно это. На вероятность влияло очень много факторов находятся ли эти термины в одной группе? Пересекаются ли сущности в предложении по своим частям или нет? Однако, выбирать тот вариант, который наиболее вероятен, тоже не оказалось идеальным решением..

Вот замечательный пример, который убил много сил и нервов: План по прибыли и обороту.

В базе данных, с которой мы работали в тот момент, были такие сущности, как план по прибыли, план по обороту, а также прибыль и оборот по отдельности. Понятно, что любой разумный человек может однозначно сказать, что имеется в виду в фразе план по прибыли и обороту просто пользователь для лаконичности свернул два запроса в одно выражение. Но как объяснить это ViTalk, который реально пытается на такой запрос ответить?

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

Свой метод перевода

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

Взять, например, GPT-3 от OpenAI, которая шокирует всех своими потрясающими сгенерированными текстами. Почему не воспользоваться чем-то похожим? Дело в том, что подход GPT-3 требует много ресурсов, а пользователю хочется быстро получить ответ на свой вопрос (не имея, как правило, больших вычислительных мощностей). К тому же, пока качество работы решений для русского языка не очень высокое (сначала все обкатывается на английском, и только потом очередь доходит до других языков).

Есть и третья проблема использования GPT-3 и подобных решений. Она заключается в том, что для дообучения системы требуется большая выборка. Но базы наших клиентов разнообразны, их много, а история обращения не такая большая.К тому же всё это может не учитывать потребности клиентов, которые в своем лексиконе используют много жаргонизмов, характерных для конкретной компании. Часто какой-то термин используется именно здесь и именно так. Соответственно, распознавание запросов требует дообучения, а выполнить мы его не можем из-за отсутствия достаточной выборки. Так что вероятностная модель своя и, тем более, уже адаптированная, оказывается лучше.

Адаптация под клиента

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

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

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

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

Неопределенности и относительные даты

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

Но даже при всем этом в запросах по-прежнему остается масса неопределенностей. Например, пользователь может и не помнить, что у него в базе есть несколько сущностей с одинаковыми названиями. В таком случае ассистент не может корректно ответить на запрос в принципе. Часто встречается ситуация, когда календарь хранится в разных понятиях: дата доставки, дата продажи, дата производства. И когда человек спрашивает: покажи нам прибыль в 2018 году, нужно, чтобы ViTalk задал уточняющий вопрос. Выделить те ситуации, когда мы должны не просто отсечь одну сущность, а задать вопрос, было непросто.

На практике часто бывает так, что сущности оказываются составными. Например, крупная категория Бакалея, сахар, соль может сопровождаться подкатегориями Бакалея, Сахар, Соль, которые существуют по отдельности. В таких случаях мы начали уточнять, что именно хочет узнать пользователь данные по всей категории или получить информацию по подкатегориям? Сейчас ViTalk уже стал достаточно умным, чтобы не проявлять лишнюю самодеятельность и задавать вопросы в неопределенных ситуациях.

Выбор метода визуализации

На вебинаре, посвященном ViTalk, мы показывали, что ассистент может по-разному показывать результаты своей работы. Иногда он выдаёт ответ текстом, бывают диаграммы и линейные графики. И в каждом случае есть свои предпочтения. Например, в запросе динамика по прибыли по месяцам, все, конечно, хотят увидеть не столбчатую диаграмму, а линейный график ведь на нем как раз видно динамику. Поэтому в ViTalk мы зашили некоторые паттерны представлений разных категорий данных.

Например, проанализировав стандартные аналитические паттерны, посмотрев логи, мы пришли к выводу, что чаще всего наших пользователей интересует сравнение, сопоставление или топ каких-то показателей. Часто хотят увидеть ТОП лучших сотрудников, ТОП продаваемых товаров, а также динамику этих изменений.

Чтобы удовлетворить эти запросы, нам пришлось реализовать подсветку дополнительных параметров. При отработке запросов на сравнение он показывает несколько столбцов, явно подчёркивая разницу, а при демонстрации ТОПов выделяет самые-самые результаты. Для динамики у нас всегда линейный график. А когда мы делаем запрос кто у нас самый эффективный сотрудник, результат будет в виде текста и числа с KPI.

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

И в заключение...

Интересно, что многие серьезные зарубежные конкуренты, тоже сделавшие своих виртуальных ассистентов, например, Qlik Insights Bot, Power BI Q&A, Tableau AskData, выбрали принципиально другой подход. В их решениях пользователь получает подсказки по мере ввода запроса, то есть система помогает ему (и принуждает) писать что-то похожее на SQL-запрос, но на естественном языке. Это делает процесс более предсказуемым, но зато не позволяет обрабатывать честные плохо сформулированные "человеческие" запросы и, по очевидным причинам, голосовые сообщения. Какой подход окажется лучше, покажет время.

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

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

Примеры работы с ViTalkПримеры работы с ViTalk

Ну а пообщаться с ViTalk можно в публичном демо-боте в Telegram - @vitalk_public_bot. Будем благодарны за любую обратную связь, критику и предложения!

P.S. Хочу выразить огромный респект нашей команде Data Science в лице Екатерины Дмитриевой, Борислава Полякова и Ивана Лазаревского, которые подготовили контент для технической части этой статьи и являются её соавторами.

Ссылки:

  1. GartnerMagic Quadrant for Analytics and Business Intelligence Platforms

Подробнее..

Простейший голосовой помощник на Python

02.10.2020 14:18:50 | Автор: admin


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

Для начала объявим необходимые нам библиотеки:

import speech_recognition as srimport osimport sysimport webbrowserimport pyttsx3 as pfrom datetime import datetimeimport timeimport datetimeimport random

Также не забудем вести лог файл, который понадобится нам, если же мы все-таки решим улучшить бота для работы с нейронной сетью. Многие компании использую нейронную сеть в своих голосовых помощниках для понимания эмоций клиента и соответствующего реагирования на них.

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

#Создаем логchat_log = [['SESSION_ID', 'DATE', 'AUTHOR', 'TEXT', 'AUDIO_NUM']]#Узнаем номер сессииi = 1exit = 0while exit == 0:    session_id = str(i)    if session_id not in os.listdir():        os.mkdir(session_id)        exit = 1    else:        i = i + 1#Первое сообщение пишет botauthor = 'Bot'text = 'Привет! Чем я могу вам помочь?'

В лог файл мы записываем время сообщения, автора (бот или пользователь) и собственно сам сказанный текст.

#Добавляем данные к логу с помощью этой процедурыdef log_me(author, text, audio):     now = datetime.datetime.now()    i = 1    exit = 0    while exit == 0:        audio_num = str(i)+'.wav'        if audio_num not in os.listdir(session_id):            exit = 1        else:            i = i + 1    os.chdir(session_id)    with open(audio_num , "wb") as file:        file.write(audio.get_wav_data())    chat_log.append([now.strftime("%Y-%m-%d %H:%M:%S"), author, text, audio_num])

Выводим первое сообщение за авторством бота: Привет! Чем я могу вам помочь?

# Выводим первое сообщение на экран и записываем в лог    print("Bot: "+ text)log_me(author, text, audio)

А с помощью такой процедуры в Jupyter Notebook мы можем озвучить через устройство воспроизведения, настроенное по умолчанию, сказанные слова:

#Произношение wordsdef talk(words):    engine.say(words)    engine.runAndWait()

Как озвучивать текст мы рассмотрели выше, но как же мы свой голос сможем превратить в текст? Тут нам поможет распознавание речи от Google и некоторые манипуляции с микрофоном.

#Настройка микрофона    def command():    rec = sr.Recognizer()    with sr.Microphone() as source:        #Бот ожидает нашего голоса        print('Bot: ...')        #Небольшая задержка в записи        rec.pause_threshold = 1        #Удаление фонового шума с записи        rec.adjust_for_ambient_noise(source, duration=1)        audio = rec.listen(source)    try:        #Распознание теста с помощью сервиса GOOGLE        text = rec.recognize_google(audio, language="ru-RU").lower()        #Вывод сказанного текста на экран        print('Вы:  ' + text[0].upper() + text[1:])        log_me('User', text, audio)    #Если не распознался тест из аудио    except sr.UnknownValueError:        text = 'Не понимаю. Повторите.'        print('Bot: ' + text)        talk(text)        #Начинаем заново слушать        text = command()        log_me('Bot', text, , Null)    return text

Что может сделать наш помощник кроме того, чтобы нас слушать? Все ограничено нашей фантазией! Рассмотрим несколько интересный примеров.

Начнем с простого, пусть при команде открыть сайт он откроет сайт (не ожидали?).

#Тут расписаны действия, которые будут выполнятся при наличии некоторых словосочетанийdef makeSomething(text):    if 'открой сайт' in text:        print('Bot: Открываю сайт NewTechAudit.')        talk('Открываю сайт NewTechAudit.')        log_me('Bot','Открываю сайт NewTechAudit.', Null)        webbrowser.open('https://newtechaudit.ru/')

Иногда полезно послушать свои слова, да чужими устами. Пусть бот еще умеет и повторять за нами:

#Повторение фразы пользователя    elif 'произнеси' in text or 'скажи' in text or 'повтори' in text:        print('Bot: ' + text[10].upper() + text[11:])        talk(text[10:])        log_me('Bot', text[10].upper() + text[11:] , Null)

Пусть еще и собеседником будет, но начнем мы пока только со знакомства:

#Ответ на вопрос    elif 'своё имя' in text or 'как тебя зовут' in text or 'назови себя' in text:        print('Bot: Меня зовут Bot.')        talk('Меня зовут Bot')        log_me('Bot', 'Меня зовут Bot', Null)

Мы также можем попросить голосового помощника назвать случайное число в выбранных нами пределах в формате: Назови случайное число от (1ое число) до (2ое число).

#Определение случайного числа    elif 'случайное число' in text:        ot=text.find('от')        do=text.find('до')        f_num=int(text[ot+3:do-1])        l_num=int(text[do+3:])        r=str(random.randint(f_num, l_num))        print('Bot: ' + r)        talk(r)        log_me('Bot', r, Null)

Для того, чтобы завершить программу, достаточно только попрощаться с ботом:

#Завершение программы    elif 'пока' in text or 'до свидания' in text:        print('Bot: До свидания!')        talk('До свидания')        log_me('Bot', 'Конец сессии', Null)        os.chdir(session_id)        log_file = open( session_id + ".txt", "w")        for row in chat_log:            np.savetxt(log_file, row)        log_file.close()        sys.exit()

А чтобы все это работало беспрерывно, мы создаем бесконечный цикл.

#Бесконечный цикл для работыwhile True:    makeSomething(command())

Проведем тестовый диалог:



В созданной папке-сессии хранятся все файлы-аудиозаписи нашего голоса и текстовый лог-файл:



В текстовый лог-файл записывается:



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

Этот бот может стать основой для вашего собственного Джарвиса!
Подробнее..

Наш опыт работы с DeepPavlov голосовой помощник за 20 дней и приём 5000 звонков на горячей линии

21.07.2020 16:21:44 | Автор: admin
Когда объявили режим самоизоляции, на горячую линию по коронавирусу в Татарстане поступало множество вопросов от жителей. Чтобы разгрузить операторов коллцентра, мы в Центре Цифровой Трансформации республики вместе с уполномоченным по ИИ в Татарстане разработали голосового помощника, который отвечал на несложные вопросы.



Для приема звонков мы использовали платформу Voximplant, а для распознавания вопросов и ответов DeepPavlov. Голосового помощника получилось запустить за две с половиной недели, и он помог обработать 5000 звонков. У нас получилось выкатить продукт, который помогал жителям Татарстана получать достоверную информацию от властей, да и просто выходить на улицу. Ниже расскажем, как мы это делали.

Какая задача стояла


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

Немного предыстории. 1 апреля в Татарстане ввели систему СМС-пропусков: чтобы выйти на улицу, нужно было отправить СМС на короткий номер с паспортными данными и указанием номера цели. Сначала целей было пять: доставка несовершеннолетних в образовательные организации, участие в похоронах, выезд на дачу, доставка лекарств и продуктов и изменение места проживания. Цели постепенно добавлялись и на последнем этапе их стало уже 12.

Через неделю после запуска мы прикрутили к Лилии возможность получения цифрового пропуска. Татарстан стал первым регионом, в котором можно было получить цифровой пропуск посредством голоса. Лилия умела определять цель, исходя из контекста. Например, человек говорит, что он хочет подстричься, и Лилия определяет соответствующий номер цели Поход в парикмахерскую
.


Кроме оформления цифровых пропусков, Лилия должна была отвечать на вопросы татарстанцев. Мы задумывали голосового помощника, который бы отвечал на распространенные вопросы, вроде Что нужно сделать чтобы получить пропуск и Помогает ли имбирь от коронавируса.

Для решения этой задачи мы могли бы сделать и обычный IVR. Но IVR долго, и если делать нормально, то нужно закладывать сложную архитектуру. В общем, времени на это не было. Мы подумали, что сделать голосового помощника (который умеет переводить речь в текст, обрабатывать его, классифицировать интенты и выдавать голосовой ответ) проще. Хе-хе.

Как это выглядит со стороны пользователя


Тут все просто.

  1. Человек звонит на горячую линию, ему предлагают выбрать между разговором с оператором и Лилией. На любом этапе можно переключиться на живого оператора.
  2. Лилия предлагает озвучить свой вопрос и человек его задает.
  3. Лилия отвечает и спрашивает, смогла ли она ответить на вопрос. Если ответ нерелевантный или Лилия не знает ответа на этот вопрос, то она просит его повторить или сформулировать по-другому.



Как обрабатываются звонки


Для приема звонков и реализации сценариев использовали платформу Voximplant: написали скрипт и подключали сигнал автоответчика. Лилия приветствовала человека и спрашивала, чего он хочет.

Звонящий задает вопрос по телефону. Затем Лилия начинала слушать. У VoxImplant мы использовали модуль ASR для перевода речи в текст, он под капотом вызывает модель Yandex.SpeechKit. Таким образом, аудиопоток переводится в текст, который потом проходит токенизацию и стемминг. Мы попробовали также извлекать признаки: NER, POS и Chunk для базовых методов ML, но все это занимало очень много времени.



Например, изначально, из вопроса Скажите, пожалуйста, как защититься от коронавируса мы стеммим защит и коронавирус и преобразуем их в векторное представление. Векторное представление сущностей попадает в классификатор по вопросам коронавируса (а позже и госуслуг). Теперь всем этим занимается DeepPavlov.

Дальше возможно несколько вариантов в зависимости от уровня уверенности (confidence):

  1. Если сеть классифицировала вопрос с достаточным confidence (исходя из исследования пороги подбирались индивидуально, поклассово), то Лилия даст ответ на вопрос.
  2. Если у сети малый confidence ответа, мы предполагаем, что это вопрос который мы не охватили в рамках нашего датасета (но вопрос при этом всё ещё относится к домену коронавируса) или человеку просто захотелось поговорить на другую тему. Например, спросил Кто такой Илон Маск.

Для таких вопросов мы использовали обученную на дампе Википедии модель BERT для задачи knowledge base question answering.

В конце Лилия обязательно верифицирует корректность распознавания интента и качество ответа, спросив: Ответила ли я на ваш вопрос?. Если пользователь ответит да, то Лилия будет ждать следующего вопроса. Если нет, то мы попросим переформулировать вопрос и пройдем весь цикл заново. Бывает так, что это не получается. Тогда в бой вступают живые операторы.

Сейчас Лилия говорит приятным голоском синтезатора речи от Яндекса мы немного поменяли тональность и увеличили скорость. Иногда Лилия путает ударения, но это можно исправить с помощью разметки. Конечно, хотелось бы добавить татарский, но пока это сложно.

Суммарно проект занял две с половиной недели с учетом датасетов: возникла идея, обсудили проект с министром и, как говорят у нас, алга. Неделя ушла на прикидку и исследование, еще дней 10 заняла разработка, затем мы дорабатывали и прикручивали дополнительные функции. Основными лошадками были Nvidia RTX2070. Для BERT'ов требовалось около 12-16 ГБ видеопамяти.

От LSVM и catboost до DeepPavlov


В процессе разработки мы использовали разные модели классификаторов. Сначала мы попробовали такие модели машинного обучения, как random forest, LSVM, catboost, logreg. Вообще точность моделей машинного обучения была не очень высокой. Почему так? Потому что многие вопросы пользователей очень похожи друг на друга: вопрос у меня ребенок заболел коронавирусом что делать достаточно похож на вопрос можно ли гулять с ребенком во время коронавируса, хотя это разные категории и требуются разные ответы.

Мы могли бы заняться извлечением сущностей, увеличением выборки, исследования. Но мы торопились. Поэтому мы решили использовать в работе библиотеку DeepPavlov от МФТИ, давшую точность 78% с логистической регрессией и BERT 84%.



Точность ответов зависит от разметки датасетов. У нас был список из 200 вопросов, которые люди задают на горячей линии, но они были неправильно разделены. Например, люди спрашивали, что делать, если у них заболел кто-то из родственников, и был вопрос, какие симптомы у коронавируса. Модели ML путались.

Результаты и планы на будущее


Лилия проработала 2 недели и обработала 5000 звонков. За это время Лилия существенно облегчила работу операторам горячей линии им не приходилось отвечать на банальные и повторяющиеся вопросы. Благодаря Лилии пользователи получали пропуска, ответы на вопросы и просто разговаривали. Конечно, были пользователи, которые ругались на нее и просили перевести на оператора.

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

Мы министерство, и у нас, по факту, две задачи: чтобы другие ведомства нормально пользовались технологиями и чтобы жители Татарстана могли легко и просто коммуницировать с государством. Со второй задачей прекрасно справляется портал госуслуг наш, местный, а не федеральный. Но этот портал сайт и приложение, до которых некоторым добраться все-таки тяжело. А если жители не идут на портал, то портал пойдет к жителю, то есть мы движемся в сторону того, чтобы упростить взаимодействие с порталом людей, которые не особо пользуются интернетом.

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

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

Если вам было бы интересно поучить Лилию, велком в нашу команду.
Подробнее..

Яндекс научил Алису принимать платежи за онлайн-покупки. Девочка созрела?

31.05.2021 16:13:25 | Автор: admin

"Яндекс" с каждым днем делает все более интересные (заметьте, мы не рискуем говорить - уверенные) шаги в сторону развития своих торговых платформ. И все чаще напоминает собой российский Amazon замедленного действия.

А еще "Яндекс" как настоящий родитель. Холит, лелеет и иногда не справляется со своей дочерью. Она показывает характер, замыкается в себе, но, стоит отдать должное, не грубит. И вот настал светлый час, дочка созрела и родители доверили ей первые карманные деньги. Точнее научили ими пользоваться, а вот сами деньги, конечно, "Алиса" будет брать у покупателей. Это хоть и робкий, но серьезный шаг. Учитывая, что "Яндекс" изо всех сил вытащить свой Маркет на передовую, новая функция может ему в этом помощь. В будущем.

Что добавили и как работает?

Компания заявила, что меню голосового помощника впервые дополнилось функцией покупки. Пока речь идет только о книгах и совместном проекте "Яндекса" и "ЛитРес". Выглядит все так: пользователь должен подать голосовую команду "Алиса, купи эту книгу" или "Оплати "ЛитРес". Сама "Алиса" провести платеж не сможет. Уверены, к счастью. После пользовательского запроса она отправляет push-уведомление для подтверждения платежа. Работать вся эта "магия" должна на Яндекс.Станции, Станции Мини и Станции Макс.

"ЛитРес" рад сотрудничеству, хотя и без него у компании все отлично. По итогам прошлого года емкость рынка аудиокниг в России выросла на 44%. При этом навыком "Аудиокниги ЛитРес" с момента его бета-тестирования воспольховался каждый десятый владелец станции от "Яндекс", а это более 100 000 человек.

Ради чего это все?

Следующим этапом "Алису" хотят научить давать рекомендации о том какую книгу лучше всего купить. Думаем, что это отличная возможность для развитие еще одного рекламного канала. Только представьте, умные устройства смогут таргетироваться на пользователей и нативно (хотя кто его знает) рассказывать им о товарах, которые решат продвигать сами продавцы.

При этом сами компании говорят о том, что оплата аудиокниг - шаг к созданию на базе голосового помощника маркетплейса товаров и услуг. Нам это видится как тесная интеграция "Алисы" и "Яндекс.Маркет". Вопрос что мы сможем получить от новых навыков?

Пока что все это выглядит как робкий и неуверенный шаг. Яндекс словно и сам переживает, что доверил Алисе право распоряжаться покупками клиентов. Но без этого никуда. И очевидно, что свой куш компания все равно сорвет. Как заявляет сам "Яндекс" в январе-июле 2020 года продажи портативной акустики и "умных" колонок в Россиивырослина 31% до 1,3 млн штук. Как минимум, владельцы станций - это уже немаленькая аудитория говорящего маркетплейса.

Правда продаётся?

Мало ли что говорит официальная статистика. Мы решили проверить как дела с продажами умных устройств Яндекса обстоят на самом деле в 2021 году. С помощью сервиса внешней аналитики маркетплейсов SellerFox мы собрали данные о спросе и выручке всех моделей Яндекс.Станции с января по мая этого года. А вдруг умные колонки и вовсе не покупают, а навыки "Алисы" лишь способ для привлечения внимания?

На Wildberries за 5 месяцев было продано более 8 тысяч колонок. Самые популярные модели - версии Мини. Видимо на это влияет низкая стоимость устройств. Общее количество продаж таких колонок всех цветов 3 341 штук за первые пять месяцев 2021 года. Станция.Макси - самая дорогая модель колонки от Яндекса и самая непопулярная. По крайней мере, на Wb.

Объем продаж, выручки и средняя стоимость товаров на маркептлейсе Wildberries с 01.01 - 31.05.2021, данные сервиса аналитики SellerFoxОбъем продаж, выручки и средняя стоимость товаров на маркептлейсе Wildberries с 01.01 - 31.05.2021, данные сервиса аналитики SellerFox

На Ozon устройства Яндекс с голосовыми помощниками продавались в первом полугодии гораздо веселее. С января по май покупатели заказали здесь больше 22 000 колонок. Тут в топ тоже выбились "Мини". Далеко в отстающих их старшие братья. А вот максимально продвинутая колонка "Макси" продалась за первые 5 месяцев года вообще в 7 раз хуже лидера.

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

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

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru