class talk_node(object): def __init__(self): self._interface = ROSpeexInterface() def sr_response(self, message): run = re.compile('(?P<run>走行)').search(message) start = re.compile('(?P<start>開始)').search(message) print 'you said : %s' %message if run is not None and start is not None: text = u'ナビゲーションを開始します。' robot_msg = 'start' rospy.loginfo(robot_msg) syscommand_pub.publish(robot_msg) print 'rospeex reply : %s' %text self._interface.say(text, 'ja', 'nict') def run(self): self._interface.init() self._interface.register_sr_response(self.sr_response) self._interface.set_spi_config(language='ja',engine='nict') rospy.spin()
class ChatTRCP(object): """ ChatTRCP class """ def __init__(self): """ Initializer """ def run(self): """ run ros node """ # initialize ros node rospy.init_node('ChatTRCP') rospy.loginfo("start DoCoMo Chat TRCP node") """ for ROSpeexInterface """ self.rospeex = ROSpeexInterface() self.rospeex.init() self.rospeex.register_sr_response(self.sr_response) """日本語(英語もある)でNICT(Googleもある)""" """launchファイ決めてもいいけど、動的に変更する?""" """とりあえず、現状は決め打ち""" self.lang = 'ja' # self.input_engine = 'nict' self.input_engine = 'google' self.rospeex.set_spi_config(language='ja', engine='google') # self.rospeex.set_spi_config(language=self.lang, engine=self.input_engine) """ 発話理解APIの準備 """ self.req = DoCoMoUnderstandingReq() self.req.projectKey = 'OSU' self.req.appName = '' self.req.appKey = 'hoge_app01' self.req.clientVer = '1.0.0' self.req.dialogMode = 'off' self.req.language = 'ja' self.req.userId = '12 123456 123456 0' self.req.lat = '139.766084' self.req.lon = '35.681382' """ 雑談対話APIの準備 """ self.req_chat = DoCoMoChatReq() self.req_chat.utt = "" self.req_chat.context = _chat_["context"] self.req_chat.nickname = _chat_["nickname"] self.req_chat.nickname_y = _chat_["nickname_y"] self.req_chat.sex = _chat_["sex"] self.req_chat.bloodtype = _chat_["bloodtype"] self.req_chat.birthdateY = _chat_["birthdateY"] self.req_chat.birthdateM = _chat_["birthdateM"] self.req_chat.birthdateD = _chat_["birthdateD"] self.req_chat.age = _chat_["age"] self.req_chat.constellations = _chat_["constellations"] self.req_chat.place = _chat_["place"] self.req_chat.mode = _chat_["mode"] self.req_chat.t = _chat_["t"] rospy.wait_for_service('docomo_sentenceunderstanding') self.understanding = rospy.ServiceProxy('docomo_sentenceunderstanding', DoCoMoUnderstanding) rospy.wait_for_service('docomo_qa') self.qa = rospy.ServiceProxy('docomo_qa', DoCoMoQa) rospy.wait_for_service('docomo_chat') self.chat = rospy.ServiceProxy('docomo_chat', DoCoMoChat) self.resp_understanding = DoCoMoUnderstandingRes() self.nowmode = "CHAT" rospy.spin() """ DoCoMo 雑談対話の実行 """ def execChat(self, message): # Rospeexを使うと、文字列の最後に「。」が付くので削除する src = message dst = src.replace('。', '') self.req_chat.utt = dst self.res_chat = self.chat(self.req_chat) rospy.loginfo("TRCP Chat response:%s", self.res_chat.response) self.rospeex.say(self.res_chat.response.yomi, 'ja', 'nict') return True """ DoCoMo 知識検索の実行 """ def execQA(self, message): rospy.loginfo("TRCP:Q&A") self.req_qa = DoCoMoQaReq() self.req_qa.text = message res_qa = self.qa(self.req_qa) rospy.loginfo("TRCP Q&A response:%s", res_qa.response.code) self.rospeex.say(res_qa.response.textForSpeech, 'ja', 'nict') return True def sr_response(self, message): rospy.loginfo("sr_responsee:%s", message) #message が特定のキーワードであれば、それに対応した処理を行う """ 時間 ->現在時刻を答える""" time = re.compile('(?P<time>何時)').search(message) if time is not None: rospy.loginfo("What Time is it now? :%s", message) d = datetime.datetime.today() text = u'%d時%d分です。' % (d.hour, d.minute) # rospeex reply self.rospeex.say(text, 'ja', 'nict') return True """ 自己紹介 ->挨拶する""" hello = re.compile('(?P<introduce>)自己紹介').search(message) if hello is not None: rospy.loginfo("Self introduce :%s", message) text = "皆さんこんにちわ。私の名前はイレイサーです。僕は家庭でみんなの手伝いをするために作られたホームサービスロボットなんだ。" # rospeex reply self.rospeex.say(text, 'ja', 'nict') return True # 特定のキーワード処理はここまで try: """ もし現在の会話モードが「しりとり」なら 文章理解APIをスキップする """ if self.nowmode == "CHAIN": self.resp_understanding.success = True self.resp_understanding.response.commandId = "BC00101" self.resp_understanding.response.utteranceText = message else: self.req.utteranceText = message self.resp_understanding = self.understanding(self.req) if self.resp_understanding.success: commandId = self.resp_understanding.response.commandId rospy.loginfo("<<< %s", commandId) if commandId == "BC00101": rospy.loginfo("BBBB") """雑談""" rospy.loginfo("TRCP:Chat") # Rospeexを使うと、文字列の最後に「。」が付くので削除する src = self.resp_understanding.response.utteranceText dst = src.replace('。', '') self.req_chat.utt = dst self.res_chat = self.chat(self.req_chat) rospy.loginfo("TRCP Chat response:%s", self.res_chat.response) """雑談対話からのレスポンスを設定する""" self.req_chat.mode = self.res_chat.response.mode.encode( 'utf-8') self.req_chat.context = self.res_chat.response.context.encode( 'utf-8') if self.nowmode == "CHAIN": if self.res_chat.response.mode == "srtr": self.nowmode = "CHAIN" self.rospeex.say(self.res_chat.response.utt, 'ja', 'nict') else: self.nowmode = "CHAT" self.rospeex.say(self.res_chat.response.utt, 'ja', 'nict') elif self.nowmode == "CHAT": if self.res_chat.response.mode == "srtr": self.nowmode = "CHAIN" self.rospeex.say(self.res_chat.response.utt, 'ja', 'nict') else: self.nowmode = "CHAT" self.rospeex.say(self.res_chat.response.yomi, 'ja', 'nict') elif commandId == "BK00101": """知識検索""" rospy.loginfo("TRCP:Q&A") self.req_qa = DoCoMoQaReq() self.req_qa.text = self.resp_understanding.response.utteranceText print self.resp_understanding.response.utteranceText res_qa = self.qa(self.req_qa) rospy.loginfo("TRCP Q&A response:%s", res_qa.response.code) self.rospeex.say(res_qa.response.textForSpeech, 'ja', 'nict') """ 質問回答のレスポンスコードは、下記のいずれかを返却。 S020000: 内部のDBからリストアップした回答 S020001: 知識Q&A APIが計算した回答 S020010: 外部サイトから抽出した回答候補 S020011: 外部サイトへのリンクを回答 E010000: 回答不能(パラメータ不備) E020000: 回答不能(結果0件) E099999: 回答不能(処理エラー) ※Sで始まる場合は正常回答、 Eで始まる場合は回答が得られていないことを示す。 """ if res_qa.success: print res_qa.response.textForDisplay rospy.loginfo("TRCP:%s", res_qa.response.textForSpeech) # for answer in res_qa.response.answer: # print answer.rank # print answer.answerText # print answer.linkText # print answer.linkUrl if res_qa.response.code == 'S020000': pass elif res_qa.response.code == 'S020001': pass elif res_qa.response.code == 'S020010': pass elif res_qa.response.code == 'S020011': pass elif res_qa.response.code == 'E010000': pass elif res_qa.response.code == 'E020000': pass elif res_qa.response.code == 'E099999': pass else: pass else: pass elif commandId == "BT00101": """乗換案内""" rospy.loginfo(":Transfer") self.execQA(message) elif commandId == "BT00201": """地図""" rospy.loginfo(":Map") self.execQA(message) elif commandId == "BT00301": """天気""" rospy.loginfo(":Weather") """お天気検索""" """http://weather.livedoor.com/weather_hacks/webservice""" # self.execQA(message) self.execChat(message) elif commandId == "BT00401": """グルメ検索""" rospy.loginfo(":Restaurant") """ グルなびWebサービス""" """http://api.gnavi.co.jp/api/""" self.execQA(message) elif commandId == "BT00501": """ブラウザ""" rospy.loginfo(":Webpage") self.execQA(message) elif commandId == "BT00601": """観光案内""" rospy.loginfo(":Sightseeing") self.execQA(message) elif commandId == "BT00701": """カメラ""" rospy.loginfo(":Camera") self.execQA(message) elif commandId == "BT00801": """ギャラリー""" rospy.loginfo(":Gallery") self.execQA(message) elif commandId == "BT00901": """通信""" rospy.loginfo(":Coomunincation") self.execQA(message) elif commandId == "BT01001": """メール""" rospy.loginfo(":Mail") self.execQA(message) elif commandId == "BT01101": """メモ登録""" rospy.loginfo(":Memo input") self.execQA(message) elif commandId == "BT01102": """メモ参照""" rospy.loginfo(":Memo output") self.execQA(message) elif commandId == "BT01201": """アラーム""" rospy.loginfo(":Alarm") self.execQA(message) elif commandId == "BT01301": """スケジュール登録""" rospy.loginfo(":Schedule input") self.execQA(message) elif commandId == "BT01302": """スケジュール参照""" rospy.loginfo(":Schedule input") self.execQA(message) elif commandId == "BT01501": """端末設定""" rospy.loginfo(":Setting") self.execQA(message) elif commandId == "BT01601": """SNS投稿""" rospy.loginfo(":SNS") self.execQA(message) elif commandId == "BT90101": """キャンセル""" rospy.loginfo(":Cancel") self.execQA(message) elif commandId == "BM00101": """地図乗換""" rospy.loginfo(":Map transfer") self.execQA(message) elif commandId == "BM00201": """通話メール""" rospy.loginfo(":Short mail") self.execQA(message) else: """発話理解APIで判定不能""" """Undeterminable""" rospy.loginfo("Undeterminable:%s", self.resp_understanding.response.commandId) self.rospeex.say("ごめんなさい、良く聞き取れませんでした。", 'ja', 'nict') else: """発話理解APIがエラーのとき""" rospy.loginfo("DoCoMo 発話理解API failed") pass except: """対話プログラムのどこかでエラーのとき""" rospy.loginfo("error") pass return True
class ChatTRCP(object): """ ChatTRCP class """ def __init__(self): """ Initializer """ def run(self): """ run ros node """ # initialize ros node rospy.init_node('ChatTRCP') rospy.loginfo("start DoCoMo Chat TRCP node") """ for ROSpeexInterface """ self.rospeex = ROSpeexInterface() self.rospeex.init() self.rospeex.register_sr_response(self.sr_response) self.rospeex.set_spi_config(language='ja', engine='nict') """日本語(英語もある)でNICT(Googleもある)""" """launchファイ決めてもいいけど、動的に変更する?""" """とりあえず、現状は決め打ち""" self.lang = 'ja' self.input_engine = 'nict' self.rospeex.set_spi_config(language='ja', engine='nict') """ for jsk voice understanding """ rospy.Subscriber("/Tablet/voice", VoiceMessage, self.jsk_voice) """ 発話理解APIの準備 """ self.req = DoCoMoUnderstandingReq() self.req.projectKey = 'OSU' self.req.appName = '' self.req.appKey = 'hoge_app01' self.req.clientVer = '1.0.0' self.req.dialogMode = 'off' self.req.language = 'ja' self.req.userId = '12 123456 123456 0' self.req.lat = '139.766084' self.req.lon = '35.681382' """ 雑談対話APIの準備 """ self.req_chat = DoCoMoChatReq() self.req_chat.utt = "" self.req_chat.context = _chat_["context"] self.req_chat.nickname = _chat_["nickname"] self.req_chat.nickname_y = _chat_["nickname_y"] self.req_chat.sex = _chat_["sex"] self.req_chat.bloodtype = _chat_["bloodtype"] self.req_chat.birthdateY = _chat_["birthdateY"] self.req_chat.birthdateM = _chat_["birthdateM"] self.req_chat.birthdateD = _chat_["birthdateD"] self.req_chat.age = _chat_["age"] self.req_chat.constellations = _chat_["constellations"] self.req_chat.place = _chat_["place"] self.req_chat.mode = _chat_["mode"] self.req_chat.t = _chat_["t"] rospy.wait_for_service('docomo_sentenceunderstanding') self.understanding = rospy.ServiceProxy('docomo_sentenceunderstanding', DoCoMoUnderstanding) rospy.wait_for_service('docomo_qa') self.qa = rospy.ServiceProxy('docomo_qa', DoCoMoQa) rospy.wait_for_service('docomo_chat') self.chat = rospy.ServiceProxy('docomo_chat', DoCoMoChat) self.resp_understanding = DoCoMoUnderstandingRes() _nowmode = "CHAT" rospy.spin() def jsk_voice(self, data): # print len(data.texts) # for elem in data.texts: # print elem rospy.loginfo("jsk_voice:%s", data.texts[0]) self.chat(data.texts[0]) def sr_response(self, message): # Rospeexを使うと、文字列の最後に「。」が付くので削除する src = message sr_dst = src.replace('。', '') rospy.loginfo("rospeex:%s", sr_dst) chat(sr_dst) def chat(self, message): rospy.loginfo("chat:%s", message) #message が特定のキーワードであれば、それに対応した処理を行う """ 時間 ->現在時刻を答える""" time = re.compile('(?P<time>何時)').search(message) if time is not None: rospy.loginfo("What Time is it now? :%s", message) d = datetime.datetime.today() text = u'%d時%d分です。' % (d.hour, d.minute) # rospeex reply self.rospeex.say(text, 'ja', 'nict') return True # 特定のキーワード処理はここまで print _nowmode try: """ もし現在の会話モードが「しりとり」なら 文章理解APIをスキップする それ以外なら、文章理解APIで文章を解析する """ if _nowmode == "CHAIN": self.resp_understanding.success = True self.resp_understanding.response.commandId = "BC00101" self.resp_understanding.response.utteranceText = message else: self.req.utteranceText = message self.resp_understanding = self.understanding(self.req) if self.resp_understanding.success: commandId = self.resp_understanding.response.commandId rospy.loginfo("<<< %s", commandId) if commandId == "BC00101": """雑談""" rospy.loginfo("TRCP:Chat") self.res_chat = self.chat(self.req_chat) rospy.loginfo("TRCP Chat response:%s", self.res_chat.response) elif commandId == "BK00101": """知識検索""" rospy.loginfo("TRCP:Q&A") self.req_qa = DoCoMoQaReq() self.req_qa.text = self.resp_understanding.response.utteranceText print self.resp_understanding.response.utteranceText res_qa = self.qa(self.req_qa) rospy.loginfo("TRCP Q&A response:%s", res_qa.response.code) self.rospeex.say(res_qa.response.textForSpeech, 'ja', 'nict') else: """発話理解APIがエラーのとき""" rospy.loginfo("DoCoMo 発話理解API failed") pass except: """対話プログラムのどこかでエラーのとき""" rospy.loginfo("error") pass return True
class ChatTRCP(object): """ ChatTRCP class """ def __init__(self): """ Initializer """ def run(self): """ run ros node """ # initialize ros node rospy.init_node('ChatTRCP') rospy.loginfo("start DoCoMo Chat TRCP node") """ for ROSpeexInterface """ self.rospeex = ROSpeexInterface() self.rospeex.init() self.rospeex.register_sr_response( self.sr_response ) """日本語(英語もある)でNICT(Googleもある)""" """launchファイ決めてもいいけど、動的に変更する?""" """とりあえず、現状は決め打ち""" self.lang = 'ja' # self.input_engine = 'nict' self.input_engine = 'google' self.rospeex.set_spi_config(language='ja',engine='google') # self.rospeex.set_spi_config(language=self.lang, engine=self.input_engine) """ 発話理解APIの準備 """ self.req = DoCoMoUnderstandingReq() self.req.projectKey = 'OSU' self.req.appName = '' self.req.appKey = 'hoge_app01' self.req.clientVer = '1.0.0' self.req.dialogMode = 'off' self.req.language = 'ja' self.req.userId = '12 123456 123456 0' self.req.lat = '139.766084' self.req.lon = '35.681382' """ 雑談対話APIの準備 """ self.req_chat = DoCoMoChatReq() self.req_chat.utt = "" self.req_chat.context = _chat_["context"] self.req_chat.nickname = _chat_["nickname"] self.req_chat.nickname_y = _chat_["nickname_y"] self.req_chat.sex = _chat_["sex"] self.req_chat.bloodtype = _chat_["bloodtype"] self.req_chat.birthdateY = _chat_["birthdateY"] self.req_chat.birthdateM = _chat_["birthdateM"] self.req_chat.birthdateD = _chat_["birthdateD"] self.req_chat.age = _chat_["age"] self.req_chat.constellations = _chat_["constellations"] self.req_chat.place = _chat_["place"] self.req_chat.mode = _chat_["mode"] self.req_chat.t = _chat_["t"] rospy.wait_for_service('docomo_sentenceunderstanding') self.understanding = rospy.ServiceProxy('docomo_sentenceunderstanding',DoCoMoUnderstanding) rospy.wait_for_service('docomo_qa') self.qa = rospy.ServiceProxy('docomo_qa',DoCoMoQa) rospy.wait_for_service('docomo_chat') self.chat = rospy.ServiceProxy('docomo_chat',DoCoMoChat) self.resp_understanding = DoCoMoUnderstandingRes() self.nowmode = "CHAT" rospy.spin() """ DoCoMo 雑談対話の実行 """ def execChat(self, message): # Rospeexを使うと、文字列の最後に「。」が付くので削除する src = message dst=src.replace('。', '') self.req_chat.utt = dst self.res_chat = self.chat(self.req_chat) rospy.loginfo("TRCP Chat response:%s",self.res_chat.response) self.rospeex.say(self.res_chat.response.yomi , 'ja', 'nict') return True """ DoCoMo 知識検索の実行 """ def execQA(self, message): rospy.loginfo("TRCP:Q&A") self.req_qa = DoCoMoQaReq() self.req_qa.text = message res_qa = self.qa(self.req_qa) rospy.loginfo("TRCP Q&A response:%s",res_qa.response.code) self.rospeex.say(res_qa.response.textForSpeech , 'ja', 'nict') return True def sr_response(self, message): rospy.loginfo("sr_responsee:%s", message) #message が特定のキーワードであれば、それに対応した処理を行う """ 時間 ->現在時刻を答える""" time = re.compile('(?P<time>何時)').search(message) if time is not None: rospy.loginfo("What Time is it now? :%s", message) d = datetime.datetime.today() text = u'%d時%d分です。'%(d.hour, d.minute) # rospeex reply self.rospeex.say(text, 'ja', 'nict') return True """ 自己紹介 ->挨拶する""" hello = re.compile('(?P<introduce>)自己紹介').search(message) if hello is not None: rospy.loginfo("Self introduce :%s", message) text = "皆さんこんにちわ。私の名前はイレイサーです。僕は家庭でみんなの手伝いをするために作られたホームサービスロボットなんだ。" # rospeex reply self.rospeex.say(text, 'ja', 'nict') return True # 特定のキーワード処理はここまで try: """ もし現在の会話モードが「しりとり」なら 文章理解APIをスキップする """ if self.nowmode == "CHAIN": self.resp_understanding.success = True self.resp_understanding.response.commandId = "BC00101" self.resp_understanding.response.utteranceText = message else: self.req.utteranceText = message self.resp_understanding = self.understanding(self.req) if self.resp_understanding.success: commandId = self.resp_understanding.response.commandId rospy.loginfo("<<< %s", commandId) if commandId == "BC00101": rospy.loginfo("BBBB") """雑談""" rospy.loginfo("TRCP:Chat") # Rospeexを使うと、文字列の最後に「。」が付くので削除する src = self.resp_understanding.response.utteranceText dst=src.replace('。', '') self.req_chat.utt = dst self.res_chat = self.chat(self.req_chat) rospy.loginfo("TRCP Chat response:%s",self.res_chat.response) """雑談対話からのレスポンスを設定する""" self.req_chat.mode = self.res_chat.response.mode.encode('utf-8') self.req_chat.context = self.res_chat.response.context.encode('utf-8') if self.nowmode == "CHAIN": if self.res_chat.response.mode == "srtr": self.nowmode = "CHAIN" self.rospeex.say(self.res_chat.response.utt , 'ja', 'nict') else: self.nowmode = "CHAT" self.rospeex.say(self.res_chat.response.utt , 'ja', 'nict') elif self.nowmode == "CHAT": if self.res_chat.response.mode == "srtr": self.nowmode = "CHAIN" self.rospeex.say(self.res_chat.response.utt , 'ja', 'nict') else: self.nowmode = "CHAT" self.rospeex.say(self.res_chat.response.yomi , 'ja', 'nict') elif commandId == "BK00101": """知識検索""" rospy.loginfo("TRCP:Q&A") self.req_qa = DoCoMoQaReq() self.req_qa.text = self.resp_understanding.response.utteranceText print self.resp_understanding.response.utteranceText res_qa = self.qa(self.req_qa) rospy.loginfo("TRCP Q&A response:%s",res_qa.response.code) self.rospeex.say(res_qa.response.textForSpeech , 'ja', 'nict') """ 質問回答のレスポンスコードは、下記のいずれかを返却。 S020000: 内部のDBからリストアップした回答 S020001: 知識Q&A APIが計算した回答 S020010: 外部サイトから抽出した回答候補 S020011: 外部サイトへのリンクを回答 E010000: 回答不能(パラメータ不備) E020000: 回答不能(結果0件) E099999: 回答不能(処理エラー) ※Sで始まる場合は正常回答、 Eで始まる場合は回答が得られていないことを示す。 """ if res_qa.success: print res_qa.response.textForDisplay rospy.loginfo("TRCP:%s",res_qa.response.textForSpeech) # for answer in res_qa.response.answer: # print answer.rank # print answer.answerText # print answer.linkText # print answer.linkUrl if res_qa.response.code == 'S020000': pass elif res_qa.response.code == 'S020001': pass elif res_qa.response.code == 'S020010': pass elif res_qa.response.code == 'S020011': pass elif res_qa.response.code == 'E010000': pass elif res_qa.response.code == 'E020000': pass elif res_qa.response.code == 'E099999': pass else: pass else: pass elif commandId == "BT00101": """乗換案内""" rospy.loginfo(":Transfer") self.execQA(message) elif commandId == "BT00201": """地図""" rospy.loginfo(":Map") self.execQA(message) elif commandId == "BT00301": """天気""" rospy.loginfo(":Weather") """お天気検索""" """http://weather.livedoor.com/weather_hacks/webservice""" # self.execQA(message) self.execChat(message) elif commandId == "BT00401": """グルメ検索""" rospy.loginfo(":Restaurant") """ グルなびWebサービス""" """http://api.gnavi.co.jp/api/""" self.execQA(message) elif commandId == "BT00501": """ブラウザ""" rospy.loginfo(":Webpage") self.execQA(message) elif commandId == "BT00601": """観光案内""" rospy.loginfo(":Sightseeing") self.execQA(message) elif commandId == "BT00701": """カメラ""" rospy.loginfo(":Camera") self.execQA(message) elif commandId == "BT00801": """ギャラリー""" rospy.loginfo(":Gallery") self.execQA(message) elif commandId == "BT00901": """通信""" rospy.loginfo(":Coomunincation") self.execQA(message) elif commandId == "BT01001": """メール""" rospy.loginfo(":Mail") self.execQA(message) elif commandId == "BT01101": """メモ登録""" rospy.loginfo(":Memo input") self.execQA(message) elif commandId == "BT01102": """メモ参照""" rospy.loginfo(":Memo output") self.execQA(message) elif commandId == "BT01201": """アラーム""" rospy.loginfo(":Alarm") self.execQA(message) elif commandId == "BT01301": """スケジュール登録""" rospy.loginfo(":Schedule input") self.execQA(message) elif commandId == "BT01302": """スケジュール参照""" rospy.loginfo(":Schedule input") self.execQA(message) elif commandId == "BT01501": """端末設定""" rospy.loginfo(":Setting") self.execQA(message) elif commandId == "BT01601": """SNS投稿""" rospy.loginfo(":SNS") self.execQA(message) elif commandId == "BT90101": """キャンセル""" rospy.loginfo(":Cancel") self.execQA(message) elif commandId == "BM00101": """地図乗換""" rospy.loginfo(":Map transfer") self.execQA(message) elif commandId == "BM00201": """通話メール""" rospy.loginfo(":Short mail") self.execQA(message) else: """発話理解APIで判定不能""" """Undeterminable""" rospy.loginfo("Undeterminable:%s",self.resp_understanding.response.commandId) self.rospeex.say("ごめんなさい、良く聞き取れませんでした。" , 'ja', 'nict') else: """発話理解APIがエラーのとき""" rospy.loginfo("DoCoMo 発話理解API failed") pass except: """対話プログラムのどこかでエラーのとき""" rospy.loginfo("error") pass return True
class ChatTRCP(object): """ ChatTRCP class """ def __init__(self): """ Initializer """ def run(self): """ run ros node """ # initialize ros node rospy.init_node('ChatTRCP') rospy.loginfo("start DoCoMo Chat TRCP node") """ for ROSpeexInterface """ self.rospeex = ROSpeexInterface() self.rospeex.init() self.rospeex.register_sr_response( self.sr_response ) self.rospeex.set_spi_config(language='ja', engine='nict') """日本語(英語もある)でNICT(Googleもある)""" """launchファイ決めてもいいけど、動的に変更する?""" """とりあえず、現状は決め打ち""" self.lang = 'ja' self.input_engine = 'nict' self.rospeex.set_spi_config(language='ja',engine='nict') """ for jsk voice understanding """ rospy.Subscriber("/Tablet/voice", VoiceMessage, self.jsk_voice) """ 発話理解APIの準備 """ self.req = DoCoMoUnderstandingReq() self.req.projectKey = rospy.get_param("~req_projectKey", 'OSU') self.req.appName = rospy.get_param("~req_appName" ,'') self.req.appKey = rospy.get_param("~req_appKey" ,'hoge_app01') self.req.clientVer = rospy.get_param("~req_clientVer", '1.0.0') self.req.dialogMode = rospy.get_param("~req_dialogMode",'off') self.req.language = rospy.get_param("~req_language", 'ja') self.req.userId = rospy.get_param("~req_userId", '12 123456 123456 0') self.req.lat = rospy.get_param("~req_lat" , '139.766084') self.req.lon = rospy.get_param("~req_lon" , '35.681382') """ 雑談対話APIの準備 """ self.req_chat = DoCoMoChatReq() self.req_chat.utt = "" self.req_chat.context = rospy.get_param("~context", "aaabbbccc111222333") self.req_chat.nickname = rospy.get_param("~nickname", "ひろゆき") self.req_chat.nickname_y = rospy.get_param("~nickname_y", "ヒロユキ") self.req_chat.sex = rospy.get_param("~sex", "男") self.req_chat.bloodtype = rospy.get_param("~bloodtype", "AB") self.req_chat.birthdateY = rospy.get_param("~birthdateY", "1960") self.req_chat.birthdateM = rospy.get_param("~birthdateM", "7") self.req_chat.birthdateD = rospy.get_param("~birthdateD", "11") self.req_chat.age = rospy.get_param("~age", "56") self.req_chat.constellations = rospy.get_param("~constellations", "蟹") self.req_chat.place = rospy.get_param("~place", "東京") self.req_chat.mode = rospy.get_param("~mode", "dialog") self.req_chat.t = rospy.get_param("~t", "20") """ サービスの起動 """ rospy.wait_for_service('docomo_sentenceunderstanding') self.understanding = rospy.ServiceProxy('docomo_sentenceunderstanding',DoCoMoUnderstanding) rospy.wait_for_service('docomo_qa') self.qa = rospy.ServiceProxy('docomo_qa',DoCoMoQa) rospy.wait_for_service('docomo_chat') self.chat = rospy.ServiceProxy('docomo_chat',DoCoMoChat) self.resp_understanding = DoCoMoUnderstandingRes() self.nowmode = "CHAT" rospy.spin() def trcpSay(self, text): self.rospeex.say(text, 'ja', 'nict') def jsk_voice(self,data): # print len(data.texts) # for elem in data.texts: # print elem rospy.loginfo("jsk_voice:%s", data.texts[0]) self.execTrcpChat(data.texts[0]) def sr_response(self, message): # Rospeexを使うと、文字列の最後に「。」が付くので削除する src = message sr_dst=src.replace('。', '') rospy.loginfo("rospeex:%s", sr_dst) self.execTrcpChat(sr_dst) """ DoCoMo 知識検索の実行 """ def execDoCoMoQA(self, message): rospy.loginfo("DoCoMo Q&A") self.req_qa = DoCoMoQaReq() self.req_qa.text = message res_qa = self.qa(self.req_qa) if res_qa.success: # for answer in res_qa.response.answer: # print answer.rank # print answer.answerText # print answer.linkText # print answer.linkUrl """ 質問回答のレスポンスコードは、下記のいずれかを返却。 S020000: 内部のDBからリストアップした回答 S020001: 知識Q&A APIが計算した回答 S020010: 外部サイトから抽出した回答候補 S020011: 外部サイトへのリンクを回答 E010000: 回答不能(パラメータ不備) E020000: 回答不能(結果0件) E099999: 回答不能(処理エラー) ※Sで始まる場合は正常回答、 Eで始まる場合は回答が得られていないことを示す。 """ rospy.loginfo("DoCoMo Q&A response code:%s",res_qa.response.code) if res_qa.response.code == 'S020000': rospy.loginfo("DoCoMo Q&A response:%s",res_qa.response.textForDisplay) self.trcpSay(res_qa.response.textForSpeech) elif res_qa.response.code == 'S020001': rospy.loginfo("DoCoMo Q&A response:%s",res_qa.response.textForDisplay) self.trcpSay(res_qa.response.textForSpeech) elif res_qa.response.code == 'S020010': rospy.loginfo("DoCoMo Q&A response:%s",res_qa.response.textForDisplay) self.trcpSay(res_qa.response.textForSpeech) elif res_qa.response.code == 'S020011': rospy.loginfo("DoCoMo Q&A response:%s",res_qa.response.textForDisplay) self.trcpSay(res_qa.response.textForSpeech) elif res_qa.response.code == 'E010000': rospy.loginfo("DoCoMo Q&A response:%s",res_qa.response.textForDisplay) self.trcpSay("ごめんなさい、答えが見つかりませんでした") elif res_qa.response.code == 'E020000': rospy.loginfo("DoCoMo Q&A response:%s",res_qa.response.textForDisplay) self.trcpSay("ごめんなさい、答えが見つかりませんでした") elif res_qa.response.code == 'E099999': rospy.loginfo("DoCoMo Q&A response:%s",res_qa.response.textForDisplay) self.trcpSay("ごめんなさい、答えが見つかりませんでした") else: pass else: rospy.loginfo("DoCoMo Q&A response:%s","system error") return False return True def execTrcpChat(self, message): rospy.loginfo("chat:%s", message) #message が特定のキーワードであれば、それに対応した処理を行う """ 時間 ->現在時刻を答える""" time = re.compile('(?P<time>何時)').search(message) if time is not None: rospy.loginfo("What Time is it now? :%s", message) d = datetime.datetime.today() text = u'%d時%d分です。'%(d.hour, d.minute) self.trcpSay(text) return True # 特定のキーワード処理はここまで print self.nowmode try: """ もし現在の会話モードが「しりとり」なら 文章理解APIをスキップする それ以外なら、文章理解APIで文章を解析する """ if self.nowmode == "CHAIN": self.resp_understanding.success = True self.resp_understanding.response.commandId = "BC00101" self.resp_understanding.response.utteranceText = message else: self.req.utteranceText = message self.resp_understanding = self.understanding(self.req) if self.resp_understanding.success: commandId = self.resp_understanding.response.commandId rospy.loginfo("<< %s", commandId) if commandId == "BC00101": """雑談""" rospy.loginfo("DoCoMo Chat") self.req_chat.utt = message self.res_chat = self.chat(self.req_chat) rospy.loginfo("DoCoMo Chat response:%s",self.res_chat.response) """雑談対話からのレスポンスを設定する""" self.req_chat.mode = self.res_chat.response.mode.encode('utf-8') self.req_chat.context = self.res_chat.response.context.encode('utf-8') if self.nowmode == "CHAIN": if self.res_chat.response.mode == "srtr": print self.nowmode self.nowmode = "CHAIN" self.trcpSay(self.res_chat.response.utt) else: print self.nowmode self.nowmode = "CHAT" self.trcpSay(self.res_chat.response.utt) elif self.nowmode == "CHAT": if self.res_chat.response.mode == "srtr": print self.nowmode self.nowmode = "CHAIN" self.trcpSay(self.res_chat.response.utt) else: print self.nowmode self.nowmode = "CHAT" rospy.loginfo("TRCP Chat response:%s",self.res_chat.response.yomi) self.trcpSay(self.res_chat.response.yomi) elif commandId == "BK00101": """知識検索""" rospy.loginfo(":Q&A") self.execDoCoMoQA(self.resp_understanding.response.utteranceText) elif commandId == "BT00101": """乗換案内""" rospy.loginfo(":Transfer") self.execDoCoMoQA(self.resp_understanding.response.utteranceText) elif commandId == "BT00201": """地図""" rospy.loginfo(":Map") self.execDoCoMoQA(self.resp_understanding.response.utteranceText) elif commandId == "BT00301": """天気""" rospy.loginfo(":Weather") """お天気検索""" """http://weather.livedoor.com/weather_hacks/webservice""" self.execDoCoMoQA(self.resp_understanding.response.utteranceText) elif commandId == "BT00401": """グルメ検索""" rospy.loginfo(":Restaurant") """ グルなびWebサービス""" """http://api.gnavi.co.jp/api/""" self.execDoCoMoQA(self.resp_understanding.response.utteranceText) elif commandId == "BT00501": """ブラウザ""" rospy.loginfo(":Webpage") self.execDoCoMoQA(self.resp_understanding.response.utteranceText) elif commandId == "BT00601": """観光案内""" rospy.loginfo(":Sightseeing") self.execDoCoMoQA(self.resp_understanding.response.utteranceText) elif commandId == "BT00701": """カメラ""" rospy.loginfo(":Camera") self.execDoCoMoQA(self.resp_understanding.response.utteranceText) elif commandId == "BT00801": """ギャラリー""" rospy.loginfo(":Gallery") self.execDoCoMoQA(self.resp_understanding.response.utteranceText) elif commandId == "BT00901": """通信""" rospy.loginfo(":Coomunincation") self.execDoCoMoQA(self.resp_understanding.response.utteranceText) elif commandId == "BT01001": """メール""" rospy.loginfo(":Mail") self.execDoCoMoQA(self.resp_understanding.response.utteranceText) elif commandId == "BT01101": """メモ登録""" rospy.loginfo(":Memo input") self.execDoCoMoQA(self.resp_understanding.response.utteranceText) elif commandId == "BT01102": """メモ参照""" rospy.loginfo(":Memo output") self.execDoCoMoQA(self.resp_understanding.response.utteranceText) elif commandId == "BT01201": """アラーム""" rospy.loginfo(":Alarm") self.execDoCoMoQA(self.resp_understanding.response.utteranceText) elif commandId == "BT01301": """スケジュール登録""" rospy.loginfo(":Schedule input") self.execDoCoMoQA(self.resp_understanding.response.utteranceText) elif commandId == "BT01302": """スケジュール参照""" rospy.loginfo(":Schedule input") self.execDoCoMoQA(self.resp_understanding.response.utteranceText) elif commandId == "BT01501": """端末設定""" rospy.loginfo(":Setting") self.execDoCoMoQA(self.resp_understanding.response.utteranceText) elif commandId == "BT01601": """SNS投稿""" rospy.loginfo(":SNS") self.execDoCoMoQA(self.resp_understanding.response.utteranceText) elif commandId == "BT90101": """キャンセル""" rospy.loginfo(":Cancel") self.execDoCoMoQA(self.resp_understanding.response.utteranceText) elif commandId == "BM00101": """地図乗換""" rospy.loginfo(":Map transfer") self.execDoCoMoQA(self.resp_understanding.response.utteranceText) elif commandId == "BM00201": """通話メール""" rospy.loginfo(":Short mail") self.execDoCoMoQA(self.resp_understanding.response.utteranceText) else: """発話理解APIで判定不能""" """Undeterminable""" rospy.loginfo("Undeterminable:%s",self.resp_understanding.response.commandId) self.trcpSay("ごめんなさい、良く聞き取れませんでした。") else: """発話理解APIがエラーのとき""" rospy.loginfo("DoCoMo 発話理解API failed") pass except: """対話プログラムのどこかでエラーのとき""" rospy.loginfo("error") pass return True