オーディエンスの拍手の大きさを測定してPepperが優勝者を決める


#この記事を書いたきっかけ
今年10月3日にDMM.make AKIBAで行われた面白カヤックさん主催のハッカソン「出張！つくってみラボ in DMM.make AKIBA with Pepperさん」でPepper賞を決めた仕組みが面白かったので、作成された「Pepperやっていたら知らない人はいない河田師匠」に聞いたら御教授頂けたので共有します。

**因みにこの時、Pepper賞は頂けませんでしたが、優勝しましたー！わーい。**

#前提
初めてQiita書くので、「もっとこうしたら見易いよ」とかあったら教えてもらえると嬉しいです。
今回、セリフとアニメーションは一切触ってないです。

#結論
発表者のプレゼンを聞いた他の出演者が拍手をした際にPepperが音の大きさを測って、「一番拍手が大きかったチームを選ぶ」アプリケーションです。

#使用したAPI
[ALAudioDevice](http://doc.aldebaran.com/2-1/naoqi/audio/alaudiodevice-api.html?highlight=alaudiodevice#ALAudioDeviceProxy)

#使用したMethod
[getFrontMicEnergy()](http://doc.aldebaran.com/2-1/naoqi/audio/alaudiodevice-api.html?highlight=alaudiodevice#ALAudioDeviceProxy::getFrontMicEnergy)

#準備
1. 対象のチームの名前
2. チーム毎のスコア

今回はとりあえずという事で、グローバル変数にしました。

```python:init.py
    global members
    global scores

    members = ["まくら", "マイペッパーライフいずスマイル", "ストッパー"]
    scores = [0, 0, 0]
```

#仕組み
一定間隔で音の大きさを測り、一番大きかった値をグローバル変数scoresに格納するといった感じです。

```python:max_SoundCk.py
    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で一番大きい値を取り出して発表するだけです。

```python:Say_Text.py
    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
```

#サンプル
今回、**河田師匠**にソースコードを頂き、少し整理したものをロボットスタートさんの[ロボットライブラリ](https://pepper.robo-lib.com/repositories/summary/41)にUPしましたので、見てみてください。
https://pepper.robo-lib.com/repositories/summary/41