📚

誰もマネしたくない学習環境を構築してみた

2023/04/16に公開

タイトルにもしましたが、誰もマネしたくならないような仕組みを作ってみました。
ざっくりいうと勉強をしないと Alexa に怒られるという仕組みになっていて、ツールには Alexa や ChatGPT を利用しています。
何を言っているのか分からないと思うので、内容を説明していこうと思います。

はじめに

Alexa や ChatGPT を使った自宅IoT環境を構築してみました。
ただ、この仕組みは私が私に勉強を促すために作った仕組みなので、あまり参考にならないと思いますが良かったら見ていってください。

対象読者

  • 興味を持ってくださった方

なぜ作ったのか

皆さんは勉強をしようと思ってからすぐに行動にうつすことが出来ますか?
私の場合、ごく稀に発生する「意識高い週間」にならないと勉強を自発的に行いません。
そのためどうにかして少しでも自分に勉強をさせたいと考え、Alexa さんに叱咤激励してもらう仕組みを構築しました。

あとは単純に Alexa を購入したので何かしたいと思ったのと、最近の波に乗っておこうと思い、ChatGPT も組み込んでみた感じです。

概要構成

全体概要図はこんな感じになります。

Alternate text

全体処理概要

  1. 学習実績をスプレッドシートで管理
  2. Google Apps Script を定期起動して特定の Google Drive にあるスプレッドシートが更新されていた場合にカレンダに予定を作成
  3. Echo dot に定時起動するように設定 ※起動トリガは人検知
  4. Echo dot が起動したら Alexa スキルを呼び出し
  5. Alexa スキルから Make HQ に連携
  6. 処理フローの中でカレンダ情報(学習実績)を確認して褒めるか怒るかを分岐
  7. ChatGPT にメッセージ作ってもらってAlexa スキルに戻す
  8. Alexa スキルを中継して受信したメッセージを Echo dot が読み上げる

利用環境/ツール

  • Alexa
    • Echo dot
    • Alexa skills kit
  • Google WorkSpace
    • スプレッドシート
    • Google App Script
    • Goolge カレンダー
  • Voiceflow
  • Make HQ
  • ChatGPT

ざっくりしたお決まりごと

前提事項

  • 学習記録はスプレッドシートに記入して管理しています。
  • ChatGPT や Make HQ、Voiceflow に関する詳しい説明はここでは割愛します。
  • 微妙に細かいところまで記載していないので、気が向いたら設定値などの詳細を書こうと思います。

Alexa からのお話

Echo dot には人検知機能があるため、人を検知していた場合にのみ定期実行により会話を開始します。
ちなみに顔識別等の機能は実装されていないので、誰を検知しても会話し始めます。

Alexa の言語

言語は日本語で話しますが、ChatGPT に関西弁で文章を考えてもらっているので最終的には関西弁になります。

メッセージ文字数

怒られるのはもちろんですが、そんなに長文で褒められたくもないので、メッセージは 50字以内 で作成するように設定しています。
※ただしメッセージ作成を行うのがChatGPTなので、50字以上になることも多々あります。

やったことをはじめから書いていく

1. とりあえず Alexa のデバイス設定

まずはじめに Alexa アプリのダウンロードおよびデバイス登録を行います。
デバイスの設定は iPhone または Android を用いて行うので、アプリをどうにかしてダウンロードしてください。
Alexa のセットアップについては、こちらのドキュメント(公式)をご参照ください。
※こちらは「Echo Dot」のセットアップ手順になります。

2. スプレッドシートを更新日付で勉強したかを確認する処理を作る

前提にも記載しましたが、私は学習した記録をスプレッドシートで管理しているので、その日のスプレッドシートの更新有無で勉強しているかを判定しています。
更新確認処理は Google Apps Script を使用して実装しています。

書いたコードはこんな感じです↓

