Skip to content

Instantly share code, notes, and snippets.

@halhorn
Last active February 28, 2022 07:27
Show Gist options
  • Save halhorn/73efc575da7e13aeceb5bffff1814e95 to your computer and use it in GitHub Desktop.
Save halhorn/73efc575da7e13aeceb5bffff1814e95 to your computer and use it in GitHub Desktop.
シナリオエディターモジュール集

モジュール一覧

abs

絶対値を返します。 例えば-1を入力すると1が返ります。

### 引数
  • val: 入力する数値

利用例

昨日と今日の温度差は {abs val=[temperature_diff]} 度なんだって

add

足し算を行います。

引数

  • val1: a + b の a
  • val2: a + b の b

利用例

{add val1=1 val2=2}

変数に1を足した値を格納することでカウンターが作れます

key: count
val: {add val1=[count] val2=1}

- をつけることで引き算もできます

{add val1=[today_num] val2=-[yesterday_num]}

alphabot_reset

AI の会話の状態をリセットします。 会話の話題転換を強制的に行う場合に使います。

### 引数 なし

利用例

話題をかえよっか {alphabot_reset}

content

一つの発話の中に複数のアクションを埋め込みます。各アクションで以下のことができます。

  • 発話
  • 音楽ファイルの再生
  • アクション毎に感情の設定
  • アクション毎に force_trigger_type を指定して特殊なアクションの実行
  • HLS(ストリーミング)再生

引数

  • text: 発話内容
  • sound: 再生する音楽ファイル名
  • streaming_sound: 再生する音楽の名前
  • emotion_type: 感情
  • force_trigger_type: 変更先のトリガータイプ
  • その他: force_trigger_type への引数になります

利用例

{content sound="happy_birthday.wav"}
{content streaming_sound="20210304_sakura_v3"}
{content streaming_video="20210304_sakura_v3"}
{content sound="happy_birthday.wav" text="ハッピバースデー"}
じゃあ歌うね!{content sound="sing.wav"}歌ったよ!
普通の感情{content text="笑っちゃうね" emotion_type="laughing"}
天気喋るね。{content text="晴れだって" force_trigger_type=weather_trigger weather=sunny max_temp=10 min_temp=2}
{content text="昔々あるところにおじいさんとおばあさんが..."}{content text="そこでおじいさんは..."}

dialogue_log

会話ログの検索を行います。 検索結果の値(発話内容など)を返します。発話が見つからなかった場合空文字を返すので、条件に組み込めます。 複数マッチするものが有った場合、最も新しい発言を返します。

引数

  • search: 検索対象の文字列(ユーザー発話)
    • 省略時はすべての発話になります
  • start: 検索開始時刻
    • time モジュールを使うことを想定しています。
    • 直接指定時は 20180101-000000
    • 未指定の場合、30日前になります
  • end: 検索終了時刻
    • start と同じ
    • 未指定の場合、今現在になります
  • target: 検索対象の ES 上のパス(未指定なら tweet.text でユーザー発話)
    • tweet.text: ユーザー発話
    • reply.text: システム発話
    • reply.bot_id: 応答した bot の ID

利用例

# 過去30日で「ラーメン」と言ってるユーザー発言を取る
{dialogue_log search="ラーメン"}

# 2018/01/01 から2018/01/18 までで「ラーメン」と言ってるユーザー発話をとる
{dialogue_log search="ラーメン" start=20180101-000000 end=20180118-000000}

# ロボット自身の直前の発話をとる(過去30日さかのぼって検索しその最新)
{dialogue_log target="reply.text"}

# ロボット自信の直前の発話をとる(過去5分以内。できれば↑よりこっちつかってね)
{dialogue_log target="reply.text" start={time addminutes="-5"}}

earthquake

地震情報を取得して話します。

引数

  • format
    • 出力フォーマット
    • 天気モジュールと同様にキーワードを指定して使います。以下が使えます。
    • time: 地震発生時刻が入ります e.g. 12時15分
    • epicenter: 震央の地名が入ります e.g. 東京湾不明
    • max_intensity: 最大震度が入ります e.g. 4, 5弱
    • magnitude: マグニチュードが入ります
    • depth: 震源の深さが入ります。e.g. 20キロごく浅い
    • content: 固定付加文というものが入ります。e.g. この地震による津波の心配はありません。

format例

time頃に震源地epicenterの地震があったんだって!最大震度はmax_intensityでマグニチュードはmagnitudeで震源の深さはdepth、commentらしいよ!

edit_distance

編集距離を計算します。

引数

  • text1
    • 1つ目のテキスト(必須)
  • text2
    • 2つ目のテキスト(必須)
  • kana(オプション)
    • True の場合、text1 と text2 をそれぞれカタカナにしてから編集距離を計算します

