# Голосовое управление с Телеграм  задачами в Notion. Курс "Автоматизация и искусственный интеллект"

## Метаданные

- **Канал:** School of Practical Skills
- **YouTube:** https://www.youtube.com/watch?v=3VT_uJ4iV8g
- **Дата:** 14.09.2023
- **Длительность:** 23:25
- **Просмотры:** 6,719

## Описание

Мой новый курс по ChatGPT по сниженной цене: https://artemdzyuba.ru/?page_id=7025

Материалы этого урока: https://artemdzyuba.ru/lesson/%d0%b3%d0%be%d0%bb%d0%be%d1%81%d0%be%d0%b2%d0%be%d0%b5-%d1%83%d0%bf%d1%80%d0%b0%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b7%d0%b0%d0%b4%d0%b0%d1%87%d0%b0%d0%bc%d0%b8-%d0%b2-%d1%82%d0%b5%d0%bb%d0%b5/

Подписывайся на мой телеграм: https://t.me/practicalskills
и инстаграм: https://www.instagram.com/practical_skills01/

## Содержание

### [0:00](https://www.youtube.com/watch?v=3VT_uJ4iV8g) Segment 1 (00:00 - 05:00)

друзья Привет Я Артём и это видео из Моего основного курса по автоматизации и искусственному интеллекту полный список уроков вы найдете по ссылке в описании А в этом занятии мы научимся управлять нашими задачами голосом через Telegram в этом уроке мы подробно разберем Как можно с помощью телеграмма и чат gpt взаимодействовать с вашими задачами скажем в ношен или любой другой системе где есть API Давайте посмотрим как это выглядит вот у меня список задач в notion и есть вот такой мой Telegram бот Покажи все задачи видим что Telegram бот выполняет эту задачу мой запрос и сейчас он должен мне прислать немного подумав вот полный список моих задач Давайте теперь добавим задачу какой-нибудь Добавь задачу покормить кота процесс идет Мы видим что все выполняется и задача про кота добавлена и Давайте например добавим задачу такую Добавь задачу встретить друга в аэропорту выполняем и вот задача сейчас вот-вот будет добавлена все задачи появилась Теперь давайте наконец выполним какие-то задачи причем что интересно нам не обязательно указывает Прям всю задачу достаточно понятный контекст пометить задачу про пещеры как завершенную видим что задача была поменьше на главное что здесь это все вернулось и мы видим новый статус Давайте еще сделаем заверши задачу про кота То есть вы можете понять Я не диктую задачу целиком и диктую просто какой-то узнаваемый контекст чтобы когда у вас голосовое управление Вы не должны помнить как в точности звучит задача видите что все это дело выполняется и теперь можно перейти к рассмотрению в подробностях нашего процесса который управляет всеми этими делами Итак вначале у нас стоит Триггер Telegram он у меня настроен на получение сообщений и сигналов от нажатия кнопок Ну в нашем конкретном случае кнопки я не вставил но просто когда-то имел на это Планы сейчас я решил пока без них обойтись запустим наш рабочий процесс поймаем какую-нибудь простую команду покажи все задачи И теперь у нас возникает ряд проверок что если это я или не я хочу чтобы этот бот был мой личный и поэтому у меня здесь Идет проверка на соответствие чата ID чата идея свой не помню я его храню в переменное окружение У меня есть отдельная статья где я рассказываю просить эти технические нюансы обязательно почитайте Как создавать переменные среды В общем здесь я проверяю причем поскольку переменной среды Судя по всему это всегда текст то в данном случае нужно Еще навесить сверху Вот эту вот функцию Number Ну и скобочки По обеим сторонам Она поняла что это я и пропускает меня Дальше она эта система далее Я просто запускаю сообщение которое здесь называется минуточку Давайте кстати назовем секундочку чтобы она была правильно секунд вот так вот Секундочку она отправляет текст секундочку мол Подождите идет процесс После этого у меня Идет проверка Является ли это сообщение я имею ввиду вот это вот вещь Потому что если это Например колба кверин то есть запрос нажатию кнопку то это другое уже ну проверяем соответственно мы реагируем здесь через Триггер Telegram Trigger проверяем вот это вот свойства где она message Ага смотрим если оно не пустое то значит мы действительно работаем с сообщением Вот хорошо далее контекст сообщения на самом деле нужно было это пораньше вставить вот сюда пожалуй потому что здесь в него сваливаю вот этот самый А нет не могу конечно не могу я сваливаю вот в этот вот это свойство как раз данные по мессенджу то есть теперь когда мы знаем что это message то мы можем в него переместить все что находится в месседж иначе может быть ошибка или как не так работать процесс Итак значит здесь у нас