コードブロックは邪魔なので折りたたんでおきます。
chkLarningRecord.gs
function chkLarningRecord() {  
  try{
    // スクリプトプロパティから値を取得
    const target_drive_id = PropertiesService.getScriptProperties().getProperty('target_drive_id');
    const gmail_address = PropertiesService.getScriptProperties().getProperty('gmail_address');
        
    // 検索対象のGoogle Driveから情報を取得
    const folder = DriveApp.getFolderById(target_drive_id);
    const files = folder.getFiles();

    // 当日日付取得
    const today = new Date();
    const date = Utilities.formatDate( today, 'JST', 'yyyyMMdd');
    
    // カレンダ情報設定
    const myCalendar = CalendarApp.getCalendarById(gmail_address);
    const events = myCalendar.getEventsForDay(today);

    // 処理確認用文字列
    const processStr = "学習記録済"

    // 予定が0件ではない場合に予定の件数分処理してタイトル名を取得
    if (events.length !== 0) {
      for (event in events) {
        let title = events[event].getTitle();
        console.log(title);
        // 既に処理済みの場合は処理を終了
        if (title === processStr) {
          console.log("お疲れ様です。処理を終了します。");
          return "0";
        }
      }
    }

    // 各ファイルの更新日付をチェック
    while(files.hasNext()){
      let file = files.next();
      let name = file.getName();
      let lastUpdatedDate = Utilities.formatDate(file.getLastUpdated(), "JST", 'yyyyMMdd');

      // 本日更新されたファイルがあれば「学習記録済」の予定をカレンダに作成して処理終了
      if (lastUpdatedDate.includes(date)){
        console.log("更新 : "+ name);
        let options = {description: name}
        myCalendar.createAllDayEvent(processStr, today, options);
        return "0";
      } else {
        // 希望は捨ててない
        console.log("未更新 : "+ name + " 更新日 : " + lastUpdatedDate);
      }
    }
    return "1";
  } catch(e) {
    console.log('エラーを検知しました。エラー内容:'+e.message);
  }
}

処理としては、まずGoogle Drive のフォルダを指定してその中に格納されいているスプレッドシートの更新日付を確認します。
スプレッドシートが更新されている場合、Google カレンダに予定を作成することで学習実績をカレンダに残せる+後続の Alexa の判定処理に使用することにしています。

3. Make HQ で Alexa と ChatGPT の API 連携を設定

Alexa と ChatGPT を連携するために、Make HQ を使います。
処理としては Alexa スキルを起動して Make に連携、Googleカレンダーの予定表が作成されているかで処理を分岐してChatGPTに連携し、その結果を Alexa スキルに戻すって感じになっています。
Make に実装した全体の流れはこんな感じです↓
Alternate text

4. VoiceFlow で Alexa スキルの作成

Alexa スキルはツールに頼って Voiceflow で作成します。
基本的にはMakeにほぼすべての処理を任せているので、Alexa スキルは起動とレスポンスを読み上げるだけです。
フロー的にはこんな感じです↓
Alternate text

この際、Amazon Developer Console で Alexa スキルを公開する必要があるのですが、今回は自分しか使いたくないツールなのでベータテストでスキルを公開しています。
このベータテストには公開期限があり、その延長方法が分からず、(多分ないと思っていますが) もしご存じの方が居たら教えてほしいです。

5. Alexa アプリで定期実行の設定をする

最後は、1で設定した Alexa アプリを使って、定期起動を作成します。
その際に実行条件に人検知を設定することで、無人で勝手に会話をスタートすることを予防しています。

おわりに

最後に Make 上での出力ですが、勉強して Alexa ( ChatGPT ) に褒められた場合と怒られた場合のメッセージを載せておきます。

  • 褒められるパターン
    Alternate text

  • 怒られるパターン
    Alternate text

褒められるパターンで褒められてないし、怒られるときは結構精神的に追い込んで来る辛辣な感じで笑いました。

以上で終わりです。
ありがとうございました。

Discussion