Speaker

디바이스의 볼륨을 제어하기 위한 규격

Version

최신 버전은 1.2 입니다.

Version Date Description
1.0 2020.03.13 규격 추가
1.1 2020.06.22 Context 의 volumes.name 목록 변경
1.2 2020.06.26 Context 에 defaultVolumeLevel 필드 추가
Context 의 volumnes 에 group 필드 추가

SDK Interface

SpeakerAgent 사용

Speaker interface 규격에 따른 디바이스의 동작 제어는 SpeakerAgent 가 처리합니다.

iOS 는 SpeakerAgent 를 지원하지 않습니다.

  • Android
  • Linux

NuguAndroidClient instance 를 통해 SpeakerAgent instance 에 접근할 수 있습니다.

복사성공!
1
val speakerAgent = nuguAndroidClient.getAgent(DefaultSpeakerAgent.NAMESPACE)

NuguAndroidClient 에 볼륨 제어를 위한 기본 Speaker 구현이 포함되어 있습니다.

Speaker 을 직접 구현하려면 NuguAndroidClient 생성시 SpeakerFactory 를 추가합니다.

복사성공!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class MySpeaker: Speaker {
    ...
}
NuguAndroidClient.Builder(...)
    .speakerFactory(object : SpeakerFactory {
        override fun createNuguSpeaker(): Speaker? = MySpeaker()

        override fun createAlarmSpeaker(): Speaker? = MySpeaker()

        override fun createCallSpeaker(): Speaker? = MySpeaker()

        override fun createExternalSpeaker(): Speaker? = MySpeaker()

        override fun createSpeaker(type: Speaker.Type): Speaker? {
            return when (type) {
                Speaker.Type.NUGU -> MySpeaker()
                Speaker.Type.ALARM -> MySpeaker()
                else -> MySpeaker()
            }
        }
    })

CapabilityFactory::makeCapability 함수로 SpeakerAgent 를 생성하고 NuguClient 에 추가해 주어야합니다.

복사성공!
1
2
3
4
5
6
auto speaker_handler(std::shared_ptr<ISpeakerHandler>(
        CapabilityFactory::makeCapability<SpeakerAgent, ISpeakerHandler>()));

nugu_client->getCapabilityBuilder()
    ->add(speaker_handler.get())
    ->construct();

Context 구성

Play 에서 디바이스의 볼륨을 제어하기 위해서는 디바이스의 볼륨 정보를 Context 에 포함시켜 주어야 합니다.

  • Android
  • Linux

각 Speaker.Type 의 Speaker 를 구현합니다.

복사성공!
1
2
3
4
5
class MySpeaker: Speaker {
    override fun getSpeakerSettings(): Speaker.SpeakerSettings? {
        ...
    }
}

SpeakerTypeSpeakerInfo 를 설정합니다.

복사성공!
1
speaker_handler->setSpeakerInfo(speakers)

볼륨 제어

디바이스의 볼륨 제어가 SetVolume directive 로 요청될 수 있습니다.

디바이스의 볼륨 음소거 제어가 SetMute directive 로 요청될 수 있습니다.

  • Android
  • Linux

Speaker 를 구현합니다.

복사성공!
1
2
3
4
5
6
7
8
9
10
11
class MySpeaker: Speaker {
    override fun setVolume(volume: Int, rate: Rate = Rate.FAST): Boolean {
        ...
    }

    override fun setMute(mute: Boolean): Boolean {
        ...
    }

    ...
}

ISpeakerListener 를 추가합니다.

복사성공!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class MySpeakerListener : public ISpeakerListener {
public:
    ...

    void requestSetMute(const std::string &ps_id, SpeakerType type, bool mute) override
    {
        ...
    }

    void requestSetVolume(const std::string &ps_id, SpeakerType type, int volume, bool linear) override
    {
        ...
    }
};
auto speaker_listener(std::make_shared<MySpeakerListener>());
CapabilityFactory::makeCapability<SpeakerAgent, ISpeakerHandler>(speaker_listener.get());

Context

