[Home]

Summary:ASTERISK-09959: app_SpeechBackground system has variety of failures with DTMF #
Reporter:John Todd (jtodd)Labels:
Date Opened:2007-07-25 13:35:09Date Closed:2007-07-25 17:01:44
Priority:MinorRegression?No
Status:Closed/CompleteComponents:Applications/app_speech_utils
Versions:Frequency of
Occurrence
Related
Issues:
Environment:Attachments:
Description:
The SpeechBackground application returns invalid characters when the # is pressed (DTMF).   Lumenvox support says that this is an Asterisk issue, and cannot be resolved by them.


****** ADDITIONAL INFORMATION ******

To: "Randal Rand" <RandalRand@LumenVox.com>
From: John Todd <jtodd@loligo.com>
Subject: Fwd: RE: Further DTMF polishing: # and *? CRM:00171302
Cc: "Support" <Support@LumenVox.com>



I'm getting some requirements to get this running again, so I've decided I'm going to try to resolve our problems with this to eventually make it a production system.  The DTMF problem I previously described is actually a deeper problem here than I first suspected, or at least I am getting responses which make no sense the more I examine this.

The "#" is not reserved - it is available via the dialplan and can be used for DTMF responses within Asterisk.  Some applications treat it specially, but that is on a per-application basis and is not a system-wide assignment.  More directly: the Lumenvox resource should not treat it specially, as I have dialplan instances which we're trying to voice-enable, and we use "#" in quite a few places.

Secondly, it seems that Asterisk (or Lumenvox?) is caching the last non-# value that gets entered, and is replying with that value when # is pressed.  For instance, if I press "2", and then loop back to another SpeechBackground and press "#", it is the case that the Lumenvox engine returns "2" as the keypress.  Clearly, this is unexpected.

Thirdly, I don't even have * or # defined in my "mode dtmf;" files.  How is it working at all?

Please see files included at the end of this message for configuration details.  Of course, I'd be happy to let you onto the machine and/or discuss in any detail required.

JT

Date: Mon, 25 Jun 2007 18:19:37 -0700
To: "Randal Rand" <RandalRand@LumenVox.com>
From: John Todd <jtodd@loligo.com>
Subject: RE: Further DTMF polishing: # and *? CRM:00171302


Randal -
 "Reserved"?  Erm... no, that's not the case.  In certain circumstances, it's used as a terminator, but that is selectable.

JT


John,

I have just found out that the octothorpe is a reserved symbol in
Asterisk that is why it is not being returned vs. that asterisk which is
not a reserved symbol thus being returned.

Randal

-----Original Message-----
From: John Todd [mailto:jtodd@loligo.com]
Sent: Tuesday, June 19, 2007 7:08 PM
To: Randal Rand
Subject: RE: Further DTMF polishing: # and *? CRM:00171302

Randal -
  Thanks!  I had created a grammar last night for all the digits (see
below) for voice mode, and it works great via voice, but as mentioned
that's not where my problems are.  Oddly, today I'm getting different
results than what I did yesterday.  I now get valid responses where
SPEECH_TEXT gets set to "*" when I press the "*" key, but still '#'
refuses to come through - I continue to get empty values.

  I don't know where in the system this problem resides, but I'm pretty
sure it's not with my grammars.  Asterisk has no problems passing me *
and # from other parts of my dialplan natively; it seems that there is
something wrong when trying to set SPEECH_TEXT somewhere in the code.

JT






#ABNF 1.0 UTF-8;

language en-US;

mode voice;

tag-format <lumenvox/1.0>;


root $Digit;

$Digit = (ONE:"1"        |
          TWO:"2"        |
          THREE:"3"      |
          FOUR:"4"       |
          FIVE:"5"       |
          SIX:"6"        |
          SEVEN:"7"      |
          EIGHT:"8"      |
          NINE:"9"       |
          (ZERO | O):"0" |
          (hash|octothorpe|pound){$="#"} |
          (star|asterisk){$="*"} );



