주변 환경 (소리)에 따라 마음대로 Pepper의 볼륨을 변경

계기


  • 전시회라든가로 일일이 사람의 양에 응해 볼륨의 조정이 번거롭기 때문에.

  • 로봇 시작 님의 로봇 라이브러리
  • 누군가 만들어 주지 않을까-라고 기다리고 있었지만, 아직···.
  • 카와다 사장에게 교수 받은 「 잠재고객의 박수 크기를 측정하여 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번 누르면 볼륨을 되돌려 앱 종료입니다.

    샘플



    로봇 시작의 로봇 라이브러리
    htps : // 로보-b. 코 m / 레포시 토리 s / 슈마 ry / 42

    좋은 웹페이지 즐겨찾기