Skip to content

WIP: audio/topology: add multi-KPB WOV arbiter for 3-keyword DMIC capture with VAD#11022

Draft
lgirdwood wants to merge 9 commits into
thesofproject:mainfrom
lgirdwood:feature/wov-multi-kpb
Draft

WIP: audio/topology: add multi-KPB WOV arbiter for 3-keyword DMIC capture with VAD#11022
lgirdwood wants to merge 9 commits into
thesofproject:mainfrom
lgirdwood:feature/wov-multi-kpb

Conversation

@lgirdwood

@lgirdwood lgirdwood commented Jul 22, 2026

Copy link
Copy Markdown
Member

EDIT now added test detection in each WoV module to wake on voice frequencies for male, female and children voice frequencies. i.e. each WoV will trigger on a different speaker type.

Adds a new WOV arbiter component and multi-KPB topology to support three simultaneous wake-word detectors sharing a single DMIC, with exclusive host PCM drain arbitration when any keyword fires.

New component: src/audio/wov_arbiter/

  • 3 input pins (one per KPB host-sink), 1 output pin (to host copier)
  • AMS subscriber for AMS_WOV_DETECT_MSG_UUID: activates the triggering slot and broadcasts WOV_CTRL PAUSE to sibling detectors
  • On trigger(STOP): deactivates and broadcasts WOV_CTRL RESUME so all detectors return to listening
  • Idle inputs are silently drained to prevent buffer stalls
  • UUID 4a5b6c7d-8e9f-4a1b-2c3d-4e5f60718293 registered in uuid-registry

AMS additions (ams_msg.h):

  • AMS_WOV_DETECT_MSG_UUID: detector -> arbiter on keyword detect
  • AMS_WOV_CTRL_MSG_UUID: arbiter -> detectors for pause/resume control

detect_test extensions:

  • IPC4_DETECT_TEST_SET_WOV_SLOT large-config param assigns a slot id (0-2)
  • On detection: also sends AMS_WOV_DETECT_MSG_UUID with slot_id to arbiter
  • AMS consumer for WOV_CTRL: sets paused flag; copy() drains buffer without running the detector when paused
  • The existing energy-threshold detector fires on a hand clap, making detect_test a ready-to-use lab test stub for this topology

Topology: tools/topology/topology2/platform/intel/dmic-wov-multi.conf

  • Pipeline 100 (Core 0): DMIC Copier -> Mixin (fan-out to 3 Mixouts)
  • Pipelines 101-102 (Core 0): Mixout -> KPB -> detect_test (slots 0-1)
  • Pipeline 103 (Core 1): Mixout -> KPB -> detect_test (slot 2)
  • Pipeline 104 (Core 0): WOV Arbiter -> Host Copier (single PCM stream)
  • KPB output_pin_binding: pin 0 -> detector (sel_sink), pin 1 -> arbiter (host_sink)

Requires: CONFIG_COMP_WOV_ARBITER, CONFIG_COMP_KPB, CONFIG_COMP_MIXIN_MIXOUT,
CONFIG_AMS, CONFIG_COMP_KWD_DETECT

@lgirdwood lgirdwood left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some opens.

Comment thread src/audio/wov_arbiter/wov_arbiter.c
Comment thread src/audio/wov_arbiter/wov_arbiter.c
Comment thread src/audio/CMakeLists.txt Outdated
Comment thread src/audio/Kconfig Outdated
Comment thread src/include/sof/audio/wov_arbiter.h Outdated
Comment thread uuid-registry.txt Outdated
@lgirdwood
lgirdwood force-pushed the feature/wov-multi-kpb branch from 49f3dc6 to c3c7161 Compare July 22, 2026 13:13
@lgirdwood lgirdwood changed the title WIP: audio/topology: add multi-KPB WOV arbiter for 3-keyword DMIC capture WIP: audio/topology: add multi-KPB WOV arbiter for 3-keyword DMIC capture with VAD Jul 23, 2026
lrgirdwo added 9 commits July 25, 2026 13:46
Update KPB component to retrieve downstream WOV detector widgets via
comp_buffer_get_sink_component(sink) on sel_sink and trigger downstream
detector pipelines directly during copy.

Signed-off-by: Liam Girdwood <[email protected]>
…g copy

Ensure all connected mixout components are automatically activated during
mixin_copy() so capture stream audio is mixed concurrently to all active
WOV detector pipelines.

Signed-off-by: Liam Girdwood <[email protected]>
Add VAD gate audio component to pre-filter background silence and gate
downstream WOV keyphrase detector pipelines when no voice energy is present.

Signed-off-by: Liam Girdwood <[email protected]>
Add AMS message UUIDs, payload structures (wov_detect_payload, wov_ctrl_payload),
and command codes for inter-component communication between WOV detectors and
the multi-slot WOV arbiter.

Signed-off-by: Liam Girdwood <[email protected]>
Add multi-slot WOV arbiter audio component to manage keyword detection events
across multiple detector pipelines, dispatch AMS slot activation and control
messages, and broadcast pause/resume commands to un-triggered slots.

Signed-off-by: Liam Girdwood <[email protected]>
…ication

- Add multi-slot zero-crossing frequency estimation for Slot 0 (Male 120Hz),
  Slot 1 (Female 220Hz), and Slot 2 (Child 350Hz).
- Require 30ms sustained frequency match (consec_match_count >= 3) and energy > 500
  to eliminate transient background room noise triggers.
- Map IPC4 pipeline IDs 101/102/103 to slot IDs 0/1/2.
- Populate IPC4 phrase detection notifications with WOV detector module ID,
  instance ID, and slot ID.

Signed-off-by: Liam Girdwood <[email protected]>
Add topology manifests and configuration files supporting 3-slot WOV capture
(Male, Female, Child) with multi-KPB buffer routes, mixin/mixout splitters,
wov-arbiter widget bindings, and HDA Jack Mic / DMIC input bindings.

Signed-off-by: Liam Girdwood <[email protected]>
…tion, and testing

Add detailed documentation for multi-slot Wake-On-Voice (WOV) architecture,
including Mermaid diagrams for audio dataflow and control messaging, Kconfig
requirements, topology syntax, and test procedures on Tiger Lake (Spider/Moth).

Signed-off-by: Liam Girdwood <[email protected]>
@lgirdwood
lgirdwood force-pushed the feature/wov-multi-kpb branch from 20edbb3 to 0f6f889 Compare July 25, 2026 12:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants