手順
「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日後を求める方法