### [5:00](https://www.youtube.com/watch?v=3VT_uJ4iV8g&t=300s) Segment 2 (05:00 - 10:00)

контент нашего мессенджа сообщения и здесь мы проверяем если это сообщение голосовое Точно также мы пролезаем в наши данные находим здесь Voice и закидываем сюда если этот voice у нас имеется то это будет действительно голосовое сообщение если там такого свойства не будет то оно значит будет пустым потому что у нас идет проверка из not empty и тогда процесс остановится далее мы разобрались со всякими проверками телеграмма теперь нам хотим хочется получить нашу голосовую команду и распознать ее получить ее в телеграме можно составить специальный запрос Get Запрос который выглядит вот таким образом здесь у меня прописан тоже спрятан переменной среды токен нашего Бота Ну то есть это главный идентификатор с помощью которого Бота можно управлять и дополнение мы отправляем квери параметр который содержит в наш файл ID это вот мы его отправляем как файл ID и это нам дает возможность получить так называемый файл PES вот с помощью файл теса мы как раз можем и сможем скачать наш наше аудио файл PES переводится как путь файловый путь мы Составляем второй запрос где опять же используем токи нашего Бота вот здесь и через слэш вставляем файл PS это дает нам возможность скачать наше голосовое сообщение Теперь мы используем сервис распознавания от Яндекса это очень дешевое действие надо сказать потому что маленькие команды и про все очень просто на специальный адрес мы отправляем Getz запрос единственно нам надо авторизоваться во-первых авторизоваться поскольку Яндекс требует от нас на при пользовании его платных API требует аутентификации и далее нам надо отправить тело запроса Body как файл вот не как Джейсон привычный нам А как найти binary Data вот мы отправляем по умолчанию здесь стоит и мы отправляем и моментально получаем распознанный текст Покажи все задачи далее важная вещь здесь наверху у нас идет мозг первой половины нашего процесса в зависимости от команды он пытается понять что я от него хочу и выглядит это так во-первых он на английском Я советую это сделать потому что текст составлен на английском стоит Примерно в три раза меньше чем текст на русском Когда вы отправляете в час gpt а соответственно что здесь есть Давайте сделаем немножко покрупнее Выбери ну во-первых да у нас модель чат используется ресурс чат а не текст операция здесь одна единственная доступна Complete и мы выбираем новейший на данный момент новейшую модель gpturbo 0613 отправляем два промта один системный который определяет поведение нашего ассистента другой наш собственно пользовательский контент так вот системный выглядит Вот так он неизменный и говорит Выбери одно из следующих если попросили вернуть все задачи на русском Верни такой текст все задачи если текст просит тебя добавить задание Верни текст который начинается со словами добавить задачу двоеточие пробел и затем Добавь точный текст задачи и задача начинается с большой буквы если текст просит тебя закончить задачу тогда Начни текст со словами заверши иначе Верни в точности не понял задачу отлично значит здесь мы Передаем наш как юзер Передаем Наш текст вот включаем выполнение и получаем в результате в такую переработку место Покажи все задачи получаем все задачи то есть мы так унифицируем наш запрос потому что мы можем разными словами это попросить разные там не знаю интонацией но он поймет что это является запросом на ту или иную действие сформулирует его единообразно чтобы мы могли потом дальше это дело может лизировать обрабатывать внизу у нас стоит во-первых изменения вот этого секундочку на с точностью то что мы рассказали то есть операция Edit

### [10:00](https://www.youtube.com/watch?v=3VT_uJ4iV8g&t=600s) Segment 3 (10:00 - 15:00)

