다음을 통해 공유


다중 음성 도우미

다중 음성 도우미 플랫폼은 Windows의 추가 음성 도우미 지원합니다. 이렇게 하면 PC 및 HoloLens와 같은 웨어러블과 같은 Windows 장치에서 다른 도우미 사용할 수 있습니다. 지원되는 키워드(keyword) 패턴 집합을 사용하여 동일한 디바이스에서 여러 음성 도우미 활성화할 수 있습니다.

참고 항목

여러 음성 도우미는 Windows 10 버전 1903부터 지원됩니다.

Windows Cortana를 구현하는 방법에 대한 자세한 내용은 음성 활성화를 참조 하세요.

음성 활성화

음성 활성화는 사용자가 특정 구를 말함으로써 다양한 디바이스 전원 상태에서 음성 인식 엔진을 호출할 수 있게 해주는 기능입니다.

음성 활성화 구현은 중요한 프로젝트이며 SoC 공급업체가 완료한 작업입니다. OEM은 SoC 공급업체에 문의하여 SoC의 음성 활성화 구현에 대한 정보를 확인할 수 있습니다.

음성 활성화를 사용하면 사용자가 자신의 음성을 사용하여 활성 컨텍스트(즉, 현재 화면의 내용)를 벗어나 음성 도우미 환경을 신속하게 참여할 수 있습니다. 사용자는 디바이스와 물리적으로 상호 작용하거나 터치하지 않고도 환경에 즉시 액세스할 수 있기를 원합니다. Xbox 사용자의 경우 컨트롤러를 찾아 연결하지 않으려는 것일 수 있습니다. PC 사용자의 경우 주방에 있는 컴퓨터의 경우처럼 여러 마우스, 터치 및/또는 키보드 작업을 수행하지 않고도 환경에 빠르게 액세스할 수 있습니다.

음성 활성화는 핵심 구가 감지되면 반응하는 KWS(키워드(keyword) 스포터)를 통해 구동됩니다. 핵심 구에는 "Hey Contoso"와 같은 핵심 단어가 포함될 수 있습니다. 키워드 검색은 하드웨어 또는 소프트웨어에서 키워드(keyword) 검색하는 것을 설명합니다.

핵심 구는 단독으로("Hey Contoso") 명령으로 발화되거나 연결된 명령("Hey Contoso, 다음 모임 위치는 어디인가요?")을 구성하는 음성 작업이 뒤에 올 수 있습니다.

Microsoft는 하드웨어 키워드(keyword) 검색을 사용할 수 없는 경우 음성 도우미 환경을 제공하기 위해 OS 기본 키워드(keyword) 스포터(소프트웨어 키워드(keyword) 스포터)를 제공합니다. 현재 Cortana에서 사용할 수 있지만 2단계 키워드(keyword) 검색을 수행하려면 다른 음성 도우미 온보딩하는 데 추가 Microsoft 구성이 필요할 수 있습니다. 자세한 내용은 문의하세요 AskMVA@Microsoft.com.

KWS가 저전력 상태에서 디바이스를 절전 모드 해제하는 경우 솔루션을 WoV(Wake-on-Voice)라고 합니다. 자세한 내용은 이 문서의 뒷부분에 있는 Wake on Voice를 참조하세요.

용어집

이 용어집에는 음성 활성화와 관련된 용어가 요약됩니다.