>Hi John,
>
>Here is an example on how to get the "#" or "*":
>
>#ABNF 1.0 UTF-8;
>
>language en-US;
>mode voice;
>tag-format <semantics/1.0>;
>
>root $rootrule;
>
>$rootrule = (hash|pound){$="#"} | (star|asterisk){$="*"};
>
>
>Unfortunately, we here are not experts on handling DTMF input as it
>pertains to Asterisk so I have a phone call into Digium to help answer
>this question - why isn't Asterisk returning the "#" or "*"?  Once I
>have an answer from them I will share it with you.
>
>Randal
>
>-----Original Message-----
>From: John Todd [mailto:jtodd@loligo.com]
>Sent: Tuesday, June 19, 2007 10:26 AM
>To: Randal Rand
>Cc: Support
>Subject: RE: Further DTMF polishing: # and *? CRM:00171302
>
>Randal -
>   I'm clear on the general methods that Asterisk and Lumenvox exchange

>or relay messages back and forth - I'll create a voice grammar for the
>various words that describe those keys.
>
>   The problem is, currently, that when I press DTMF "#" or "*" I
>cannot get those keys back.  There is an empty reply in SPEECH_TEXT.
>The vocalization of those keys isn't a problem.  It's the DTMF part.  I

>only get 0-9 back when I press those respective keys.  Pressing # or *
>leads to an empty reply.
>
>   Please take a quick look at the enclosed .gram file, the
>extensions.conf, and the console output at the bottom of this message.
>Note that I have modified the grammar to try to include "*" and "#" in
>the syntax in the same way that numbers were specified, and this
>results in a syntax error and resultant non-loading of the .gram file
>by the speech engine.  Is there some way to specify "*" and "#" in the
>.gram file or is this a bug?
>
>JT
>
>
>At 6:17 PM -0700 2007/6/18, Randal Rand wrote:
>>
>>John,
>>
>>Just some added information about DTMF and Speech Recognition with
>>Asterisk.  What happens when you have DTMF and Speech Recognition
>>active at the same time with Asterisk is that once Asterisk starts to
>>detect DTMF input Asterisk stops streaming audio to our Speech Engine.
>
>>The resulting string of the DTMF input is available as a string in the

>>variable ${SPEECH_TEXT(0)}.
>>
>>Specifically what our DTMF grammars are designed to do is interpret a
>>DTMF string into something meaningful like a currency format or a
>>phone
>
>>number format, or what other format(semantic interpretation) you
>desire.
>>Currently this type of interpretation is not available thru Asterisk.
>>DTMF grammars serve no purpose being active in the dial plan and don't

>>even need to be loaded.
>>
>>So, for your application where you want the person to say "pound",
>>"hash", or "enter" you would have to create a voice grammar that would

>>take in one of those phrases then the Speech Engine can decode the
>>spoken utterance returning the '#'/'*' symbol.  Maybe you might want
>>to
>
>>consider modifying one of our built in grammars by adding in one/some
>  >of these phrases.
>>
>>
>>
>>Randal Rand
>>Speech Application Developer
>>LumenVox
>>P:877-977-0707, just say "Randal"
>>F:858-707-7072
>>Randal@LumenVox.com
>>http://www.LumenVox.com
>>
>>Winner "Best Innovation in Speech Recognition"
>>AVIOS SpeechTEK Award
>>
>>
>>
>>-----Original Message-----
>>From: Support
>>Sent: Monday, June 18, 2007 5:16 PM
>>To: John Todd; Support
>>Subject: RE: Further DTMF polishing: # and *? CRM:00171302
>>
>>John,
>>
>>The "mode DTMF" declaration in your grammar file is not used by
>>Asterisk
>>-- it is a grammar file for our Engine, for telephony platforms that
>>pass the Engine decoded DTMF tones. Since Asterisk does not pass the
>>Speech Engine any DTMF decodes, your DTMF grammars are never being
>used.
>>
>>You should be able to just check the ${SPEECH_TEXT()} variable from
>>your dial plan to get back DTMF input without having a DTMF grammar.
>>Is
>
>>this not working with * and # ?
>>
>>Stephen Keller
>>LumenVox Support
>>P: 877-977-0707, just say "Support"
>>F: 858-707-7072
>>Support@LumenVox.com
>>www.LumenVox.com
>>
>>
>>
>>Winner "Best Innovation in Speech Recognition"
>>AVIOS SpeechTEK Award
>>
>>
>>
>>
>>>  -----Original Message-----
>>>  From: John Todd [mailto:jtodd@loligo.com]
>>>  Sent: Monday, June 18, 2007 5:04 PM
>>>  To: Support
>>>  Subject: RE: Further DTMF polishing: # and *? CRM:00171302
>>>
>>>
>>>  Stephen -
>>>     I think I've not explained properly.
>>>
>>>     I'm happy at this point with DTMF _and_ with voice recognition
>>> of  my characters.  I can press or say a single digit, and the
>>> correct  numeric digit will be presented back to me.
>>>
>>>     However, I'd like to have the system understand the full range
>>> of  keys on a standard 12-digit keyboard, meaning that I need to
>>> include
>>  > "#" and "*" (and their various vocalized  > words) as legal digits

