Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Русский
  3. ioBroker
  4. Скрипты
  5. ioBroker скрипты
  6. Голосовое меню

NEWS

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    24
    1
    1.3k

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    9.3k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    14
    1
    2.6k

Голосовое меню

Geplant Angeheftet Gesperrt Verschoben ioBroker скрипты
11 Beiträge 4 Kommentatoren 3.2k Aufrufe
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • B Offline
    B Offline
    bondrogeen
    schrieb am zuletzt editiert von
    #2

    Для себя пока решил обрабатывать голос сторонними программами, такими как АССИСТЕНТ ДУСЯ, а результат выводить в iobroker.

    1 Antwort Letzte Antwort
    0
    • I Offline
      I Offline
      instalator
      schrieb am zuletzt editiert von
      #3

      @bondrogeen:

      Для себя пока решил обрабатывать голос сторонними программами, такими как АССИСТЕНТ ДУСЯ, а результат выводить в iobroker. `
      Ты сделал в дусе меню? Смысл темы сделать диалог с уд

      Высокий уровень Децибел вреден для здоровья!

      http://blog.instalator.ru/

      1 Antwort Letzte Antwort
      0
      • B Offline
        B Offline
        bondrogeen
        schrieb am zuletzt editiert von
        #4

        @instalator:

        @bondrogeen:

        Для себя пока решил обрабатывать голос сторонними программами, такими как АССИСТЕНТ ДУСЯ, а результат выводить в iobroker. Ты сделал в дусе меню? Смысл темы сделать диалог с уд

        Нет.

        Пока задачи такой не стоит.

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

        В процессе диалога забирать или отправлять команды iobroker.

        В дуси есть "скрипты" где можно как раз обрабатывать все это.

        П.С. что заказывать собрались?

        1 Antwort Letzte Antwort
        0
        • I Offline
          I Offline
          instalator
          schrieb am zuletzt editiert von
          #5

          @bondrogeen:

          @instalator:

          @bondrogeen:

          Для себя пока решил обрабатывать голос сторонними программами, такими как АССИСТЕНТ ДУСЯ, а результат выводить в iobroker. Ты сделал в дусе меню? Смысл темы сделать диалог с уд
          Делаю голосовое управления скриптом заказа воды

          Нет.

          Пока задачи такой не стоит.

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

          В процессе диалога забирать или отправлять команды iobroker.

          В дуси есть "скрипты" где можно как раз обрабатывать все это.

          П.С. что заказывать собрались? `
          Делаю голосовое управление скриптом заказа воды

          Высокий уровень Децибел вреден для здоровья!

          http://blog.instalator.ru/

          1 Antwort Letzte Antwort
          0
          • BluefoxB Offline
            BluefoxB Offline
            Bluefox
            schrieb am zuletzt editiert von
            #6

            @instalator:

            PS/ BlueFox в переменных(состояниях) IoB можно же хранить объекты и массивы? `
            Да можно, как минимум в JSON.

            1 Antwort Letzte Antwort
            0
            • I Offline
              I Offline
              instalator
              schrieb am zuletzt editiert von
              #7

              Обновил скрипт меню.

              Высокий уровень Децибел вреден для здоровья!

              http://blog.instalator.ru/

              1 Antwort Letzte Antwort
              0
              • H Offline
                H Offline
                Haus
                schrieb am zuletzt editiert von
                #8

                @instalator:

                Один из вариантов реализации голосового меню на примере меню для заказа воды.

                Сейчас скрипт получился такой

                ! ```
                `menu = [
                [
                ['Заказываем как обычно?', 'да', 'нет', [0,1]],
                ['На какой день?', 'сегодня', 'завтра'],
                ['На какое время?', 'утро', 'обед', 'вечер'],
                ['Я делаю заказ']

                ],
                [   
                    ['Какое количество?', 'одну', 'две'],
                    ['Какое количество?', 'одну', 'две'],
                    ['На какой день?', 'сегодня', 'завтра'],
                    ['На какое время?', 'утро', 'обед', 'вечер']
                ]
                

                ];
                var collect = {
                hours: {
                1: '9:00-13:00 (утро)',
                2: '13:01-17:00 (день)',
                3: '17:01-21:00 (вечер)',
                4: '18:01-21:00 (вечер)'
                },
                Product: {
                id: [1204],
                price: [190],
                discprice: [180]
                }
                };
                var order = {
                productsid: 1204,
                price: 190,
                discountprice: 180,
                count: 1,
                date: '16-03-2016',
                hours: '18:01-21:00 (вечер)',
                periodid: 4
                };
                ////////////////////////////////////
                function resultOrder(item, num){
                log('RESULT - ' + result);
                //var order = getState('javascript.0.WaterOrder.order').val;
                var prodid = JSON.parse(getState('javascript.0.WaterOrder.ProductsId').val);
                var price = JSON.parse(getState('javascript.0.WaterOrder.price').val);
                var discprice = JSON.parse(getState('javascript.0.WaterOrder.discountPrice').val);

                var date = new Date();
                var day = date.getDate();
                var month = ((date.getMonth()+1)<10?'0':'')+(date.getMonth()+1);
                var year = date.getFullYear();
                
                if (num === 0){
                    var datedost;
                    if (result[1] === 0){
                        // productsid, price, discountprice, count, date, hours, periodid
                        datedost = 'сегодня';
                        order.date = day+ '-' +month+ '-' +year;
                    }
                    else if (result[1] === 1){
                        datedost = 'завтра';
                        order.date = day+1 + '-' +month+ '-' +year;
                    }
                    if (result[2] === 0){
                        order.hours = collect.hours['1'];
                        order.periodid = 1;
                    }
                    else if (result[2] === 1){
                        order.hours = collect.hours['2'];
                        order.periodid = 2;
                    }
                    else if (result[2] === 2){
                        order.hours = collect.hours['4'];
                        order.periodid = 4;
                    }
                    
                    var e = prodid.indexOf(order.productsid);
                    if (~e){
                        order.price = price[e];
                        order.discountprice = discprice[e];
                    }
                    var per = order.hours.replace(/-/g, ' часов до ');
                    setState('sayit.0.tts.text',  'Я заказываю '+ order.count + ' бутыль за '+ order.count * order.price + ' руб. .' + 'Доставка ' + datedost + ' в период с ' + per);
                    setState('javascript.0.WaterOrder.order', JSON.stringify(order));
                    setState('javascript.0.WaterOrder.Start', true);
                }
                if (num === 1){
                    
                }
                

                }
                /////////////////////////////////////////////////////////////////////////////////
                /////////////////////////////////////////////////////////////////////////////////
                var result = [];
                var item;
                var num;
                var wait;
                var сonf;
                var flag = false;
                var step;
                var notFound = 0;
                var voice = '';

                ! on({id: 'javascript.0.Voice.Command', change: 'any'}, function (obj) {
                voice = obj.newState.val.toLowerCase();
                VoiceCommands (voice);
                });
                ///////////////////////////////////////
                function verify(confirm){
                if (confirm === true){
                var lastAnswer = result[result.length - 1];
                if (lastAnswer === undefined) {
                console.error('No last answer found: ' + JSON.stringify(result));
                return;
                }
                var possibleValues = menu[num][item][menu[num][item].length - 1]; // always last element of submenu
                if (possibleValues === undefined) {
                console.error('No possible values found: ' + JSON.stringify(menu[num][item]));
                return;
                }
                if (typeof possibleValues === 'object' && possibleValues[lastAnswer] !== 0){
                clear();
                item = 0;
                step = 0;
                num = possibleValues[lastAnswer];
                whiles(item, num);
                log('Переходим в подменю меню');
                } else {
                //log('Подтверждение - ' + confirm);
                log('Массив результата - ' + JSON.stringify(result));
                item++;
                if (item >= menu[num].length -1){
                clear();
                resultOrder(item, num);
                } else {
                whiles(item, num);
                }
                }
                } else {
                setState('javascript.0.Voice.menu', false);
                clear();
                setState('sayit.0.tts.text', 'Ошибка! Заказ отменён.');
                }
                }
                ///////////////////////////////////////
                function whiles(item, num){
                log('Переменные: num-' + num +' item-'+ item);
                log('menu[num][item]' + menu[num][item]);
                //log('SayIt - ' + menu[num][item][0]);
                var say = menu[num][item].slice();
                if (typeof menu[num][item][menu[num][item].length-1] === 'object'){
                say.pop();
                }
                log('say ' + JSON.stringify(say));
                setState('sayit.0.tts.text', JSON.stringify(say));
                Confirm(num, item, function (confirm) {
                verify(confirm);
                //setState('sayit.0.tts.text', menu[i][0]);
                });
                }
                /////////////////////////////////////////////
                function clear(){
                log('Отписались');
                unsubscribe(сonf);
                clearTimeout(wait);
                }
                ///////////////////////////////////////
                function Confirm (num, item, callback){
                wait = setTimeout(function() {
                setState('javascript.0.Voice.menu', false);
                //setState('sayit.0.tts.text', 'Заказ отменён по таймауту');
                unsubscribe(сonf);
                callback (false);
                }, 40000);
                сonf = on({id: 'javascript.0.Voice.Command', change: 'any'}, function (obj) {
                var voice = obj.newState.val.toLowerCase();
                var Arrphrase = menu[num][item].slice();
                Arrphrase.splice(0, 1);
                var el;
                Arrphrase.forEach(function(itm, i, arr) {
                //log ('i - '+ i +' Ищем в '+voice+ ' - '+ itm+ ' Массив -' + arr);
                if (~voice.indexOf(itm)){
                flag = true;
                el = i;
                }
                if (i >= Arrphrase.length-1){
                if (flag){
                result[step] = el;
                log('Номер найденного элемента в массиве - ' + el);
                step++;
                flag = false;
                clear();
                callback (true);
                } else {
                flag = false;
                if (notFound > 0){
                clear();
                callback (false);
                } else {
                notFound++;
                setState('sayit.0.tts.text', 'Не поняла, повторите');
                clear();
                Confirm (num, item, function (confirm, cmd) {
                verify(confirm, menu);
                });
                whiles(item, num);
                }
                }
                }

                    });
                

                });
                }
                ////////////////////////////////////////
                function VoiceCommands (voice){
                log('Вся переменная - ' + voice);
                if ((found('закаж') || found('заказ')) && found('вод')){
                setState('javascript.0.Voice.menu', true);
                setState('javascript.0.WaterOrder.Update', true);
                item = 0;
                num = 0;
                step = 0;
                whiles(item, num);
                }
                ///////
                function found (cmd){
                cmd = String(cmd);
                if (~voice.indexOf(cmd)){
                return true;
                } else {
                return false;
                }
                }
                }`

                ! Скрипт под спойлером обновлен.
                ! Привет пробую разобраться с твоим скриптом, создал переменные
                ! ~~[code]~~createState('WaterOrder.order',''); createState('WaterOrder.ProductsId',''); createState('WaterOrder.price',''); createState('WaterOrder.discountPrice',''); createState('WaterOrder.Start',''); createState('Voice.Command',''); createState('Voice.menu',''); createState('WaterOrder.Update','');[/code]
                ! ругается после ответа, что не так?
                ! >! ~~[spoiler]~~17:31:56.229 [info] javascript.2 script.js.AWaterOrder: Вся переменная - заказ воды
                ! 17:31:56.231 [info] javascript.2 script.js.AWaterOrder: Переменные: num-0 item-0
                ! 17:31:56.231 [info] javascript.2 script.js.AWaterOrder: menu[num][item]Заказываем как обычно?,да,нет,0,1
                ! 17:31:56.232 [info] javascript.2 script.js.AWaterOrder: say ["Заказываем как обычно?","да","нет"]
                ! 17:32:09.189 [info] javascript.2 script.js.AWaterOrder: Вся переменная - да
                ! 17:32:09.194 [info] javascript.2 script.js.AWaterOrder: Номер найденного элемента в массиве - 0
                ! 17:32:09.194 [info] javascript.2 script.js.AWaterOrder: Отписались
                ! 17:32:09.194 [info] javascript.2 script.js.AWaterOrder: Массив результата - [0]
                ! 17:32:09.194 [info] javascript.2 script.js.AWaterOrder: Переменные: num-0 item-1
                ! 17:32:09.194 [info] javascript.2 script.js.AWaterOrder: menu[num][item]На какой день?,сегодня,завтра
                ! 17:32:09.195 [info] javascript.2 script.js.AWaterOrder: say ["На какой день?","сегодня","завтра"]
                ! 17:32:21.366 [info] javascript.2 script.js.AWaterOrder: Вся переменная - сегодня
                ! 17:32:21.367 [info] javascript.2 script.js.AWaterOrder: Номер найденного элемента в массиве - 0
                ! 17:32:21.367 [info] javascript.2 script.js.AWaterOrder: Отписались
                ! 17:32:21.369 [info] javascript.2 script.js.AWaterOrder: Массив результата - [0,0]
                ! 17:32:21.369 [info] javascript.2 script.js.AWaterOrder: Переменные: num-0 item-2
                ! 17:32:21.369 [info] javascript.2 script.js.AWaterOrder: menu[num][item]На какое время?,утро,обед,вечер
                ! 17:32:21.370 [info] javascript.2 script.js.AWaterOrder: say ["На какое время?","утро","обед","вечер"]
                ! 17:32:30.823 [info] javascript.2 script.js.AWaterOrder: Вся переменная - вечер
                ! 17:32:30.823 [info] javascript.2 script.js.AWaterOrder: Номер найденного элемента в массиве - 2
                ! 17:32:30.824 [info] javascript.2 script.js.AWaterOrder: Отписались
                ! 17:32:30.824 [info] javascript.2 script.js.AWaterOrder: Массив результата - [0,0,2]
                ! 17:32:30.824 [info] javascript.2 script.js.AWaterOrder: Отписались
                ! 17:32:30.824 [info] javascript.2 script.js.AWaterOrder: RESULT - 0,0,2
                ! 17:32:30.825 [error] SyntaxError: Unexpected end of input at Object.parse (native) at resultOrder (script.js.AWaterOrder:75:23) at verify (script.js.AWaterOrder:164:17) at script.js.AWaterOrder:187:13 at script.js.AWaterOrder:223:21 at Array.forEach (native) at Object. (script.js.AWaterOrder:210:18) at Object.subs.callback (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:1206:48) at /opt/iobroker/node_modules/iobroker.javascript/javascript.js:541:48 at getObjectEnums (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:2430:17)[/spoiler][/i]
                ``` `

                js-controller: 1.5.7 / node.js: v8.15.1/ npm: 6.4.1

                admin: 3.6.0

                javascript: 4.1.10

                web: 2.4.1 vis: 1.1.10

                cloud: 2.6.2

                Server: DELL FX170 / linux: Debian 9.5 Stretch

                Adapter: MegaD-2561, Mega-ES…

                1 Antwort Letzte Antwort
                0
                • I Offline
                  I Offline
                  instalator
                  schrieb am zuletzt editiert von
                  #9

                  @Haus:

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

                  createState('WaterOrder.order','');
                  createState('WaterOrder.ProductsId','');
                  createState('WaterOrder.price','');
                  createState('WaterOrder.discountPrice','');
                  createState('WaterOrder.Start','');
                  createState('Voice.Command','');
                  createState('Voice.menu','');
                  createState('WaterOrder.Update','');
                  

                  ругается после ответа, что не так? `

                  У тебя видимо объекты пустые, у меня там массивы данных
                  filename="е4343.png" index="0">~~
                  Смысл меню что в итоге получить массив с выбранными данными, а его уже обрабатывать можно как тебе нужно.

                  У меня есть вторая часть скрипта заказа, которая парсит сайт, наполняет эти объекты актуальными данными и отправляет сформированный заказ.

                  Высокий уровень Децибел вреден для здоровья!

                  http://blog.instalator.ru/

                  1 Antwort Letzte Antwort
                  0
                  • H Offline
                    H Offline
                    Haus
                    schrieb am zuletzt editiert von
                    #10

                    @instalator:

                    @Haus:

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

                    createState('WaterOrder.order','');
                    createState('WaterOrder.ProductsId','');
                    createState('WaterOrder.price','');
                    createState('WaterOrder.discountPrice','');
                    createState('WaterOrder.Start','');
                    createState('Voice.Command','');
                    createState('Voice.menu','');
                    createState('WaterOrder.Update','');
                    

                    ругается после ответа, что не так? `

                    У тебя видимо объекты пустые, у меня там массивы данных
                    filename="е4343.png" index="0">~~
                    Смысл меню что в итоге получить массив с выбранными данными, а его уже обрабатывать можно как тебе нужно.

                    У меня есть вторая часть скрипта заказа, которая парсит сайт, наполняет эти объекты актуальными данными и отправляет сформированный заказ. `

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

                    js-controller: 1.5.7 / node.js: v8.15.1/ npm: 6.4.1

                    admin: 3.6.0

                    javascript: 4.1.10

                    web: 2.4.1 vis: 1.1.10

                    cloud: 2.6.2

                    Server: DELL FX170 / linux: Debian 9.5 Stretch

                    Adapter: MegaD-2561, Mega-ES…

                    1 Antwort Letzte Antwort
                    0
                    • I Offline
                      I Offline
                      instalator
                      schrieb am zuletzt editiert von
                      #11

                      @Haus:

                      Я так понял есть компания которая по заказу клиента доставляет воду в бутылях. Если вторая часть скрипта заказа не секретная выложи пожалуйста. `
                      266_new__0.rar

                      Высокий уровень Децибел вреден для здоровья!

                      http://blog.instalator.ru/

                      1 Antwort Letzte Antwort
                      0
                      Antworten
                      • In einem neuen Thema antworten
                      Anmelden zum Antworten
                      • Älteste zuerst
                      • Neuste zuerst
                      • Meiste Stimmen


                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      639

                      Online

                      32.5k

                      Benutzer

                      81.7k

                      Themen

                      1.3m

                      Beiträge
                      Community
                      Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                      ioBroker Community 2014-2025
                      logo
                      • Anmelden

                      • Du hast noch kein Konto? Registrieren

                      • Anmelden oder registrieren, um zu suchen
                      • Erster Beitrag
                        Letzter Beitrag
                      0
                      • Home
                      • Aktuell
                      • Tags
                      • Ungelesen 0
                      • Kategorien
                      • Unreplied
                      • Beliebt
                      • GitHub
                      • Docu
                      • Hilfe