暮らしの技術

暮らしを豊かにする技術や、特に暮らしを豊かにしない技術があります

botと恋バナできるようにする

関連研究


DocomoruでBOTと雑に会話する - Qiita


DOCOMOの雑談対話APIを使ってHubotと雑談する。 - 文字っぽいの。

基本的にはアトム君がやってるのと全く同じで,違うのはrubot.brainを使ってるところと,contextの破棄を30分毎にしてる.あとrequestじゃなくてrobot.http使ってるところとか微妙に違うんだけど結局裏では同じもの叩いてると思うから大きな違いは本当に無い.

module.exports = (robot) ->
    getContext = (username) ->
        context_obj = robot.brain.get(username) or {context: ""}
        if context_obj["updatedAt"] && (Date.now() - context_obj["updatedAt"])/1000  > 60 * 60 # 30分で記憶を失います
            context_obj = {context: ""}
        return context_obj

    storeContext = (username, context) ->
        context_obj = {"context": context, "updatedAt": Date.now()}
        robot.brain.set username, context_obj

    robot.hear /.*/, (msg) ->
        user_id = msg["envelope"]["user"]["id"]
        context_obj = getContext(user_id)

        if msg["envelope"]["room"] == "comschans-room"
            robot.http("https://api.apigw.smt.docomo.ne.jp/dialogue/v1/dialogue?APIKEY=#{process.env.HUBOT_DOCOMO_API_KEY}").post(JSON.stringify({"utt": msg["envelope"]["message"]["text"],"context": context_obj["context"],"nickname": msg["envelope"]["user"]["name"], "sex": "男","place": "滋賀","mode": "dialog"})) (err, res, body) ->
                body = JSON.parse(body)
                msg.send body["utt"]
                console.log(body["yomi"])
                storeContext(msg["envelope"]["user"]["id"], body["context"])

様子

f:id:side_tana:20141207011540p:plainf:id:side_tana:20141207011544p:plain
f:id:side_tana:20141207011550p:plain

意外とちゃんと会話できてて面白い

知見

contextをユーザ毎に管理しているので,多人数で話したりしてるときにbotからすると話が急に飛ぶって感じになる.とはいえぱっとみた限り,docomoapiに話を聞かせて返信はさせないって言うのが無い.

書きながら思ったけど,受話者推定みたいなの簡単にやって,発話をアプリケーション側で制御すれば良さそうって思いました.