복사성공!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
  "Speaker": {
    "version": "1.0",
    "volumes": [
      {
        "name": "{{STRING}}",
        "group": "{{STRING}}",
        "volume": {{LONG}},
        "minVolume": {{LONG}},
        "maxVolume": {{LONG}},
        "defaultVolumeStep": {{LONG}},
        "defaultVolumeLevel": {{LONG}},
        "muted": {{BOOLEAN}}
      }
    ]
  }
}
parameter type mandatory description
volumes array of object N 볼륨 조절 불가한 경우는 전달하지 않음
volumes.name string Y NUGU(MUSIC+VOICE_COMMAND)
MUSIC
RINGTONE
CALL
NOTIFICATION
ALARM
VOICE_COMMAND
NAVIGATION
SYSTEM_SOUND
Reference: https://source.android.com/devices/audio/attributes#contexts
volumes.group string N volume의 group 값으로 영문자와 숫자를 이용하여 구성할 수 있음.(Play에서는 group 값을 mapping하여 TTS를 만들 때 사용할 수 있음) grouping 되어 있지 않은 경우는 전달하지 않음 Reference: https://source.android.com/devices/automotive/audio#volume-and-groups
volumes.volume long N 현재 설정된 볼륨 볼륨 조절 불가한 경우는 전달하지 않음
volumes.minVolume long N 설정 가능한 최대 볼륨 볼륨 조절 불가한 경우는 전달하지 않음
volumes.maxVolume long N 설정 가능한 최소 볼륨 볼륨 조절 불가한 경우는 전달하지 않음
volumes.defaultVolumeStep long N 기본 볼륨 단계 볼륨 조절 불가한 경우는 전달하지 않음
volumnes.defaultVolumeLevel long N 기본 볼륨 값 볼륨 조절 불가한 경우는 전달하지 않음 version 1.2 이전에서는 전달하지 않음
volumes.muted boolean N 음소거 상태 음소거 설정이 불가한 경우는 전달하지 않음

Directive

SetVolume

복사성공!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
  "header": {
    "namespace": "Speaker",
    "name": "SetVolume",
    "messageId": "{{STRING}}",
    "dialogRequestId": "{{STRING}}",
    "version": "1.0"
  },
  "payload": {
    "playServiceId": "{{STRING}}",
    "rate": "{{STRING}}",
    "volumes": [
      {
        "name": "{{STRING}}",
        "volume": {{LONG}}
      }
    ]
  }
}
parameter type mandatory description
name string Y Context 참조
rate string N SLOW, FAST
- SLOW: 점진적으로 변경 (max 값으로 설정하는 시나리오에서 사용)
- FAST : 바로 변경
volume long Y 설정할 volume

SetMute

복사성공!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
  "header": {
    "namespace": "Speaker",
    "name": "SetVolume",
    "messageId": "{{STRING}}",
    "dialogRequestId": "{{STRING}}",
    "version": "1.0"
  },
  "payload": {
    "playServiceId": "{{STRING}}",
    "rate": "{{STRING}}",
    "volumes": [
      {
        "name": "{{STRING}}",
        "mute": {{BOOLEAN}}
      }
    ]
  }
}
parameter type mandatory description
name string Y Context 참조
mute boolean Y true / false

Event

SetVolumeSucceeded

복사성공!
1
2
3
4
5
6
7
8
9
10
11
12
{
  "header": {
    "namespace": "Speaker",
    "name": "SetVolumeSucceeded",
    "messageId": "{{STRING}}",
    "dialogRequestId": "{{STRING}}",
    "version": "1.0"
  },
  "payload": {
    "playServiceId": "{{STRING}}"
  }
}

SetVolumeFailed

복사성공!
1
2
3
4
5
6
7
8
9
10
11
12
{
  "header": {
    "namespace": "Speaker",
    "name": "SetVolumeFailed",
    "messageId": "{{STRING}}",
    "dialogRequestId": "{{STRING}}",
    "version": "1.0"
  },
  "payload": {
    "playServiceId": "{{STRING}}"
  }
}

SetMuteSucceeded

복사성공!
1
2
3
4
5
6
7
8
9
10
11
12
{
  "header": {
    "namespace": "Speaker",
    "name": "SetMuteSucceeded",
    "messageId": "{{STRING}}",
    "dialogRequestId": "{{STRING}}",
    "version": "1.0"
  },
  "payload": {
    "playServiceId": "{{STRING}}"
  }
}

SetMuteFailed

복사성공!
1
2
3
4
5
6
7
8
9
10
11
12
{
  "header": {
    "namespace": "Speaker",
    "name": "SetMuteFailed",
    "messageId": "{{STRING}}",
    "dialogRequestId": "{{STRING}}",
    "version": "1.0"
  },
  "payload": {
    "playServiceId": "{{STRING}}"
  }
}