용어 예제/정의
스테이징된 명령 예: Contoso <일시 중지, 도우미 UI> 날씨를 기다립니다. 이를 "투샷 명령" 또는 "키워드(keyword) 전용"이라고도 합니다.
연결된 명령 예: Contoso의 날씨는 무엇인가요? 이를 "원샷 명령"이라고도 합니다.
음성 활성화 예: "Hey Contoso" 미리 정의된 활성화 핵심 구에서 키워드(keyword) 검색되는 시나리오입니다.
Wake-on-Voice(WoV) 전원 상태가 낮은 화면에서 전체 전원 상태의 화면으로 음성 활성화를 가능하게 하는 기술입니다.
최신 대기의 WoV S0ix(최신 대기) 화면에서 전체 전원(S0) 상태의 화면으로의 절전 모드 해제 음성
최신 대기 Windows 저전력 유휴 인프라 - Windows 10에서 커넥트 대기(CS)의 후속 작업입니다. 최신 대기 상태의 첫 번째 상태는 화면이 꺼져 있는 경우입니다. 가장 깊은 절전 상태는 DRIPS/복원력에 있는 경우입니다. 자세한 내용은 최신 대기를 참조 하세요.
Kws 키워드 스포터 - "Hey Contoso"의 검색을 제공하는 알고리즘입니다.
SW KWS 소프트웨어 키워드(keyword) 스포터 - 호스트(CPU)에서 실행되는 KWS의 구현입니다. "Hey Cortana"의 경우 SW KWS가 Windows의 일부로 포함됩니다.
HW KWS 하드웨어 키워드(keyword) 스포터 - 하드웨어에서 오프로드되는 KWS 구현입니다.
버스트 버퍼 KWS 검색을 트리거한 모든 오디오가 포함되도록 KWS 검색 시 버스트할 수 있는 PCM 데이터를 저장하는 데 사용되는 순환 버퍼입니다.
이벤트 감지기 OEM 어댑터 Windows 음성 도우미 스택과 드라이버 간의 중간 역할을 하는 사용자 모드 구성 요소입니다.
모델 KWS 알고리즘에서 사용하는 음향 모델 데이터 파일입니다. 데이터 파일이 정적입니다. 모델은 로캘당 하나씩 지역화됩니다.
MVA 다중 음성 에이전트 - 여러 에이전트를 지원하는 HWKWS DDI.
Sva 단일 음성 에이전트 - 단일 에이전트(Cortana)만 지원하는 이전 HWKWS DDI입니다.

하드웨어 키워드 스포터 통합

하드웨어 키워드(keyword) 스포터(HW KWS) SoC 공급업체를 구현하려면 다음 작업을 완료해야 합니다.

하드웨어 오프로드된 키워드(keyword) 스포터(HW KWS) WoV 요구 사항

  • HW KWS WoV는 S0 작업 상태 및 S0 절전 상태(최신 대기라고도 함) 중에 지원됩니다.
  • HW KWS WoV는 S3에서 지원되지 않습니다.

Aec

AEC는 버스트 오디오가 캡처될 때 DSP에서 수행하거나 소프트웨어 APO를 통해 나중에 수행할 수 있습니다. KWS 버스트 데이터를 사용하여 소프트웨어 AEC를 수행하려면 버스트 데이터가 캡처된 시점부터 해당 루프백 오디오가 있어야 합니다. 이렇게 하려면 버스트 출력에 대한 사용자 지정 오디오 형식이 생성되어 루프백 오디오를 버스트 오디오 데이터로 인터리브합니다.

Windows 버전 20H1부터 Microsoft AEC APO는 이 인터리브 형식을 인식하고 이를 사용하여 AEC를 수행할 수 있습니다. 자세한 내용은 KSPROPERTY_INTERLEAVEDAUDIO_FORMATINFORMATION 참조하세요.

유효성 검사

Voice Activation Manager 2 테스트를 사용하여 KSPROPSETID_SoundDetector2 속성에 대한 HW 지원의 유효성을 검사합니다.

샘플 코드 개요

SYSVAD 가상 오디오 어댑터 샘플의 일부로 GitHub에서 음성 활성화를 구현하는 오디오 드라이버에 대한 샘플 코드가 있습니다. 이 코드를 시작점으로 사용하는 것이 좋습니다.

SYSVAD 샘플 오디오 드라이버에 대한 자세한 내용은 샘플 오디오 드라이버를 참조 하세요.

키워드 인식 시스템 정보

음성 활성화 오디오 스택 지원

음성 활성화를 사용하도록 설정하기 위한 오디오 스택 외부 인터페이스는 음성 플랫폼 및 오디오 드라이버에 대한 통신 파이프라인 역할을 합니다. 외부 인터페이스는 세 부분으로 나뉩니다.

  • 이벤트 감지기 DDI(디바이스 드라이버 인터페이스). 이벤트 감지기 디바이스 드라이버 인터페이스는 HWS(키워드 스포터)를 구성하고 무장하는 역할을 담당합니다. 또한 드라이버에서 감지 이벤트를 시스템에 알리는 데 사용됩니다.
  • IEvent Detector OEM 어댑터 DLL. 이 DLL은 OS에서 사용할 드라이버별 불투명 데이터를 조정하여 키워드(keyword) 검색을 지원하는 COM 인터페이스를 구현합니다.
  • WaveRT의 향상된 기능 향상된 기능을 통해 오디오 드라이버는 키워드(keyword) 검색에서 버퍼링된 오디오 데이터를 버스트할 수 있습니다.

오디오 엔드포인트 속성

