#この記事を書いたきっかけ
今年10月3日にDMM.make AKIBAで行われた面白カヤックさん主催のハッカソン「出張!つくってみラボ in DMM.make AKIBA with Pepperさん」でPepper賞を決めた仕組みが面白かったので、作成された「Pepperやっていたら知らない人はいない河田師匠」に聞いたら御教授頂けたので共有します。
因みにこの時、Pepper賞は頂けませんでしたが、優勝しましたー!わーい。
#前提
初めてQiita書くので、「もっとこうしたら見易いよ」とかあったら教えてもらえると嬉しいです。
今回、セリフとアニメーションは一切触ってないです。
#結論
発表者のプレゼンを聞いた他の出演者が拍手をした際にPepperが音の大きさを測って、「一番拍手が大きかったチームを選ぶ」アプリケーションです。
#使用したAPI
ALAudioDevice
#使用したMethod
getFrontMicEnergy()
#準備
- 対象のチームの名前
- チーム毎のスコア
今回はとりあえずという事で、グローバル変数にしました。
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