Skip to main content

detect_machine

A detection method that combines AMD (Answering Machine Detection) and fax detection. Detect whether the user on the other end of the call is a machine (fax, voicemail, etc.) or a human. The detection result(s) will be sent to the specified status_url as a POST request and will also be saved in the detect_result variable.

NameTypeDefaultDescription
detect_machineRequiredobject-An object that accepts the detect_machine parameters.

detect_machine parameters

NameTypeDefaultDescription
detect_message_endOptionalbooleanfalseIf true, stops detection on beep / end of voicemail greeting.
detectorsOptionalstringamd,faxComma-separated string of detectors to enable. Valid Values: amd, fax
end_silence_timeoutOptionalnumber1.0How long to wait for voice activity to finish (in seconds).
initial_timeoutOptionalnumber4.5How long to wait for initial voice activity before giving up (in seconds).
machine_ready_timeoutOptionalnumberThe value of end_silence_timeoutHow long to wait for voice activity to finish before firing the READY event (in seconds).
machine_voice_thresholdOptionalnumber1.25The number of seconds of ongoing voice activity required to classify as MACHINE.
machine_words_thresholdOptionalinteger6The minimum number of words that must be detected in a single utterance before classifying the call as MACHINE.
status_urlOptionalstring-The HTTP(S) URL to deliver detector events to. Learn more about status callbacks.
timeoutOptionalnumber30.0The maximum time to run the detector (in seconds).
toneOptionalstringCEDThe tone to detect. Only the remote side tone will be received. (CED or CNG) Used for fax detection.
waitOptionalbooleantrueIf false, the detector will run asynchronously and status_url must be set. If true, the detector will wait for detection to complete before moving to the next SMWL instruction.

Variables

The following variables are available after the detect_machine method is executed and detection is complete. You can reference these variables in your SMWL script utilizing the %{variable} syntax.

VariableDirectionTypeDescription
detect_resultouthuman | machine | fax | unknownThe result of detection.
detect_machine_beepouttrue | falseWhether a beep was detected. true if detected.
detect_msoutintegerThe number of milliseconds the detection took.

StatusCallbacks

A POST request will be sent to status_url with a JSON payload like the following:

FieldTypeDescription
event_typestringThe type of event, always calling.call.detect for this method.
event_channelstringThe channel for the event, includes the SWML session ID.
timestampnumberUnix timestamp (float) when the event was generated.
project_idstringThe project ID associated with the call.
space_idstringThe space ID associated with the call.
params.control_idstringThe control ID for this detect operation.
params.detectobjectDetection result details (see subfields below).
params.detect.typestringThe type of detection. Valid values: machine or fax.
params.detect.params.eventstringThe detection result. Valid values: HUMAN, MACHINE, FAX, UNKNOWN, finished.
params.call_idstringThe call ID.
params.node_idstringThe node handling the call.
params.segment_idstringThe segment ID for this part of the call.

Raw JSON example

{
"event_type": "calling.call.detect",
"event_channel": "swml:be38xxxx-8xxx-4xxxx-9fxx-bxxxxxxxxx",
"timestamp": 1745332535.668522,
"project_id": "xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"space_id": "xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"params": {
"control_id": "xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"detect": {
"type": "machine",
"params": {
"event": "HUMAN"
}
},
"call_id": "xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"node_id": "xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"segment_id": "xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}

Examples

Play the detection result

version: 1.0.0
sections:
main:
- detect_machine:
status_url: 'https://example.com/detect-events'
timeout: 20
- play:
url: 'say:Detection result: %{detect_result}'

Conditional actions based on the detection result

version: 1.0.0
sections:
main:
- play:
url: "say: Welcome to the machine detection test."
- detect_machine:
status_url: "https://webhook.site/5c8abf82-b8c7-41c8-b5d6-b32a40068109"
detectors: "amd,fax"
wait: true
- cond:
- when: detect_result == 'machine'
then:
- play:
url: "say: You are a machine, goodbye."
- hangup: {}
- when: detect_result == 'human'
then:
- play:
url: "say: You are a human, hello."
- hangup: {}
- when: detect_result == 'fax'
then:
- play:
url: "say: You are a fax, goodbye."
- hangup: {}
- else:
- play:
url: "say: Unable to determine if you are a human, machine, or fax, goodbye. Result was %{detect_result}"
- hangup: {}