오디오 엔드포인트 그래프 빌드는 일반적으로 발생합니다. 그래프는 실시간 캡처보다 빠르게 처리할 수 있도록 준비됩니다. 캡처된 버퍼의 타임스탬프는 true가 기본. 특히 타임스탬프는 과거에 캡처되고 버퍼링된 데이터를 올바르게 반영하며 이제 버스트됩니다.

Bluetooth 바이패스 오디오 스트리밍 이론

드라이버는 평소처럼 캡처 디바이스에 대한 KS 필터를 노출합니다. 이 필터는 여러 KS 속성 및 검색 이벤트를 구성, 사용 및 신호를 보낼 KS 이벤트를 지원합니다. 필터에는 KWS(키워드(keyword) 스포터) 핀으로 식별되는 추가 핀 팩터리도 포함됩니다. 이 핀은 키워드(keyword) 스포터에서 오디오를 스트리밍하는 데 사용됩니다.

속성은 다음과 같습니다. KSPROPSETID_SoundDetector2

모든 KSPROPSETID_SoundDetector2 속성은 KSSOUNDDETECTORPROPERTY 데이터 구조로 호출됩니다. 이 데이터 구조에는 KSPROPERTY 및 키워드(keyword) 무장, 재설정, 검색 등에 대한 이벤트 ID가 포함됩니다.

  • 지원되는 키워드(keyword) 형식 - KSPROPERTY_SOUNDDETECTOR_PATTERNS. 이 속성은 검색할 키워드(keyword) 구성하도록 운영 체제에 의해 설정됩니다.
  • 키워드(keyword) 패턴 GUID 목록 - KSPROPERTY_SOUNDDETECTOR_SUPPORTEDPATTERNS. 이 속성은 지원되는 패턴의 유형을 식별하는 GUID 목록을 가져오는 데 사용됩니다.
  • 무장 - KSPROPERTY_SOUNDDETECTOR_ARMED. 이 읽기/쓰기 속성은 탐지기가 무장되어 있는지 여부를 나타내는 단순한 부울 상태. OS는 키워드(keyword) 탐지기를 연결하도록 설정합니다. OS는 이 작업을 취소하여 연결을 해제할 수 있습니다. 드라이버는 키워드(keyword) 패턴이 설정되고 키워드(keyword) 검색된 후에도 자동으로 지웁니다. (OS는 다시 시작해야 합니다.)
  • 일치 결과 - KSPROPERTY_SOUNDDETECTOR_RESET 시작 시 소리 감지기를 다시 설정하는 데 사용됩니다.

키워드(keyword) 검색 시 KSNOTIFICATIONID_SoundDetector 포함하는 PNP 알림이 전송됩니다. 참고: KSEvent가 아니라 IoReportTargetDeviceChangeAsynchronous를 통해 페이로드와 함께 전송되는 PNP 이벤트입니다.

KSNOTIFICATIONID_SoundDetector 여기에 표시된 대로 ksmedia.h에 정의됩니다.

// The payload of this notification is a SOUNDDETECTOR_PATTERNHEADER
#define STATIC_KSNOTIFICATIONID_SoundDetector\
    0x6389d844, 0xbb32, 0x4c4c, 0xa8, 0x2, 0xf4, 0xb4, 0xb7, 0x7a, 0xfe, 0xad
DEFINE_GUIDSTRUCT("6389D844-BB32-4C4C-A802-F4B4B77AFEAD", KSNOTIFICATIONID_SoundDetector);
#define KSNOTIFICATIONID_SoundDetector DEFINE_GUIDNAMED(KSNOTIFICATIONID_SoundDetector)

작업 시퀀스

시스템 시작

  1. OS는 이전 탐지기 상태를 지우는 KSPROPERTY_SOUNDDETECTOR_RESET 전송하여 모든 탐지기를 무장 해제로 다시 설정하고 이전 패턴 집합을 지웁니다.
  2. OS 쿼리는 KSPROPERTY_SOUNDDETECTOR_PATTERNS 이벤트 감지기 OEM 어댑터에 대한 clsid를 검색합니다.
  3. OS는 이벤트 감지기 oem 어댑터를 사용하여 지원되는 키워드(keyword) 및 언어 목록을 검색합니다.
  4. OS는 드라이버에서 보낸 사용자 지정 PNP 알림을 등록합니다.
  5. OS는 필요한 키워드(keyword) 패턴을 설정합니다.
  6. OS는 탐지기를 무기화합니다.

내부 드라이버 및 하드웨어 작업

