Help us understand the problem. What is going on with this article?

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

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

AntEgg
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away