[Приложение] Sound Direct Manager

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

Модератор: immortal

Аватара пользователя
sergejey
Site Admin
Сообщения: 4286
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 76 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Sound Direct Manager

Сообщение sergejey » Пт апр 15, 2016 4:16 pm

Bagir писал(а):Кстати, раз уж речь зашла о шлюзе сообщений и о планшетах. Кто знает как отправить звук на андроид устройство по локальной сети?
Я вижу только два варианта. Это страница МД, которая в любом случает запущена на этом планшете, либо сторонняя программа, которая слушает порт.
Вариант со сторонней программой уже реализован -- у программы MajorDroid есть API, которое позволяет отправлять как ссылку на файл для проигрывания, так и просто текст, который планшет воспроизведёт средствами Google TTS.

Что касается процедуры say в целом -- да, она несколько устарела, т.к. в ней нельзя указать куда именно должно отправиться сообщение, что необходимо. У меня самого помимо общего канала оповещения есть отдельные планшеты, которые могут воспроизводить фразы (про API выше) и я бы хотел иметь возможность указывать, на какое устройство отправлять сообщение. Я к тому, что этот вопрос пока в стадии "обдумывания" как лучше и в ближайшее время планирую, что в добавлению к say появится парочка новый функций, что-то вроде sayTo (с адресацией) и sayReply (с авто-адресацией)

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Аватара пользователя
Bagir
Сообщения: 1615
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

Re: Sound Direct Manager

Сообщение Bagir » Пт апр 15, 2016 11:15 pm

Да, точно! У MajorDroid что то было. Буду опять пробовать. Последний раз, когда я смотрел MajorDroid, там не отображались мои элементы сцен на CSS. Поэтому остался на Хроме в полный экран. Буду дружиться с MajorDroid ещё раз ))
Буду ждать реализации новой функции say. А потом и перепишу свой сценарий для хука на новый лад.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
redmax144
Сообщения: 44
Зарегистрирован: Чт янв 28, 2016 8:18 pm
Благодарил (а): 13 раз
Поблагодарили: 5 раз

Re: Sound Direct Manager

Сообщение redmax144 » Вс апр 17, 2016 5:51 pm

И снова мне понадобилась ваша помощь:)

Программа работает стабильно, всё очень нравится. Рассказываю о ситуации:
На кухню выведен третий канал акустики и стоит терминал на базе андроид телефона. Если на терминале распознаётся лицо, то скрипт "facedetection"
facedetectionПоказать
$ip=$_SERVER['REMOTE_ADDR'];//узнаем IP терминала пославшего запрос
if ($ip == "192.168.0.105") {

$total=(int)$params['faces'];
if ($total>0) {
DebMes("Faces detected at $ip ($total)");
$last_register=(int)registeredEventTime('facedetect'.$ip);
if ((time()-$last_register)>5*60) { //не чаще чем раз в 5 минут
registerEvent('facedetect'.$ip,$total,1);
say("-recognizeid:3 Я слушаю вас",3);
}
}
}
проговаривает в третьем канале текст "Я слушаю вас". И затем запускает распознавание для дальнейших указаний.

Вариант первый - использование микрофона сервера...

