13
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

周りの環境(音)に応じて勝手にPepperのボリュームを変える

Last updated at Posted at 2015-12-27

#きっかけ

  1. 展示会とかでいちいち人の量に応じてボリュームの調整が面倒くさいから。
  2. ロボットスタートさんのロボットライブラリで音量調整が流行ってる?
  3. 誰か作ってくれないかなーって待ってたけど、まだ・・・。
  4. 河田師匠に御教授頂いた「オーディエンスの拍手の大きさを測定してPepperが優勝者を決める」でせっかくだから作ってみようと思った。

#使ったAPI
ALAudioDevice
前回と一緒w

#使ったMethod
getFrontMicEnergy()
前回と一緒w

#準備
何を見て音量を調整するか。

  • 人の量
  • 周りの音量
  • Pepperと人の距離
  • 人の動き

以上の2つで作ってみます。

#ボリュームの決め方

  • 周りがうるさい -> 音量最大
  • お客さんがPepperの前にいない -> 元々のボリューム
  • お客さん1人 -> デカすぎるとうるさいと思うので60%
  • お客さん2人〜3人 -> みんなに聞いて欲しいので80%
  • お客さん4人以上 -> ガヤガヤして聞き取りにくそうなので100%

#仕組み
勝手にやって欲しいので起動後、Timerでこんな感じで半永久的に動いてもらいます。
スクリーンショット 2015-12-27 16.29.02.png

アウトプットした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起動した時に勝手にアプリは動き出します。
スクリーンショット 2015-12-27 16.45.31.png

#おまけ
Configを読み込んだ際に元々の音量を記憶しておいてアプリを終了する際に戻しています。
頭をタッチしてから5秒以内にバックバンパーを4回押したらボリュームを元に戻してアプリ終了です。

#サンプル
ロボットスタートさんのロボットライブラリ
https://robo-lib.com/repositories/summary/42

13
16
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
13
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?