Простое голосовое управление системой

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

emaster
Сообщения: 14
Зарегистрирован: Ср авг 15, 2012 3:15 pm

Re: Простое голосовое управление системой

Сообщение emaster »

sergejey писал(а):Обсуждение страницы Простое голосовое управление системой
Насчёт голосового поиска гугла - где-то мелькала информация о том, что их голосовой engine доступен (или будет в ближайшее время) в stand-alone виде внутри какого-то устройства, что по многим причинам гораздо интереснее, чем работа с удалённым сервером.

В моей прошлой квартире за распознавание голосовых команд отвечал движок STC VoiceCom Demo - в нём можно было нарисовать дерево команд и обучить нескольких дикторов. После чего распознанные команды выводились в заголовке окна, откуда я и тянул их в свой софт. Так у нас появилась Свити :)

А ещё для голосового управления хорошо уметь фильтровать "базар", т.е. буквально :)
В доме у меня для этого предусмотрено по 4 потолочных микрофона в каждой комнате - с них можно обрабатывать сигнал как с фазированной антенной решетки, т.е. достаточно эффективно фильтровать и отслеживать отдельные источники. Но за ворохом более важных задач эта "математика" пока ещё ждёт своей реализации.
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm

Re: Простое голосовое управление системой

Сообщение Alex »

В доме у меня для этого предусмотрено по 4 потолочных микрофона в каждой комнате
Очень интересная идея. Как я сам до такого не додумался? Видать есть ещё над чем поработать... :)
- с них можно обрабатывать сигнал как с фазированной антенной решетки, т.е. достаточно эффективно фильтровать и отслеживать отдельные источники.
Вот это да... Впечатлило. С такими людьми Умный Дом против нас долго не продержится :).
Vip
Сообщения: 86
Зарегистрирован: Вт авг 28, 2012 5:36 pm
Откуда: Kiev, Ukraine

Re: Простое голосовое управление системой

Сообщение Vip »

А можно ли реализовать распознавание речи на уровне ПК, без привлечения мобильных устройств.
По примеру http://habrahabr.ru/post/117234/#comment_3812334
Как думаете, возможно?
Аватара пользователя
sergejey
Site Admin
Сообщения: 4286
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Контактная информация:

Re: Простое голосовое управление системой

Сообщение sergejey »

Vip писал(а):А можно ли реализовать распознавание речи на уровне ПК, без привлечения мобильных устройств.
По примеру http://habrahabr.ru/post/117234/#comment_3812334
Как думаете, возможно?
Без мобильных устройств можно сделать просто запустив хром с включенным голосовым вводом и зайдя на страницу http://ваш_сервер/command.php -- там в строке ввода нажать на микрофон и говорить команду. Но это, конечно, не очень удобно -- лучше было бы если б программа сама распознавала речь и отправляла её на гугл. На ab-log.ru в форуме есть большая дискуссия на эту тему -- там они подключают всякие фильтры и скрипты, но по-моему надёжного способа так и нет -- то распознаёт плохо, то качество записи хромает.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Vadymkyr
Сообщения: 125
Зарегистрирован: Ср дек 26, 2012 8:33 pm
Откуда: Севастополь

Re: Простое голосовое управление системой

Сообщение Vadymkyr »

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

Re: Простое голосовое управление системой

Сообщение sergejey »

Vadymkyr писал(а):а есть аналог этой программы для IOS?
К сожалению, не встречал. Под iOs я слышал, что делают в домашней сети специальный proxy-сервер для Siri, чтобы можно было перехватывать для неё команды и обрабатывать собственными средствами. Вот страница проекта https://github.com/plamoni/SiriProxy

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
igorek4649
Сообщения: 2
Зарегистрирован: Вт окт 27, 2015 8:54 am

Re: Простое голосовое управление системой

Сообщение igorek4649 »

Кто нибудь пробывал laitis.ru возможно использовать этот софт?
vash_sa
Сообщения: 13
Зарегистрирован: Чт янв 26, 2017 2:53 pm

