사운드 트리거

사운드 트리거 기능은 저전력 및 개인 정보 보호 방식으로 핫워드와 같은 특정 음향 이벤트를 수신할 수 있는 기능을 앱에 제공합니다. Sound Trigger의 사용 사례는 Assistant 및 Now Playing입니다.

이 페이지에서는 Sound Trigger 아키텍처와 HAL(Hardware Abstraction Layer) 인터페이스에 대한 개요를 제공합니다.

사운드 트리거 스택

사운드 트리거 하위 시스템은 그림 1과 같이 레이어로 구축되어 있습니다.

sound_trigger_stack

그림 1: 사운드 트리거 스택

다음 목록은 그림 1에 표시된 각 계층에 대해 더 자세히 설명합니다.

  • HAL 레이어 (녹색)에는 STHAL( Sound Trigger HAL ) 인터페이스를 구현하는 공급업체별 코드가 포함되어 있습니다.

  • SoundTriggerMiddleware (노란색)는 HAL 인터페이스 위에 있습니다. HAL과 통신하고 다른 클라이언트 간에 HAL 공유, 로깅, 권한 적용 및 이전 HAL 버전과의 호환성 처리와 같은 기능을 담당합니다.

  • SoundTriggerService (파란색) 시스템은 미들웨어 위에 있습니다. 전화 통신 및 배터리 이벤트와 같은 다른 시스템 기능과의 통합을 용이하게 합니다. 또한 고유 ID로 인덱싱된 사운드 모델 데이터베이스를 유지 관리합니다.

  • SoundTriggerService 레이어 위의 스택(갈색)은 어시스턴트와 일반 앱과 관련된 기능을 별도로 처리합니다.

사운드 트리거 스택의 기능은 음향, 트리거 이벤트를 나타내는 개별 이벤트를 전달하는 것입니다. 대부분의 경우 사운드 트리거 스택은 오디오를 처리하지 않습니다. 트리거 이벤트를 수신하면 앱은 오디오 프레임워크를 통해 AudioRecord 개체를 열어 이벤트 시간을 둘러싼 실제 오디오 스트림에 액세스할 수 있습니다. 사운드 트리거 HAL API는 오디오 프레임워크와 함께 사용되는 트리거된 이벤트에 대한 핸들을 제공합니다. 따라서 Sound Trigger HAL과 Audio HAL은 내부적으로 연결되어 있기 때문에 일반적으로 프로세스를 공유합니다.

사운드 트리거 HAL 인터페이스

사운드 트리거 HAL(STHAL) 인터페이스는 사운드 트리거 스택의 공급업체별 부분이며 핫워드 및 기타 사운드의 하드웨어 인식을 처리합니다. STHAL은 각각의 엔진이 특정 종류의 소리를 감지하도록 설계된 다른 알고리즘을 실행하는 하나 이상의 엔진을 제공합니다. STHAL이 트리거를 감지하면 프레임워크에 이벤트를 보낸 다음 감지를 중지합니다.

STHAL 인터페이스는 /hardware/interfaces/soundtrigger/ 아래에 지정됩니다.

ISoundTriggerHw 인터페이스는 주어진 시간에 하나 이상의 감지 세션을 실행하고 음향 이벤트를 수신하는 기능을 지원합니다. ISoundTriggerHw.getProperties() 에 대한 호출은 구현 설명 및 기능을 포함하는 Properties 구조를 반환합니다.

세션을 설정하는 기본 흐름은 그림 2에 설명되어 있습니다.

sthal_state

그림 2: STHAL 상태 다이어그램

다음 단계에서는 각 상태를 더 자세히 설명합니다.

  1. HAL 클라이언트는 loadSoundModel() 또는 loadPhraseSoundModel() 을 사용하여 모델을 로드합니다. 제공된 모델 객체는 사용할 구현별 탐지 알고리즘(엔진)과 이 알고리즘에 적용할 수 있는 매개변수를 나타냅니다. 성공하면 이러한 메서드는 후속 호출에서 이 모델을 참조하는 데 사용되는 핸들을 반환합니다.

  2. 모델이 성공적으로 로드되면 HAL 클라이언트가 startRecognition() 을 호출하여 감지를 시작합니다. 다음 이벤트 중 하나가 발생할 때까지 백그라운드에서 인식이 계속 실행됩니다.

    1. 이 모델에서 stopRecognition() 이 호출되었습니다.
    2. 감지가 발생했습니다.
    3. 예를 들어 더 높은 우선 순위 사용 사례가 시작된 경우와 같이 리소스 제약으로 인해 탐지가 중단됩니다.

    후자의 두 경우에 인식 이벤트는 로드 시 HAL 클라이언트에 의해 등록된 콜백 인터페이스를 통해 전송됩니다. 모든 경우에 이러한 이벤트 중 하나가 발생한 후 탐지가 비활성화되고 더 이상 인식 콜백이 허용되지 않습니다.

    나중에 같은 모델을 다시 시작할 수 있으며 이 과정을 필요한 만큼 반복할 수 있습니다.

  3. 마지막으로 더 이상 필요하지 않은 비활성 모델은 unloadModel() 을 통해 HAL 클라이언트에서 언로드됩니다.

HAL 오류 처리

드라이버 구현 간에 안정적이고 일관된 동작을 보장하기 위해 Android 11에서는 HAL에서 반환된 모든 비성공 오류 코드가 프로그래밍 오류로 처리되며, 이를 복구하려면 HAL 프로세스를 다시 시작해야 합니다. 이것은 최후의 수단 복구 전략이며 제대로 작동하는 시스템에서는 이러한 경우가 발생하지 않을 것으로 예상됩니다.