>> for either DTMF or for speech.  This does  > seem to be something
>> that the grammars need to contain, as I  > currently do _not_ have *
>> or # apparently as valid possible results  > in my "mode
>>>  dtmf;" file, and they correspondingly do not get returned when I
>>> press
>>
>>>  # or *.
>>>
>>>  JT
>>>
>>>
>>>
>>>  >John,
>>>  >
>>>  >I believe there has likely been a bit of confusion --  possibly
>>> caused  >by me, and if so I apologize -- about handling DTMF with
>>> Asterisk and  >LumenVox.
>>>  >
>>>  >When you input DTMF tones, Asterisk immediately stops using speech

>>> >recognition. It will send any the decoded DTMF digits into
>>> >${SPEECH_TEXT()} so you can access it in a similar manner to
>>> speech,
>
>>>  >but essentially you cannot currently use the Asterisk-LumenVox
>>> >integration to have our Engine perform semantic  interpretation on
>>> DTMF  >grammars. To do this, you would have to create a little
>>> application  >that used the AGI and talked directly to our Engine's
>>> API,  creating a  >grammar object and passing things between
>>> LumenVox and Asterisk.
>>>  >
>>>  >So if you're just using the standard Asterisk speech API,  you'll
>>> not be  >able to handle DTMF parsing in grammars at all. I believe I

>>> told a few  >people this was possible, but I was mistaken.
>>>  >
>>>  >Stephen Keller
>>>  >LumenVox Support
>>>  >P: 877-977-0707, just say "Support"
>>>  >F: 858-707-7072
>>>  >Support@LumenVox.com
>>>  >www.LumenVox.com
>>>  >
>>>  >Winner "Best Innovation in Speech Recognition"
>>>  >AVIOS SpeechTEK Award
>>>  >
>>>  >
>>>  >
>>>  >
>>>  >>  -----Original Message-----
>>>  >>  From: John Todd [mailto:jtodd@loligo.com]  >>  Sent: Monday,
>>> June 18, 2007 2:55 PM  >>  To: Stephen Keller  >>  Subject: Further
>>> DTMF polishing: # and *?
>>>  >>
>>>  >>    However, in my interest of getting "*" and "#" working
>>>  via  DTMF
>>>  >> as well, I seem to be perplexed at the syntax.  I tried  the
>>> obvious  >> addition according to the ABNF rule syntax, like this:
>>>  >>
>>>  >>  . . .
>>>  >>
>>>  >>             8:"8"      |
>>>  >>             9:"9"      |
>>>  >>             0:"0"      |
>>>  >>             #:"#"      |
>>>  >>             *:"*");
>>>  >>  . . .
>>>  >>
>>>  >>  but that fails to load.  Sorry to bother you, but I think
>>>   I've read
>>>  >> the docs on ABNF to the point where I believe this  should  work