탐지기가 무장되어 있는 동안 하드웨어는 작은 FIFO 버퍼에서 오디오 데이터를 지속적으로 캡처하고 버퍼링할 수 있습니다. (이 FIFO 버퍼의 크기는 이 문서 외부의 요구 사항에 따라 결정되지만 일반적으로 수백 밀리초에서 몇 초 정도가 될 수 있습니다.) 검색 알고리즘은 이 버퍼를 통해 스트리밍되는 데이터에서 작동합니다. 드라이버와 하드웨어의 디자인은 무장하는 동안 드라이버와 하드웨어 간의 상호 작용이 없고 키워드(keyword) 감지될 때까지 "애플리케이션" 프로세서를 중단하지 않습니다. 이렇게 하면 다른 활동이 없는 경우 시스템이 더 낮은 전원 상태에 도달할 수 있습니다.

하드웨어가 키워드(keyword) 감지하면 인터럽트를 생성합니다. 드라이버가 인터럽트 서비스를 기다리는 동안 하드웨어는 버퍼에 오디오를 계속 캡처하여 버퍼 제한 내에서 키워드(keyword) 손실된 후 데이터가 없도록 합니다.

키워드 타임스탬프

키워드(keyword) 감지한 후 모든 음성 활성화 솔루션은 키워드(keyword) 시작하기 전에 1.6s를 포함하여 모든 음성 키워드(keyword) 버퍼링해야 합니다. 오디오 드라이버는 스트림에서 핵심 구의 시작과 끝을 식별하는 타임스탬프를 제공해야 합니다.

키워드(keyword) 시작/끝 타임스탬프를 지원하기 위해 DSP 소프트웨어는 DSP 클록을 기반으로 이벤트를 내부적으로 타임스탬프해야 할 수 있습니다. 키워드(keyword) 감지되면 DSP 소프트웨어가 드라이버와 상호 작용하여 KS 이벤트를 준비합니다. 드라이버 및 DSP 소프트웨어는 DSP 타임스탬프를 Windows 성능 카운터 값에 매핑해야 합니다. 이 작업을 수행하는 방법은 하드웨어 디자인과 관련이 있습니다. 한 가지 가능한 해결 방법은 드라이버가 현재 성능 카운터를 읽고, 현재 DSP 타임스탬프를 쿼리하고, 현재 성능 카운터를 다시 읽은 다음, 성능 카운터와 DSP 시간 간의 상관 관계를 예측하는 것입니다. 그런 다음 상관 관계가 지정된 경우 드라이버는 키워드(keyword) DSP 타임스탬프를 Windows 성능 카운터 타임스탬프에 매핑할 수 있습니다.

IEvent Detector OEM 어댑터 인터페이스

OEM은 OS와 드라이버 간의 중개자 역할을 하는 COM 개체 구현을 제공하여 KSPROPERTY_SOUNDDETECTOR_PATTERNS 및 KSPROPERTY_SOUNDDETECTOR_MATCHRESULT 통해 오디오 드라이버에 기록되고 읽은 불투명한 데이터를 계산하거나 구문 분석하는 데 도움이 됩니다.

COM 개체의 CLSID는 KSPROPERTY_SOUNDDETECTOR_SUPPORTEDPATTERNS 반환된 감지기 패턴 형식 GUID입니다. OS는 패턴 형식 GUID를 전달하는 CoCreateInstance를 호출하여 키워드(keyword) 패턴 형식과 호환되는 적절한 COM 개체를 인스턴스화하고 개체의 IEventDetectorOemAdapter 인터페이스에서 메서드를 호출합니다.

COM 스레딩 모델 요구 사항

OEM의 구현은 COM 스레딩 모델 중 하나를 선택할 수 있습니다.

IEventDetectorOemAdapter

인터페이스 디자인은 개체 구현을 상태 비지정 상태로 유지하려고 시도합니다. 즉, 구현에서는 메서드 호출 사이에 상태를 저장하지 않아도 됩니다. 실제로 내부 C++ 클래스는 일반적으로 COM 개체를 구현하는 데 필요한 변수 이외의 멤버 변수가 필요하지 않을 수 있습니다.

메서드

다음 메서드를 구현합니다.

WAVERT 향상된 기능

미니포트 인터페이스는 WaveRT 미니포트 드라이버에서 구현하도록 정의됩니다. 이러한 인터페이스는 오디오 드라이버를 간소화하거나, OS 오디오 파이프라인 성능 및 안정성을 향상시키거나, 새로운 시나리오를 지원하는 방법을 제공합니다. PnP 디바이스 인터페이스 속성은 드라이버가 OS에 버퍼 크기 제약 조건의 정적 식을 제공할 수 있도록 정의됩니다.