Re: Простое голосовое управление системой

Сообщение vash_sa »

Vip писал(а):Без мобильных устройств можно сделать просто запустив хром с включенным голосовым вводом и зайдя на страницу http://ваш_сервер/command.php -- там в строке ввода нажать на микрофон и говорить команду. Но это, конечно, не очень удобно -- лучше было бы если б программа сама распознавала речь и отправляла её на гугл. На ab-log.ru в форуме есть большая дискуссия на эту тему -- там они подключают всякие фильтры и скрипты, но по-моему надёжного способа так и нет -- то распознаёт плохо, то качество записи хромает.
Нет там никакой кнопки "нажать на микрофон" и нажимать не на что. Там только одна строка ввода say

Та к все-таки эта тема как-то продвинулась?
Аватара пользователя
Divan
Сообщения: 859
Зарегистрирован: Пн июл 08, 2019 5:04 pm

Re: Простое голосовое управление системой

Сообщение Divan »

Автор Smoke выложил еще один вариант управления голосом. Вариант интересный, но нет нормальной инструкции, что и как делать. Работает в браузере Хром и через https (нужен SSL сертификат). Плюсы: бесплатно, без ключей, быстро, не ограниченно в запросах, неограниченное время распознавания.

Так выглядит кнопка на сцене
SPOILERSPOILER_SHOW
кнопка.jpg
кнопка.jpg (62.91 КБ) 8765 просмотров

Выкладываю пошаговую инструкцию

Внимание!!! Если у вас уже установлен SSL сертификат и есть доступ по https, то пропускаем этот пункт

Создаем SSL сертификат (без этого не будет работать), пример создания SSL сертификата на Ubuntu
1) Ставим certbot
SPOILERSPOILER_SHOW
1) sudo apt-get update
2) sudo apt-get install software-properties-common
3) sudo add-apt-repository universe - если запустить эту команду, то получим ошибку add-apt-repository universe error: universe invalid, в таком
случае запускаем эту команду sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu $(lsb_release -sc) universe"
4) sudo add-apt-repository ppa:certbot/certbot
5) sudo apt-get update

Привязываем Font Awesome
1) Скачиваем Font Awesome
2) Распаковываем и переименовываем в font-awesome
3) Закидываем всю папку font-awesome например сюда www/var/templates_alt/font-awesome/css/font-awesome.min.css";
SPOILERSPOILER_SHOW
Путь к папке font awesome.jpg
Путь к папке font awesome.jpg (100.98 КБ) 8765 просмотров

Действия в сцене
В раздел Дополнительный код CSS вставляем код для импорта font-awesome

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

@import "/templates_alt/font-awesome/css/font-awesome.min.css";
SPOILERSPOILER_SHOW
Дополнительный код CSS.JPG
Дополнительный код CSS.JPG (17.9 КБ) 8765 просмотров
В раздел Код вставляем весь код.
SPOILERSPOILER_SHOW
раздел код.JPG
раздел код.JPG (74.82 КБ) 8765 просмотров

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

