사운드 트리거

사운드 트리거 기능을 사용하면 앱이 핫워드와 같은 특정 어쿠스틱 이벤트를 저전력 및 개인 정보 보호에 민감한 방식으로 리슨할 수 있습니다. 사운드 트리거의 사용 사례 예로는 어시스턴트와 Now Playing이 있습니다.

이 페이지에서는 사운드 트리거 아키텍처와 하드웨어 추상화 계층(HAL) 인터페이스에 관해 간략하게 설명합니다.

사운드 트리거 스택

사운드 트리거 하위 시스템은 그림 1과 같이 레이어로 빌드됩니다.

sound_trigger_stack

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

다음 목록은 그림 1에 표시된 각 레이어를 자세하게 설명합니다.

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

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

  • SoundTriggerService(파란색) 시스템은 미들웨어 위에 있습니다. 텔레포니 및 배터리 이벤트와 같은 다른 시스템 기능과의 통합을 용이하게 합니다. 고유 ID로 색인이 생성된 사운드 모델의 데이터베이스도 유지합니다.

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

사운드 트리거 스택의 기능은 어쿠스틱 및 트리거 이벤트를 나타내는 개별 이벤트를 전달하는 것입니다. 대부분의 경우 사운드 트리거 스택은 오디오를 처리하지 않습니다. 앱이 트리거 이벤트를 수신하면 오디오 프레임워크를 통해 AudioRecord 객체를 열어 이벤트 시간 근처의 실제 오디오 스트림에 액세스합니다. 사운드 트리거 HAL API는 오디오 프레임워크와 함께 사용되는 트리거된 이벤트가 포함된 핸들을 제공합니다. 따라서 사운드 트리거 HAL과 오디오 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 프로세스를 다시 시작해야 합니다. 이는 최후의 복구 전략이며, 제대로 작동하는 시스템에서는 이러한 상황이 발생하지 않을 것으로 예상됩니다.