LoginSignup
10
10

More than 3 years have passed since last update.

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

Last updated at Posted at 2015-12-27

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

今年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

10
10
0

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
10
10