# 1 になる
{edit_distance text1=東京都 text2=京都 kana=false}
# 2 になる
{edit_distance text1=東京都 text2=京都 kana=true}

emotion

halucas の感情を設定します。

引数

  • type
    • 感情のタイプを指定します。
      • normal: 🙂
      • laughing: 😆
      • joy: 🤣
      • sob: 😭
      • heart: 😍
      • kiss: 😚
      • relaxed: 😊
      • sweat_smile: 😅
      • cry: 😢
      • scream: 😱
      • fearful: 😨
      • tired: 😩
      • surprised: 😳
      • angry: 😠
      • thinking: 🤔

利用例

笑顔を出すね{emotion type=laughing}

発話は「笑顔を出すね」になり、顔が laughing になります。 別に先に emotion モジュールを呼んでから「笑顔を出すね」と書いても問題ありません。

english

英語モードに設定します。 英語モードになると、聞き取るのも話すのも英語になります。

引数

  • switch
    • on: 英語モードに設定します(switch を指定しない場合 on とみなされます)
    • off: 英語モードを解除します

利用例

英語でしゃべってね!{english}
OK, I will stop english mode {english switch=off}

func_utterance

機能発話であることを知らせる効果音を鳴らしたあと、効果音と発話が被らないよう少し待ってから発話します。

引数

  • text: 発話内容
  • sound: 再生する音声ファイル(デフォルト: sound/romi_birth_anniversary.wav)
  • delay: 効果音を鳴らし始めてから何ミリ秒発話を遅らせるか(デフォルト: 500)

利用例

{func_utterance text="機能発話です"}

上記は以下のように展開されます。

<content sound="sound/romi_birth_anniversary.wav">
  <vtml_pause time="500" />機能発話です
</content>

fortune

運勢を占います。 総合運・恋愛運・金運・仕事運・健康運が占えます。 formatで発話内容を指定する必要があります。 ※birth_dateを引数で指定しないかつ誕生日が未設定の場合は空文字を返すので、誕生日を引数で渡さない場合は、knowledgeなどを使って誕生日が設定済みであることを確認してから呼び出してください。

引数

  • date:
  • birth_date:
  • format: 出力フォーマットです。以下のキーワードが使えます。
    • date: 占った日付を表す文字列。今日・明日・明後日・昨日・一昨日以外の場合は具体的な日付を「○月○日」の形式で返します。
    • birth_date: 占う対象人物の誕生日を「○月○日」の形式で返します。
    • sign: 誕生日の星座。e.g. やぎ 座
    • color: ラッキーカラー。
    • item: ラッキーアイテム。
    • title: 総合運のタイトル。
    • summary: 総合運のまとめ。
    • text_short: 総合運のかんたんな説明。
    • text_long :総合運の長い説明。
    • point :総合運の点数 (5段階評価で1=悪い、5=良い)。
    • rank :総合運の順位。
    • love_title :恋愛運のタイトル。
    • love_summary :恋愛運のまとめ。
    • love_text_short :恋愛運のかんたんな説明。
    • love_text_long :恋愛運の長い説明。
    • love_point :恋愛運の点数 (5段階評価)。
    • love_rank :恋愛運の順位。
    • money_title :金運のタイトル。
    • money_summary :金運のまとめ。
    • money_text_short :金運のかんたんな説明。
    • money_text_long :金運の長い説明。
    • money_point :金運の点数 (5段階評価)。
    • money_rank :金運の順位。
    • work_title :仕事運のタイトル。
    • work_summary :仕事運のまとめ。
    • work_text_short :仕事運のかんたんな説明。
    • work_text_long :仕事運の長い説明。
    • work_point :仕事運の点数 (5段階評価)。
    • work_rank :仕事運の順位。
    • health_title :仕事運のタイトル。
    • health_summary :健康運のまとめ。
    • health_text_short :健康運のかんたんな説明。
    • health_text_long :健康運の長い説明。
    • health_point :健康運の点数 (5段階評価)。
    • health_rank :健康運の順位。

利用例

今日の総合運を占う

{fortune format=title!signの運勢は第rank位だよ!「summary」みたいだよー!}

西洋占星術で占う今日の総合運!やぎ 座の運勢は第6位だよ!「気楽に過ごすと、最高のアイデアが湧きそう」みたいだよー!

恋愛運を占って補足説明する

{fortune format=signの恋愛運は第love_rank位だよ!「love_text_long」だってさー!}