К примеру говорю: "включи музыку". Алиса задаёт уточняющий вопрос: "Где именно?". И я даю ответ: "Из домашней коллекции". Вот как это выглядит в программе:
СпойлерПоказать
17:13:33 Секундочку
17:13:31 Ответ: id=1 из домашней коллекции 89%
17:13:30 Расспознавание id=1
17:13:30 Конвертирую во flac id=1
17:13:26 Какую именно?
17:13:26 Начало записи id=1
17:13:23 Ответ: id=3 Включи музыку 91%
17:13:22 Расспознавание id=3
17:13:22 Конвертирую во flac id=3
17:13:18 Я слушаю вас
17:13:18 Начало записи id=3
Кусочек кода из шаблона "включи музыку"
СпойлерПоказать
if (preg_match('/включи/uis',$original)) {
say('-recognizeid:'.context_getuser().' Какую именно?');
Проблема в том, что SDM не поддерживает контекст, и все остальные ответы озвучивает в канале по умолчанию, а не в третьем, который находится на кухне.

Вариант второй - использование микрофона приложения MojorDroid.
В таком случае вид скрипта "facedetection" будет иметь следующий вид:
facedetectionПоказать
$ip=$_SERVER['REMOTE_ADDR'];//узнаем IP терминала пославшего запрос
if ($ip == "192.168.0.105") {

$total=(int)$params['faces'];
if ($total>0) {
DebMes("Faces detected at $ip ($total)");
$last_register=(int)registeredEventTime('facedetect'.$ip);
if ((time()-$last_register)>5*60) { //не чаще чем раз в 5 минут
registerEvent('facedetect'.$ip,$total,1);
say("Я слушаю вас",3);
setTimeOut("canihelp","runScript('AutoRemoteMessage',array('ip'=>'$ip','msg'=>'hi'));",4);
}
}
}
Но тут опять же все уточняющие вопросы воспроизводятся в канале по умолчанию... Не могу пока разобраться, как же заставить SDM продолжать диалог с тем же самым id, чтобы получать ответы в нужной комнате.
И как по нужному id отправлять звук в нужный -outputchannel

Заранее спасибо за разъяснения! :)
Аватара пользователя
Bagir
Сообщения: 1615
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

Re: Sound Direct Manager

Сообщение Bagir » Вс апр 17, 2016 6:11 pm

Заглянул на пару минут. Вечерком буду тут и обдумаю ситуацию. Но сразу могу сказать, что SDM сам не будет оставаться в каком либо контексте. Это просто инструмент не задуманный принимать какие либо решения самостоятельно. Вся логика должна быть у Алисы. Когда Алиса отправляет команду SDM начать запись, то в параметре -recognizeid:1 можно указать id задачи, который будет после распознавания возвращён в файл command.php в параметре user_id. Это можно использовать, чтобы понять на какой вопрос пришёл ответ.
Полный вид будет примерно такой:
command.php?qry=Текст&confidence=98&user_id=1
Где Текст это распознанный текст, 98 это процент вероятности распознавания, который ответил Гугл, 1 это id пользователя, от чьего имени в чате появится этот текст. Передавая в команде за начало записи нужный id, мы получим ответ от нужного пользователя. А в пользователей лично я занёс все комнаты и мобильные устройства.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
redmax144
Сообщения: 44
Зарегистрирован: Чт янв 28, 2016 8:18 pm
Благодарил (а): 13 раз
Поблагодарили: 5 раз

Re: Sound Direct Manager

Сообщение redmax144 » Вс апр 17, 2016 8:16 pm

Когда Алиса отправляет команду SDM начать запись, то в параметре -recognizeid:1 можно указать id задачи, который будет после распознавания возвращён в файл command.php в параметре user_id.
Ну вот я так и сделал в скрипте "facedetection"
СпойлерПоказать
$ip=$_SERVER['REMOTE_ADDR'];//узнаем IP терминала пославшего запрос
if ($ip == "192.168.0.105") {

$total=(int)$params['faces'];
if ($total>0) {
DebMes("Faces detected at $ip ($total)");
$last_register=(int)registeredEventTime('facedetect'.$ip);
if ((time()-$last_register)>5*60) { //не чаще чем раз в 5 минут
registerEvent('facedetect'.$ip,$total,1);
say("-recognizeid:3 Я слушаю вас",3);
}
}
}
Лицо обнаруживается в терминале, затем Алиса отправляет команду SDM начать запись. SDM записывает, отправляет в гугл, расшифровывает и отправляет обратно Алисе, к примеру в шаблон включи музыку, который выглядит у меня так:
СпойлерПоказать
if (preg_match('/включи/uis',$original)) {
say('-recognizeid:'.context_getuser().' Какую именно?');
} elseif (preg_match('/выключи/uis',$original)) {
getURL('http://127.0.0.1/rc/?command=vlc_close', 0);
context_clear();
clearTimeOut('user_'.context_getuser().'_contexttimeout');
say(getRandomLine('done'),10);
} else {
say('Непонятно, что с музыкой: '.$original,10);
}
Таким образом где-то в этом шаблоне и нужно использовать параметр "user_id", чтобы по нему определять значение "level", которое отвечает за посылку сообщения в нужный канал звуковой карты. Такие у меня мысли...
Последний раз редактировалось redmax144 Вс апр 17, 2016 8:23 pm, всего редактировалось 1 раз.
Аватара пользователя
Bagir
Сообщения: 1615
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

