LoginSignup
11
12

More than 5 years have passed since last update.

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

Posted at

手順

「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に現在時刻を聞いてみよう!!~

11
12
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
12