共用方式為


多重語音助理

Multiple Voice Assistant 平臺提供 Windows 中其他語音助理的支援。 這可讓其他助理在 Windows 裝置上提供,例如電腦和 HoloLens 等可穿戴裝置。 多個語音助理可以使用一組支援的關鍵詞模式,在相同的裝置上使用。

注意

從 Windows 10 版本 1903 開始,支援多重語音助理。

如需實作 Windows Cortana 的相關信息,請參閱 語音啟用

語音啟用

語音啟用是一項功能,可讓使用者從各種裝置電源狀態叫用語音辨識引擎,方法是說出特定片語。

實作語音啟用是一個重要的專案,而且是由SoC廠商完成的工作。 OEM 可以連絡其 SoC 廠商,以取得其 SoC 實作語音啟用的相關信息。

語音啟用可讓使用者使用語音,在作用中內容之外快速參與語音助理體驗(也就是目前在螢幕上的內容)。 使用者通常想要能夠立即存取體驗,而不需要實際與裝置互動或觸控。 對於 Xbox 使用者,這可能不是想要尋找並連線控制器。 對於計算機使用者,他們可能會想要快速存取體驗,而不需要執行多個滑鼠、觸控和/或鍵盤動作,就像廚房中的計算機一樣。

語音啟用是由關鍵詞 Spotter (KWS) 提供,當偵測到關鍵片語時會做出反應。 關鍵片語可能包含關鍵詞,例如“Hey Contoso”。 關鍵詞偵測 描述硬體或軟體偵測關鍵詞。