message текст правильным мессендж чата Едим и перетаскиваем пожалуйста из Telegram триггера тащили мы перетаскиваем Извините из секундочку вот этот вот мы хотим исправить наш вот это вот сообщение поэтому перетаскиваем его и собственно здесь текст вы сказали и потом мы перетаскиваем то что было распознавание вот мы сказали распознавание в Яндексе все дела запустим Давайте попробуем а ну все значит я запустил он Отработал и вторым этапом он тоже создал новое сообщение выполняем это вот здесь просто отправил сообщение а почему Я использовал эту конструкцию она пропускает то что проходит по верху но не снизу потому что здесь данные нам не нужно отправлять дальше все равно сможем до них дотянуться Я мог бы избежать этой конструкции не использовать этот узел мерч а просто один за другим поставить Вот это потом вот это и просто обращаться если надо обращаться уже адресно ну я решил так сказать использовать первое что не пришел в голову именно мерч процедурой пропустить подождать обоих подождать оба Ну когда придут прибудут оба входа так сказать Верхняя и нижний поток и пропустить только верхний Эксперт не прошел и теперь наш настало время маршрутизации здесь стоит Switch который проверяет в зависимости от указанной команды он смотрит Куда мы пойдем Если все задачи идем на нулевой выход если содержит не понял задачу то пойдет на третий выход если начинается с добавить задачу двоеточие то мы идем на первый с индексом 1 если начинается с заверши то идем на выход с индексом 2 запускаем сейчас мы пойдем на нулевой выход вот тут 0 Все мы пошли Вот сюда здесь все очень просто в этом узле мы получаем все наши задачи нам нужно вывести их на экран получили и здесь у нас три таких блока которые помогают нам сформировать сообщения для телеграма во-первых мы добавляем иконки в зависимости от того какие у задачи статусы то есть какой статус если она завершена то у нее будет стоять галочка и тогда вот это вот так называемая терминарное выражение вот это вот она вернет нам галочку то есть она смотрит Вот на это вот выражение говорит Ага истина тогда возвращаем то что и после вопросительного знака Если же она считает что это ложно то есть галочки нет Значит она вернет вот такой вот смайлик Ну не смайлик амидзи квадратика Почему здесь не выделяется зеленым потому что у нас здесь участвует вот эти вот символы и к сожалению с ними на данный момент такая разметка не работает но в любом случае мы после этого ветеринарного оператора ставим текст задачи и еще к нему Обратите внимание Вот здесь стоит плюс И вот такой символ слэш N обратный слэш Это знак переноса строки потому что мы хотим чтобы Наша задача каждый начинал с отдельной строки вот мы получили список задач Ну соответственно это у нас 6 предметов Теперь мы хотим объединить их массив это узел айтем-лист он у нас стоит в режиме concottenate Items То есть он все 6 элементов превратил в один который содержит себе массив от 6 такими элементами теперь этот массив мы можем слепить в одно в один текст с помощью узла сет и такой операции как Join и у Джой на нужно указать в качестве аргументов пустую строку то есть кавычки опять сразу кавычки я запускаю и у нас формируется вот такой вот текст где сразу стоит еще Перенос строки И если мы сейчас запустим вот этот вот узел то он у нас отредактирует последнее сообщение выполняем мы уже разбирались редактированием и вставить туда Просто вставить туда слова список задач и текст задачами и смотрим как это будет выглядеть соответственно все задачи переносятся на новую строку

### [15:00](https://www.youtube.com/watch?v=3VT_uJ4iV8g&t=900s) Segment 4 (15:00 - 20:00)

