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

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

この記事を書いたきっかけ

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

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

前提

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

結論

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

使用したAPI

ALAudioDevice

使用したMethod

getFrontMicEnergy()

準備

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

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

init.py
    global members
    global scores

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

仕組み

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

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

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

サンプル

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

mat_aaa
私、完全に素人です。
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