diff --git a/src/main/java/io/spokestack/spokestack/profile/VADTriggerKeywordASR.java b/src/main/java/io/spokestack/spokestack/profile/VADTriggerKeywordASR.java
new file mode 100644
index 0000000..9139d22
--- /dev/null
+++ b/src/main/java/io/spokestack/spokestack/profile/VADTriggerKeywordASR.java
@@ -0,0 +1,56 @@
+package io.spokestack.spokestack.profile;
+
+import io.spokestack.spokestack.PipelineProfile;
+import io.spokestack.spokestack.SpeechPipeline;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A speech pipeline profile that uses voice activity detection to activate
+ * ASR based on keyword detection.
+ *
+ *
+ * The keyword detector requires extra configuration, which must be
+ * added to the pipeline build process separately from this profile:
+ *
+ *
+ *
+ * -
+ * keyword-classes (string): comma-separated ordered
+ * list of class names for the keywords; the name corresponding to the
+ * most likely class will be returned in the transcript field when the
+ * recognition event is raised
+ *
+ * -
+ * keyword-filter-path (string): file system path to the
+ * "filter" Tensorflow-Lite model
+ *
+ * -
+ * keyword-encode-path (string): file system path to the
+ * "encode" Tensorflow-Lite model
+ *
+ * -
+ * keyword-detect-path (string): file system path to the
+ * "detect" Tensorflow-Lite model
+ *
+ *
+ *
+ * @see io.spokestack.spokestack.asr.KeywordRecognizer
+ */
+public class VADTriggerKeywordASR implements PipelineProfile {
+ @Override
+ public SpeechPipeline.Builder apply(SpeechPipeline.Builder builder) {
+ List stages = new ArrayList<>();
+ stages.add("io.spokestack.spokestack.webrtc.AutomaticGainControl");
+ stages.add("io.spokestack.spokestack.webrtc.AcousticNoiseSuppressor");
+ stages.add("io.spokestack.spokestack.webrtc.VoiceActivityDetector");
+ stages.add("io.spokestack.spokestack.webrtc.VoiceActivityTrigger");
+ stages.add("io.spokestack.spokestack.ActivationTimeout");
+ stages.add("io.spokestack.spokestack.asr.KeywordRecognizer");
+
+ return builder
+ .setInputClass("io.spokestack.spokestack.android.MicrophoneInput")
+ .setStageClasses(stages);
+ }
+}
diff --git a/src/test/java/io/spokestack/spokestack/SpeechPipelineTest.java b/src/test/java/io/spokestack/spokestack/SpeechPipelineTest.java
index a7f8f1d..cc06217 100644
--- a/src/test/java/io/spokestack/spokestack/SpeechPipelineTest.java
+++ b/src/test/java/io/spokestack/spokestack/SpeechPipelineTest.java
@@ -28,6 +28,7 @@ public class SpeechPipelineTest implements OnSpeechEventListener {
io.spokestack.spokestack.profile.VADTriggerAndroidASR.class,
io.spokestack.spokestack.profile.VADTriggerAzureASR.class,
io.spokestack.spokestack.profile.VADTriggerGoogleASR.class,
+ io.spokestack.spokestack.profile.VADTriggerKeywordASR.class,
io.spokestack.spokestack.profile.VADTriggerSpokestackASR.class
);