Asterisk Answering machine detection (AMD) always

2020-06-30 04:51发布

问题:

I am using Asterisk 1.8 on Ubuntu. the problem is however I change the amd.conf configurations AMD() call detects AMDSTATUS as MACHINE. Please guide me on the right settings for AMD detection if a person picks up phone and says 'Hi this is so and so' vs. machine picks up with a 10-19 minute message followed by a beep. I am willing to pay if some one can solve this for me.

Here is my amd.conf settings:

[general]
initial_silence = 2250          ; Maximum silence duration before the greeting.
                                ; If exceeded then MACHINE.
greeting = 15000                ; Maximum length of a greeting. If exceeded then MACHINE.
after_greeting_silence = 2250   ; Silence after detecting a greeting.
                                ; If exceeded then HUMAN
total_analysis_time = 25000     ; Maximum time allowed for the algorithm to decide
                                ; on a HUMAN or MACHINE
min_word_length = 300           ; Minimum duration of Voice to considered as a word
between_words_silence = 250     ; Minimum duration of silence after a word to consider
                                ; the audio what follows as a new word
maximum_number_of_words = 8     ; Maximum number of words in the greeting.
                                ; If exceeded then MACHINE
silence_threshold = 500


here is my extensions.conf setting for this extension:
[AMDTEST]
exten=> s,1,Answer()
exten=> s,n,AMD()
exten=> s,n,NoOp(${AMDSTATUS})
exten=> s,n,GotoIf($[${AMDSTATUS}=HUMAN]?humn:mach)
exten=> s,n(mach),WaitForSilence(3000,1,20)
exten=> s,n,Playback(${VOICEFILE})
exten=> s,n,Hangup()
exten=> s,n(humn),WaitForSilence(500)
exten=> s,n,Playback(${VOICEFILE})
exten=> s,n,Hangup()



Output in Asterisk debug when I picked up the call and said 'Hi its me here'
Starting SIP/Vitelity-00000f92 at AMDTEST,1400,1 failed so falling back to exten 's'
    -- Executing [s@AMDTEST:1] Answer("SIP/Vitelity-00000f92", "") in new stack
    -- Executing [s@AMDTEST:2] AMD("SIP/Vitelity-00000f92", "") in new stack
    -- AMD: SIP/Vitelity-00000f92 7702002111 (N/A) (Fmt: slin)
    -- AMD: initialSilence [2250] greeting [15000] afterGreetingSilence [2250] totalAnalysisTime [25000] minimumWordLength [300] betweenWordsSilence [250] maximumNumberOfWords [8] silenceThreshold [256] maximumWordLength [5000] 
    -- AMD: Channel [SIP/Vitelity-00000f92]. Changed state to STATE_IN_SILENCE
    -- AMD: Channel [SIP/Vitelity-00000f92]. ANSWERING MACHINE: silenceDuration:2300 initialSilence:2250
    -- Executing [s@AMDTEST:3] NoOp("SIP/Vitelity-00000f92", "MACHINE") in new stack
    -- Executing [s@AMDTEST:4] GotoIf("SIP/Vitelity-00000f92", "0?humn:mach") in new stack
    -- Goto (AMDTEST,s,5)
    -- Executing [s@AMDTEST:5] WaitForSilence("SIP/Vitelity-00000f92", "3000,1,20") in new stack
    -- Waiting 1 time(s) for 3000 ms silence with 20 timeout
    -- Exiting with 3000ms silence >= 3000ms required
    -- Executing [s@AMDTEST:6] Playback("SIP/Vitelity-00000f92", "KC_TNA") in new stack
    -- <SIP/Vitelity-00000f92> Playing 'KC_TNA.gsm' (language 'en')
  == Spawn extension (AMDTEST, s, 6) exited non-zero on 'SIP/Vitelity-00000f92'

回答1:

I know its bit old post. As per my experience, It is related to the initial_silence value and total_analysis_time value. Set the following:

 initial_silence=5100
 total_analysis_time=5000

That allows your algorithm to detect the answer machine in a right way.



回答2:

you are very right, problem is I am not that experienced with Asterisk AMD. But after a lot of reading and trial and error I got this working fine ( atleast 80%). Most critical thing was adding background command before calling AMD(). key factors : 1. Make sure to ahve Initial silence setting atleast 3-4 seconds ( humans respond faster than machines) 2. Make sure you give enough time for greeting ( typical human greeting finishes in 2-3 seconds) 3. fine tune wait for silence after detecting machine based on experience

Here is the extension config:

     [AMDTEST]
exten=> s,1,Answer()
exten=> s,2,Background(en_US/silence/1)
exten=> s,n,AMD()
exten=> s,n,NoOp(${AMDSTATUS})
exten=> s,n,GotoIf($[${AMDSTATUS}=HUMAN]?humn:mach)
exten=> s,n(mach),WaitForSilence(4500,2,16)
exten=> s,n,Playback(${VOICEFILE})
exten=> s,n,Hangup()
exten=> s,n(humn),Playback(${VOICEFILE})
exten=> s,n,Hangup()</code>

Amd.conf:
[general]
initial_silence = 4000      ; Maximum silence duration before the greeting.
                ; If exceeded then MACHINE.
greeting = 9000         ; Maximum length of a greeting. If exceeded then
 MACHINE.
after_greeting_silence = 2250   ; Silence after detecting a greeting.
                ; If exceeded then HUMAN
total_analysis_time = 15000 ; Maximum time allowed for the algorithm to deci
de
                ; on a HUMAN or MACHINE
min_word_length = 100       ; Minimum duration of Voice to considered as a w
ord
between_words_silence = 50  ; Minimum duration of silence after a word to co
nsider
                ; the audio what follows as a new word
maximum_number_of_words = 5 ; Maximum number of words in the greeting.
                ; If exceeded then MACHINE
silence_threshold = 256


回答3:

You detection reason is described by this line:

ANSWERING MACHINE: silenceDuration:2300 initialSilence:2250

So you have increase initial sielence param or maybe ajust treshhold. It is almost imposible to got correct answer without recordin of call.



回答4:

I want to share the observation. If you use call files - you need to have Background after Answer in your "IN LEG", otherwise AMD will not work

[CALLFILES-IN]
exten=> s,1,Answer()
exten=> s,2,Background(en/silence/1)
exten=> s,n,AMD()


标签: asterisk