diff --git a/apps/app_speech_utils.c b/apps/app_speech_utils.c
index 13aa709b625a3863cb412af7c124b82940a02242..df2fe468a0a9ac35356db14cb1df63a6a4696aaf 100644
--- a/apps/app_speech_utils.c
+++ b/apps/app_speech_utils.c
@@ -662,6 +662,7 @@ static int speech_background(struct ast_channel *chan, void *data)
 			/* Free the frame we received */
 			switch (f->frametype) {
 			case AST_FRAME_DTMF:
+				ast_speech_dtmf(speech, f->subclass);
 				if (dtmf_terminator != '\0' && f->subclass == dtmf_terminator) {
 					done = 1;
 				} else {
diff --git a/include/asterisk/speech.h b/include/asterisk/speech.h
index e040629d4b04e819ea55747f84334734444d8282..e4d0c76d5448c60c8f4e7e88bc95090629ef647f 100644
--- a/include/asterisk/speech.h
+++ b/include/asterisk/speech.h
@@ -87,6 +87,8 @@ struct ast_speech_engine {
 	int (*deactivate)(struct ast_speech *speech, char *grammar_name);
 	/*! Write audio to the speech engine */
 	int (*write)(struct ast_speech *speech, void *data, int len);
+	/*! Signal DTMF was received */
+	int (*dtmf)(struct ast_speech *speech, char dtmf);
 	/*! Prepare engine to accept audio */
 	int (*start)(struct ast_speech *speech);
 	/*! Change an engine specific setting */
@@ -134,6 +136,8 @@ struct ast_speech *ast_speech_new(char *engine_name, int formats);
 int ast_speech_destroy(struct ast_speech *speech);
 /*! \brief Write audio to the speech engine */
 int ast_speech_write(struct ast_speech *speech, void *data, int len);
+/*! \brief Signal to the engine that DTMF was received */
+int ast_speech_dtmf(struct ast_speech *speech, char dtmf);
 /*! \brief Change an engine specific attribute */
 int ast_speech_change(struct ast_speech *speech, char *name, const char *value);
 /*! \brief Change the type of results we want */
diff --git a/res/res_speech.c b/res/res_speech.c
index ed815b6ec8721bd1933d277b3ff867c1610719d0..82614a50ab11608378e411097b4093aab0602d68 100644
--- a/res/res_speech.c
+++ b/res/res_speech.c
@@ -153,6 +153,21 @@ int ast_speech_write(struct ast_speech *speech, void *data, int len)
 	return speech->engine->write(speech, data, len);
 }
 
+/*! \brief Signal to the engine that DTMF was received */
+int ast_speech_dtmf(struct ast_speech *speech, char dtmf)
+{
+	int res = 0;
+
+	if (speech->state != AST_SPEECH_STATE_READY)
+		return -1;
+
+	if (speech->engine->dtmf != NULL) {
+		res = speech->engine->dtmf(speech, dtmf);
+	}
+
+	return res;
+}
+
 /*! \brief Change an engine specific attribute */
 int ast_speech_change(struct ast_speech *speech, char *name, const char *value)
 {