メインコンテンツへスキップ
見出し画像

【AI BOT テンプレート】Update 時間や曜日指定で指示を実行させてみる

    こんにちはRcatです。
    今回は前回紹介した以下の記事の続きです。
    具体的にはタイトルにあるように時間指定や曜日指定などを行っていきます。

    次回のアップデートはこちら

    前回まであらすじ

    前回、Discordのポットを使ってメッセージを送信することで、現実にアクションを起こすということをやっていきました。
    具体的な例では、自作のledライトを点灯させるというのをやってみました。

    さて、ここまでは入り口にすぎません。
    確かにAIに対してメッセージするだけで様々なものを遠隔操作できるのは便利ですが、その場でやる必要があります。
    例えば今電気をつけたいから電気をつけてということはできますが、朝起きる時間になったら勝手に電気つけて欲しい時どうしますか?…..ということで、タイマー機能を実装しましょう。

    概要

    実現したい機能

    今回は以下のような機能をタイマー機能として実装していきます。
    最初は単純に日時指定ができればいいかなと思っていたのですが、実際使うと思うと曜日指定や一時停止などを組み込まないと使いづらいことが判明したので、それなりに機能を盛り込んでいます。

    • タイマー機能

      • 何時何分に実行という指定方法でタイマーをかける

      • 何分後という指定方法でタイマーをかける

    • 繰り返し機能

      • 回数を指定して1日おきに繰り返す。無限の設定も可能。

    • 曜日指定機能

      • 平日のみ実行するや月水金だけ実行など、毎回次の目的の日時にセットし直さなくても、曜日による指定をできるようにする

    • 一時停止機能

      • 祝日だからその日はやらないや長期休暇中はやらないなど、タイマーを解除しなくても一時的に抑制する機能

    • 今すぐ実行

      • 時間になっていない場合でも実行できるようにする。
        引数の多いコマンドをタイマージョブとして定義して置き、IDを告げるだけで実行等ショートカットにもなる

    追加機能

    さらに追加として、Discord標準搭載の音声を記録機能と音声認識を組み合わせてどんなデバイスでも音声入力を出来るようにします。           

    ターゲット

    今回は別の工作をターゲットにやっていこうと思います。
    ということで、今回は以下のMP3プレーヤーを操作していきます。
    こちらも今までと同じようにwi-fiに接続してスマートフォンから操作するMP3プレーヤーです。主に音楽をかけたり、寝る前に雑音をかけ続けるのに使います。
    具体的には、寝る前に雑音に切り替えて音量とイコライザーの変更を行った後、タイマーをかけるのですが、その作業を今回のAIにタスクとしてやらせようと思います。

    とりあえず実行する

    まず最初にどんなことができたのか、実行結果からお見せします。
    ここではMP3プレーヤーを操作するための"music_control"関数を用意し、それのパラメーターに今回変更したい各種内容を入れてみました。

    時間指定でタイマーコマンドを設定

    まずは時間の指定方法です。
    曲番号を変更する方は5分後にという方法で指示しています。
    送信時刻が42分でタイマーがかかった時間が47分なので、AIはきちんと認識しているようです。
    音量を変更する方法は時間を指定しています。
    タイマーのかかった時間が正確に言った時間になっているので、こちらもきちんと認識されているみたいですね。

    画像

    実際にかかったタイマーを確認してみましょう。
    一覧コマンドで、以下のようにどのコマンドがどの引数でいつ実行されるのかと詳細な情報を見ることができます。

    画像

    ちなみにタイマーが実行されると以下のようなメッセージが投稿されます。
    今回は回数を1に設定しているので、終わった後タイマーが削除されています。

    画像

    曜日指定で繰り返す

    次に曜日指定を行ってみます。
    指示の内容は午前3時にスリープするというもの。条件として平日のみという曜日指定が入っています。
    AIは意外と頭いいのか、月曜日から金曜日という範囲指定でもきちんと認識してくれています。
    ちなみに-1回というのは無限という意味です。

    画像

    タイマーの設定内容は以下の通り。期待通りですね。

    画像

    ちょっと意地悪な指示の仕方をしてみます。
    AIはやってはいけないことの指示は苦手と聞いていましたが、この程度であれば大丈夫なのですかね?

    画像

    きちんと土日以外が指定されています。

    画像

    今までは単一の範囲で指定していましたが、複数の指定方法の場合はどうでしょうか?

    画像

    さすがですね。火曜日と日曜日以外がきちんと指定されています。

    画像

    一時停止を使う

    では、次に一時停止機能を試してみましょう。
    まずは事前にタイマータスクをセットしておきます。例えば、以下のようなタスクがあるとします。

    画像

    次に一時停止をかけます。
    タイマーのIDを使ってどのジョブかを指定した上で、一時停止の期間を指示します。

    画像

    もう一度ジョブ一覧を確認してみます。
    前回なかった一時停止の文言が増えています。この状態のジョブは実行されることはありません。

    画像

    今すぐ実行する

    まずタイマージョブを作成します。
    とりあえず5分後に曲を5番に変えてもらいます。
    次に時間内に今すぐ実行の指示を出します。一番下に追加されているのでIDは14番ですね。

    画像

    音声入力でジョブが誤記になっていますが、AIへの指示の仕方が工夫されているので問題なく認識されました。
    その後コマンドが正常に実行され、用済みのタイマージョブは削除されます。

    消さずにショートカットとして使いたい場合は回数を無限にしておけばOK。
    こんな感じで指示が面倒なコマンドを事前に設定しておきます

    画像

    ショートカット目的なら定期実行は要らないので一時停止します。

    画像

    実行したいときにIDを言えばOK

    画像

    長押しして記録で音声認識

    Discordには右のマイクボタンを押し続けると録音して即座に送信する機能があります。
    さて、これで記録した音声を音声認識に掛ければ…音声入力できますね!?
    私はGBoardを使っているのでそれの音声入力を使っていますが、そうでない人もこの機能を使うことで音声をBOTに送れます。

    画像

    詳細はこちら

    実行結果がこちら
    簡単なコマンドなので処理速度も申し分ないです。

    仕組み

    今回はBOTのシステムとAIのプロンプトの変更を行いました。

    AI側

    AI側のプロンプトは以下の通りです。
    黒い部分はダウンロード限定です。詳細が気になる方は是非ダウンロードしてください。

    画像

    まずは一番最初の指示の部分に、タイマーという要素があるよというのを書いています。これによりユーザーの入力に時間的概念が入ってきた時、タイマーとして認識してくれるようになります。

    次にタイマーについてというセクションを追加しています。色々書かなければいけないので、セクションを分けました。
    具体的にはどういうものがタイマーかという定義を最初に行い、次にどういう風に指示が入ってくるのかということが書いてあります。
    具体的には何分後という時間という入力、および何時何分という時刻を入力があるよということを書いています。
    また、AIは簡単な計算ならできるので、N分後やN時間後といった指定方法の場合、秒にして出力してくださいという風に言っています。こうすることでプログラム側では秒で扱うように書けばいいのでかなり楽になります。

    また、過去の日付は指定しないようにと言っていますが、これはあんまり効いていません。

    また、もう一つ工夫があり、塗りつぶしの部分ではあるんですが現在時刻を入力しています。これはAIが現在時刻に関する情報を確実に持っているとは限らないからです。

    最後に出力フォーマットですね。
    前回の高性能質問分岐で検討した出力にタイマーという出力を加えています。ここにタイマーがかかる場合は出力が入ることでタイマーコマンドが否かを判別する仕組みです。

    Python側

    AIからのレスポンスを受け取る部分を以下のように変更しました。
    具体的には応答の中にタイマーの指示が入っているかどうかで分岐します。

    画像

    ポイントとしては、プログラム内で扱いやすいようにタイマーは時刻で扱っています。AIからの応答を元に時刻に変換して保持するという形ですね。そして、その時刻を現在時刻が過ぎている場合、タスクが実行されるといった具合です。
    それ以外はAIの応答はブレるので、いくつかの補正の処理が入っています。主に数値と文字ですね…。

    そしてタイマーのメインループはこちらです。
    時間ぴったりは狙っていないので、30秒おきのループでやっています。

    画像

    ポイントとしては、タイマー実行時に実行したメッセージを送信できるようにメッセージをオブジェクトが保持されているところでしょうか?
    タイマーのリストの中にメッセージオブジェクトをそのまま保持しておくことで、実行時にメッセージを返せる仕組みです。

    ちなみにタイマーはセットしたり、削除したりすると保存されます。なので再起動したり、BOTが落ちた場合でも消えることはありません。

    保存されたデータの一部がこちら。今回タイマーは辞書のオブジェクトなので、そのままJSONとして保存しています。
    ただし、Discordのメッセージオブジェクトはそのままでは保存できないので一工夫しています。詳しくはDL。

    画像

    テンプレートの配布

    最後までご覧いただきありがとうございます。
    本作の詳細なソースコードや、これを使ったBOTの開発を行いたい場合は、テンプレート配布しています。

    配布URL

    前回の記事最下部の配布の部分に追加してありますので、そこから参照してください。

    実行環境

    Windows11 / Linux (Ubuntu)でBOTがログインして指示を受け付けることを確認済み(DifyはUbuntuで実行)

    環境構築

    本作から完全自動で仮想環境作成から起動までを行えるようにしました。
    実行の際は、OSに応じてstart.shまたはstart.batを起動するだけでOKです。
    ※何も設定せずいきなり起動ではトークンエラーで即落ちします

    画像

    Difyのセットアップなどは前回の記事の方を参考にしてください。

     
     
    モノづくりが趣味。 "売ってないなら自分で作ればいいじゃない"をコンセプトに、機械/電気/AI/プログラム/ネットワーク 全部やります。 記事執筆はAI不使用。 ご連絡や利用規約はプロフィール記事参照。

    あなたへのおすすめ