语音激活
注意
本主题主要介绍当前在 Windows 10(版本 1909 和更早版本)中交付的使用者体验。有关详细信息,请参阅 Windows 和 Teams 中的 Cortana 支持结束。
Cortana 这项个人助手技术于 2013 年在 Microsoft BUILD 开发人员大会上首次面世。 该 Windows 语音平台用于支持 Windows 10 中的所有语音体验,例如 Cortana 和听写。 语音激活是一项功能,让用户可通过说出特定短语“你好小娜”,从各种设备电源状态调用语音识别引擎。 若要创建支持语音激活技术的硬件,请查看本主题中的信息。
注意
实现语音激活是一个重要项目,也是 SoC 供应商完成的任务。 OEM 可以联系其 SoC 供应商,了解有关其 SoC 实现语音激活的信息。
Cortana 最终用户体验
若要了解 Windows 中提供的语音交互体验,请查看这些主题。
主题 | 说明 |
---|---|
什么是 Cortana? | 提供 Cortana 的概述和使用说明 |
“你好小娜”语音激活和“学习我的语音”简介
“你好小娜”语音激活
利用“你好小娜”语音激活 (VA) 功能,用户可使用其语音在活动上下文(即当前在屏幕上的内容)之外快速参与 Cortana 体验。 用户通常希望能够即时访问体验,而无需对设备进行物理交互触控。 对于电话用户来说,这可能是由于正在开车,需要集中注意力和用手操控车辆。 对于 Xbox 用户,这可能是由于不想查找和连接控制器。 对于电脑用户,这可能是由于快速访问体验,而无需执行多个鼠标、触控和/或键盘操作,例如厨房中的计算机。
语音激活始终提供通过预定义的关键短语或“激活短语”聆听语音输入的功能。 关键短语自身(“你好小娜”)可作为暂存命令表达,或者后跟语音操作,例如,“你好小娜,我的下一次会议在哪里开?”,这是一个链接命令。
术语关键字检测描述如何通过硬件或软件检测关键字。
仅当说出 Cortana 关键字时,才会发生仅关键字激活,Cortana 将启动并播放 EarCon 声音,以指示它已进入侦听模式。
链接命令描述了在关键字后面立即发出命令的功能(如“你好小娜,呼叫 John”),并且让 Cortana 启动(如果尚未启动)并按照命令行事(启动打给 John 的电话呼叫)。
此图演示了链接激活和仅关键字激活。
Microsoft 提供 OS 默认关键字检测工具(软件关键字检测工具),用于确保硬件关键字检测的质量,并在硬件关键字检测不存在或不可用的情况下提供“你好小娜”体验。
“学习我的语音”功能
“学习我的语音”功能允许用户训练 Cortana 来识别其独特的语音。 用户可在 Cortana 设置屏幕中选择“学习我如何说‘你好小娜’来完成此操作。 然后,用户重复六个精心选择的短语,这些短语提供了足够的各种语音模式,可标识用户语音的唯一属性。
将语音激活与“学习我的语音”配对时,这两种算法将协同工作,以减少错误激活。 这对于会议室场景特别有用,因为会有人在充满设备的房间里说“你好小娜”。 此功能仅适用于 Windows 10 版本 1903 及更早版本。
语音激活由关键字检测工具 (KWS) 提供支持,当检测到关键短语时该检测工具会做出反应。 如果 KWS 从低功率状态唤醒设备,则解决方案称为语音唤醒 (WoV)。 有关详细信息,请参阅语音唤醒。
术语词汇表
此术语表汇总了与语音激活相关的术语。
Term | 示例/定义 |
---|---|
暂存命令 | 示例:你好小娜<暂停,等待提示音>天气怎样? 这有时称为“双枪命令”或“仅关键字” |
链接命令 | 示例:你好小娜,天气怎样? 这有时称为“单枪命令” |
语音激活 | 提供预定义激活关键短语的关键字检测的方案。 例如,“你好小娜”是 Microsoft 语音激活方案。 |
WoV | 语音唤醒 – 支持语音激活的技术,从屏幕关闭、低功率状态到屏幕打开、全功率状态。 |
来自新式待机的 WoV | 从新式待机 (S0ix) 屏幕关闭状态到屏幕打开、全功率 (S0) 状态的语音唤醒。 |
新式待机 | Windows 低功率空闲基础结构 - Windows 10 中连接待机 (CS) 的后续任务。 新式待机的第一种状态是屏幕关闭时。 最深的睡眠状态是处于 DRIPS/复原状态时。 有关详细信息,请参阅新式待机 |
KWS | 关键字检测工具 - 提供“你好小娜”检测的算法 |
SW KWS | 软件关键字检测工具 – 在主机 (CPU) 上运行的 KWS 实现。 对于“你好小娜”,Windows 中包含 SW KWS。 |
HW KWS | 硬件卸载关键字检测工具 – 在硬件上卸载运行的 KWS 实现。 |
突发缓冲区 | 用于存储在 KWS 检测时可以“突发”的 PCM 数据的循环缓冲区,以便包括触发 KWS 检测的所有音频。 |
关键字检测器 OEM 适配器 | 驱动程序级别填充码,使启用 WoV 的 HW 能够与 Windows 和 Cortana 堆栈通信。 |
模型 | KWS 算法使用的声学模型数据文件。 数据文件是静态文件。 模型已本地化,每个区域设置一个。 |
集成硬件关键字检测工具
若要实现硬件关键字检测工具 (HW KWS),SoC 供应商必须完成以下任务。
- 根据本主题后面介绍的 SYSVAD 示例创建自定义关键字检测器。 将在 COM DLL 中实现这些方法,如关键字检测器 OEM 适配器接口中所述。
- 实现 WAVERT 增强功能中介绍的 WAVE RT 增强功能。
- 提供 INF 文件条目来描述用于关键字检测的任何自定义 APO。
- 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
- 查看音频设备建议中的硬件建议和测试指导。 本主题为设计和开发用于 Microsoft 语音平台的音频输入设备提供指导和建议。
- 支持暂存命令和链接命令。
- 针对每个受支持的 Cortana 区域设置支持“你好小娜”。
- APO(音频处理对象)必须提供以下效果:
- AEC
- AGC
- NS
- 语音处理模式的效果必须由 MFX APO 报告。
- APO 可能会将格式转换为 MFX。
- APO 必须输出格式:
- 16 kHz,单声道,FLOAT。
- (可选)设计任何自定义 APO,以增强音频捕获过程。 有关详细信息,请参阅 Windows 音频处理对象。
硬件卸载关键字检测工具 (HW KWS) WoV 要求
- HW KWS WoV 在 S0 工作状态和 S0 睡眠状态(也称为新式待机)期间受支持。
- 从 S3 开始不支持 HW KWS WoV。
HW KWS 的 AEC 要求
适用于 Windows 版本 1709
- 要针对 S0 睡眠状态(新式待机)支持 HW KWS WoV,不需要 AEC。
- Windows 版本 1709 不支持 S0 工作状态的 HW KWS WoV。
适用于 Windows 版本 1803
- 支持 S0 工作状态的 HW KWS WoV。
- 若要为 S0 工作状态启用 HW KWS WoV,APO 必须支持 AEC。
示例代码概览
GitHub 上实现语音激活的音频驱动程序示例代码是 SYSVAD 虚拟音频适配器示例的一部分。 建议将此代码用作起点。 此位置提供代码。
https://github.com/Microsoft/Windows-driver-samples/tree/main/audio/sysvad/
有关 SYSVAD 示例音频驱动程序的详细信息,请参阅示例音频驱动程序。
关键字识别系统信息
语音激活音频堆栈支持
用于启用语音激活的音频堆栈外部接口充当语音平台和音频驱动程序的通信管道。 外部接口分为三个部分。
- 关键字检测器设备驱动程序接口 (DDI)。 关键字检测器设备驱动程序接口负责配置和配备 HW 关键字检测工具 (KWS)。 驱动程序也使用它来通知系统检测事件。
- 关键字检测器 OEM 适配器 DLL。 此 DLL 实现 COM 接口,以调整 OS 用于帮助关键字检测的驱动程序特定不透明数据。
- WaveRT 流式处理增强功能。 增强功能使音频驱动程序能够从关键字检测中突发流式处理缓冲的音频数据。
音频终结点属性
通常会生成音频终结点图形。 图形的处理速度比实时捕获快。 所捕获缓冲区上的时间戳仍为 true。 具体而言,时间戳将正确反映过去捕获和缓冲的数据,并且现在已“突发”。
蓝牙旁路音频流理论
驱动程序会像往常一样公开其捕获设备的 KS 筛选器。 此筛选器支持多个 KS 属性和 KS 事件,可配置、启用检测事件并发出相应信号。 该筛选器还包括一个标识为关键字检测工具 (KWS) 引脚的额外引脚工厂。 此引脚用于从关键字检测工具流式传输音频。
这些属性为:
- 支持的关键字类型 - KSPROPERTY_SOUNDDETECTOR_PATTERNS。 此属性由操作系统设置,用于配置要检测的关键字。
- 关键字模式 GUID 列表 - KSPROPERTY_SOUNDDETECTOR_SUPPORTEDPATTERNS。 此属性用于获取标识受支持模式类型的 GUID 列表。
- 配备 - KSPROPERTY_SOUNDDETECTOR_ARMED。 此读/写属性只是指示是否配备检测器的布尔状态。 OS 将其设置为使用关键字检测器。 OS 可以清除此项以解除连接。 当设置了关键字模式,并在检测到关键字后,驱动程序会自动清除此模式。 (OS 必须重新配备。)
- 匹配结果 - KSPROPERTY_SOUNDDETECTOR_MATCHRESULT。 进行检测后,此读取属性保存结果数据。
检测到关键字时触发的事件是 KSEVENT_SOUNDDETECTOR_MATCHDETECTED 事件。
操作顺序
系统启动
- OS 读取受支持的关键字类型,以验证它是否具有该格式的关键字。
- OS 会注册检测器状态更改事件。
- OS 设置关键字模式。
- OS 将配备检测器。
接收 KS 事件时
- 驱动程序解除配备检测器。
- OS 读取关键字检测器状态、解析返回的数据并确定检测到的模式。
- OS 将重新配备检测器。
内部驱动程序和硬件操作
当配备检测器时,硬件可以持续捕获和缓冲小型 FIFO 缓冲区中的音频数据。 (此 FIFO 缓冲区的大小由本文档之外的要求决定,但通常可能为几百毫秒到几秒。)检测算法通过此缓冲区对数据流式传输执行操作。 驱动程序和硬件的设计使得在配备时,在检测到关键字之前,驱动程序与硬件之间没有交互,并且不会中断“应用程序”处理器。 这允许系统在没有其他活动的情况下达到低功率状态。
当硬件检测到关键字时,会生成中断。 在等待驱动程序提供中断时,硬件将继续将音频捕获到缓冲区中,从而确保在缓冲限制内不会丢失关键字后的任何数据。
关键字时间戳
检测关键字后,所有语音激活解决方案都必须缓冲所有用户说出的关键字,包括关键字开始前的 250 毫秒。 音频驱动程序必须提供时间戳,用于标识流中关键短语的开始和结束。
为了支持关键字开始/结束时间戳,DSP 软件可能需要根据 DSP 时钟在内部标记事件的时间戳。 检测到关键字后,DSP 软件将与驱动程序交互,以准备 KS 事件。 驱动程序和 DSP 软件需要将 DSP 时间戳映射到 Windows 性能计数器值。 执行此操作的方法特定于硬件设计。 一种可能的解决方案是让驱动程序读取当前性能计数器,查询当前的 DSP 时间戳,再次读取当前性能计数器,然后估计性能计数器与 DSP 时间之间的关联。 然后,鉴于相关性,驱动程序可以将关键字 DSP 时间戳映射到 Windows 性能计数器时间戳。
关键字检测器 OEM 适配器接口
OEM 提供一个 COM 对象实现,该实现充当 OS 和驱动程序之间的中介,帮助计算或分析通过 KSPROPERTY_SOUNDDETECTOR_PATTERNS 和 KSPROPERTY_SOUNDDETECTOR_MATCHRESULT 写入和读取到音频驱动程序的不透明数据。
COM 对象的 CLSID 是由 KSPROPERTY_SOUNDDETECTOR_SUPPORTEDPATTERNS 返回的检测器模式类型 GUID。 OS 会调用传递模式类型 GUID 的 CoCreateInstance 来实例化与关键字模式类型兼容的相应 COM 对象,并在对象的 IKeywordDetectorOemAdapter 接口上调用方法。
COM 线程模型要求
OEM 的实现可以选择任何 COM 线程模型。
IKeywordDetectorOemAdapter
接口设计会尝试使对象实现保持无状态。 换句话说,实现不应要求在方法调用之间存储任何状态。 事实上,内部 C++ 类可能不需要除一般实现 COM 对象所需的成员变量之外的任何成员变量。
方法
实现以下方法。
- IKeywordDetectorOemAdapter::BuildArmingPatternData
- IKeywordDetectorOemAdapter::ComputeAndAddUserModelData
- IKeywordDetectorOemAdapter::GetCapabilities
- IKeywordDetectorOemAdapter::ParseDetectionResultData
- IKeywordDetectorOemAdapter::VerifyUserKeyword
KEYWORDID
KEYWORDID 枚举标识关键字的短语文本/函数,也用于 Windows 生物识别服务适配器。 有关详细信息,请参阅生物识别框架概述 - 核心平台组件
typedef enum {
KwInvalid = 0,
KwHeyCortana = 1,
KwSelect = 2
} KEYWORDID;
KEYWORDSELECTOR
KEYWORDSELECTOR 结构是一组唯一选择特定关键字和语言的 ID。
typedef struct
{
KEYWORDID KeywordId;
LANGID LangId;
} KEYWORDSELECTOR;
处理模型数据
静态用户独立模型 - OEM DLL 通常包括一些静态用户独立模型数据,这些数据内置于 DLL 中或 DLL 附带的单独数据文件中。 GetCapabilities 例程返回的受支持关键字 ID 集将取决于此类数据。 例如,如果 GetCapabilities 返回的受支持关键字 ID 列表包括 KwHeyCortana,则静态用户独立模型数据将包括所有受支持语言的“你好小娜”(或其翻译)的数据。
动态用户相关模型 - IStream 提供随机访问存储模型。 OS 会将 IStream 接口指针传递给 IKeywordDetectorOemAdapter 接口上的许多方法。 OS 支持高达 1MB 数据的相应存储的 IStream 实现。
此存储中的数据的内容和结构由 OEM 定义。 预期目的是持久存储由 OEM DLL 计算或检索的用户相关模型数据。
OS 可以使用空 IStream 调用接口方法,尤其是用户从未训练过关键字时。 OS 会为每个用户创建单独的 IStream 存储。 换言之,给定的 IStream 存储一个且仅一个用户的模型数据。
OEM DLL 开发人员决定如何管理用户独立数据和用户相关数据。 但是,它永远不会在 IStream 之外的任何位置存储用户数据。 一种可能的 OEM DLL 设计将在访问 IStream 和静态用户独立数据之间进行内部切换,具体取决于当前方法的参数。 备用设计可能会在每次方法调用开始时检查 IStream,并将静态用户独立数据添加到 IStream(如果尚不存在),从而允许该方法的其余部分仅访问所有模型数据的 IStream。
训练和操作音频处理
如前所述,训练 UI 流会导致音频流中提供完整的语音丰富句子。 每个句子都将分别传递给 IKeywordDetectorOemAdapter::VerifyUserKeyword,以验证它是否包含预期的关键字并具有可接受的质量。 在 UI 收集并验证所有句子后,会在 IKeywordDetectorOemAdapter::ComputeAndAddUserModelData 的一次调用中传递这些句子。
将以独特的方式处理音频,以进行语音激活训练。 下表总结了语音激活训练与常规语音识别用法之间的差异。
|
语音训练 | 语音识别 | |
模式 | 原始 | 原始或语音 |
固定 | 正常 | KWS |
音频格式 | 32 位浮点数(类型 = 音频,子类型 = IEEE_FLOAT,采样率 = 16 kHz,位 = 32) | 由 OS 音频堆栈管理 |
麦克风 | 麦克风 0 | 阵列或单声道中的所有麦克风 |
关键字识别系统概述
此图概述了关键字识别系统。
关键字识别序列图
在这些关系图中,语音运行时模块显示为“语音平台”。 如前所述,该 Windows 语音平台用于支持 Windows 10 中的所有语音体验,例如 Cortana 和听写。
在启动期间,使用 IKeywordDetectorOemAdapter::GetCapabilities 收集功能。
稍后当用户选择“学习我的语音”时,将调用训练流。
此图描述了配备用于关键字检测的过程。
WAVERT 的增强功能
微型端口接口被定义为由 WaveRT 微型端口驱动程序实现。 这些接口提供了简化音频驱动程序、提高 OS 音频管道性能和可靠性或支持新方案的方法。 定义了新的 PnP 设备接口属性,从而允许驱动程序向 OS 提供其缓冲区大小约束的静态表达式。
缓冲区大小
在 OS、驱动程序和硬件之间移动音频数据时,驱动程序在各种约束下运行。 这些约束可能是由于在内存和硬件之间移动数据的物理硬件传输,和/或由于硬件或关联的 DSP 中的信号处理模块所致。
HW-KWS 解决方案必须支持至少 100 毫秒和高达 200 毫秒的音频捕获大小。
通过在具有 KS 流式处理引脚的 KS 筛选器的 KSCATEGORY_AUDIO PnP 设备接口上设置 DEVPKEY_KsAudio_PacketSize_Constraints 设备属性,驱动程序可表达缓冲区大小约束。 启用 KS 筛选器接口时,此属性应保持有效且稳定。 OS 可以随时读取此值,而无需打开驱动程序的句柄并在驱动程序上调用。
DEVPKEY_KsAudio_PacketSize_Constraints
DEVPKEY_KsAudio_PacketSize_Constraints属性值包含描述物理硬件约束的 KSAUDIO_PACKETSIZE_CONSTRAINTS 结构(即由于将数据从 WaveRT 缓冲区传输到音频硬件的机制)。 该结构包括一个由 0 个或多个 KSAUDIO_PACKETSIZE_PROCESSINGMODE_CONSTRAINT 结构构成的数组,描述特定于任何信号处理模式的约束。 驱动程序会在调用 PcRegisterSubdevice 之前设置此属性,或者为其流式传输引脚启用其 KS 筛选器接口。
IMiniportWaveRTInputStream
驱动程序会实现此接口,以便更好地协调从驱动程序到 OS 的音频数据流。 如果此接口在捕获流上可用,则 OS 会在此接口上使用方法访问 WaveRT 缓冲区中的数据。 有关详细信息,请参阅 IMiniportWaveRTInputStream::GetReadPacket
IMiniportWaveRTOutputStream
WaveRT 微型端口(可选)会实现此接口,以便从 OS 收到写入进度并返回精确的流位置。 有关详细信息,请参阅 IMiniportWaveRTOutputStream::SetWritePacket、IMiniportWaveRTOutputStream::GetOutputStreamPresentationPosition 和 IMiniportWaveRTOutputStream::GetPacketCount。
性能计数器时间戳
多个驱动程序例程返回 Windows 性能计数器时间戳,反映设备捕获或显示样本的时间。
在具有复杂 DSP 管道和信号处理的设备中,计算准确的时间戳可能具有挑战性,应该考虑周到地完成。 时间戳不应仅反映将样本传输到 Windows 或从 OS 传输到 DSP 的时间。
- 在 DSP 中,使用一些内部 DSP 时钟跟踪样本时间戳。
- 在驱动程序与 DSP 之间,计算 Windows 性能计数器与 DSP 时钟之间的关联。 此操作的过程可以是非常简单(但不太精确)到相当复杂或耗时(但更精确)。
- 除非考虑这些延迟,否则考虑因信号处理算法或者管道或硬件传输而产生的任何持续延迟。
突发读取操作
本部分介绍突发读取的 OS 和驱动程序交互。 只要驱动程序支持基于数据包的流式处理 WaveRT 模型(包括 IMiniportWaveRTInputStream::GetReadPacket 函数),就会在语音激活方案之外出现突发读取。
将讨论两个突发示例读取方案。 在一种方案中,如果微型端口支持引脚类别 KSNODETYPE_AUDIO_KEYWORDDETECTOR,则在检测到关键字时,驱动程序将开始捕获和内部缓冲数据。 在另一种方案中,如果 OS 未调用 IMiniportWaveRTInputStream::GetReadPacket 来足够快地读取数据,驱动程序可以选择在 WaveRT 缓冲区外部对数据进行内部缓冲。
若要突发在转换到 KSSTATE_RUN 之前捕获的数据,驱动程序必须保留准确的样本时间戳信息,以及缓冲的捕获数据。 时间戳标识所捕获样本的采样即时。
流过渡到 KSSTATE_RUN 后,驱动程序会立即设置缓冲区通知事件,因为它已有数据可用。
在此事件中,OS 会调用 GetReadPacket(),以获取有关可用数据的信息。
a. 驱动程序会返回有效捕获数据的数据包数(从 KSSTATE_STOP 过渡到 KSSTATE_RUN 后的第一个数据包为 0),OS 可以从中派生 WaveRT 缓冲区中的数据包位置,以及相对于流开始的数据包位置。
b. 驱动程序还会返回与数据包中第一个样本的采样即时相对应的性能计数器值。 请注意,此性能计数器值可能相对较旧,具体取决于硬件或驱动程序(在 WaveRT 缓冲区外部)中缓冲了多少捕获数据。
c. 如果有更多未读缓冲数据可用,驱动程序将:i. 立即将该数据传输到 WaveRT 缓冲区的可用空间(即 GetReadPacket 返回的数据包未使用的空间),为 MoreData 返回 true,并在从此例程返回之前设置缓冲区通知事件。 或,ii. 程序硬件将下一个数据包突发到 WaveRT 缓冲区的可用空间,为 MoreData 返回 false,并在传输完成后设置缓冲区事件。
OS 使用 GetReadPacket() 返回的信息,从 WaveRT 缓冲区读取数据。
OS 等待下一个缓冲区通知事件。 如果驱动程序在步骤 (2c) 中设置缓冲区通知,则等待可能会立即终止。
如果驱动程序未在步骤 (2c) 中立即设置事件,驱动程序会在将更多捕获的数据传输到 WaveRT 缓冲区并使其可供 OS 读取后设置该事件
转到 (2)。 对于 KSNODETYPE_AUDIO_KEYWORDDETECTOR关键字检测器引脚,驱动程序应为至少 5000 毫秒的音频数据分配足够的内部突发缓冲。 如果 OS 在缓冲区溢出之前无法在引脚上创建流,则驱动程序可能会结束内部缓冲活动并释放关联资源。
语音唤醒
语音唤醒 (WoV) 使用户能够通过说出特定的关键字(如“你好小娜”),从屏幕关闭、低功率状态到屏幕打开、全功率状态,激活和查询语音识别引擎。
此功能允许设备在设备处于低功率状态时始终侦听用户的语音,包括屏幕关闭且设备处于空闲状态时。 它使用侦听模式来执行此操作,与正常麦克风录制期间看到的高得多的功率使用率相比,该模式的功率较低。 低功率语音识别允许用户简单地说一个预定义的关键短语,如“你好小娜”,后跟一个链接语音短语,如“我的下一个预约是什么时间”,以免提调用语音。 无论设备处于使用状态还是处于空闲状态(屏幕关闭),这都将正常工作。
音频堆栈负责传达唤醒数据(扬声器 ID、关键字触发器、置信度),以及通知感兴趣的客户端检测到关键字。
新式待机系统上的验证
使用 HLK 中的使用交流电源进行新式待机语音唤醒基本测试和使用直流电源进行新式待机语音唤醒基本测试,可以在新式待机系统上验证来自系统空闲状态的 WoV。 这些测试会检查系统是否具有硬件关键字检测工具 (HW-KWS),是否能够进入最深运行时空闲平台状态 (DRIPS),以及是否能够利用语音命令从新式待机唤醒,其中系统恢复延迟小于或等于一秒。