버퍼 크기

드라이버는 OS, 드라이버 및 하드웨어 간에 오디오 데이터를 이동할 때 다양한 제약 조건에서 작동합니다. 이러한 제약 조건은 메모리와 하드웨어 간에 데이터를 이동하는 물리적 하드웨어 전송 및/또는 하드웨어 또는 관련 DSP 내의 신호 처리 모듈로 인해 발생할 수 있습니다.

HW-KWS 솔루션은 최소 100ms 및 최대 200ms의 오디오 캡처 크기를 지원해야 합니다.

드라이버는 KS 스트리밍 핀이 있는 KS 필터의 KSCATEGORY_AUDIO PnP 디바이스 인터페이스에서 DEVPKEY_KsAudio_PacketSize_Constraints2 디바이스 속성을 설정하여 버퍼 크기 제약 조건을 표현합니다. KS 필터 인터페이스를 사용하는 동안 이 속성은 기본 유효하고 안정적이어야 합니다. OS는 드라이버에 대한 핸들을 열고 드라이버를 호출하지 않고도 언제든지 이 값을 읽을 수 있습니다.

DEVPKEY_KsAudio_PacketSize_Constraints2

DEVPKEY_KsAudio_PacketSize_Constraints2 속성 값에는 물리적 하드웨어 제약 조건을 설명하는 KSAUDIO_PACKETSIZE_CONSTRAINTS2 구조가 포함되어 있습니다(즉, WaveRT 버퍼에서 오디오 하드웨어로 데이터를 전송하는 메커니즘으로 인해). 구조체에는 신호 처리 모드와 관련된 제약 조건을 설명하는 0개 이상의 KSAUDIO_PACKETSIZE_PROCESSINGMODE_CONSTRAINT 구조체 배열이 포함됩니다. 드라이버는 PcRegisterSubdevice를 호출하거나 스트리밍 핀에 대한 KS 필터 인터페이스를 사용하도록 설정하기 전에 이 속성을 설정합니다.

IMiniportWaveRTInputStream

드라이버는 드라이버에서 OS로 오디오 데이터 흐름을 더 잘 조정하기 위해 이 인터페이스를 구현합니다. 이 인터페이스를 캡처 스트림에서 사용할 수 있는 경우 OS는 이 인터페이스의 메서드를 사용하여 WaveRT 버퍼의 데이터에 액세스합니다. 자세한 내용은 IMiniportWaveRTInputStream::GetReadPacket을 참조 하세요.

IMiniportWaveRTOutputStream

WaveRT 미니포트는 필요에 따라 OS에서 쓰기 진행률을 확인하고 정확한 스트림 위치를 반환하도록 이 인터페이스를 구현합니다. 자세한 내용은 IMiniportWaveRTOutputStream::SetWritePacket, IMiniportWaveRTOutputStream::GetOutputStreamPresentationPositionIMiniportWaveRTOutputStream::GetPacketCount를 참조하세요.

성능 카운터 타임스탬프

몇 가지 드라이버 루틴은 디바이스에서 샘플을 캡처하거나 표시하는 시간을 반영하는 Windows 성능 카운터 타임스탬프를 반환합니다.

복잡한 DSP 파이프라인 및 신호 처리가 있는 디바이스에서는 정확한 타임스탬프를 계산하는 것이 어려울 수 있으며 신중하게 수행해야 합니다. 타임스탬프는 샘플이 OS에서 DSP로 전송된 시간을 단순히 반영해서는 안 됩니다.

  • DSP 내에서 일부 내부 DSP 벽 클록을 사용하여 샘플 타임스탬프를 추적합니다.
  • 드라이버와 DSP 간에 Windows 성능 카운터와 DSP 벽시계 간의 상관 관계를 계산합니다. 이에 대한 절차는 매우 간단하지만 정확하지는 않지만 매우 복잡하거나 소설(그러나 더 정확)까지 다양할 수 있습니다.
  • 신호 처리 알고리즘 또는 파이프라인 또는 하드웨어 전송으로 인한 일정한 지연을 고려합니다.

버스트 읽기 작업

이 섹션에서는 버스트 읽기에 대한 OS 및 드라이버 상호 작용에 대해 설명합니다. 버스트 읽기는 드라이버가 IMiniportWaveRTInputStream::GetReadPacket 함수를 포함하여 패킷 기반 스트리밍 WaveRT 모델을 지원하는 한 음성 활성화 시나리오 외부에서 발생할 수 있습니다.

두 가지 버스트 예제 읽기 시나리오에 대해 설명합니다. 한 시나리오에서 미니포트가 핀 범주가 KSNODETYPE_AUDIO_KEYWORDDETECTOR 핀을 지원하는 경우 드라이버는 키워드(keyword) 감지될 때 데이터를 캡처하고 내부적으로 버퍼링하기 시작합니다. 다른 시나리오에서는 OS가 IMiniportWaveRTInputStream::GetReadPacket을 호출하여 데이터를 충분히 빠르게 읽지 못하는 경우 드라이버가 선택적으로 WaveRT 버퍼 외부의 데이터를 내부적으로 버퍼링할 수 있습니다.

KSSTATE_RUN 전환하기 전에 캡처된 데이터를 버스트하려면 드라이버는 버퍼링된 캡처 데이터와 함께 정확한 샘플 타임스탬프 정보를 유지해야 합니다. 타임스탬프는 캡처된 샘플의 샘플링 인스턴트를 식별합니다.

  1. 스트림이 KSSTATE_RUN 전환된 후 드라이버는 이미 사용 가능한 데이터가 있으므로 버퍼 알림 이벤트를 즉시 설정합니다.

  2. 이 이벤트에서 OS는 GetReadPacket()을 호출하여 사용 가능한 데이터에 대한 정보를 가져옵니다.

    a. 드라이버는 유효한 캡처된 데이터의 패킷 번호(KSSTATE_STOP에서 KSSTATE_RUN로 전환한 후 첫 번째 패킷의 경우 0)를 반환하며, 여기서 OS는 스트림 시작에 상대적인 패킷 위치뿐만 아니라 WaveRT 버퍼 내에서 패킷 위치를 파생시킬 수 있습니다.

    b. 또한 드라이버는 패킷에서 첫 번째 샘플의 샘플링 인스턴스에 해당하는 성능 카운터 값을 반환합니다. 이 성능 카운터 값은 하드웨어 또는 드라이버(WaveRT 버퍼 외부) 내에서 버퍼링된 캡처 데이터의 양에 따라 비교적 오래되었을 수 있습니다.

    c. 읽지 않은 버퍼링된 데이터가 더 있는 경우 드라이버도 사용할 수 있습니다. i. 해당 데이터를 WaveRT 버퍼의 사용 가능한 공간(즉, GetReadPacket에서 반환된 패킷에서 사용하지 않는 공간)으로 즉시 전송하고, MoreData에 대해 true를 반환하고, 이 루틴에서 반환하기 전에 버퍼 알림 이벤트를 설정합니다. 또는, ii. 다음 패킷을 WaveRT 버퍼의 사용 가능한 공간으로 버스트하도록 하드웨어를 프로그래밍하고, MoreData에 대해 false를 반환하고, 나중에 전송이 완료되면 버퍼 이벤트를 설정합니다.

  3. OS는 GetReadPacket()에서 반환된 정보를 사용하여 WaveRT 버퍼에서 데이터를 읽습니다.

  4. OS는 다음 버퍼 알림 이벤트를 기다립니다. 드라이버가 단계(2c)에서 버퍼 알림을 설정하는 경우 대기가 즉시 종료될 수 있습니다.

  5. 드라이버가 2c단계에서 이벤트를 즉시 설정하지 않은 경우 드라이버는 더 많은 캡처된 데이터를 WaveRT 버퍼로 전송한 후 이벤트를 설정하고 OS에서 읽을 수 있도록 합니다.

  6. (2)로 이동합니다.

KSNODETYPE_AUDIO_KEYWORDDETECTOR 키워드(keyword) 감지기 핀의 경우 드라이버는 최소 5,000ms의 오디오 데이터에 충분한 내부 버스트 버퍼링을 할당해야 합니다. OS가 버퍼 오버플로 전에 핀에 스트림을 만들지 못하면 드라이버는 내부 버퍼링 작업을 종료하고 연결된 리소스를 해제할 수 있습니다.

Wake on Voice

WoV(Wake-on-Voice)를 사용하면 사용자가 "Hey Contoso"와 같은 특정 키워드(keyword) 말함으로써 저전력 상태에서 전체 전원 상태로 음성 인식 엔진을 활성화하고 쿼리할 수 있습니다.

이 기능을 사용하면 디바이스가 유휴 상태이고 화면이 꺼져 있는 동안 디바이스가 항상 사용자의 음성을 수신 대기할 수 있습니다. 이는 일반 마이크 녹음에 비해 훨씬 적은 전원을 사용하는 수신 모드 때문입니다. WoV를 사용하면 "Hey Contoso, when's my next appointment"와 같은 연결된 음성 구가 음성 도우미 핸즈프리 방식으로 응답을 호출할 수 있습니다.

오디오 스택은 절전 모드 해제 데이터(화자 ID, 키워드(keyword) 트리거, 신뢰도 수준의 컨텍스트 정보)를 전달하고 관심 있는 클라이언트에게 키워드(keyword) 감지되었음을 알리는 역할을 합니다.

최신 대기 시스템에 대한 유효성 검사

시스템 유휴 상태의 WoV는 AC 전원의 최신 대기 절전 모드 해제 온 음성 기본 테스트와 HLK의 DC 전원 원본 에 대한 최신 대기 절전 모드 해제 온 음성 기본 테스트를 사용하여 최신 대기 시스템에서 유효성을 검사할 수 있습니다. 이러한 테스트는 시스템에 하드웨어 키워드(keyword) 스포터(HW-KWS)가 있고 DRIPS(Deepest Runtime 유휴 플랫폼 상태)에 진입할 수 있으며 시스템 다시 시작 대기 시간이 1초 미만 또는 같음인 음성 명령에서 최신 대기 상태에서 절전 모드 해제할 수 있음을 검사.

ACX 및 MVA

ACX(오디오 클래스 eXtension)는 오디오 작업에 대한 WDF(Windows 드라이버 프레임워크) 클래스 확장을 정의합니다기본. ACX에 대한 자세한 내용은 ACX 오디오 클래스 확장 개요ACX 개체 요약을 참조하세요. 이 섹션에서는 ACX를 사용하여 MVA를 구현하는 방법을 설명합니다.

ACX는 키워드(keyword) 스포터에 동일한 KS 인프라를 사용하여 드라이버 구현을 간소화하는 추상화 계층을 추가합니다. ACX를 사용하면 위에서 설명한 대로 동일한 OEM DLL이 사용되고 변경되지 기본. ACX와 Portcls 모두 IEventDetectorOEMAdapter 인터페이스가 필요하며 OEM 어댑터에 대한 두 인터페이스 간에는 구현에 차이가 없습니다.

AcxKeywordSpotterCreate 함수는 회로 디바이스 개체 부모에 연결할 ACX 키워드(keyword) 스포터 불투명 개체(ACXKEYWORDSPOTTER)를 만드는 데 사용됩니다.

ACXKEYWORDSPOTTER 개체는 모든 KSPROPERTY_SOUNDDETECTOR 호출을 대체하여 KWS 구현을 간소화하는 데 사용됩니다. 이는 ACX 회로에 KWS 요소 및 KWS 핀을 추가하는 과정에서 사용됩니다. 관련 콜백은 패턴, 무장, 무장 해제 및 재설정을 처리합니다. 키워드(keyword) 스포터의 구성을 설명하는 초기화된 ACX_KEYWORDSPOTTER_CONFIG 구조를 사용합니다.

ACX_KEYWORDSPOTTER_CONFIG 구조체는 다음 콜백을 정의하는 ACX_KEYWORDSPOTTER_CALLBACKS 구조를 사용합니다.

EvtAcxKeywordSpotterRetrieveArm - ACX_KEYWORDSPOTTER_RETRIEVE_ARM 콜백입니다.

EvtAcxKeywordSpotterAssignArm - ACX_KEYWORDSPOTTER_ASSIGN_ARM 콜백입니다.

EvtAcxKeywordSpotterAssignPatterns - ACX_KEYWORDSPOTTER_ASSIGN_PATTERNS 콜백입니다.

EvtAcxKeywordSpotterAssignReset - ACX_KEYWORDSPOTTER_ASSIGN_RESET 콜백입니다.

ACX PNP 이벤트

ACX PNP 이벤트는 KSNOTIFICATIONID_SoundDetector 대체하여 검색 알림 이벤트를 간소화합니다. ACX_PNPEVENT_CONFIG_INIT 함수는 ACX_PNPEVENT_CONFIG 구조를 초기화합니다. 이 함수에는 입력이 사용되지 않습니다.

ACX KWS 샘플 코드

ACX KWS 샘플 코드는 콜백의 초기화, 키워드(keyword) 요소 및 키워드(keyword) 스포터 만들기를 보여 줍니다.

