きっかけ
- 展示会とかでいちいち人の量に応じてボリュームの調整が面倒くさいから。
- ロボットスタートさんのロボットライブラリで音量調整が流行ってる?
- 誰か作ってくれないかなーって待ってたけど、まだ・・・。
- 河田師匠に御教授頂いた「オーディエンスの拍手の大きさを測定してPepperが優勝者を決める」でせっかくだから作ってみようと思った。
使ったAPI
ALAudioDevice
※前回と一緒w
使ったMethod
getFrontMicEnergy()
※前回と一緒w
準備
何を見て音量を調整するか。
- 人の量
- 周りの音量
- Pepperと人の距離
- 人の動き
以上の2つで作ってみます。
ボリュームの決め方
- 周りがうるさい -> 音量最大
- お客さんがPepperの前にいない -> 元々のボリューム
- お客さん1人 -> デカすぎるとうるさいと思うので60%
- お客さん2人〜3人 -> みんなに聞いて欲しいので80%
- お客さん4人以上 -> ガヤガヤして聞き取りにくそうなので100%
仕組み
勝手にやって欲しいので起動後、Timerでこんな感じで半永久的に動いてもらいます。

アウトプットしたVolume(%)はSet Speaker Vol.ボックスの変数に入れてます。
その後、設定しておいた間隔でVolumeを都度、設定。
Config.py
    def onLoad(self):
        self.timer = None
        self.nFacesDetected = -1
        self.audiodevice = ALProxy("ALAudioDevice")
        self.defaultVol = self.audiodevice.getOutputVolume()
        self.vol = self.defaultVol
    def onUnload(self):
        self.cancelTimer()
    def cancelTimer(self):
        if self.timer:
            self.timer.stop()
        self.timer = None
    def onTimer(self):
        self.timerOutput()
    def startTimer(self):
        import qi
        self.timer = qi.PeriodicTask()
        self.timer.setCallback(self.onTimer)
        self.timer.setUsPeriod(int(self.getParameter("Period (s)") * 1000 * 1000))
        self.timer.start(True)
    def onInput_onStart(self):
        self.cancelTimer()
        self.startTimer()
    def onInput_onStop(self):
        self.audiodevice.setOutputVolume(self.defaultVol)
        if self.timer and self.timer.isRunning():
            self.onStopped()
        self.onUnload()
    def onInput_inputFaceTracked(self, p):
        if(len(p) > 0):
            if(self.nFacesDetected != len(p[1]) -1): # an additional array has been placed at the end for time
                self.nFacesDetected = len(p[1]) -1  # filtered info and has to be substracted when counting faces
                self._JudgeOutput( self.nFacesDetected )
        else:
            if(self.nFacesDetected != 0):
                self.nFacesDetected = 0
                self._JudgeOutput( self.nFacesDetected )
    def _JudgeOutput(self, envMaterial):
        self.logger.info("FrontMicEnergy:%d" % self.audiodevice.getFrontMicEnergy())
        self.logger.info("envMaterial:%d" % envMaterial)
        if (self.audiodevice.getFrontMicEnergy() >= 1800):
            self.EnvironmentVolume(100)
        elif envMaterial == 0:
            self.EnvironmentVolume(self.defaultVol)
        elif envMaterial == 1:
            self.EnvironmentVolume(60)
        elif envMaterial >= 2 and envMaterial < 4:
            self.EnvironmentVolume(80)
        elif envMaterial >= 4:
            self.EnvironmentVolume(100)
起動
起動は再生ボタンの隣のこの旗にチェックをつけておくか、プラグイン入れればPepper起動した時に勝手にアプリは動き出します。

おまけ
Configを読み込んだ際に元々の音量を記憶しておいてアプリを終了する際に戻しています。
頭をタッチしてから5秒以内にバックバンパーを4回押したらボリュームを元に戻してアプリ終了です。
サンプル
ロボットスタートさんのロボットライブラリ
https://robo-lib.com/repositories/summary/42