やぎ 座の恋愛運は第12位だよ!「言葉に気をつけたい日。思いつきや発言はよけいなトラブルに発展する恐れがあります。またよかれと思っても、相手のことにあまり口を出さないこと。逆に干渉と受け取られて不快感を抱かせます。一歩距離をおくことです。」だってさー!

占う対象人物の誕生日を指定して仕事運を占う

{fortune birth_date=1月1日 format=birth_date生まれの仕事運はwork_point点だよ!「work_summary」らしいよー!}

1月1日生まれの仕事運は1点だよ!「平穏無事な運気。アイデアを書き留めると〇」らしいよー!

占う日付を指定してラッキーアイテムとラッキーカラーを取得

{fortune date=明日 format=dateのラッキーアイテムはitem!ラッキーカラーはcolorだよー!}

明日のラッキーアイテムはリュック!ラッキーカラーはレモンイエローだよー!

halucas_name

ロミィの名前(の正規表現)を返します。

引数

  • type: ユーザー発話用の正規表現パターンを返すか、発話用に名前をそのまま帰すかを指定します。指定しない場合 filter になります。
    • filter: ユーザーの発話でつかいます。ロミィの名前のエイリアスを含めた正規表現を返します。例: (?:ロミィ|ゴミ|海)
    • utterance: ロミィの発話で使います。ロミィの名前をそのまま返します。例: ロミィ

利用例

名前の取得

{halucas_name}.*こっち向いて
やっほー私は{halucas_name type=utterance}だよ。よろしくね。

interval

指定された起点から指定された時間発話をブロックします。 1日1回だけそのルールを発話、1度発話したらN時間そのルールは発話しない、1回だけその発話をするとかができます。

引数

  • key: このインターバルを一意に特定できるてきとうな文字列。 gohan とか。とりあえず各 interval に違う key つけとけばいいです。
  • from: 何を起点にするか。指定しない場合 interval になります。
    • interval: 前回そのルールを通ってから
    • activation: アクティベーションしてから
    • dialogue: 最後の会話から
  • once: 指定すると1度しかその interval を通れなくなります。 from=activation と組み合わせて使うといいでしょう。
    • once=1 みたいに指定。1を2に変えても1回しか通らないので注意。
  • time モジュールで使える時間指定いろいろ:起点からどれだけの間 interval をブロックするか指定します

利用例

interval

1度通ったら2日と2時間ブロック

{interval adddays=2 addhours=2 key=futsuka_nijikan}

1度通ったら今日はブロック

{interval zone=endday key=aiueo}

1度通ったら明日いっぱいまでブロック

{interval zone=endday adddays=1 key=aiueo}

1度通ったら今週末(日曜23:59:59)までブロック

{interval zone=endweek key=shuumatsu}

dialogue

直前の何らかの会話から2時間はブロック

{interval from=dialogue addhours=2 key=dialogue_2h}

その日何か会話していたら、次の日の朝6時まではブロック

{interval from=dialogue zone=endday addhours=6 key=dialogue_next_day_6am}

activation

アクティベーション3日目以降に1回だけ

{interval from=activation once=1 zone=startday adddays=3 key=sorosoro_naretakana}

is_ng

与えた文字列が NG ワードを含むかを返します。 NG の場合 "1" が、それ以外の場合空文字 "" が返ります。

### 引数 - text: 判定対象の文字列

利用例

ユーザーが NG ワードを言ったら「そんなこと言わないで」と返す

.+
{is_ng text=$0}
そんなこと言わないで!

ユーザー発話が NG ワードを含まないときのみ

.+
{is_ng text=$0} == ""

knowledge

  • halucas の知識を参照することができます。
    • 知識は「主語」「述語」「目的語」の三項関係で記述されています。
  • 知識は複数の bot 間で参照しあうことができます。

引数

  • method
    • get, set, update_object, update_subject, delete のいずれかを指定します
    • 何も指定しなかった場合は get になります
    • method=get のとき subject と predicate を指定すると、 object が返ってきます
    • method=get のとき object と predicate を指定すると、 subject が返ってきます
    • それ以外の method では subject, predicate, object を3つとも指定して下さい
  • subject
    • 主語を指定します
      • 例: 山田
  • subject_type
    • 主語の型を指定します
    • subject を指定したときだけ、指定してください
      • 例えば'山田'と言った場合、人名と社名どっちもありうるので明示的に書くようにしています
      • 例: person
  • predicate
    • 述語を指定します
      • 例: relation_for_owner
  • predicate_type
    • 述語の型を指定します
  • object
    • 目的語を指定します
      • 例: 恋人
  • object_type
    • 目的語の型を指定します
  • datetime_format

利用例

目的語(object)を取得する