關鍵片語可以自行表達(“Hey Contoso”)作為分段命令,或接著由鏈結命令組成的語音動作(“Hey Contoso,我的下一次會議在哪裡?

Microsoft 提供 OS 預設關鍵字 Spotter(軟體關鍵詞 spotter),以在硬體關鍵詞偵測無法使用的情況下提供語音助理體驗。 雖然這目前適用於 Cortana,但可能需要額外的 Microsoft 設定,才能讓其他語音助理上線,才能進行雙階段關鍵詞偵測。 如需詳細資訊,請連絡 AskMVA@Microsoft.com

如果 KWS 是從低電源狀態喚醒裝置,解決方案稱為「語音喚醒」(WoV)。 如需詳細資訊,請參閱 本文稍後的喚醒語音

詞彙詞彙

此詞彙摘要說明與語音啟用相關的詞彙。

術語 範例/定義
分段命令 範例:Hey Contoso <暫停,等待助理 UI> 天氣為何? 這有時稱為「雙槍命令」或「僅限關鍵詞」。
鏈結命令 範例:Hey Contoso 天氣為何? 這有時稱為「單次命令」。
語音啟用 範例:「Hey Contoso」 在預先定義的啟用關鍵詞片語中偵測到關鍵詞的案例。
語音喚醒 (WoV) 啟用從螢幕關閉、降低電源狀態到全電源狀態螢幕的語音啟用技術。
來自新式待命的 WoV 從新式待命 (S0ix) 螢幕關閉狀態到全電源 (S0) 狀態的螢幕喚醒語音。
新式待命 Windows 低功率閑置基礎結構 - Windows 10 中 連線 待命 (CS) 的後續任務。 新式待命的第一個狀態是螢幕關閉時。 最深的睡眠狀態是在 DRIPS/Resiliency 中。 如需詳細資訊,請參閱 新式待命
KWS 關鍵詞現成器 – 提供「Hey Contoso」偵測的演算法。
SW KWS 軟體關鍵詞 Spotter – 在主機上執行的 KWS 實作(CPU)。 對於 「Hey Cortana」,SW KWS 會包含在 Windows 中。
HW KWS Hardware 關鍵詞 spotter – 在硬件上卸除的 KWS 實作。
高載緩衝區 迴圈緩衝區,用來儲存在 KWS 偵測時可能會暴增的 PCM 數據,以便包含觸發 KWS 偵測的所有音訊。
事件偵測器 OEM 配接器 使用者模式元件,做為 Windows 語音助理堆疊與驅動程式之間的媒介。
模型 KWS 演算法所使用的原音模型數據檔。 數據檔是靜態的。 模型會當地語系化,每個地區設定一個。
Mva 多個語音代理程式 - 支援多個代理程式的 HWKWS DDI。
SVA 單一語音代理程式 - 先前只支援單一代理程式 (Cortana) 的 HWKWS DDI。

整合 Hardware 關鍵詞 Spotter

若要實作硬體關鍵詞 Spotter (HW KWS) SoC 廠商,必須完成下列工作。

硬體卸除關鍵詞 Spotter (HW KWS) WoV 需求

  • HW KWS WoV 在 S0 工作狀態和 S0 睡眠狀態也稱為新式待命期間受到支援。
  • S3 不支援 HW KWS WoV。

Aec

AEC 可以在擷取高載音訊時由 DSP 執行,也可以透過軟體 APO 稍後完成。 若要使用 KWS 高載資料執行軟體 AEC,必須從擷取高載數據的時間取得對應的回送音訊。 若要這樣做,已建立高載輸出的自定義音訊格式,以將回送音訊交錯到高載音訊數據。

從 Windows 20H1 版開始,Microsoft AEC APO 會察覺到此交錯格式,並可以使用它來執行 AEC。 如需詳細資訊,請參閱 KSPROPERTY_INTERLEAVEDAUDIO_FORMATINFORMATION

驗證

使用語音啟用管理員 2 測試驗證KSPROPSETID_SoundDetector2屬性的 HW 支援。

範例程式代碼概觀

音訊驅動程式有範例程序代碼,會在 GitHub 上實作語音啟用,做為 SYSVAD 虛擬音訊配接器範例的一部分。 建議使用此 程式代碼 作為起點。

如需SYSVAD範例音訊驅動程式的詳細資訊,請參閱 範例音訊驅動程式

關鍵詞辨識 系統資訊

語音啟用音訊堆疊支援

啟用語音啟用的音訊堆疊外部介面可作為語音平臺和音訊驅動程式的通訊管線。 外部介面分成三個部分。

音訊端點屬性

音訊端點圖形建置通常會發生。 圖表已準備好處理速度比即時擷取快。 所擷取緩衝區上的時間戳維持為 true。 具體來說,時間戳會正確反映過去擷取並緩衝的數據,而且現在會暴增。

藍牙 略過音訊串流理論

驅動程式會像往常一樣公開其擷取裝置的 KS 篩選器。 此篩選支持數個 KS 屬性和 KS 事件,以設定、啟用和發出偵測事件的訊號。 篩選條件也包含識別為關鍵詞 Spotter (KWS) 針腳的其他針腳處理站。 此釘選可用來串流關鍵詞 Spotter 的音訊。

屬性為: KSPROPSETID_SoundDetector2

所有 KSPROPSETID_SoundDetector2 屬性都會以 KSSOUNDDETECTORPROPERTY 數據結構呼叫。 此數據結構包含 KSPROPERTY,以及要武裝、重設、偵測到等關鍵詞的事件識別碼。

  • 支援的關鍵詞類型 - KSPROPERTY_SOUNDDETECTOR_PATTERNS。 這個屬性是由作業系統所設定,以設定要偵測到的關鍵詞。
  • 關鍵詞模式 GUID 清單 - KSPROPERTY_SOUNDDETECTOR_SUPPORTEDPATTERNS。 這個屬性可用來取得識別支援模式類型的 GUID 清單。
  • 武裝 - KSPROPERTY_SOUNDDETECTOR_ARMED。 這個讀取/寫入屬性只是布爾值狀態,指出偵測器是否武裝。 OS 會將此設定為參與關鍵詞偵測器。 OS 可以清除此專案以脫離。 當已設定關鍵詞模式,以及偵測到關鍵詞之後,驅動程式會自動清除此情況。 (OS 必須重新排列。
  • 比對結果 - KSPROPERTY_SOUNDDETECTOR_RESET 用於在啟動時重設聲音偵測器。

在關鍵詞偵測時間,會傳送包含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 配接器來擷取支援的關鍵詞和語言清單。
  4. 操作系統會註冊驅動程式所傳送的自定義 PNP 通知
  5. OS 會設定必要的關鍵詞模式。。
  6. OS 將偵測器武裝在偵測器上

內部驅動程式和硬體作業

當偵測器處於武裝時,硬體可以在小型 FIFO 緩衝區中持續擷取和緩衝音訊數據。 (此 FIFO 緩衝區的大小取決於本檔外部的需求,但通常為數百毫秒到數秒。偵測算法會在透過這個緩衝區串流的數據上運作。 驅動程式和硬體的設計使得在驅動程式與硬體之間沒有互動,而且在偵測到關鍵詞之前,不會中斷「應用程式」處理器。 這可讓系統在沒有其他活動的情況下達到較低的電源狀態。

當硬體偵測到關鍵詞時,會產生中斷。 等候驅動程式服務中斷時,硬體會繼續將音訊擷取到緩衝區,確保關鍵詞遺失後不會遺失任何數據,並在緩衝限制內。

關鍵詞時間戳

偵測關鍵詞之後,所有語音啟用解決方案都必須緩衝所有口語關鍵詞,包括關鍵詞開頭前的1.6s。 音訊驅動程式必須提供時間戳,以識別數據流中關鍵片語的開始和結尾。

為了支持關鍵詞開始/結束時間戳,DSP 軟體可能需要根據 DSP 時鐘在內部時間戳事件。 偵測到關鍵詞之後,DSP 軟體會與驅動程式互動以準備 KS 事件。 驅動程式和 DSP 軟體必須將 DSP 時間戳對應至 Windows 性能計數器值。 執行這項操作的方法專屬於硬體設計。 其中一個可能的解決方案是讓驅動程式讀取目前的性能計數器、查詢目前的 DSP 時間戳、再次讀取目前的性能計數器,然後估計性能計數器與 DSP 時間之間的相互關聯。 然後,假設相互關聯,驅動程式可以將關鍵詞 DSP 時間戳對應至 Windows 性能計數器時間戳。

IEvent Detector OEM 配接器介面

OEM 提供 COM 物件實作,做為 OS 與驅動程式之間的媒介,協助計算或剖析透過KSPROPERTY_SOUNDDETECTOR_PATTERNS和KSPROPERTY_SOUNDDETECTOR_MATCHRESULT寫入和讀取音訊驅動程式的不透明數據。

COM物件的 CLSID 是KSPROPERTY_SOUNDDETECTOR_SUPPORTEDPATTERNS所傳回的偵測器模式類型 GUID。 OS 會呼叫 CoCreateInstance 傳遞模式類型 GUID,以具現化與關鍵詞模式類型相容的適當 COM 物件,並在物件的 IEventDetectorOemAdapter 介面上呼叫方法。

COM 線程模型需求

OEM 的實作可以選擇任何 COM 線程模型。

IEventDetectorOemAdapter

介面設計會嘗試讓物件實作保持無狀態。 換句話說,實作應該不需要在方法呼叫之間儲存任何狀態。 事實上,內部 C++ 類別可能不需要超出一般實作 COM 物件所需的任何成員變數。

方法

實作下列方法。

WAVERT 增強功能

Miniport 介面是定義為由 WaveRT 迷你埠驅動程序實作。 這些介面提供方法來簡化音訊驅動程式、改善OS音訊管線效能和可靠性,或支援新的案例。 定義 PnP 裝置介面屬性,讓驅動程式能夠為其 OS 提供其緩衝區大小條件約束的靜態表達式。

緩衝區大小

驅動程式會在 OS、驅動程式和硬體之間行動音訊數據時,在各種限制下運作。 這些條件約束可能是由於在記憶體和硬體之間移動數據的實體硬體傳輸,以及/或因為硬體或相關聯的 DSP 內的訊號處理模組所造成。

HW-KWS 解決方案必須支援至少 100 毫秒和最多 200 毫秒的音訊擷取大小。

驅動程式會在具有 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::SetWritePacketIMiniportWaveRTOutputStream::GetOutputStreamPresentationPositionIMiniportWaveRTOutputStream::GetPacketCount

性能計數器時間戳

數個驅動程式例程會傳回 Windows 性能計數器時間戳,以反映裝置擷取或呈現樣本的時間。

在具有複雜 DSP 管線和訊號處理的裝置中,計算精確的時間戳可能具有挑戰性,而且應該深思熟慮地完成。 時間戳不應只反映樣本傳送到OS或從OS傳送到 DSP 的時間。

  • 在 DSP 中,使用一些內部的 DSP 時鐘來追蹤範例時間戳。
  • 在驅動程式與 DSP 之間,計算 Windows 性能計數器與 DSP 時鐘之間的相互關聯。 程式的範圍可以從非常簡單(但不太精確)到相當複雜或新穎(但更精確)。
  • 因訊號處理演算法或管線或硬體傳輸而造成任何持續延遲的因素,除非另有考慮這些延遲。

高載讀取作業

本節說明高載讀取的OS和驅動程序互動。 只要驅動程式支援以封包為基礎的串流 WaveRT 模型,包括 IMiniportWaveRTInputStream::GetReadPacket 函式,就會在語音啟用案例之外發生高載讀取。

討論兩個高載範例讀取案例。 在一個案例中,如果迷你埠支援針腳類別 KSNODETYPE_AUDIO_KEYWORDDETECTOR ,則驅動程式會在偵測到關鍵詞時開始擷取和內部緩衝數據。 在另一個案例中,如果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 關鍵詞偵測器針腳,驅動程式應該為至少 5000 毫秒的音訊數據配置足夠的內部高載緩衝。 如果 OS 無法在緩衝區溢位之前於針腳上建立數據流,則驅動程式可能會結束內部緩衝活動並釋放相關聯的資源。

語音喚醒

語音喚醒(WoV)可讓使用者啟用和查詢語音辨識引擎,從低功率狀態到螢幕的完整電源狀態,方法是說出特定關鍵詞,例如“Hey Contoso”。

此功能可讓裝置在裝置閒置且螢幕關閉時一律接聽用戶的語音。 這是因為與一般麥克風錄製相比,使用較少的電源的接聽模式。 WoV 允許鏈結的語音片語,例如“Hey Contoso,何時是我的下一個約會”,以免手方式叫用語音助理的回應。

音訊堆疊負責傳達喚醒數據(說話者標識符、關鍵詞觸發程式、信賴等級的內容資訊),以及通知感興趣的用戶端已偵測到關鍵詞。

新式待命系統的驗證

來自系統閑置狀態的 WoV 可以在新式待命系統上使用 AC 電源上的新式待命喚醒基本測試,以及 HLKDC 電源上的新式待命喚醒基本測試來驗證。 這些測試會檢查系統是否有硬體關鍵詞 Spotter (HW-KWS),能夠進入最深層運行時間閑置平台狀態 (DRIPS),而且能夠在語音命令上從新式待命喚醒,系統恢復延遲小於或等於一秒。

ACX 和 MVA

音訊類別 eXtension (ACX) 會定義音訊網域的 Windows Driver Framework (WDF) 類別延伸模組。 如需 ACX 的詳細資訊,請參閱 ACX 音訊類別延伸模組概觀ACX 物件的摘要。 本節說明如何使用 ACX 實作 MVA。

ACX 針對關鍵詞 Spotter 使用相同的 KS 基礎結構,新增一層抽象概念來簡化驅動程序實作。 使用 ACX 時,會使用與上述相同的 OEM DLL,且維持不變。 ACX 和 Portcls 都需要 IEventDetectorOEMAdapter 介面,而且 OEM 適配卡的兩者實作沒有差異。

AcxKeywordSpotterCreate 函式可用來建立與線路裝置物件父系相關聯的 ACX 關鍵詞 spotter 不透明物件 (ACXKEYWORDSPOTTER)。

ACXKEYWORDSPOTTER 物件可用來取代所有KSPROPERTY_SOUNDDETECTOR呼叫,簡化 KWS 實作。 它會用於將 KWS 元素和 KWS 針腳新增至 ACX 線路的過程中。 相關聯的回呼會負責取得模式、武裝、解除武裝和重設。 它會使用初始化 的 ACX_KEYWORDSPOTTER_CONFIG 結構 ,描述關鍵詞 spotter 的組態。

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 範例程式代碼會顯示回呼、關鍵詞元素的初始化,以及建立關鍵詞 Spotter。

{
    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 關鍵詞 Spotter 物件,並將它與現有的線路產生關聯。

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

然後決定關鍵詞 Spotter 內容,並用來在 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 類別作為範例實作,以模擬範例驅動程式內的關鍵詞發現。 CKeywordDetector 類別不是 ACX 架構的一部分,或 ACX 上 MVA 實作的必要部分,但可提供開發實際關鍵詞 Spotter 的良好起點。

最後,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 自動將串流與串流網橋產生關聯。

另請參閱

語音啟用