<script>
        // Создаем распознаватель
        var recognizer = new webkitSpeechRecognition();

        // Ставим опцию, чтобы распознавание началось ещё до того, как пользователь закончит говорить
        recognizer.interimResults = false;
        // Какой язык будем распознавать?
        recognizer.lang = 'ru-Ru';

        recognizer.onstart = function () {
            //После старта
            $('#voiceBtn').attr('style', 'position: fixed;z-index: 99;padding: 15px;border-radius: 50px;bottom: 0px;right: 0px;margin-right: 10px;background:lime;margin-bottom: 10px;animation: pulse;animation-iteration-count: infinite;animation-duration: 1s;');
            $('#voiceBtn').attr('class', 'bg-gradient-06-anim-fast');
        };

        recognizer.onerror = function (event) {
            //Если ошибка
        };

        // Используем колбек для обработки результатов
        recognizer.onresult = function (event) {
            var result = event.results[event.resultIndex];
            if (result.isFinal) {
                voiceStr = result[0].transcript.toLowerCase();
                //Вот тут ключевое слово маленькими буквами, если ключего слова нет - будет слать все подряд на сервер
                keyWords = voiceStr.indexOf('');
                if(keyWords != '-1') {
                    //Часть запросов будем отрабатывать прямо из JS
                    if(voiceStr.substring(keyWords).toLowerCase() == 'алиса включи музыку') {
                        startPlayMusic();
                    } else {
                        //AJAX на сервер
                        $.getJSON({
                            url: '/objects/?script=VoiceTest&voice='+encodeURI(voiceStr.substring(keyWords)),
                            success: function(responce) {
                                //Возврат от скрипта MJDM
                            },
                           error: function(responce) {
       						console.log('Ошибка отправки AJAX');
      						}
                        }); 
                    }
                }
            }
        };
        recognizer.onend = function () {
            //По окончании
            $('#voiceBtn').attr('style', 'position: fixed;z-index: 99;padding: 15px;border-radius: 50px;bottom: 0px;right: 0px;margin-right: 10px;background: purple; margin-bottom: 10px;');
            $('#voiceBtn').removeAttr('class');
            //Если сюда вписать recognizer.start(); будет слушать эфир вечно
        };
</script>
 

<div id="voiceBtn" style="position: fixed;z-index: 99;padding: 15px;border-radius: 50px;bottom: 0px;right: 0px;margin-right: 10px;background: purple;margin-bottom: 10px;" onclick="recognizer.start();">
  <i class="fa fa-microphone" style="font-size: 3rem;color: white;"></i>
</div>
Пояснение по коду

Здесь можно изменить ключевое слово (выделил где), но я убрал ключевое слово, нажали на кнопку и можно говорить.
SPOILERSPOILER_SHOW
ключевое слово.jpg
ключевое слово.jpg (43.84 КБ) 8765 просмотров
Здесь меняем цвет фона, тут устанавливается цвет фона при активации микрофона
SPOILERSPOILER_SHOW
изменить цвет фона.jpg
изменить цвет фона.jpg (70.57 КБ) 8765 просмотров
Здесь указываем имя скрипта (сценария). Сценарии создаете с любым именем и указываете в коде имя. У меня например так, где VoiceTest это имя сценария.

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

url: '/objects/?script=VoiceTest&voice='+encodeURI(voiceStr.substring(keyWords)),
SPOILERSPOILER_SHOW
Имя скрипта.jpg
Имя скрипта.jpg (75.49 КБ) 8765 просмотров
Если в коде заменить адрес куда отправлять распознанный текст на:

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

url: '/command.php?qry='+encodeURI(voiceStr.substring(keyWords)),
SPOILERSPOILER_SHOW
строка скрипта.jpg
строка скрипта.jpg (86.14 КБ) 8750 просмотров
то сообщения будут прилетать в системную консоль (на главной странице).


Про ошибку AJAX
Когда вы все сделали и нажали на кнопку, а после всплыла такая ошибка, то не пугайтесь, это нормально, такая ошибка всплывает, если сценарий пустой, нужно добавить в код echo 'ok'; чтобы сценарии возвращал ответ.
SPOILERSPOILER_SHOW
ошибка AJAX.jpg
ошибка AJAX.jpg (18.76 КБ) 8765 просмотров
Пример сценария который будет записывать голос в свойство и в консоле можно увидеть текст
SPOILERSPOILER_SHOW
передача текста в свойство.JPG
передача текста в свойство.JPG (36.31 КБ) 8765 просмотров
Чтобы увидеть текст, нужно нажать на консоль
SPOILERSPOILER_SHOW
консоль.jpg
консоль.jpg (15.8 КБ) 8765 просмотров
Создали к примеру сценарии VoiceTest
SPOILERSPOILER_SHOW
Сценарии VoiceTest.JPG
Сценарии VoiceTest.JPG (13.99 КБ) 8765 просмотров
Вставляем код на примере блокли, где я создал переменную voice
SPOILERSPOILER_SHOW
Код в блокли.JPG
Код в блокли.JPG (24.29 КБ) 8765 просмотров
или код в PHP, кому как удобно

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