山田 との 心理的距離心理的距離1 のとき」という条件で何かをする場合は、 cond に以下のように書きます。

{knowledge subject=山田 predicate=心理的距離} == 心理的距離1

山田との関係性を発話したい場合は、 utterance に以下のように書きます。

山田は{knowledge subject=山田 predicate=relation_for_owner}なんだよね!

ScenarioGraph 変数を使うこともできます。 例えば ff_name という変数に今話題にしている人名が入っているなら以下のように書けます。

{knowledge subject=[ff_name] predicate=心理的距離} == 心理的距離1
[ff_name]は{knowledge subject=[ff_name] predicate=心理的距離}なんだよね!

主語(subject)を取得する

人フォーム関係性親友 であるエンティティ」を1つ取得する場合は、以下のように書きます。

悩んでるなら、{knowledge object=親友 predicate=relation_for_owner}に相談してみたら?

知識を追加する

halucas好きなものチョコレート 」という知識を追加するときは、以下のように書きます。

チョコレート食べたいなあ{knowledge method=set subject=owner predicate=preference object=チョコレート}

ScenarioGraph 変数を使うこともできます。

[food]食べたいなあ{knowledge method=set subject=owner predicate=preference object=[food]}

知識を更新する

オーナーは初期設定では「オーナー」という名前になっています。 ScenarioGraph 変数に入っている値でこれを上書きしたい場合、以下のようにします。

オッケー![temp_name]よろしくね!{knowledge method=update_object subject=owner predicate=name object=[temp_name]}

object を更新するときは update_object を、 subject を更新するときは update_subject を使ってください。

lucas_mode

Romi のモード(喋ってる、寝てる、英語、 etc.)を返します。 モード一覧: https://github.com/projectlucas/lucathing/blob/master/lucathing/entity/devicestate/lucas_mode.py#L15

引数

なし

利用例

# 条件:英語モードだったら
{lucas_mode} == english

# 条件:英語モードじゃなかったら
{lucas_mode} != english

# 条件:持ち上げてるとき
{lucas_mode} ~= "lift_.+"

mode_change

ロミィを寝かしたり起こしたりします

引数

  • mode: sleep を指定すると寝かせられます

利用例

# 寝かす
{mode_change mode="sleep"}

news

ニュースを喋ります。

