この記事を書いたきっかけ
今年10月3日にDMM.make AKIBAで行われた面白カヤックさん主催のハッカソン「出張!つくってみラボ in DMM.make AKIBA with Pepperさん」でPepper賞を決めた仕組みが面白かったので、作成された「Pepperやっていたら知らない人はいない河田師匠」に聞いたら御教授頂けたので共有します。
因みにこの時、Pepper賞は頂けませんでしたが、優勝しましたー!わーい。
前提
初めてQiita書くので、「もっとこうしたら見易いよ」とかあったら教えてもらえると嬉しいです。
今回、セリフとアニメーションは一切触ってないです。
結論
発表者のプレゼンを聞いた他の出演者が拍手をした際にPepperが音の大きさを測って、「一番拍手が大きかったチームを選ぶ」アプリケーションです。
使用したAPI
使用したMethod
準備
- 対象のチームの名前
- チーム毎のスコア
今回はとりあえずという事で、グローバル変数にしました。
    global members
    global scores
    members = ["まくら", "マイペッパーライフいずスマイル", "ストッパー"]
    scores = [0, 0, 0]
仕組み
一定間隔で音の大きさを測り、一番大きかった値をグローバル変数scoresに格納するといった感じです。
    def onLoad(self):
        self.timer = None
        self.limit = 0
        self.audio = ALProxy("ALAudioDevice")
    def onUnload(self):
        self.cancelTimer()
        self.audio.disableEnergyComputation()
    def cancelTimer(self):
        if self.timer:
            self.timer.stop()
        self.timer = None
    def onTimer(self):
        v = self.audio.getFrontMicEnergy()
        if self.maxV < v:
            self.maxV = v
        self.limit += int(self.getParameter("Check Interval (s)") * 1000 * 1000)
        if self.limit >= int(self.getParameter("Limit Measure (s)") * 1000 * 1000):
            self.onInput_onStop()
    def startTimer(self):
        import qi
        self.timer = qi.PeriodicTask()
        self.timer.setCallback(self.onTimer)
        self.timer.setUsPeriod(int(self.getParameter("Check Interval (s)") * 1000 * 1000))
        self.timer.start(True)
    def onInput_onStart(self):
        global members
        global current_member
        self.logger.info("モニタリング開始 チーム:%s" % members[current_member])
        self.audio.enableEnergyComputation()
        self.maxV = 0
        self.cancelTimer()
        self.startTimer()
    def onInput_onStop(self):
        global scores
        global current_member
        if self.timer and self.timer.isRunning():
            self.logger.info(self.maxV)
            self.onStopped()
            scores[current_member] = self.maxV
        self.onUnload()
結果発表
単純にscoresで一番大きい値を取り出して発表するだけです。
    def onInput_onStart(self):
        global members
        global current_member
        global scores
        
        self.logger.info(members)
        m = 0
        mv = 0
        l = len(members)
        for i in range(0,l)  :
            if scores[i] > mv:
                self.logger.info("%d : %d" % (int(i), int(scores[i])))
                m = i
                mv = scores[i]
        p =  members[m]
        self.bIsRunning = True
        try:
            sentence = "\RSPD="+ str( self.getParameter("Speed (%)") ) + "\ "
            sentence += "\VCT="+ str( self.getParameter("Voice shaping (%)") ) + "\ "
            sentence += str(p)
            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
サンプル
今回、河田師匠にソースコードを頂き、少し整理したものをロボットスタートさんのロボットライブラリにUPしましたので、見てみてください。
https://pepper.robo-lib.com/repositories/summary/41