>>> - is  >> this a bug, or my syntax?
>  >> >>
>>>  >>
>>>  >>
>>>  >>
>>>  >>  Another possible bug or at least inconsistency is that the
>>> error
>
>>>  >> message produced by an invalid grammar doesn't match  the  error

>>> type.
>>>  >>  When I add that line to my grammar above, and then try to
>>>   execute
>>>  >> it, I get this:
>>>  >>
>>>  >>       -- Executing [s@test:6]
>>>  >>  SpeechActivateGrammar("SIP/1234-0a06eea0", "digit-dtmf") in
>>> new  >> stack [Jun 18 22:48:12] ERROR[320]:
>>> res_speech_lumenvox.c:445  >>  lumenvox_activate: Grammar
>>> 'digit-dtmf' could not be  found  and thus  >> could not be
>>> activated.
>>>  >>     == Spawn extension (test, s, 6) exited non-zero on
>>>  >> 'SIP/1234-0a06eea0'
>>>  >>
>>>  >>  It's not that the file isn't found; it's that the file
>>> contains  >> invalid grammar.
>>>  >>
>>>  >>
>>>  >>  Now, when I did perform a reload prior to this call, this  is
>>> what I  >> received:
>>>  >>
>>>  >>  [Jun 18 22:48:09] ERROR[32650]: res_speech_lumenvox.c:161  >>
>>> load_config: Failed to load grammar 'digit-dtmf': Syntax is not  >>
>>> fully  conforming... but okay  >>  >>  >>  So possibly there needs
>>> to be a slight change or addition to the  >> run-time message,
>>> something like:
>>>  >>
>>>  >>  Grammar 'digit-dtmf' could not be found or was invalid and thus