$voice = urldecode($_GET['voice']);


debMes($voice);
sg('VoiceMD.text',urldecode($_GET['voice']));
echo 'ok';
Xpenology DSM 6.2.2 + Ubuntu Server 18.10 + Majordomo + MariaDB
Аватара пользователя
Alexander Znamensky
Сообщения: 160
Зарегистрирован: Ср дек 18, 2019 11:13 am
Откуда: Москва

Re: Простое голосовое управление системой

Сообщение Alexander Znamensky »

Divan писал(а): Сб июн 06, 2020 12:32 am Автор Smoke выложил еще один вариант управления голосом. Вариант интересный, но нет нормальной инструкции, что и как делать. Работает в браузере Хром и через https (нужен SSL сертификат). Плюсы: бесплатно, без ключей, быстро, не ограниченно в запросах, неограниченное время распознавания.
SPOILERSPOILER_SHOW
Так выглядит кнопка на сцене
SPOILERSPOILER_SHOW
кнопка.jpg

Выкладываю пошаговую инструкцию

Внимание!!! Если у вас уже установлен SSL сертификат и есть доступ по https, то пропускаем этот пункт

Создаем SSL сертификат (без этого не будет работать), пример создания SSL сертификата на Ubuntu
1) Ставим certbot
SPOILERSPOILER_SHOW
1) sudo apt-get update
2) sudo apt-get install software-properties-common
3) sudo add-apt-repository universe - если запустить эту команду, то получим ошибку add-apt-repository universe error: universe invalid, в таком
случае запускаем эту команду sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu $(lsb_release -sc) universe"
4) sudo add-apt-repository ppa:certbot/certbot
5) sudo apt-get update

Привязываем Font Awesome
1) Скачиваем Font Awesome
2) Распаковываем и переименовываем в font-awesome
3) Закидываем всю папку font-awesome например сюда www/var/templates_alt/font-awesome/css/font-awesome.min.css";
SPOILERSPOILER_SHOW
Путь к папке font awesome.jpg

Действия в сцене
В раздел Дополнительный код CSS вставляем код для импорта font-awesome

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

@import "/templates_alt/font-awesome/css/font-awesome.min.css";
SPOILERSPOILER_SHOW
Дополнительный код CSS.JPG
В раздел Код вставляем весь код.
SPOILERSPOILER_SHOW
раздел код.JPG

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

<script>
        // Создаем распознаватель
        var recognizer = new webkitSpeechRecognition();

        // Ставим опцию, чтобы распознавание началось ещё до того, как пользователь закончит говорить
        recognizer.interimResults = false;
        // Какой язык будем распознавать?
        recognizer.lang = 'ru-Ru';

        recognizer.onstart = function () {
            //После старта
            $('#voiceBtn').attr('style', 'position: fixed;z-index: 99;padding: 15px;border-radius: 50px;bottom: 0px;right: 0px;margin-right: 10px;background:lime;margin-bottom: 10px;animation: pulse;animation-iteration-count: infinite;animation-duration: 1s;');
            $('#voiceBtn').attr('class', 'bg-gradient-06-anim-fast');
        };

        recognizer.onerror = function (event) {
            //Если ошибка
        };

        // Используем колбек для обработки результатов
        recognizer.onresult = function (event) {
            var result = event.results[event.resultIndex];
            if (result.isFinal) {
                voiceStr = result[0].transcript.toLowerCase();
                //Вот тут ключевое слово маленькими буквами, если ключего слова нет - будет слать все подряд на сервер
                keyWords = voiceStr.indexOf('');
                if(keyWords != '-1') {
                    //Часть запросов будем отрабатывать прямо из JS
                    if(voiceStr.substring(keyWords).toLowerCase() == 'алиса включи музыку') {
                        startPlayMusic();
                    } else {
                        //AJAX на сервер
                        $.getJSON({
                            url: '/objects/?script=VoiceTest&voice='+encodeURI(voiceStr.substring(keyWords)),
                            success: function(responce) {
                                //Возврат от скрипта MJDM
                            },
                           error: function(responce) {
       						console.log('Ошибка отправки AJAX');
      						}
                        }); 
                    }
                }
            }
        };
        recognizer.onend = function () {
            //По окончании
            $('#voiceBtn').attr('style', 'position: fixed;z-index: 99;padding: 15px;border-radius: 50px;bottom: 0px;right: 0px;margin-right: 10px;background: purple; margin-bottom: 10px;');
            $('#voiceBtn').removeAttr('class');
            //Если сюда вписать recognizer.start(); будет слушать эфир вечно
        };