Re: Sound Direct Manager

Сообщение Bagir » Вс апр 17, 2016 8:22 pm

Забыл добавить одно важное дополнение!
Как уже говорил, если в команде для SDM было указано, скажем, -recognizeid:3, то после распознавания текста SDM отправит примерно следующее:
стоит обратить внимание на user_id=3
Но чтобы выловить это в файле command.php, я добавил туда

Код: Выделить всё

   if (isset($params['user_id'])) { $user_id = $params['user_id']; } 
перед строкой

Код: Выделить всё

   include_once(DIR_MODULES . 'patterns/patterns.class.php'); 
и конечно же давно забыл про это. Вот почему я не люблю править фалы МД. потом всё это забывается. И я точно помню, что sergejey предлагал другое решение. Сегодня буду искать его в почте.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
Bagir
Сообщения: 1615
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

Re: Sound Direct Manager

Сообщение Bagir » Вс апр 17, 2016 8:26 pm

id пользователей можно посмотреть в phpmyadmin4 в таблице users
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
redmax144
Сообщения: 44
Зарегистрирован: Чт янв 28, 2016 8:18 pm
Благодарил (а): 13 раз
Поблагодарили: 5 раз

Re: Sound Direct Manager

Сообщение redmax144 » Вс апр 17, 2016 8:32 pm

Я так думаю, что раз у нас есть теперь id, по нему можно и выставить уровень приоритета, который теперь отвечает за конкретный канал звуковой карты, примерно так:

Код: Выделить всё

if ($params['user_id']) {
  $id=$params['user_id'];
} else {
 $id='0'; //Здесь задаём канал звуковой карты по умолчанию. В данном случае все сообщения будут отправляться на все каналы, если id указан не будет. 
}
И использование:

Код: Выделить всё

say('-recognizeid:'.$id.' Какую именно?',$id); 
Если бы ещё поместить верхний код в сам сценарий say, не пришлось бы его включать в каждый шаблон... :)
UPD:
Я был немного не прав, не нужен сценарий say, немного модифицировал предложенный код в command.php

Код: Выделить всё

if (isset($params['user_id'])) { $user_id = $params['user_id']; } else {
$id='0';
}
Последний раз редактировалось redmax144 Вс апр 17, 2016 8:50 pm, всего редактировалось 2 раза.
Аватара пользователя
Bagir
Сообщения: 1615
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

Re: Sound Direct Manager

Сообщение Bagir » Вс апр 17, 2016 8:46 pm

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

Код: Выделить всё

say('-recognizeid:'.context_getuser().' Какое устройство?');
И SDM отправляет текст в command.php именно от этого пользователя. Подробно об этом есть в конце первого сообщения. Пока такой вариант вполне устраивает. Предполагается, что SDM это решение для терминала на Windows, и что микрофон установлен где то поблизости от этого терминала.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
redmax144
Сообщения: 44
Зарегистрирован: Чт янв 28, 2016 8:18 pm
Благодарил (а): 13 раз
Поблагодарили: 5 раз

Re: Sound Direct Manager

Сообщение redmax144 » Вс апр 17, 2016 9:05 pm

Я понял о чём вы говорите. Спасибо за объяснение :oops: В каждой комнате стоит терминал, и в каждом терминале выполнен вход нужного пользователя. В Ванной пользователь "Ванная" и его id к примеру 9. Таким образом SDM знает, куда слать сообщение... Отличный вариант

У меня есть несколько телефонов стареньких на андроид. Я для себя пока внёс изменения в command.php, для каждого ip в скрипте facedetection я пропишу свой id и таким образом буду знать, в какую комнату отправлять ответ...
Ответить