и галочки все это отлично отмечается Так теперь давайте Допустим мы попробуем добавить задачу я запущу процесс и я назову Добавь задачу повидаться с родными все дело пошло и мы видим что у нас выход сейчас под номером один То есть он распознал что у нас вопрос добавить задачу и вот сформулировал Я таким образом повидаться с родными соответственно здесь еще проще мы просто идем в узел на уши добавляем новую запись здесь Но единственное что как это делается У нас есть лишний текст который нам не нужен текст выглядит так добавить задачу двоеточие пробел повидаться с родными и мы обратим внимание что у нас всегда есть вот такой вот элемент Вот он есть всегда и мы можем по нему разрубить все вот это вот конструкцию превратить ее в массив это будет нулевой элемент А это первый если мы потом возьмем первый элемент то мы возьмем как раз актуальный текст нашей задачи это становится Возможно с помощью специальной процедуры Сплит не процедура функции то есть мы перетаскиваем вот этот контент Да и после того как перетащили давайте это проделаем еще раз после того перетащили ставим точку и пишем сплит и внутри сплита мы Ну сразу Давайте зайдем во внутрь составим пустую строку и здесь составим двоеточие и пробел все И вот таким образом мы раскалываем эту строку Превращаем в массив из двух элементов и нам нужно взять второй элемент он будет подым один для этого используется квадратная скобочка Вот и вот так вот мы выдергиваем полезную информацию супер нажимаем и здесь встретиться повидаться с родными возникает как задача и теперь точно так же мы правим последнее сообщение только правим Каким образом мы добавляем текст задача пробел кавычки дальше добавляем сюда Собственно отсюда добавляем текст вот так вот перетаскиваем повидаться с родными закрываем кавычки и пишем добавлено пробел добавлено это исправит наши сообщения здесь на собственно с выполняем на задачу с родными добавлена так и теперь давайте самое интересное посмотрим во всей этой конструкции это пометить задачу как выполнена Почему самое интересное потому что нам еще раз придется обращаться к чат gpt чтобы корректно найти нашу задачу и в зависимости от того как мы сформулируем наш запрос это может сработать А может и нет Итак Давайте возьмем сложное заверши задачу про аэропорт Здесь много слов и ему может этого не хватить смотрим Так давайте посмотрим завершить задачу про аэропорт А так Да все он правильно выбрал и Теперь смотрите что нам нужно получить во-первых нужно извлечь весь список наших задач потому что мы начнем пока не знаем С какой из них работать То есть вместе с задачами подсасываются их ID их прочие какие-то данные вот и это все мы выпускаем два потока один идет вниз и вот придет в узел мерч Они чуть позже в другом потоке Мы хотим выдернуть название всех этих задач из вложенных конструкций и соответственно получим просто вот такой вот набор элементов Ну то есть набор айтомов просто задачами Вот они идут мы хотим превратить это все в строку через запятую то есть опять как мы уже делали мы создаем через массив А потом склеим этот массив причем склеиваем просто с помощью запятой И вот так вот мы получили вот такой список теперь этот список мы можем передать нашему чат gpt Давайте посмотрим как выглядит промт на самом деле не очень сложно но его мне пришлось подтачивать используя слова данные как

### [20:00](https://www.youtube.com/watch?v=3VT_uJ4iV8g&t=1200s) Segment 5 (20:00 - 23:00)

дальше я привожу нашу наш список А точнее я привожу наш запрос Пардон вытаскиваю из узла мерч приложу запрос Как он звучит вот Прошу вернуть наиболее подходящую задачу из списка а список То есть это я задавал как инструкцию для системы а список то есть свой пользовательский текст я задаю вот здесь список идет вот и сейчас надо смотреть а выдаст ли он нам правильный ответ Да он сообразил что нужно именно выдать встретить друга в аэропорту а не какой-то еще текст он мог бы написать завершить задачу про аэропорт вот прям буквально бывают у него такое Но обычно по всем моим опытам многочисленным он все-таки выдает правильный результат если контекст хоть как-то нормально определяет задачу то есть человек поймет по контексту то он тоже как правило понимает отлично значит что сейчас произойдет здесь у нас один элемент а здесь 7 так вот будет произведено соответствие Всех элементов здесь по значению название задачи и здесь там где задача там где задачи названия имеют одинаковое название то тот элемент пройдет из Нижнего потока то есть внизу 7 элементов все не имеют разные названия и здесь у меня написано встретить друга в аэропорту А если мы возьмем другой Input то тут очень много инпутов и только одна имеет встретить друга в аэропорту Мне важно проверить на равенство этих полей и пропустить Нижний поток то есть пройдет только один элемент из семи но он будет содержать себе в себе полную информацию включая ID записи в notion потому что она нам нужна теперь Мы выполняем нашу задачу то есть мы обновляем элемент в базе данных используя тот самый ID который к нам пришел вот здесь мы знаем что это ID правильные задачи запускаем и у нас появится галочка встретить друга в аэропорту После чего мы повторяем все то же самое что мы делали вот здесь то есть по сути эти шаги Один в один можно на самом деле сделать один процесс и Ну то есть один блок и вернуться к нему то есть а нет кстати Возможно не получится или нет наверное нет получится потому что нам нужно будет менять этот текст а он будет стоять как раз до развилки Вот Но в любом случае чтобы не лепить тут слишком много лапши перепутанной я сделал точно такой же процесс который мы уже проходили то есть получить задачи обновленный уже список подготовить сообщение и получить вот этот новый вид это мы уже делали вот ровно вот здесь все это делали список задач Итак я понимаю что это был достаточно трудный урок но теперь вы можете сами уже составлять подобные боты для управления не только задачами но и прочими структурами с использованием текстовых или голосовых коман

---
*Источник: https://ekstraktznaniy.ru/video/15152*