Dialogflowを使った日付の音声入力

日常会話の中で、日付に言及する場合、「2023年2月13日に会いましょう」のような表現をすることはあまりないと思います。通常は「今日」を基点として、「明日」とか「来週の日曜」とか、表現するのではないでしょうか?

現在、音声メモアプリを作って血圧を登録する機能を考えているのですが、この機能を作る上で、「日付の音声入力」はどうすれば良いか、あらためて考えてみました。

目標は、「明後日」や「来週の日曜」をデータとして取り扱いのしやすい”年月日の表現(2023-01-02)”に変換することです。

Dialogflow

辞書や正規表現を使って変換するコードを書けば良いのですが、既存のものがあれば、自分で作るものよりも良いかと思われます。

Dilalogflowは航空機やレストランの予約をすることを想定されていますので、一般的な日付の表現を理解できるようになっています。これを使って、日付の変換を試してみます。

今回は、非常にシンプルなintentになりますので、Dialogflow Essentialsを使います。

Intentを一つ作り、Training Phrasesに典型的な日付の表現を追加します。

ハイライトされている部分は@sys.date-time Entityにしておきます。

Responseは、$date-time valueを返します。

Try it now

intentをsaveしたら、Try it nowでテストしてみます。

テストした日付は2023-02-13 月曜日です。

入力Response結果判定
今日2023-02-13
明日2023-02-14
明後日2023-02-15
明明後日(しあさって)2023-02-16
昨日2023-02-12
一昨日(おととい)2023-02-11
先一昨日(さきおととい)2023-02-10△ 漢字は判別不能
来週の金曜2023-02-24
今週の金曜2023-02-17
次の金曜2023-02-24×
今週の日曜2023-02-12

今日は月曜日なので、「次の金曜」は、私たちの感覚で言うと、「今週の金曜」と同義なので、間違いとしました。しかし、英語で"Next Friday"というと、"Next WeekのFriday"を指すようなので、英語圏では正しいということです。ちなにに、今週の金曜は"this Friday"だそうです。

また、1週間の始まりが日曜日とすると、今週の日曜は正しいのですが、月曜日とすると間違いになります。日本人に限ってもどちらが正解なのかは、決まっていないようです。

次に時間についても確認してみました。

今朝9時2023-02-13T09:00:00
今晩9時2023-02-13T21:00:00
明朝9時2023-02-14T09:00:00
明日の夜7時2023-02-14T19:00:00

時間の表現も正しく変換できているようです。

次に、範囲をもつ表現を試してみます。

明日の朝2023-02-14T05:00:00/2023-02-14T11:59:59
明日の夜2023-02-14T17:00:00/2023-02-14T23:59:59
明日の昼2023-02-14T12:00:00/2023-02-14T17:59:59
明日の深夜2023-02-14T22:00:00/2023-02-14T23:59:59
明日の明け方2023-02-14T05:00:00/2023-02-14T06:59:59
明日の早朝2023-02-14T05:00:00/2023-02-14T06:59:59
明日の午前中2023-02-14T05:00:00/2023-02-14T11:59:59
明日の午後2023-02-14T12:00:00/2023-02-14T17:59:59

開始時刻と終了時刻がResponseで返されます。「午前中」が何時から何時までを指すのかは定義されたものはないかと思いますが、概ね妥当な範囲になっているのではないでしょうか?

ちょっと変わった使い方になりますが、Dialogflowを使えば、日付の表現をDatetime型に簡単に変換できそうです。

FlutterからDialogflowを呼び出す基本コードは以下の通りです。

  void response(query) async {
    AuthGoogle authGoogle =
        await AuthGoogle(fileJson: "assets/dialogflow.json") // ※ 認証情報のファイル名
            .build();
    DialogFlow dialogflow = DialogFlow(authGoogle: authGoogle, language: "ja"); // ※ 日本語に変更
    AIResponse aiResponse = await dialogflow.detectIntent(query);
  }

queryに日付表現をセットしてresponse()関数に与えれば、aiResponseからdatetimeが取得できます。

詳細は、以下の記事に記載していますので、ご参考にしてください。

FlutterアプリでDialogflow APIを使う(dialogflow_flutter)

以前ご紹介した音声チャットボットアプリでは、全てのユーザ発話を応答生成サーバに送ってボットの応答を得ていました。実用的な応答を得るためには、会話の流れを制御す…

(おまけ)ChatGPT

せっかくなので、最近はやりのChatGPTではどうなるのか試してみました。まず、ChatGPTはタイムゾーンを持っていないようです。当たり前にできると思った「今何時?」の問いには答えることができません。ちょっと意外でした。が、ChatGPTが訓練された知識に閉じた世界の回答しかしないと考えてみれば当たり前ですよね。

では、なぜ日付だけはわかっているのかは、謎です。何かしらの時刻も持っているようですが、UTCのタイムゾーンでもないように思えます。もしかしたら、適当な時刻を答えただけかもしれません。

以下、ChatGPTとのやり取りです。

今日は何曜日?

ー 申し訳ありませんが、私は時刻や日付にアクセスすることはできません。私は一種の人工知能であり、私が訓練された知識に基づいて質問に答えることができますが、現在の日付や時刻にアクセスすることはできません。

今日は何日?

ー 申し訳ありませんが、私は2023年2月13日の情報しか持っていません。

今何時?

ー 現在の時刻は、私にとってはタイムゾーンに依存します。私がどのタイムゾーンで動作しているか教えていただければ、現在の時刻をお伝えできます。

あなたはUTCで動作しているとして、今何時?

ー 現在のUTC時刻は、2023年2月13日 13時55分です。

それはJSTでは何時になりますか

ー JSTはUTC+9のタイムゾーンで、現在のUTC時刻が13時55分なので、JSTでは2023年2月13日22時55分となります。(現在のJST 時刻は2023年2月13日19時53分なので、UTCではなかったということでしょうか)

今日が2023年2月13日だとして来週の金曜日は何日?

ー 2023年2月13日の翌週金曜日は、2023年2月24日になります。

当初の目的であった、「明後日」や「来週の日曜日」を得るためには、まず、「今が何日であるか」を伝えた上で、訪ねることで正しい回答は得られるかもしれませんが、このような問いには不向きであるように思います。