引数

  • query
    • なんについてのニュースを取得するか指定します
    • 指定しなければ直近の適当なニュースをとってきます
    • 時間表現を入れることもできます(今日、とか)
  • other_news
    • 1を入れると直近しゃべってない記事のみを返してくれます
      • 15分間ニュースについて話さないと、直近喋った記事一覧はリセットされます
  • restrict_domain
    • 1を入れると、事前に設定したドメインの記事のみを返すようになります
    • ニュースのドメインは以下の方法で確認できます
      • kibana
        • module: halucas.module.news AND body: *articles* で検索してください
      • SGでニュースを発話させるときに format に <ドメイン> を入れる
        • 例: {news query=$0 format="<タイトル>のドメインは<ドメイン>だよ"}
  • domains
    • 返したいドメインを , で区切って指定します
  • format
    • 話す内容を指定します。
    • 以下のタグを使います。それぞれ無い場合もあります。
      • <タイトル>: 記事タイトル
      • <本文>: 本文。くそながい場合が多いです。
      • <説明>: 多分その記事の要約です。
      • <説明か本文>: 説明文があれば説明文を、なければ本文が入ります。
      • 発行日: 発行日時。下で説明する datetime_format で表示形式を指定できます。
      • ソース: ニュース提供元
      • 著者: ニュースを書いた人
      • URL: 記事 URL
      • ドメイン: 記事のドメイン(例: asahi.com nhk.or.jp
  • datetime_format

注意

ニュースは毎回ランダムに選ばれます。ニュースモジュールを叩くたびに違うニュースが返ってくるので、ニュースモジュールは一度だけ叩くのをおすすめします。 タイトルを話して、次のターンで詳細を話す等は現在実質できません。

利用例

(.*)のニュースを教えて
{news query=$1}
{news query=$1 format="<発行日>のニュースは<タイトル>だよ。<説明か本文>だって。" datetime_format="%m月%d日"}
{news query=$1 other_news=1}
{news query=$1 restirct_domain=1}
{news query=$1 domains="asahi.com,nhk.or.jp"}

old_calendar

旧暦・六曜を取り扱うモジュールです。

引数

  • date: 日付を指定します。
    • 単にその日の旧暦・六曜を聞きたい場合はその日を指定します
    • 次の旧暦がいつか取得したい場合は、ここに起点となる日を入れます(恐らく今日でよさそう)
  • format: 出力フォーマットを指定します。
    • rokuyou: 六曜が入ります。 例: 仏滅
    • old_date: 旧暦が入ります。 例: 2020年うるう4月21日
    • new_date: 旧暦に対応した新暦(月日)が入ります。ただし、今日に近い日は今日明日のようになります。 例: 7月5日明後日

利用例

今日の旧暦を喋らせたい

{old_calendar format=new_dateの旧暦はold_dateでrokuyouだよ}

今日の旧暦は2021年5月26日で赤口だよ

任意の日付の旧暦を喋らせたい

正規表現で日付を$1に入れていると仮定します。

{old_calendar format=new_dateの旧暦はold_dateでrokuyouだよ date=$1}

明日の旧暦は2021年5月27日で先勝だよ

次の六曜が知りたい

正規表現で六曜が$1に入っていると仮定します。 例えばこんなので取っておきます: .*次の(大安|赤口|先勝|友引|先負|仏滅)(は|を|って|)(教えて|いつ).*

{old_calendar format=次のrokuyouはnew_dateだよ next_rokuyou=$1}

owner_name

オーナー名を返します。

引数

無し

利用例

{owner_name}はどう思う?

random

あるノードを決められた確率でランダムに通過できたり通過できなかったりさせます。

引数

  • p: 確率(0.0〜1.0)
    • 例えば0.1なら10%
    • 省略時は0.5 = 50%

利用例

condition 部分に以下のように書きます

# 10%の確率でこのノードを通過できる
{random p=0.1}

reg

正規表現でテキストの一部を抽出します。 数字部分だけを抜き出すとか、先頭N文字を抜き出すとかに使えます。

引数

  • text: 元の文字列
  • pattern: 正規表現のパターン
  • group: () で囲った何番目を使うか。(指定しない場合マッチした全体を使います)

利用例

オーナー名の先頭2文字をとってきて、ちゃんをつける

{reg text={owner_name} pattern=".{2}"}ちゃんって呼んでいいかな

何日か抽出する (\d は数字を表すので、 \d+ は数字だけで任意の文字数となります。() でかこったグループの1番目つまり \d+ 部分を取ってきます。)

{reg text="11月12日のニュースはほげほげ" pattern="(\d+)日" group=1}

source_qa

ソースと質問を用いて質問応答します。

引数

  • source: 質問の答えが入った文章
  • question: 質問

利用例

{source_qa source="信田春満は1987年に生まれた" question="信田春満はいつ生まれた"}

time

現在の時刻を取得、もしくは time に指定した文字列から時刻を抽出します。 さらに時刻計算をし、指定したフォーマットで出力できます。

引数

  • 時間指定系(ユーザーの発話から時間を抽出するときに使用)
    • time: ユーザーの発話など時刻を抽出したい文字列
      • 指定しない場合現在日時になります
    • default_time: 上記の time での抽出が失敗したときに使う日時。
      • default_time を指定せず time から時刻を抽出できなかった場合、 {time} モジュールは空文字を返します。
    • prefered_direction: 指定された時間に曖昧性があるとき、未来・過去・今のどれを優先するか
      • future: 未来を優先。デフォルト。 (5/31に5/8と言われれば来年の5/8)
      • past: 過去を優先(5/1 に 5/8 と言われれば去年の5/8)
      • none: 今を優先(5/8 と言われればそれが過去でも未来でも、今年の5/8とみなす)
  • format: 出力のフォーマット(後述)
  • 日時修正系
    • addyears: 指定した日付に足す年数
    • addmonths: 指定した日付に足す月数
    • addweeks: 指定した日付に足す週数
    • adddays: 指定した時刻に足す日にち
    • addhours: 指定した時刻に足す時間
    • addminutes: 指定した時刻に足す分数
    • addseconds: 指定した時刻に足す秒数
    • zone: 日や月のはじめ・終わり指定。以下の値のどれか
      • startyear
      • endyear
      • startmonth
      • endmonth
      • startweek
      • endweek
      • startday
      • endday

format

%Y/%m/%d %H:%M:%S のように%Y などの文字を使ってフォーマットを指定します。 ここでは 2021/01/02 12:34:56 を例に説明します

  • %Y: 西暦4桁(2021)
  • %m: 月2桁(01)
  • %d: 日2桁(02)
  • %A: 曜日(Sunday, Monday, ..., Saturday)
  • %H: 時2桁-24h表記 (12)
  • %M: 分2桁 (34)
  • %S: 秒2桁(56)

利用例

引数なし

{time}
# 20171101-114514

指定フォーマット

{time format="%Y/%m/%d %H:%M:%S"}
# 2017/11/01 11:45:14
{time format="%H"}
# 11

特定フォーマット

{time format="日付"}
# 11/01
{time format="時間"}
# 11:45
{time format="日時"}
# 11/01 11:45

日時抽出

# 直前のユーザー発話から時刻を抽出。失敗したら今日の日時を返す。
{time time=$0 default_time=今日}

日時操作

# 日単位で操作する場合
{time adddays=1}
# 20171221-100000 -> 20171222-100000
{time adddays=-1}
# 20171221-100000 -> 20171220-100000
{time adddays=11}
# 20171221-100000 -> 20180101-100000

# 年単位で操作する場合
{time addyears=1}
# 月単位で操作する場合
{time addmonths=1}
# 週単位で操作する場合
{time addweeks=1}
# 時間単位で操作する場合
{time addhours=1}
# 分単位で操作する場合
{time addminutes=1} 
# 秒単位で操作する場合
{time addseconds=1}

# 組み合わせで操作する場合
# 半角スペースで追加してください
{time addhours=1 addminutes=30}
# 下記と同意
{time addminutes=90}

# format も指定可
{time addhours=1 format="時間"}
# 11:00

年月週日の始まり終わりの時間を取得 例えば検索条件に1日単位で指定したい場合、start=1日の始まり、end=1日の終わりと指定することに使えます。

# 日単位
{time zone="startday"}
# 20180306-000000
{time zone="endday"}
# 20180306-235959
# 昨日を指定したい場合は adddays=-1 を追加することで実現できます。
{time zone="startday" adddays="-1"}
# 20180305-000000
# format も指定できます
{time zone="startday" adddays="-1" format="日時"}
# 03/05 00:00

# 月単位
{time zone="startmonth"}
# 20180301-000000
{time zone="endmonth"}
# 20180331-235959

# 週単位
{time zone="startweek"}
# 20180305-000000 -> 今週月曜0時
{time zone="endweek"}
# 20180311-235959 -> 今週日曜23:59:59

#年単位
{time zone="startyear"}
# 20180101-000000
{time zone="endyear"}
# 20181231-235959

応用(条件で使う)

# ユーザーが発話した内容が7日後以降のことだったら
{time time=$0 default_time=今日} >= {time zone=startday adddays=7}

# ユーザーの発言に日時情報が含まれていれば
{time time=$0}

trigger

リクエストのトリガの種類を返します。

トリガの種類は以下です。

  • user_utterance_trigger: ユーザー発話によるトリガ
  • face_detection_trigger: 顔認識(話しかけ)のトリガー

利用例

(ユーザーの話しかけではなく)顔認識でリクエストが来たとき (こうする場合 user_utterance は .* とかで空文字を許容するようにしてね)

{trigger} == face_detection_trigger

ユーザーの話しかけのときのみ (これについては発話内容を .* 以外にするのとほぼ同じ)

{trigger} == user_utterance_trigger

user_utterance

ユーザーの直近の発話を返します。

### 引数 なし

利用例

主に条件部分で使うことを想定しています。

{user_utterance} reg "(天気|晴れ|雨|曇り|傘)"

user_word

ユーザーのよく発言する単語を取得、削除できます。

取得

単語の取得は以下の条件で行われます。

  • 期間:1ヶ月以内
  • 最低 min_count 回以上出ている単語
  • 固有名詞か、カタカナ3文字以上の一般名詞

これらでフィルタされた単語から、出現回数で重み付けされたランダムで1単語を取得して返します。

削除

text で指定された文章から単語を抽出して削除します。 (削除は1ヶ月以内の固有名詞、カタカナ3文字以上の一般名詞が対象です) 削除された単語一覧がスペース区切りで返されます。 削除されたものが特にない場合空文字が返ります。

引数

  • method: 何をするか。以下から選んでください。デフォルト: get
    • get: 単語を取得します
    • delete: text で指定された単語を削除します。削除された単語をスペース区切りで返します。

method=get の場合の引数

  • min_count: 最低この回数発話された単語だけを取得します。デフォルト:5

method=delete の場合の引数

  • text: ここで指定されたテキストに含まれる単語を消します

利用例

取得

{user_word}
{user_word min_count=10}

ランダム性があるので、同じ単語を複数で使いたい場合一旦変数に保存してください。

削除

消されたものがあるかで発話を分岐する場合、一旦変数に保存するのがおすすめです

# 直前のユーザー発話に含まれる単語を削除。削除結果を [deleted_words] に保存
store key: deleted_words
store value: {user_word method=delete text=$0}

さらに続くもう一つの system_utterance で以下のように書きます

# cond
[deleted_words]

# utterance
[deleted_words] ってもう言わないようにするね。

vtml_pause

会話に間を置きます 元のVTML 仕様: https://drive.google.com/file/d/19mc9E_GUCROR9ZYr77NQTX67AaLxxQIX/view?usp=sharing

引数

  • time: 間の長さ。ミリ秒単位。0〜65536の間で指定します。

利用例

それでね{vtml_pause time=500}実は宝くじあたったんだ!

vtml_pitch

話す音程を変えられます 元のVTML 仕様: https://drive.google.com/file/d/19mc9E_GUCROR9ZYr77NQTX67AaLxxQIX/view?usp=sharing

引数

  • text: 発話する内容
  • value: 速さ。50〜500 の値を指定します。(単位は%)

利用例

{vtml_pitch value=200 text="超高い声"}

vtml_phoneme

ロミィの発話の読みとイントネーションを指定します。

内部的には VTML をロミィに渡します。 VTML 仕様: https://drive.google.com/file/d/19mc9E_GUCROR9ZYr77NQTX67AaLxxQIX/view?usp=sharing

引数

  • ph: 発音記号。以下のように書いてください。
    • 全部カタカナで書く
    • アクセントを付ける文字の後に ^ を入れる
      • 例: オカメイ^ンコ -> イ が強調される
  • text: 文章(会話ログとしてはこちらが載る)
  • alphabet: 言語セット。指定しなくて OK
    • 日本語の場合 x-pentax
    • 英語の場合変える

利用例

オーナーは{vtml_phoneme ph="ナニイ^ンコ" text="何インコ"}が好きなの?

vtml_speed

話す速さを変えられます 元のVTML 仕様: https://drive.google.com/file/d/19mc9E_GUCROR9ZYr77NQTX67AaLxxQIX/view?usp=sharing

引数

  • text: 発話する内容
  • value: 速さ。50〜400 の値を指定します。(単位は%)

利用例

{vtml_speed value=200 text="生麦生米生卵"}

vtml_volume

話す音量を変えられます 元のVTML 仕様: https://drive.google.com/file/d/19mc9E_GUCROR9ZYr77NQTX67AaLxxQIX/view?usp=sharing

引数

  • text: 発話する内容
  • value: 速さ。0〜500 の値を指定します。(単位は%)

利用例

{vtml_volume value=20 text="こっそり話すね"}

new_weather_forecast

天気の情報を取得します。 日付は、15時以前なら当日の天気を、15時以降なら翌日の天気を返します。 (今の所日付指定はできませんが要望があれば実装します。)

引数

  • area
    • 天気を知りたい場所
    • area=渋谷札幌宮古島のように指定します
    • 正規表現を用いるとよいでしょう
  • time
  • format
    • 出力フォーマット
    • weather_type と言ったようにキーワードを埋め込めます。
    • セキュリティ上の問題があるのでユーザー発話等ユーザー情報を format に入れないでください。
    • 省略時は天気だけが返されます。
      • timeの天気はweather_type。最高気温はtemp_max度で最低気温はtemp_min度でしょう。湿度はhumidityパーセントだよ。
    • キーワード
      • time: 日付け。以下の4種類:「今日」「明日」「明後日」「X月X日」
      • weather_type: 天気。例:「晴れ」「曇り」etc.
      • temp_min: 最低気温。例:「19.8」
      • temp_max: 最高気温。例:「24.2」
      • humidity_min: 最低湿度。例:「77」パーセントのもの。
      • humidity_max: 最高湿度。
      • humidity: 湿度。最高湿度と同じ。
      • precip_prob: 降水確率。例:「73」パーセントのもの。
      • area: 天気を知りたかった場所(表記ゆれが補正されます)。 例:「渋谷区」

利用例

天気予報を喋らせる

{new_weather_forecast format=timeの天気はweather_type。最高気温はtemp_max度で最低気温はtemp_min度でしょう。湿度はhumidityパーセントだよ。}

-> 今日の天気は晴れ。最高気温は13.5度で最低気温は10.1度でしょう。湿度は88パーセントだよ。

{new_weather_forecast format=timeはsummary}

-> 明日は一日中曇り。

天気は{new_weather_forecast}だよー

-> 天気は曇りだよー

場所を指定する

(.*)の天気(.*)教えて

-> 渋谷の天気を教えて

{new_weather_forecast area=$1 format=areaのtimeの天気はweather_typeみたいだよー。}

-> 渋谷区の今日の天気は晴れのち曇りみたいだよー。

時間を指定する

\A.*天気を教えて.*\z
{new_weather_forecast time=$0}

直前のユーザー発話で、全体がマッチするようにします。(前後に .* をつけておきます) それによって、システム発話の $0 にはユーザー発話全体が入るので、それを time に入れます。

天気などによって会話を変える

{new_weather_forecast} == '曇り'
{new_weather_forecast format=temp_min} < 10

weather_warning

気象警報や注意報などを話す際に使います。

引数

  • area: 場所を指定します。正規表現でうまく取ってください。 e.g. 那覇石垣市
  • format: 出力フォーマット。以下のキーワードが使えます。
    • time: 警報注意報が発令された時間が入ります。
    • author_name: どこがその情報を発表したかが入ります。 e.g. 気象庁名古屋地方気象台
    • content: 発令されている情報が自然文で入ります。 e.g. 本島中南部、本島北部では、土砂災害に注意してください。沖縄本島地方では、高波や竜巻などの激しい突風、落雷に注意してください。
    • emergencies: 発令されている特別警報が入ります。複数ある場合は で区切られます。
    • warnings: 発令されている警報が入ります。特別警報は含みません。複数ある場合は で区切られます。
    • advisories: 発令されている注意報が入ります。複数ある場合は で区切られます。
    • conditions: 発令されている警報などの状態が入ります。例えば大雨のときは土砂災害みたいなのが入ります。
    • additions: 警報注意報以外に注意すべきものが入ります。例えば、竜巻とか
    • attentions: 発令されている警報などについて、注意すべき災害が入ります。土砂災害警戒 とか 浸水注意 とか
    • locations: 地名が入ります。

formatの例

{weather_warning area=$0 format=time現在、author_nameによると、contentなんだって}

警報注意報をより詳細にしたいとき

{weather_warning area=$0 format=time現在、author_nameによると、locationではemergencies、warnings、advisories、が出ているよ。additionsに注意してね。それから、conditions、attentionsに気をつけてね。}

19時27分現在、福島地方気象台によると、いわき市では、大雨警報、雷注意報、洪水注意報、が出ているよ。竜巻、ひょうに注意してね。それから、、浸水警戒、土砂災害注意に気をつけてね。

警報が出ているときだけ分岐みたいなことも可能です。こちらを参考にしてみてください。 https://docs.google.com/spreadsheets/d/1PwHBvso7apRJxgf9i_gFoXWEHhMCahn1zNtlZdYfurI/edit#gid=107993462&range=B14:F23

wikipedia

wikipedia で検索してサマリーを返します。

引数

  • title: ウィキペディアのページのタイトル

利用例

{wikipedia title=エクアドル}

wiki_qa

質問に対してウィキペディアを引いて答えます。 非常に重たいモジュールなので必ず追い発話 (additional_utterance) と組み合わせてお使いください。

引数

  • question: 質問
  • format: 出力のフォーマット。以下のシンボルを入れられます。シンボルを入れる場合 "" で囲ってね。デフォルトは <answer>
    • <answer>: 答え
    • <supporting_text>: 答えの根拠となる文章
    • <supporting_entity>: 答えの根拠になったエンティティ(ウィキペディアのページ)
    • <entity_list>: 質問から抽出したエンティティ一覧(スペース区切り。)デバッグ用

利用例

{wiki_qa question=[wiki_question] format="答えは<answer>かな。<supporting_entity>のウィキによると<supporting_text> ならしいよ!"}

word

発話から指定された品詞の単語を抽出します。 ユーザー発話の中から好きな食べ物などを抽出するときに使うのを想定しています。 もし指定された品詞の単語が複数あった場合ランダムに一つ返します。 (最後に出たものを優先してとかあればエンジニア相談)

引数

  • text: 入力にするテキスト。
    • $1 などでユーザーの発話の部分から検索させることができます。
    • 指定しなければ直前のユーザー発話全体から検索します。
  • type: 品詞
    • 名詞 形容詞 動詞 など
      • 名詞の場合、厳密には一般名詞と固有名詞のみを抽出します。数字や代名詞などは抽出しません。
    • 地域: 地名を抽出します

利用例

# 直前のユーザー発話から名詞を抽出します
{word}

# 直前のユーザー発話を `僕は(.*)が好きだなぁ` としているとして、 `(.*)` の中から名詞を抽出します
{word text=$1}

# 直前のユーザー発話から動詞を抽出します
{word type=動詞}

# 直前のユーザー発話から名詞を抽出して Knowledge に保存します
# word は復数単語があったときランダム性があるので一旦変数に保存するのがいいです
# storeKey に favorite_tmp として storeValue に {word} と入れます。これで favorite_tmp に抽出した名詞が入ります。
# 発話しつつ knowledge に格納します
[favorite_tmp]が好きなんだね!{knowledge method=update_object subject=owner predicate=favorite object=[favorite_tmp]}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment