Несколько голосовых помощников
Платформа Нескольких голосовых помощников обеспечивает поддержку дополнительных помощник голосовых помощник в Windows. Это позволяет другим помощник быть доступны на устройствах Windows, таких как пк и носимые устройства, такие как HoloLens. Несколько голосовых помощник могут быть активными на одном устройстве с помощью набора поддерживаемых шаблонов ключевое слово.
Примечание.
Несколько голосовых помощников поддерживаются начиная с Windows 10 версии 1903.
Сведения о реализации Windows Кортана см. в разделе "Активация голосовой связи".
Голосовая активация
Активация голосовой связи — это функция, которая позволяет пользователям вызывать подсистему распознавания речи из различных состояний питания устройства, говоря определенную фразу.
Реализация голосовой активации является значительным проектом и является задачей, выполненной поставщиками SoC. Изготовители оборудования могут обратиться к поставщику SoC для получения сведений о реализации активации голосовой связи SoC.
Активация голосовой связи позволяет пользователям быстро взаимодействовать с голосовой помощник за пределами активного контекста (т. е. то, что сейчас на экране) с помощью голоса. Пользователи часто хотят мгновенно получить доступ к интерфейсу без физического взаимодействия с устройством или касания устройства. Для пользователя Xbox это может быть не требуется найти и подключить контроллер. Пользователям пк может потребоваться быстрый доступ к интерфейсу без необходимости выполнять несколько действий мыши, касания и /или клавиатуры, как в случае компьютера на кухне.
Активация голоса активируется ключевое слово точечным методом (KWS), который реагирует, если обнаружена ключевая фраза. Ключевые фразы могут включать ключевые слова, такие как "Hey Contoso". Обнаружение ключевых слов описывает обнаружение ключевое слово по оборудованию или программному обеспечению.
Ключевые фразы могут быть написаны сами по себе ("Hey Contoso") в качестве поэтапной команды или следуют речевые действия, составляющие команду с цепочкой ("Hey Contoso, где находится мое следующее собрание?")
Корпорация Майкрософт предоставляет средство обнаружения ключевое слово ОС по умолчанию (программное ключевое слово точечный элемент) для предоставления голосовых помощник возможностей в случаях, когда обнаружение аппаратного ключевое слово недоступно. Хотя это доступно для Кортана, для подключения других помощник голосовых помощник может потребоваться дополнительная конфигурация Майкрософт для двухэтапного обнаружения ключевое слово. Для получения дополнительных сведений.AskMVA@Microsoft.com
Если KWS требует пробуждения устройства от низкой мощности, решение называется пробуждением по голосовой связи (WoV). Дополнительные сведения см. в статье "Пробуждение по голосовой связи " далее в этой статье.
Глоссарий терминов
В этом глоссарии приведены термины, связанные с активацией голосовой связи.
Термин | Пример/определение |
---|---|
Этапная команда | Пример: Хей Contoso <приостанавливает, дождитесь помощник пользовательского интерфейса> Что такое погода? Иногда это называется "двухфакторной командой" или "только ключевое слово". |
Команда с цепочкой | Пример: Эй Contoso, что такое погода? Иногда это называется "одностреловой командой". |
Голосовая активация | Пример: "Hey Contoso" Сценарий, в котором ключевое слово обнаруживается в предопределенной ключевой фразе активации. |
Пробуждение по голосовой связи (WoV) | Технология, которая позволяет активировать голосовую активацию с экрана, отключать, снизить состояние питания на экран в полном состоянии питания. |
WoV из современного резервного режима | Пробуждение на голосовой связи с экрана с современного режима ожидания (S0ix) на экран с полным состоянием питания (S0). |
современный ждущий режим. | Инфраструктура простоя Windows Low Power — преемник Подключение резервного копирования (CS) в Windows 10. Первое состояние современного резервного режима — при отключении экрана. Самое глубокое состояние сна — когда в DRIPS/устойчивость. Дополнительные сведения см. в статье "Современный резервный режим". |
KWS | Точечный элемент ключевого слова — алгоритм, обеспечивающий обнаружение "Hey Contoso". |
SW KWS | Программное обеспечение ключевое слово пятно — реализация KWS, которая выполняется на узле (ЦП). Для "Hey Кортана", SW KWS входит в состав Windows. |
HW KWS | Аппаратное ключевое слово точечный объект — реализация KWS, которая выполняется вне нагрузки на оборудование. |
Буфер с ускорением | Циклический буфер, используемый для хранения данных PCM, которые могут вспыхнуть в случае обнаружения KWS, чтобы все звуки, активировающие обнаружение KWS, включались. |
Адаптер OEM для детектора событий | Компонент пользовательского режима, который выступает в качестве посредника между голосовым помощник стеком и драйвером Windows. |
Модель | Файл данных акустической модели, используемый алгоритмом KWS. Файл данных является статическим. Модели локализованы по одному на языковой стандарт. |
MVA | Несколько голосовых агентов — DDI HWKWS, поддерживающий несколько агентов. |
SVA | Единый голосовой агент — предыдущий DDI HWKWS, который поддерживает только один агент (Кортана). |
Интеграция точечных элементов аппаратного ключевого слова
Чтобы реализовать аппаратный ключевое слово точечный модуль (HW KWS), поставщики SoC должны выполнить следующие задачи.
- Создайте пользовательский детектор ключевое слово на основе примера SYSVAD, описанного далее в этом разделе. Эти методы будут реализованы в com-библиотеке DLL, описанной в интерфейсе адаптера OEM детектора IEvent.
- Реализуйте усовершенствования WAVE RT, описанные в разделе "Усовершенствования WAVERT".
- Предоставьте записи INF-файла для описания любых пользовательских API, используемых для обнаружения ключевое слово.
- PKEY_FX_KeywordDetector_StreamEffectClsid
- PKEY_FX_KeywordDetector_ModeEffectClsid
- PKEY_FX_KeywordDetector_EndpointEffectClsid
- PKEY_SFX_KeywordDetector_ProcessingModes_Supported_For_Streaming
- PKEY_MFX_KeywordDetector_ProcessingModes_Supported_For_Streaming
- PKEY_EFX_KeywordDetector_ProcessingModes_Supported_For_Streaming
- Ознакомьтесь с рекомендациями по оборудованию и тестом в рекомендации по аудиоустройствам. В этом разделе приведены рекомендации и рекомендации по проектированию и разработке устройств ввода звука, предназначенных для использования с платформой распознавания речи Майкрософт.
- Поддержка этапных и цепочек команд.
- Соответствие требованиям языкового стандарта для голосовых помощник
- API -интерфейсы (объекты обработки звука) должны обеспечить следующие эффекты:
- AD
- AGC
- NS
- Эффекты для режима обработки речи должны быть сообщены MFX APO.
- APO может выполнять преобразование формата в виде MFX.
- APO должен выводить следующий формат:
- 16 кГц, mono, FLOAT.
- При необходимости создайте любые пользовательские API для улучшения процесса записи звука. Дополнительные сведения см. в разделе "Объекты обработки звука Windows".
Требования К woV с аппаратной разгрузкой ключевое слово (HW KWS) WoV
- HW KWS WoV поддерживается во время рабочего состояния S0 и состояния сна S0, также известного как современный резервный.
- HW KWS WoV не поддерживается из S3.
AD
AEC может выполняться службой DSP во время записи звука с ускорением или его можно сделать позже с помощью программного обеспечения APO. Для выполнения программного обеспечения AEC с данными с ускорением KWS необходимо иметь соответствующий звук обратной передачи с момента записи данных о всплеске. Для этого был создан пользовательский формат звука для выходных данных с всплеском, который пересекает звук обратной передачи в поток звуковых данных.
Начиная с Windows версии 20H1, APO Microsoft AEC знает об этом чередованном формате и может использовать его для выполнения AEC. Дополнительные сведения см. в KSPROPERTY_INTERLEAVEDAUDIO_FORMATINFORMATION.
Проверка
Проверьте поддержку HW для свойств KSPROPSETID_SoundDetector2 с помощью тестов Диспетчера активации голосовой связи 2.
Обзор примера кода
Существует пример кода для звукового драйвера, реализующего активацию голосовой связи на GitHub в рамках примера виртуального звукового адаптера SYSVAD. Рекомендуется использовать этот код в качестве отправной точки.
Дополнительные сведения о примере звукового драйвера SYSVAD см. в разделе "Примеры звуковых драйверов".
Распознавание ключевых слов Сведения о системе
Поддержка звукового стека голосовой активации
Внешние интерфейсы стека звука для включения активации голосовой связи служат конвейером связи для платформы речи и звуковых драйверов. Внешние интерфейсы делятся на три части.
- Интерфейс драйвера устройства детектора событий (DDI). Интерфейс драйвера устройства детектора событий отвечает за настройку и вооружение точечных слов HW (KWS). Он также используется драйвером для уведомления системы события обнаружения.
- БИБЛИОТЕКА DLL адаптера OEM-адаптера детектора IEvent. Эта библиотека DLL реализует COM-интерфейс для адаптации конкретных непрозрачных данных драйвера для использования ОС для ключевое слово обнаружения.
- Усовершенствования WaveRT. Улучшения позволяют звуковому драйверу вспыхивать поток буферизованного аудиоданных из обнаружения ключевое слово.
Свойства конечной точки аудио
Построение графа аудиоконечной точки обычно происходит. Граф готов обрабатывать быстрее, чем запись в режиме реального времени. Метки времени для захваченных буферов остаются верными. В частности, метки времени будут правильно отражать данные, которые были записаны в прошлом и буферизованном, и теперь рвутся.
Теория обхода аудиопотока Bluetooth
Драйвер предоставляет фильтр KS для устройства записи как обычно. Этот фильтр поддерживает несколько свойств KS и событие KS для настройки, включения и сигнала события обнаружения. Фильтр также включает дополнительную фабрику закреплений, определяемую как ключевое слово запятой (KWS). Этот пин-код используется для потоковой передачи звука из ключевое слово точечный элемент.
Свойство: KSPROPSETID_SoundDetector2
Все свойства KSPROPSETID_SoundDetector2 вызываются со структурой данных KSSOUNDDETECTORPROPERTY. Эта структура данных содержит идентификатор события KSPROPERTY и идентификатор события для ключевое слово, которые должны быть вооружены, сбрасываются, обнаруживаются и т. д.
- Поддерживаемые типы ключевое слово — KSPROPERTY_SOUNDDETECTOR_PATTERNS. Это свойство устанавливается операционной системой для настройки обнаруженных ключевое слово.
- Список графических идентификаторов ключевое слово шаблонов — KSPROPERTY_SOUNDDETECTOR_SUPPORTEDPATTERNS. Это свойство используется для получения списка идентификаторов GUID, определяющих типы поддерживаемых шаблонов.
- Вооруженные - KSPROPERTY_SOUNDDETECTOR_ARMED. Это свойство чтения и записи — это просто логическое состояние, указывающее, вооружен ли детектор. ОС задает это для привлечения детектора ключевое слово. ОС может очистить это, чтобы отключиться. Драйвер автоматически очищает это при установке шаблонов ключевое слово, а также после обнаружения ключевое слово. (ОС должна перезапуститься.)
- Результат сопоставления — KSPROPERTY_SOUNDDETECTOR_RESET используется для сброса детектора звука во время запуска.
Во время обнаружения ключевое слово отправляется уведомление PNP, содержащее KSNOTIFICATIONID_SoundDetector. ПРИМЕЧАНИЕ. Это не KSEvent, а событие PNP, которое отправляется с полезными данными через IoReportTargetDeviceChangeAsynchronous.
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)
Последовательность операций
Запуск системы
- ОС отправляет KSPROPERTY_SOUNDDETECTOR_RESET для очистки любого предыдущего состояния детектора, сбросив все детекторы для обезоружения и очистки предыдущих шаблонов.
- ОС запрашивает KSPROPERTY_SOUNDDETECTOR_PATTERNS , чтобы получить clsid для адаптера OEM детектора событий.
- Ос использует адаптер изготовителя детектора событий для получения списка поддерживаемых ключевое слово и языков.
- ОС регистрирует пользовательские уведомления PNP, отправленные драйвером
- ОС задает необходимые ключевое слово шаблоны.
- ОС вооружит детекторы
Внутренняя операция драйвера и оборудования
В то время как детектор вооружен, оборудование может быть непрерывно захватывает и буферизирует звуковые данные в небольшом буфере FIFO. (Размер этого буфера FIFO определяется требованиями за пределами этого документа, но обычно может составлять сотни миллисекунд до нескольких секунд.) Алгоритм обнаружения работает с потоковой передачей данных через этот буфер. Проектирование драйвера и оборудования заключается в том, что во время вооруженных действий между драйвером и оборудованием нет прерываний процессоров "приложения", пока не будет обнаружена ключевое слово. Это позволяет системе достичь более низкого состояния питания, если нет других действий.
Когда оборудование обнаруживает ключевое слово, оно создает прерывание. Ожидая, пока драйвер будет обслуживать прерывание, оборудование продолжает записывать звук в буфер, обеспечивая отсутствие данных после потери ключевое слово в пределах буферизации.
Метки времени ключевых слов
После обнаружения ключевое слово все решения для активации голосовой связи должны буферивировать все речевой ключевое слово, включая 1,6s до начала ключевое слово. Звуковой драйвер должен предоставить метки времени, определяющие начало и конец ключевой фразы в потоке.
Для поддержки меток времени начала и окончания ключевое слово программное обеспечение DSP может потребоваться внутренней метки времени на основе часов DSP. После обнаружения ключевое слово программное обеспечение DSP взаимодействует с драйвером для подготовки события KS. Драйвер и программное обеспечение DSP должны сопоставить метки времени DSP со значением счетчика производительности Windows. Этот метод предназначен для проектирования оборудования. Одним из возможных решений является чтение текущего счетчика производительности, запрос текущей метки времени DSP, повторное чтение текущего счетчика производительности, а затем оценка корреляции между счетчиком производительности и временем DSP. Затем с учетом корреляции драйвер может сопоставить метки времени ключевое слово DSP с метками времени счетчика производительности Windows.
Интерфейс адаптера OEM для детектора IEvent
OEM предоставляет реализацию COM-объекта, которая выступает в качестве посредника между ОС и драйвером, помогая вычислить или проанализировать непрозрачные данные, записанные и считываемые в звуковой драйвер через KSPROPERTY_SOUNDDETECTOR_PATTERNS и KSPROPERTY_SOUNDDETECTOR_MATCHRESULT.
CLSID объекта COM — это идентификатор GUID шаблона детектора, возвращаемый KSPROPERTY_SOUNDDETECTOR_SUPPORTEDPATTERNS. ОС вызывает CoCreateInstance, передав guid типа шаблона, чтобы создать экземпляр соответствующего COM-объекта, совместимого с типом шаблона ключевое слово и вызывает методы в интерфейсе IEventDetectorOemAdapter объекта.
Требования к модели потоков COM
Реализация OEM может выбрать любую из моделей потоков COM.
IEventDetectorOemAdapter
Структура интерфейса пытается сохранить без отслеживания состояния реализации объекта. Другими словами, реализация не должна хранить состояние между вызовами методов. На самом деле, внутренние классы C++, скорее всего, не нуждаются ни в каких переменных-членах, кроме тех, которые требуются для реализации COM-объекта в целом.
Методы
Реализуйте следующие методы.
- IEventDetectorOemAdapter::BuildArmingPatternData
- IEventDetectorOemAdapter::ComputeAndAddUserModelData
- IEventDetectorOemAdapter::GetCapabilities
- IEventDetectorOemAdapter::GetCapabilitiesForLanguage
- IEventDetectorOemAdapter::P arseDetectionResultData
- IEventDetectorOemAdapter::ReportOSDetectionResult
- IEventDetectorOemAdapter::VerifyUserEventData
Усовершенствования WAVERT
Минипортные интерфейсы определены для реализации драйверами минипорта WaveRT. Эти интерфейсы предоставляют методы для упрощения звукового драйвера, повышения производительности и надежности звукового конвейера ОС или поддержки новых сценариев. Свойство интерфейса устройства PnP определяется, что позволяет драйверу предоставлять статические выражения ограничений размера буфера операционной системе.
Размеры буфера
Драйвер работает под различными ограничениями при перемещении звуковых данных между ОС, драйвером и оборудованием. Эти ограничения могут быть вызваны физическим аппаратным транспортом, который перемещает данные между памятью и оборудованием, а также (или) из-за модулей обработки сигналов в аппаратном или связанном DSP.
Решения HW-KWS должны поддерживать по крайней мере 100 мс и до 200 мс.
Драйвер выражает ограничения размера буфера, задав свойство устройства DEVPKEY_KsAudio_PacketSize_Constraints2 в интерфейсе устройства KSCATEGORY_AUDIO PnP фильтра KS с пин-кодами потоковой передачи KS. Это свойство должно оставаться допустимым и стабильным во время включения интерфейса фильтра KS. ОС может читать это значение в любое время, не открывая дескриптор драйверу и вызывая драйвер.
DEVPKEY_KsAudio_PacketSize_Constraints2
Значение свойства DEVPKEY_KsAudio_PacketSize_Constraints2 содержит структуру KSAUDIO_PACKETSIZE_CONSTRAINTS2 , описывающую ограничения физического оборудования (т. е. из-за механики передачи данных из буфера WaveRT в звуковое оборудование). Структура включает массив из 0 или более KSAUDIO_PACKETSIZE_PROCESSINGMODE_CONSTRAINT структур, описывающих ограничения, относящиеся к любым режимам обработки сигналов. Драйвер задает это свойство перед вызовом PcRegisterSubdevice или в противном случае включает интерфейс фильтра KS для своих пин-кодов потоковой передачи.
IMiniportWaveRTInputStream
Драйвер реализует этот интерфейс для улучшения координации потоков аудиоданных от драйвера к ОС. Если этот интерфейс доступен в потоке записи, ОС использует методы этого интерфейса для доступа к данным в буфере WaveRT. Дополнительные сведения см. в разделе IMiniportWaveRTInputStream::GetReadPacket
IMiniportWaveRTOutputStream
Минипорт WaveRT при необходимости реализует этот интерфейс, чтобы рекомендовать ход записи из ОС и возвращать точное положение потока. Дополнительные сведения см. в разделе IMiniportWaveRTOutputStream::SetWritePacket, IMiniportWaveRTOutputStreamStream::GetOutputStreamPresentationPosition и IMiniportWaveRTOutputStream::GetPacketCount.
Метки времени счетчика производительности
Некоторые подпрограммы драйверов возвращают метки времени счетчика производительности Windows, отражающие время захвата или представления примеров устройством.
На устройствах, имеющих сложные конвейеры DSP и обработку сигналов, вычисление точной метки времени может быть сложной задачей и должно выполняться тщательно. Метки времени не должны просто отражать время, в течение которого образцы были переданы в ОС или из ос в DSP.
- В рамках DSP отслеживайте примеры меток времени с помощью некоторых внутренних часов стенных часов DSP.
- Между драйвером и DSP вычислите корреляцию между счетчиком производительности Windows и часов DSP. Процедуры для этого могут отличаться от очень простых (но менее точных) до довольно сложных или новых (но более точных).
- Фактор любых постоянных задержек из-за алгоритмов обработки сигналов или конвейера или аппаратного транспорта, если эти задержки не учитываются в противном случае.
Операция с ускорением чтения
В этом разделе описывается взаимодействие ОС и драйвера для операций чтения с ускорением. Ускорение чтения может произойти вне сценария активации голоса, пока драйвер поддерживает модель потоковой передачи На основе пакетов WaveRT, включая функцию IMiniportWaveRTInputStream::GetReadPacket.
Рассматриваются два сценария чтения с ускорением. В одном сценарии, если минипорт поддерживает закрепление с категорией закреплений KSNODETYPE_AUDIO_KEYWORDDETECTOR, драйвер начнет записывать и внутренне буферизируя данные при обнаружении ключевое слово. В другом сценарии драйвер может дополнительно буферизовывать данные за пределами буфера WaveRT, если ос не считывает данные достаточно быстро, вызвав IMiniportWaveRTInputStream::GetReadPacket.
Для ускорения данных, которые были записаны до перехода на KSSTATE_RUN, драйвер должен хранить точные данные метки времени вместе с буферизованной записью данных. Метки времени определяют моментальный экземпляр захваченных выборок.
После перехода потока на KSSTATE_RUN драйвер немедленно задает событие уведомления буфера, так как у него уже есть данные.
В этом событии ОС вызывает GetReadPacket(), чтобы получить сведения о доступных данных.
a. Драйвер возвращает номер пакета допустимых захваченных данных (0 для первого пакета после перехода с KSSTATE_STOP на KSSTATE_RUN), от которого ОС может наследовать позицию пакета в буфере WaveRT, а также положение пакета относительно начала потока.
b. Драйвер также возвращает значение счетчика производительности, соответствующее моменту выборки первого примера в пакете. Обратите внимание, что это значение счетчика производительности может быть относительно старым, в зависимости от того, сколько данных записи было буферировано в аппаратном или драйвере (за пределами буфера WaveRT).
c. Если есть более непрочитанные буферизованные данные, доступные драйверу: i. Немедленно передает эти данные в доступное пространство буфера WaveRT (т. е. пространство, не используемое пакетом, возвращаемым из GetReadPacket), возвращает значение true для MoreData и задает событие уведомления буфера перед возвратом из этой процедуры. Или, ii. Оборудование программ для ускорения следующего пакета в доступное пространство буфера WaveRT, возвращает значение false для MoreData, а затем задает событие буфера после завершения передачи.
ОС считывает данные из буфера WaveRT с помощью сведений, возвращаемых GetReadPacket().
ОС ожидает следующего события уведомления буфера. Ожидание может завершиться немедленно, если драйвер устанавливает уведомление буфера на шаге (2c).
Если драйвер не сразу задал событие на шаге (2c), драйвер устанавливает событие после передачи более захваченных данных в буфер WaveRT и делает его доступным для чтения ОС.
Перейдите (2).
Для KSNODETYPE_AUDIO_KEYWORDDETECTOR ключевое слово закреплений детектора драйверы должны выделить достаточно внутреннего буферизации всплеска для по крайней мере 5000 мс звуковых данных. Если ОС не удается создать поток на закреплении перед переполнением буфера, драйвер может завершить внутреннее буферизацию и освободить связанные ресурсы.
Пробуждение по голосовой связи
Пробуждение на голосовой связи (WoV) позволяет пользователю активировать и запрашивать подсистему распознавания речи с низкой мощностью до полного состояния питания с экраном, сказав определенный ключевое слово, например "Hey Contoso".
Эта функция позволяет устройству всегда прослушивать голос пользователя, пока устройство неактивно и экран отключен. Это связано с режимом прослушивания, который использует гораздо меньше энергии по сравнению с обычной записью микрофона. WoV позволяет выполнять цепочку речевых фраз, таких как "Hey Contoso, когда моя следующая встреча", чтобы вызвать ответ от голосового помощник в практических руках.
Стек звука отвечает за обмен данными о пробуждении (идентификатор динамиков, триггер ключевое слово, сведения о контексте на уровне достоверности), а также уведомлять заинтересованных клиентов об обнаружении ключевое слово.
Проверка в современных резервных системах
WoV из состояния простоя системы можно проверить на современных резервных системах с помощью современного резервного пробуждения на голосовом базовом тесте на источнике питания AC и современном резервном пробуждении на голосовом базовом тесте на источнике питания dc-power в HLK. Эти тесты проверка, что система имеет аппаратное ключевое слово точечный модуль (HW-KWS), может войти в состояние глубокой среды выполнения idle Platform (DRIPS) и может проснуться от современной резервной команды на голосовой команде с задержкой возобновления системы меньше или равно одной секунде.
ACX и MVA
Класс аудио eXtension (ACX) определяет расширение класса Windows Driver Framework (WDF) для звукового домена. Дополнительные сведения о расширениях аудиоклассов ACX см. в обзоре и сводке объектов ACX. В этом разделе описывается, как реализовать MVA с помощью ACX.
ACX использует ту же инфраструктуру KS для обнаружения ключевое слово, добавив слой абстракции для упрощения реализации драйвера. С acX тот же DLL OEM используется, как описано выше, и остается неизменным. Для acX и Portcls требуется интерфейс IEventDetectorOEMAdapter, и между ними нет разницы в реализации для адаптера OEM.
Функция AcxKeywordSpotterCreate используется для создания непрозрачного объекта acX ключевое слово точечных объектов (ACXKEYWORDSPOTTER), который будет связан с родительским объектом устройства канала.
Объект ACXKEYWORDSPOTTER используется для замены всех вызовов KSPROPERTY_SOUNDDETECTOR, упрощая реализацию KWS. Он используется в процессе добавления элемента KWS и закрепления KWS в канал ACX. Связанные обратные вызовы заботятся о получении шаблонов, вооружений, обезоружения и сброса. Она использует инициализированную 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 показывает инициализацию обратных вызовов, ключевое слово элементов и создание ключевое слово точечный элемент.
{
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 ключевое слово и связывания его с существующим каналом.
status = AcxKeywordSpotterCreate(Circuit, &attributes, &keywordSpotterCfg, Element);
if (!NT_SUCCESS(status))
{
ASSERT(FALSE);
goto exit;
}
Затем определяется контекст обнаружения ключевое слово и используется для создания ключевого словаDetector в памяти NonPagedPoolNx.
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, добавленный в контекст, предоставляется только в качестве примера реализации, которая имитирует ключевое слово обнаружение в примере драйвера. Класс CKeywordDetector не является частью платформы ACX или обязательной частью реализации MVA в ACX, но может обеспечить хорошую отправную точку для разработки фактического ключевое слово точечных объектов.
Наконец, событие 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 от обработки потокового моста и вместо этого создать поток-мост без изменения. Этот подход не позволит ACX автоматически связывать потоки с потоковыми мостами.