>>> >> could  not be activated.
>>>  >>
>>>  >>
>>  > >>  JT
>
>
>Example of output when I press '*':
>
>
>*CLI>     -- Executing [111@from-sip:1] Goto("SIP/1234-0a06eea0",
>"test|s|1") in new stack
>     -- Goto (test,s,1)
>     -- Executing [s@test:1] SpeechCreate("SIP/1234-0a06eea0", "") in
>new stack
>     -- Executing [s@test:2] Set("SIP/1234-0a06eea0", "THRESHOLD=500")
>in new stack
>     -- Executing [s@test:3] Set("SIP/1234-0a06eea0",
>"SPEECH_DTMF_MAXLEN=1") in new stack
>     -- Executing [s@test:4] Set("SIP/1234-0a06eea0",
>"SPEECH_RESULTS_TYPE()=nbest") in new stack
>     -- Executing [s@test:5] SpeechActivateGrammar("SIP/1234-0a06eea0",
>"digit") in new stack
>     -- Executing [s@test:6] SpeechActivateGrammar("SIP/1234-0a06eea0",
>"digit-dtmf") in new stack
>     -- Executing [s@test:7] SpeechStart("SIP/1234-0a06eea0", "") in
>new stack
>     -- Executing [s@test:8] SpeechBackground("SIP/1234-0a06eea0",
>"tt-monkeys") in new stack
>     -- Executing [s@test:9] Verbose("SIP/1234-0a06eea0", "1|Number of
>results:0") in new stack  Number of results:0
>     -- Executing [s@test:10] Verbose("SIP/1234-0a06eea0", "1|Result in
>SPEECH_TEXT(0/0) is  with a confidence of ") in new stack  Result in
>SPEECH_TEXT(0/0) is  with a confidence of
>     -- Executing [s@test:11] Verbose("SIP/1234-0a06eea0", "1|Result in
>SPEECH_TEXT(1/0) is  with a confidence of ") in new stack  Result in
>SPEECH_TEXT(1/0) is  with a confidence of
>     -- Executing [s@test:12] Verbose("SIP/1234-0a06eea0", "1|Result in
>SPEECH_TEXT(2/0) is  with a confidence of ") in new stack  Result in
>SPEECH_TEXT(2/0) is  with a confidence of
>     -- Executing [s@test:13] NoOp("SIP/1234-0a06eea0", "The value in
>SPEECH_TEXT is ") in new stack
>     -- Executing [s@test:14] SayDigits("SIP/1234-0a06eea0", "") in new

>stack
>     -- Executing [s@test:15] Hangup("SIP/1234-0a06eea0", "") in new
>stack
>   == Spawn extension (test, s, 15) exited non-zero on
>'SIP/1234-0a06eea0'
>
>
>[root@jt-test grammars]# more digit-dtmf.gram #ABNF 1.0 UTF-8;
>
>language en-US;
>
>mode dtmf;
>
>tag-format <lumenvox/1.0>;
>
>root $Digit;
>
>$Digit = (1:"1"      |
>           2:"2"      |
>           3:"3"      |
>           4:"4"      |
>           5:"5"      |
>           6:"6"      |
>           7:"7"      |
>           8:"8"      |
>           9:"9"      |
>           0:"0");
>
>
>
>[root@jt-test grammars]#
>
>
>[test]
>exten => s,1,SpeechCreate
>exten => s,n,Set(THRESHOLD=500)
>exten => s,n,Set(SPEECH_DTMF_MAXLEN=1)
>exten => s,n,Set(SPEECH_RESULTS_TYPE()=nbest)
>exten => s,n,SpeechActivateGrammar(digit) exten =>
>s,n,SpeechActivateGrammar(digit-dtmf)
>exten => s,n,SpeechStart
>exten => s,n,SpeechBackground(tt-monkeys)
>
>exten => s,n,Verbose(1,Number of results:${SPEECH(results)}) exten =>
>s,n,Verbose(1,Result in SPEECH_TEXT(0/0) is ${SPEECH_TEXT(0/0)} with a
>confidence of ${SPEECH_SCORE(0/0)}) exten => s,n,Verbose(1,Result in
>SPEECH_TEXT(1/0) is ${SPEECH_TEXT(1/0)} with a confidence of
>${SPEECH_SCORE(1/0)}) exten => s,n,Verbose(1,Result in SPEECH_TEXT(2/0)

>is ${SPEECH_TEXT(2/0)} with a confidence of ${SPEECH_SCORE(2/0)}) exten

>=> s,n,NoOp(The value in SPEECH_TEXT is ${SPEECH_TEXT(0)}) exten =>
>s,n,SayDigits(${SPEECH_TEXT(0)})
>
>exten => s,n,Hangup
>
>exten => i,1,Playback(tt-somethingwrong) exten => i,n,Hangup




Examples from 2007-07-25 (pressing "2" and then "#"):

jt-test*CLI>
   -- Executing [111@from-sip:1] Goto("SIP/1234-0969b800", "test|s|1") in new stack
   -- Goto (test,s,1)
   -- Executing [s@test:1] Answer("SIP/1234-0969b800", "") in new stack
   -- Executing [s@test:2] NoOp("SIP/1234-0969b800", "The IP address sending media to me is ") in new stack
   -- Executing [s@test:3] SpeechCreate("SIP/1234-0969b800", "") in new stack
   -- Executing [s@test:4] Set("SIP/1234-0969b800", "THRESHOLD=500") in new stack
   -- Executing [s@test:5] Set("SIP/1234-0969b800", "SPEECH_DTMF_MAXLEN=1") in new stack
   -- Executing [s@test:6] Set("SIP/1234-0969b800", "SPEECH_RESULTS_TYPE()=nbest") in new stack
   -- Executing [s@test:7] SpeechActivateGrammar("SIP/1234-0969b800", "digit") in new stack
   -- Executing [s@test:8] SpeechActivateGrammar("SIP/1234-0969b800", "digit-dtmf") in new stack
   -- Executing [s@test:9] SpeechStart("SIP/1234-0969b800", "") in new stack
   -- Executing [s@test:10] SpeechBackground("SIP/1234-0969b800", "tt-monkeys") in new stack
   -- Executing [s@test:11] Verbose("SIP/1234-0969b800", "1|Number of results:1") in new stack
Number of results:1
   -- Executing [s@test:12] Verbose("SIP/1234-0969b800", "1|Result in SPEECH_TEXT(0/0) is 2 with a confidence of 1000") in new stack
Result in SPEECH_TEXT(0/0) is 2 with a confidence of 1000
   -- Executing [s@test:13] Verbose("SIP/1234-0969b800", "1|Result in SPEECH_TEXT(1/0) is  with a confidence of ") in new stack
Result in SPEECH_TEXT(1/0) is  with a confidence of
   -- Executing [s@test:14] Verbose("SIP/1234-0969b800", "1|Result in SPEECH_TEXT(2/0) is  with a confidence of ") in new stack
Result in SPEECH_TEXT(2/0) is  with a confidence of
   -- Executing [s@test:15] NoOp("SIP/1234-0969b800", "The value in SPEECH_TEXT is 2") in new stack
   -- Executing [s@test:16] NoOp("SIP/1234-0969b800", "") in new stack
   -- Executing [s@test:17] NoOp("SIP/1234-0969b800", "") in new stack
   -- Executing [s@test:18] NoOp("SIP/1234-0969b800", "") in new stack
   -- Executing [s@test:19] GotoIf("SIP/1234-0969b800", "1?good:nogood") in new stack
   -- Goto (test,s,22)
   -- Executing [s@test:22] SayDigits("SIP/1234-0969b800", "2") in new stack
   -- <SIP/1234-0969b800> Playing 'digits/2' (language 'en')
   -- Executing [s@test:23] Goto("SIP/1234-0969b800", "start") in new stack
   -- Goto (test,s,10)
   -- Executing [s@test:10] SpeechBackground("SIP/1234-0969b800", "tt-monkeys") in new stack
   -- Executing [s@test:11] Verbose("SIP/1234-0969b800", "1|Number of results:1") in new stack
Number of results:1
   -- Executing [s@test:12] Verbose("SIP/1234-0969b800", "1|Result in SPEECH_TEXT(0/0) is 2 with a confidence of 1000") in new stack
Result in SPEECH_TEXT(0/0) is 2 with a confidence of 1000
   -- Executing [s@test:13] Verbose("SIP/1234-0969b800", "1|Result in SPEECH_TEXT(1/0) is  with a confidence of ") in new stack
Result in SPEECH_TEXT(1/0) is  with a confidence of
   -- Executing [s@test:14] Verbose("SIP/1234-0969b800", "1|Result in SPEECH_TEXT(2/0) is  with a confidence of ") in new stack
Result in SPEECH_TEXT(2/0) is  with a confidence of
   -- Executing [s@test:15] NoOp("SIP/1234-0969b800", "The value in SPEECH_TEXT is 2") in new stack
   -- Executing [s@test:16] NoOp("SIP/1234-0969b800", "") in new stack
   -- Executing [s@test:17] NoOp("SIP/1234-0969b800", "") in new stack
   -- Executing [s@test:18] NoOp("SIP/1234-0969b800", "") in new stack
   -- Executing [s@test:19] GotoIf("SIP/1234-0969b800", "1?good:nogood") in new stack
   -- Goto (test,s,22)
   -- Executing [s@test:22] SayDigits("SIP/1234-0969b800", "2") in new stack
   -- <SIP/1234-0969b800> Playing 'digits/2' (language 'en')
   -- Executing [s@test:23] Goto("SIP/1234-0969b800", "start") in new stack
   -- Goto (test,s,10)
   -- Executing [s@test:10] SpeechBackground("SIP/1234-0969b800", "tt-monkeys") in new stack
jt-test*CLI>




[test]
exten => s,1,Answer
exten => s,n,NoOp(The IP address sending media to me is ${CHANNEL(rtpdest)})

exten => s,n,SpeechCreate
exten => s,n,Set(THRESHOLD=500)
exten => s,n,Set(SPEECH_DTMF_MAXLEN=1)
exten => s,n,Set(SPEECH_RESULTS_TYPE()=nbest)
exten => s,n,SpeechActivateGrammar(digit)  
exten => s,n,SpeechActivateGrammar(digit-dtmf)
exten => s,n,SpeechStart
exten => s,n(start),SpeechBackground(tt-monkeys)

exten => s,n,Verbose(1,Number of results:${SPEECH(results)})
exten => s,n,Verbose(1,Result in SPEECH_TEXT(0/0) is ${SPEECH_TEXT(0/0)} with a confidence of ${SPEECH_SCORE(0/0)})
exten => s,n,Verbose(1,Result in SPEECH_TEXT(1/0) is ${SPEECH_TEXT(1/0)} with a confidence of ${SPEECH_SCORE(1/0)})
exten => s,n,Verbose(1,Result in SPEECH_TEXT(2/0) is ${SPEECH_TEXT(2/0)} with a confidence of ${SPEECH_SCORE(2/0)})
exten => s,n,NoOp(The value in SPEECH_TEXT is ${SPEECH_TEXT(0)})
exten => s,n,NoOp()
exten => s,n,NoOp()
exten => s,n,NoOp()
exten => s,n,GotoIf($[${SPEECH_SCORE(0/0)} > 900]?good:nogood)
;
exten => s,n(nogood),Playback(vm-sorry)
exten => s,n,Goto(start)
;
exten => s,n(good),SayDigits(${SPEECH_TEXT(0)})
exten => s,n,Goto(start)


exten => i,1,Playback(tt-somethingwrong)
exten => i,n,Hangup



[root@jt-test grammars]# cat digit-dtmf.gram
#ABNF 1.0 UTF-8;

language en-US;

mode dtmf;

tag-format <lumenvox/1.0>;

root $Digit;

$Digit = (1:"1"      |
         2:"2"      |
         3:"3"      |
         4:"4"      |
         5:"5"      |
         6:"6"      |
         7:"7"      |
         8:"8"      |
         9:"9"      |
         0:"0");



[root@jt-test grammars]# cat digit.gram
#ABNF 1.0 UTF-8;

language en-US;

mode voice;

tag-format <lumenvox/1.0>;


root $Digit;

$Digit = (ONE:"1"        |
         TWO:"2"        |
         THREE:"3"      |
         FOUR:"4"       |
         FIVE:"5"       |
         SIX:"6"        |
         SEVEN:"7"      |
         EIGHT:"8"      |
         NINE:"9"       |
         (ZERO | O):"0" |
         (hash|pound|octothorpe){$="#"} |
         (star|asterisk){$="*"} );

[root@jt-test grammars]#
Comments:By: John Todd (jtodd) 2007-07-25 13:43:13

I understand that # is used to terminate DTMF sequences as a "hack", but perhaps a selectable option to turn that capability on or off would be useful, since some dialplan requirements use # as a character.  (before it's suggested, I don't think invalidating # as a terminating character when SPEECH_DTMF_MAXLEN is set to "1" is sufficient.)

By: Digium Subversion (svnbot) 2007-07-25 16:59:05

Repository: asterisk
Revision: 77176

------------------------------------------------------------------------
r77176 | file | 2007-07-25 16:59:00 -0500 (Wed, 25 Jul 2007) | 4 lines

(closes issue ASTERISK-9959)
Reported by: jtodd
Add SPEECH_DTMF_TERMINATOR variable so the user can specify the digit to terminate a DTMF string with. If none is specified then no terminator will be used.

------------------------------------------------------------------------

By: Digium Subversion (svnbot) 2007-07-25 17:01:44

Repository: asterisk
Revision: 77182

------------------------------------------------------------------------
r77182 | file | 2007-07-25 17:01:43 -0500 (Wed, 25 Jul 2007) | 12 lines

Merged revisions 77176 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4

........
r77176 | file | 2007-07-25 19:16:10 -0300 (Wed, 25 Jul 2007) | 4 lines

(closes issue ASTERISK-9959)
Reported by: jtodd
Add SPEECH_DTMF_TERMINATOR variable so the user can specify the digit to terminate a DTMF string with. If none is specified then no terminator will be used.

........

------------------------------------------------------------------------