</script>
 

<div id="voiceBtn" style="position: fixed;z-index: 99;padding: 15px;border-radius: 50px;bottom: 0px;right: 0px;margin-right: 10px;background: purple;margin-bottom: 10px;" onclick="recognizer.start();">
  <i class="fa fa-microphone" style="font-size: 3rem;color: white;"></i>
</div>
Пояснение по коду

Здесь можно изменить ключевое слово (выделил где), но я убрал ключевое слово, нажали на кнопку и можно говорить.
SPOILERSPOILER_SHOW
ключевое слово.jpg
Здесь меняем цвет фона, тут устанавливается цвет фона при активации микрофона
SPOILERSPOILER_SHOW
изменить цвет фона.jpg
Здесь указываем имя скрипта (сценария). Сценарии создаете с любым именем и указываете в коде имя. У меня например так, где VoiceTest это имя сценария.

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

url: '/objects/?script=VoiceTest&voice='+encodeURI(voiceStr.substring(keyWords)),
SPOILERSPOILER_SHOW
Имя скрипта.jpg
Если в коде заменить адрес куда отправлять распознанный текст на:

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

url: '/command.php?qry='+encodeURI(voiceStr.substring(keyWords)),
SPOILERSPOILER_SHOW
строка скрипта.jpg
то сообщения будут прилетать в системную консоль (на главной странице).


Про ошибку AJAX
Когда вы все сделали и нажали на кнопку, а после всплыла такая ошибка, то не пугайтесь, это нормально, такая ошибка всплывает, если сценарий пустой, нужно добавить в код echo 'ok'; чтобы сценарии возвращал ответ.
SPOILERSPOILER_SHOW
ошибка AJAX.jpg
Пример сценария который будет записывать голос в свойство и в консоле можно увидеть текст
SPOILERSPOILER_SHOW
передача текста в свойство.JPG
Чтобы увидеть текст, нужно нажать на консоль
SPOILERSPOILER_SHOW
консоль.jpg
Создали к примеру сценарии VoiceTest
SPOILERSPOILER_SHOW
Сценарии VoiceTest.JPG
Вставляем код на примере блокли, где я создал переменную voice
SPOILERSPOILER_SHOW
Код в блокли.JPG
или код в PHP, кому как удобно

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

$voice = urldecode($_GET['voice']);


debMes($voice);
sg('VoiceMD.text',urldecode($_GET['voice']));
echo 'ok';


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

Я пробовал получить SSL сертификат по вашему описанию через certbot (с оговоркой, что у меня Raspberry Pi4B+).
Соответственно, я выбрал Nginx и Debian 10 (buster).
Но несмотря на как-бы успешное получение сертификата, доступа по защищенному протоколу https нет....
SPOILERSPOILER_SHOW
Screenshot 2020-07-16 17.29.52.png
Screenshot 2020-07-16 17.29.52.png (191.21 КБ) 5596 просмотров
К сожалению, не силен в сетевых вопросах и застрял на этом шаге. Сможете что-то посоветовать?
Спасибо!
Raspberry Pi4 B+, образ v4_44 -> Alpha, PHP 7.3, Xiaomi Gateway 2, Tuya, Blynk, ESP8266
Ответить