Antony Stone
2018-Jan-20 17:53 UTC
[asterisk-users] Can anyone help with a quick app_record.c module improvement and can explain over-riding modules?
On Saturday 20 January 2018 at 18:45:49, Jonathan H wrote:> Oh, what a good idea! That's exactly the kind of lateral thinking I > was hoping someone would come up with. > > I thought it was called MixMonitor, and tried to wrap my head around > it but couldn't.MixMonitor is related, but different (and as the name suggests, automatically mixes the two channels, so I think Tim's suggestion to use Monitor is much better. Note that you may well need to use the 'b' option with Monitor, to make sure you can record when there's no bridge between two channels.> I'll give this a go tomorrow and let you know what I come up with!Please do report back - this is a useful feature. Antony.> On 20 January 2018 at 17:03, Tim S wrote: > > Just a quick and dirty thought, try the MONITOR application. > > > > > > Pseudo-code: > > > > Anchor-point > > PLAYBACK ("press or say") > > MONITOR (use the split audio files mode, not the mixed - this way you can > > roughly separate which side did the "talking") > > READ (audio file "1 to 5", try to grab one digit) > > STOPMONITOR > > IF (READ variable timed-out, send the incoming half of the monitor file > > to Google Speech) > > > > Playback (some sound effect to indicate "thinking" on the Asterisk > > side > > > > - user feedback is good) > > > > Check Google Speech result against a white-list > > IF filtered result was not a valid option > > > > PLAYBACK "I didn't understand that" > > GOTO to Anchor-point > > > > ELSE > > > > Goto next step using valid decoded speech data > > > > ELSE > > > > Check DTMF result against a white-list > > IF filtered DTMFresult was not a valid option > > > > PLAYBACK "I didn't understand that" > > GOTO to Anchor-point > > > > ELSE > > > > Goto next step using valid decoded DTMF data > > > > Catch-all, should never get here. > > > > /Pseudo-code > > > > > > Don't forget to filter your user sourced data against your white-list, > > always assume users are hostile, this is part of the total picture of > > defence-in-depth. > > > > -Tim > > > > On Sat, Jan 20, 2018 at 12:42 AM, Jonathan H wrote: > >> Hello, > >> > >> I want to start recording with a prompt of "press or say 1 to 5". If > >> no DMTF is pressed, I want to send the recording to Google Speech to > >> get the number back (got that part working already). > >> > >> If any dtmf key is pressed while Application_Record is running with > >> option y, then the recording terminates and sends > >> RECORD_STATUS of "DTMF" (A terminating DTMF was received). > >> > >> But I need to know **what** number that DTMF was, and I can't see a > >> way of grabbing it after the fact. > >> > >> I can see in the code where the right variables are.. > >> > >> https://github.com/asterisk/asterisk/blob/master/apps/app_record.c#L140 > >> dtmf_response > >> > >> https://github.com/asterisk/asterisk/blob/master/apps/app_record.c#L166 > >> * \param dtmf_integer the integer value of the DTMF key received > >> > >> So,3 questions I guess: > >> > >> 1: Am I going about this the right way? (unimrcp is not an option here) > >> 2: Can someone explain in layman's terms how a simpleton like me could > >> copy, hack about with and make a new module, like, for example, > >> app_record_alt.c, that would stick around each time I updated Asterisk > >> from source? > >> 3: Or, is anyone willing to make the simple code change to the file to > >> improve it to send back the DTMF to the dialplan? For free to improve > >> core code? If not, and I posted on the commercial list, how much would > >> I be looking at to modify about 6 lines of code and return an extra > >> variable? > >> > >> So, ultimately, I'm hoping for something like: > >> > >> Currently: > >> option "y" returns a RECORD_STATUS of "DTMF" if a key was press > >> > >> Hopefully: > >> option "z" returns a RECORD_STATUS of <dtmf-value> showing which key > >> was pressed. > >> Or possibly even DTMF_VALUE (if an app can return two variables to the > >> dialplan?) > >> > >> I'm sure this would benefit a lot of people. > >> > >> I posted this a few days ago in the forum at > >> > >> https://community.asterisk.org/t/can-anyone-help-with-a-quick-app-record > >> -c-module-improvement-and-can-explain-over-riding-modules/73221 but > >> no-one bit, so, I'm hoping this list can help. > >> > >> Many thanks!-- Schr?dinger's rule of data integrity: the condition of any backup is unknown until a restore is attempted. Please reply to the list; please *don't* CC me.
Tim S
2018-Jan-20 23:30 UTC
[asterisk-users] Can anyone help with a quick app_record.c module improvement and can explain over-riding modules?
Also, be aware that by creating an audio file, you may need to insert a pause in your code before the file is: 1) written 2) flushed from cache to disk 3) registered as available to be opened by the OS I have seen this take over 2 seconds before on a sluggish machine. You can speed this up a bit by putting the recordings in a RAMDISK partition on the host - but be careful that you only use short recordings and clean them up after they are not needed any more. If that's still not fast enough, there's the Google Speech streaming API, but I'm not up to snuff on that - essentially you'd need the functionality of the monitor split to only stream the remote user's voice, then you'd need to pipe that to a Google Speech API tunnel. That's probably not something you can hack away at with simple Asterisk dialplan applications. Cheers, -Tim On Sat, Jan 20, 2018 at 9:53 AM, Antony Stone <Antony.Stone at asterisk.open.source.it> wrote:> On Saturday 20 January 2018 at 18:45:49, Jonathan H wrote: > >> Oh, what a good idea! That's exactly the kind of lateral thinking I >> was hoping someone would come up with. >> >> I thought it was called MixMonitor, and tried to wrap my head around >> it but couldn't. > > MixMonitor is related, but different (and as the name suggests, automatically > mixes the two channels, so I think Tim's suggestion to use Monitor is much > better. > > Note that you may well need to use the 'b' option with Monitor, to make sure > you can record when there's no bridge between two channels. > >> I'll give this a go tomorrow and let you know what I come up with! > > Please do report back - this is a useful feature. > > > Antony. > >> On 20 January 2018 at 17:03, Tim S wrote: >> > Just a quick and dirty thought, try the MONITOR application. >> > >> > >> > Pseudo-code: >> > >> > Anchor-point >> > PLAYBACK ("press or say") >> > MONITOR (use the split audio files mode, not the mixed - this way you can >> > roughly separate which side did the "talking") >> > READ (audio file "1 to 5", try to grab one digit) >> > STOPMONITOR >> > IF (READ variable timed-out, send the incoming half of the monitor file >> > to Google Speech) >> > >> > Playback (some sound effect to indicate "thinking" on the Asterisk >> > side >> > >> > - user feedback is good) >> > >> > Check Google Speech result against a white-list >> > IF filtered result was not a valid option >> > >> > PLAYBACK "I didn't understand that" >> > GOTO to Anchor-point >> > >> > ELSE >> > >> > Goto next step using valid decoded speech data >> > >> > ELSE >> > >> > Check DTMF result against a white-list >> > IF filtered DTMFresult was not a valid option >> > >> > PLAYBACK "I didn't understand that" >> > GOTO to Anchor-point >> > >> > ELSE >> > >> > Goto next step using valid decoded DTMF data >> > >> > Catch-all, should never get here. >> > >> > /Pseudo-code >> > >> > >> > Don't forget to filter your user sourced data against your white-list, >> > always assume users are hostile, this is part of the total picture of >> > defence-in-depth. >> > >> > -Tim >> > >> > On Sat, Jan 20, 2018 at 12:42 AM, Jonathan H wrote: >> >> Hello, >> >> >> >> I want to start recording with a prompt of "press or say 1 to 5". If >> >> no DMTF is pressed, I want to send the recording to Google Speech to >> >> get the number back (got that part working already). >> >> >> >> If any dtmf key is pressed while Application_Record is running with >> >> option y, then the recording terminates and sends >> >> RECORD_STATUS of "DTMF" (A terminating DTMF was received). >> >> >> >> But I need to know **what** number that DTMF was, and I can't see a >> >> way of grabbing it after the fact. >> >> >> >> I can see in the code where the right variables are.. >> >> >> >> https://github.com/asterisk/asterisk/blob/master/apps/app_record.c#L140 >> >> dtmf_response >> >> >> >> https://github.com/asterisk/asterisk/blob/master/apps/app_record.c#L166 >> >> * \param dtmf_integer the integer value of the DTMF key received >> >> >> >> So,3 questions I guess: >> >> >> >> 1: Am I going about this the right way? (unimrcp is not an option here) >> >> 2: Can someone explain in layman's terms how a simpleton like me could >> >> copy, hack about with and make a new module, like, for example, >> >> app_record_alt.c, that would stick around each time I updated Asterisk >> >> from source? >> >> 3: Or, is anyone willing to make the simple code change to the file to >> >> improve it to send back the DTMF to the dialplan? For free to improve >> >> core code? If not, and I posted on the commercial list, how much would >> >> I be looking at to modify about 6 lines of code and return an extra >> >> variable? >> >> >> >> So, ultimately, I'm hoping for something like: >> >> >> >> Currently: >> >> option "y" returns a RECORD_STATUS of "DTMF" if a key was press >> >> >> >> Hopefully: >> >> option "z" returns a RECORD_STATUS of <dtmf-value> showing which key >> >> was pressed. >> >> Or possibly even DTMF_VALUE (if an app can return two variables to the >> >> dialplan?) >> >> >> >> I'm sure this would benefit a lot of people. >> >> >> >> I posted this a few days ago in the forum at >> >> >> >> https://community.asterisk.org/t/can-anyone-help-with-a-quick-app-record >> >> -c-module-improvement-and-can-explain-over-riding-modules/73221 but >> >> no-one bit, so, I'm hoping this list can help. >> >> >> >> Many thanks! > > -- > Schr?dinger's rule of data integrity: the condition of any backup is unknown > until a restore is attempted. > > Please reply to the list; > please *don't* CC me. > > -- > _____________________________________________________________________ > -- Bandwidth and Colocation Provided by http://www.api-digital.com -- > > Check out the new Asterisk community forum at: https://community.asterisk.org/ > > New to Asterisk? Start here: > https://wiki.asterisk.org/wiki/display/AST/Getting+Started > > asterisk-users mailing list > To UNSUBSCRIBE or update options visit: > http://lists.digium.com/mailman/listinfo/asterisk-users
Jonathan H
2018-Jan-20 23:57 UTC
[asterisk-users] Can anyone help with a quick app_record.c module improvement and can explain over-riding modules?
On 20 January 2018 at 23:30, Tim S <tim.strommen at gmail.com> wrote:> I have seen this take over 2 seconds before on a sluggish machine.Thanks - my host uses SSD and everything seems pretty quick, but I'll give it a 1 second pause.> you'd need to pipe that to a Google Speech API tunnel. > That's probably not something you can hack away at with simple > Asterisk dialplan applications.Funnily enough, I had just found an old reply from last year to another similar question:> ---------- Forwarded message ---------- > From: Matt Riddell > Date: 22 September 2017 at 16:01 > Subject: Re: [asterisk-users] Asterisk 15, Jack, streams, speech recognition? so many questions! > At least in older versions you can use EAGI to get a handle to the audio stream.So I had a look and found this: https://stackoverflow.com/questions/34026698/asterisk-write-plugin-to-catch-voice-stream And read this: https://wiki.asterisk.org/wiki/display/AST/Asterisk+15+Application_EAGI There's a few knowledge gaps, but I think with a few days reading and the great help here, we might have a solution :) This is all very helpful - if anyone else feels like wading in, please do. Many thanks!