{
    NTSTATUS                        status;
    WDF_OBJECT_ATTRIBUTES           attributes;
    ACX_KEYWORDSPOTTER_CALLBACKS    keywordSpotterCallbacks;
    ACX_KEYWORDSPOTTER_CONFIG       keywordSpotterCfg;
    PCODEC_KEYWORDSPOTTER_CONTEXT   keywordSpotterCtx;
    ACX_PNPEVENT_CONFIG             keywordEventCfg;
    ACXPNPEVENT                     keywordEvent;

    PAGED_CODE();

    ACX_KEYWORDSPOTTER_CALLBACKS_INIT(&keywordSpotterCallbacks);
    keywordSpotterCallbacks.EvtAcxKeywordSpotterRetrieveArm = CodecC_EvtAcxKeywordSpotterRetrieveArm;
    keywordSpotterCallbacks.EvtAcxKeywordSpotterAssignArm = CodecC_EvtAcxKeywordSpotterAssignArm;
    keywordSpotterCallbacks.EvtAcxKeywordSpotterAssignPatterns = CodecC_EvtAcxKeywordSpotterAssignPatterns;
    keywordSpotterCallbacks.EvtAcxKeywordSpotterAssignReset = CodecC_EvtAcxKeywordSpotterAssignReset;
    
    ACX_KEYWORDSPOTTER_CONFIG_INIT(&keywordSpotterCfg);
    keywordSpotterCfg.Pattern = &CONTOSO_KEYWORDCONFIGURATION_IDENTIFIER2;
    keywordSpotterCfg.Callbacks = &keywordSpotterCallbacks;
    
    WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attributes, CODEC_KEYWORDSPOTTER_CONTEXT);
    attributes.ParentObject = Circuit;

다음으로 AcxKeywordSpotterCreate 함수를 사용하여 ACX 키워드(keyword) 스포터 개체를 만들고 기존 회로와 연결합니다.

    status = AcxKeywordSpotterCreate(Circuit, &attributes, &keywordSpotterCfg, Element);
    if (!NT_SUCCESS(status))
    {
        ASSERT(FALSE);
        goto exit;
    }

그런 다음 키워드(keyword) 스포터 컨텍스트가 결정되고 NonPagedPoolNx 메모리에서 KeywordDetector를 만드는 데 사용됩니다.

    
    keywordSpotterCtx = GetCodecKeywordSpotterContext(*Element);
    ASSERT(keywordSpotterCtx);
    
    keywordSpotterCtx->KeywordDetector = (PVOID) new(NonPagedPoolNx, DRIVER_TAG) CKeywordDetector();
    if (keywordSpotterCtx->KeywordDetector == NULL)
    {
        status = STATUS_INSUFFICIENT_RESOURCES;
        ASSERT(FALSE);
        goto exit;
    }

이 샘플 코드에서 컨텍스트에 추가된 CKeywordDetector 클래스는 샘플 드라이버 내에서 키워드(keyword) 스포팅을 시뮬레이트하는 예제 구현으로만 제공됩니다. CKeywordDetector 클래스는 ACX 프레임워크 또는 ACX에서 MVA 구현의 필수 부분이 아니지만 실제 키워드(keyword) 스포터 개발을 위한 좋은 시작점을 제공할 수 있습니다.

마지막으로 ACX PnP 이벤트가 구성되고 생성됩니다.

   
    ACX_PNPEVENT_CONFIG_INIT(&keywordEventCfg);
    
    WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attributes, CODEC_PNPEVENT_CONTEXT);
    attributes.ParentObject = *Element;
    status = AcxPnpEventCreate(Device, *Element, &attributes, &keywordEventCfg, &keywordEvent);
    if (!NT_SUCCESS(status))
    {
        ASSERT(FALSE);
        goto exit;
    }

    keywordSpotterCtx->Event = keywordEvent;

    //
    // Done. 
    //
    status = STATUS_SUCCESS;

}

KWS를 비롯한 복잡한 핀 동작이 있는 회로

호스트 엔진 및/또는 KWS가 있는 회로와 같은 복잡한 핀 동작이 있는 회로의 경우 드라이버는 ACX를 사용하지 않도록 설정하여 스트림 브리지 처리를 수행하지 않도록 설정하고 대신 inmode 없이 스트림 브리지를 만들어야 합니다. 이 방법을 사용하면 ACX가 스트림을 스트림 브리지에 자동으로 연결하지 못하게 됩니다.

참고 항목

음성 활성화