Posted at

pepperに曜日をしゃべらせるサンプルコード(メモ)

More than 3 years have passed since last update.


手順

「SetLanguage」ボックスを置き、Japaneseに設定

「Say」ボックスを置き、ダブルクリックで中に入り、Localized TextをJapaneseに設定「Say Text」ボックスをダブルクリックし、コードを以下に書き換える

「SetLanguage」と「Say」をつなぎ実行。今日の曜日を話してくれるはず。


サンプルコード

#import time

#import datetime

class MyClass(GeneratedClass):
def __init__(self):
GeneratedClass.__init__(self, False)
self.tts = ALProxy('ALTextToSpeech')
self.ttsStop = ALProxy('ALTextToSpeech', True) #Create another proxy as wait is blocking if audioout is remote

def onLoad(self):
self.bIsRunning = False
self.ids = []

def onUnload(self):
for id in self.ids:
try:
self.ttsStop.stop(id)
except:
pass
while( self.bIsRunning ):
time.sleep( 0.2 )

def onInput_onStart(self, p):
self.bIsRunning = True
d = datetime.datetime.today()
self.log("曜日(月曜が0,日曜が6):")
self.log(d.weekday())

wd = self.getWeekday(d.weekday())
self.log(wd)

try:
sentence = "\RSPD="+ str( self.getParameter("Speed (%)") ) + "\ "
sentence += "\VCT="+ str( self.getParameter("Voice shaping (%)") ) + "\ "
sentence += '%sようび' %(wd)
sentence += "\RST\ "
id = self.tts.post.say(str(sentence))
self.ids.append(id)
self.tts.wait(id, 0)
finally:
try:
self.ids.remove(id)
except:
pass
if( self.ids == [] ):
self.onStopped() # activate output of the box
self.bIsRunning = False

def onInput_onStop(self):
self.onUnload()

def getWeekday(self, num):
self.log("getWeekday関数が実行された" + str(num))

if (num == 0):
return "げつ"
elif (num == 1):
return "か"
elif (num == 2):
return "すい"
elif (num == 3):
return "もく"
elif (num == 4):
return "きん"
elif (num == 5):
return "ど"
elif (num == 6):
return "にち"
else:
return "なん"

先頭行のimport、書かないと動かないと思っていたが、コメントアウトしても動いた。

自作関数getWeekday()を辞書を使ってもう少し簡潔にしてみた。

さらに、parameterにaddDateを追加して、過去や未来の曜日も言わせられるように。


def onInput_onStart(self, p):
#略

wd = self.getWeekday(d.weekday(), self.getParameter("addDate"))
self.log(wd)

try:
sentence = "\RSPD="+ str( self.getParameter("Speed (%)") ) + "\ "
sentence += "\VCT="+ str( self.getParameter("Voice shaping (%)") ) + "\ "
sentence += '%sようび' %(wd)
sentence += "\RST\ "
#略

def getWeekday(self, num, opt=0):
self.log("getWeekday関数が実行された" + str(num))
self.log(type(num))
num += opt
youbi = ["げつ", "か", "すい", "もく", "きん", "ど", "にち", "なん"]
return youbi[num]


所感

・python(オブジェクト思考も)が初めてなので、関数ひとつ作るだけなのに苦労した。

・selfを書くところと不要なところがあるが、いまいちわからなかった。

・配列を使って処理することで記述量が減る。

・self.log("xxx")を多用して、ログビューアで1つずつ確認した。

・timedeltaオブジェクトを使えばgetWeekday関数の第3引数を自作しなくてよかったかも。PythonでX日前/X日後を求める方法


参考

[Pepper] Pepperアプリケーション開発 ~Pepperに現在時刻を聞いてみよう!!~