Compare commits

..

1 Commits

Author SHA1 Message Date
Quan HL
e557b9ac3d add support for dual streams in rest:dial 2023-09-20 14:16:45 +07:00
6 changed files with 28 additions and 371 deletions

View File

@@ -1,4 +1,4 @@
# verb-specifications
# verb-specificiations
Jambonz Verb Specification Utilities
#### Running the test suite

View File

@@ -58,8 +58,7 @@ function validateVerb(name, data, logger) {
const dSpec = specData.properties[dKey];
debug(`Task:validate validating property ${dKey} with value ${JSON.stringify(dVal)}`);
if (typeof dVal === 'undefined') continue;
else if (typeof dSpec === 'string' && dSpec === 'array') {
if (typeof dSpec === 'string' && dSpec === 'array') {
if (!Array.isArray(dVal)) throw new Error(`${name}: property ${dKey} is not an array`);
}
else if (typeof dSpec === 'string' && dSpec.includes('|')) {

28
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{
"name": "@jambonz/verb-specifications",
"version": "0.0.72",
"version": "0.0.34",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@jambonz/verb-specifications",
"version": "0.0.72",
"version": "0.0.34",
"license": "MIT",
"dependencies": {
"debug": "^4.3.4",
@@ -2011,9 +2011,9 @@
}
},
"node_modules/semver": {
"version": "7.6.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
"integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
"version": "7.3.8",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
"integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
"dev": true,
"dependencies": {
"lru-cache": "^6.0.0"
@@ -2446,9 +2446,9 @@
}
},
"node_modules/word-wrap": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
"integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
"integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
"dev": true,
"engines": {
"node": ">=0.10.0"
@@ -3922,9 +3922,9 @@
"integrity": "sha512-gMxvPJYhP0O9n2pvcfYfIuYgbledAOJFcqRThtPRmjscaipiwcwPPKLytpVzMkG2HAN87Qmo2d4PtGiri1dSLA=="
},
"semver": {
"version": "7.6.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
"integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
"version": "7.3.8",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
"integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
"dev": true,
"requires": {
"lru-cache": "^6.0.0"
@@ -4253,9 +4253,9 @@
}
},
"word-wrap": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
"integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
"integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
"dev": true
},
"wrappy": {

View File

@@ -1,6 +1,6 @@
{
"name": "@jambonz/verb-specifications",
"version": "0.0.72",
"version": "0.0.34",
"description": "Jambonz Verb Specification Utilities",
"main": "index.js",
"scripts": {

View File

@@ -1,11 +1,4 @@
{
"answer": {
"properties": {
"id": "string"
},
"required": [
]
},
"sip:decline": {
"properties": {
"id": "string",
@@ -50,29 +43,13 @@
"bargeIn": "#bargeIn",
"record": "#recordOptions",
"listen": "#listenOptions",
"transcribe": "#transcribeOptions",
"amd": "#amd",
"fillerNoise": "#fillerNoise",
"notifyEvents": "boolean",
"reset": "string|array",
"onHoldMusic": "string",
"actionHookDelayAction": "#actionHookDelayAction",
"sipRequestWithinDialogHook": "object|string",
"boostAudioSignal": "number|string",
"vad":"#vad"
"onHoldMusic": "string"
},
"required": []
},
"fillerNoise": {
"properties": {
"enable": "boolean",
"url": "string",
"startDelaySecs": "number"
},
"required": [
"enable"
]
},
"listenOptions": {
"properties": {
"enable": "boolean",
@@ -88,7 +65,6 @@
"passDtmf": "boolean",
"playBeep": "boolean",
"disableBidirectionalAudio": "boolean",
"bidirectionalAudio": "#bidirectionalAudio",
"timeout": "number"
},
"required": [
@@ -100,7 +76,6 @@
"enable": "boolean",
"sticky": "boolean",
"actionHook": "object|string",
"partialResultHook": "object|string",
"input": "array",
"finishOnKey": "string",
"numDigits": "number",
@@ -114,34 +89,6 @@
"enable"
]
},
"transcribeOptions": {
"properties": {
"enable": "boolean",
"transcriptionHook": "string",
"recognizer": "#recognizer"
},
"required": [
"enable"
]
},
"dub": {
"properties": {
"id": "string",
"action": {
"type": "string",
"enum": ["addTrack", "removeTrack", "silenceTrack", "playOnTrack", "sayOnTrack"]
},
"track": "string",
"play": "string",
"say": "string|object",
"loop": "boolean",
"gain": "number|string"
},
"required": [
"action",
"track"
]
},
"dequeue": {
"properties": {
"id": "string",
@@ -227,9 +174,7 @@
"timeout": "number",
"recognizer": "#recognizer",
"play": "#play",
"say": "#say",
"fillerNoise": "#fillerNoise",
"actionHookDelayAction": "#actionHookDelayAction"
"say": "#say"
},
"required": [
]
@@ -239,8 +184,6 @@
"id": "string",
"name": "string",
"beep": "boolean",
"memberTag": "string",
"speakOnlyTo": "string",
"startConferenceOnEnter": "boolean",
"endConferenceOnExit": "boolean",
"endConferenceDuration": "number",
@@ -272,16 +215,13 @@
"dtmfHook": "object|string",
"headers": "object",
"anchorMedia": "boolean",
"boostAudioSignal": "number|string",
"listen": "#listen",
"target": ["#target"],
"timeLimit": "number",
"timeout": "number",
"proxy": "string",
"transcribe": "#transcribe",
"amd": "#amd",
"dub": ["#dub"],
"tag": "object"
"amd": "#amd"
},
"required": [
"target"
@@ -366,7 +306,6 @@
"passDtmf": "boolean",
"playBeep": "boolean",
"disableBidirectionalAudio": "boolean",
"bidirectionalAudio": "#bidirectionalAudio",
"sampleRate": "number",
"timeout": "number",
"transcribe": "#transcribe",
@@ -469,8 +408,7 @@
"headers": "object",
"timeout": "number",
"amd": "#amd",
"dual_streams": "boolean",
"sipRequestWithinDialogHook": "string"
"dual_streams" : "boolean"
},
"required": [
"call_hook",
@@ -492,8 +430,7 @@
"id": "string",
"transcriptionHook": "string",
"recognizer": "#recognizer",
"earlyMedia": "boolean",
"channel": "number"
"earlyMedia": "boolean"
},
"required": [
"transcriptionHook"
@@ -519,8 +456,7 @@
"vmail": "boolean",
"tenant": "string",
"trunk": "string",
"overrideTo": "string",
"proxy": "string"
"overrideTo": "string"
},
"required": [
"type"
@@ -549,11 +485,11 @@
"vendor": "string",
"label": "string",
"language": "string",
"voice": "string|object",
"voice": "string",
"fallbackVendor": "string",
"fallbackLabel": "string",
"fallbackLanguage": "string",
"fallbackVoice": "string|object",
"fallbackVoice": "string",
"engine": {
"type": "string",
"enum": ["standard", "neural"]
@@ -645,12 +581,7 @@
"nvidiaOptions": "#nvidiaOptions",
"sonioxOptions": "#sonioxOptions",
"cobaltOptions": "#cobaltOptions",
"awsOptions": "#awsOptions",
"azureOptions": "#azureOptions",
"assemblyAiOptions": "#assemblyAiOptions",
"googleOptions": "#googleOptions",
"customOptions": "#customOptions",
"verbioOptions": "#verbioOptions"
"customOptions": "#customOptions"
},
"required": [
"vendor"
@@ -665,59 +596,6 @@
"required": [
]
},
"awsOptions": {
"properties": {
"accessKey": "string",
"secretKey": "string",
"securityToken": "string",
"region": "string",
"vocabularyName": "string",
"vocabularyFilterName": "string",
"vocabularyFilterMethod": {
"type": "string",
"enum": [
"remove",
"mask",
"tag"
]
},
"languageModelName": "string",
"piiEntityTypes": "array",
"piiIdentifyEntities": "boolean"
},
"required": [
]
},
"azureOptions": {
"properties": {
"speechSegmentationSilenceTimeoutMs": "number",
"languageIdMode": {
"type": "string",
"enum": [
"AtStart",
"Continuous"
]
}
},
"required": [
]
},
"googleOptions" : {
"properties": {
"serviceVersion": {
"type": "string",
"enum": [
"v1",
"v2"
]
},
"recognizerId": "string",
"speechStartTimeoutMs": "number",
"speechEndTimeoutMs": "number",
"enableVoiceActivityEvents": "boolean",
"transcriptNormalization": "array"
}
},
"cobaltOptions": {
"properties": {
"serverUri": "string",
@@ -762,15 +640,12 @@
},
"deepgramOptions": {
"properties": {
"deepgramSttUri": "string",
"deepgramSttUseTls": "boolean",
"apiKey": "string",
"tier": "string",
"model": "string",
"customModel": "string",
"version": "string",
"punctuate": "boolean",
"smartFormatting": "boolean",
"profanityFilter": "boolean",
"redact": {
"type": "string",
@@ -791,8 +666,6 @@
"replace": "array",
"keywords": "array",
"endpointing": "boolean | number",
"utteranceEndMs": "number",
"shortUtterance": "boolean",
"vadTurnoff": "number",
"tag": "string"
}
@@ -810,21 +683,6 @@
"required": [
]
},
"verbioOptions": {
"properties": {
"enable_formatting": "boolean",
"enable_diarization": "boolean",
"topic": "number",
"inline_grammar": "string",
"grammar_uri": "string",
"label": "string",
"recognition_timeout": "number",
"speech_complete_timeout": "number",
"speech_incomplete_timeout": "number"
},
"required": [
]
},
"sonioxStorage": {
"properties": {
"id": "string",
@@ -882,11 +740,6 @@
"required": [
]
},
"assemblyAiOptions": {
"properties": {
"apiKey": "string"
}
},
"resource": {
"properties": {
"externalReference": "#resourceReference",
@@ -963,8 +816,6 @@
"properties": {
"enable": "boolean",
"voiceMs": "number",
"silenceMs": "number",
"strategy": "string",
"mode": "number"
},
"required": [
@@ -989,21 +840,5 @@
"toneTimeoutMs": "number",
"greetingCompletionTimeoutMs": "number"
}
},
"actionHookDelayAction" : {
"properties": {
"enabled": "boolean",
"noResponseTimeout": "number",
"noResponseGiveUpTimeout": "number",
"retries": "number",
"actions": "array"
}
},
"bidirectionalAudio" : {
"properties": {
"enabled": "boolean",
"streaming": "boolean",
"sampleRate": "number"
}
}
}
}

View File

@@ -37,60 +37,7 @@ test("validate correct verbs", async (t) => {
"input" : ["speech"],
"actionHook": "/userInput"
},
"transcribe": {
"enable": true,
"transcriptionHook": "http://server.com/hook",
"recognizer": {
"vendor": "google",
"language": "de-DE",
}
},
"onHoldMusic": "http://server.com/hold",
"actionHookDelayAction": {
"enabled": true,
"noResponseTimeout": 5,
"noResponseGiveUpTimeout": 10,
"retries": 3,
"actions": [
{
"verb": "say",
"text": "To speak to Sales press 1 or say Sales. To speak to customer support press 2 or say Support",
"synthesizer": {
"vendor": "google",
"language": "en-US"
}
},
{
"verb": "play",
"url": "https://example.com/example.mp3",
"timeoutSecs": 10,
"seekOffset": 8000,
"actionHook": "/play/action"
}
]
}
},
{
"verb": "config",
"recognizer": {
"vendor": "google",
"language": "de-DE",
"label": "label1",
"assemblyAiOptions": {
"apiKey": "apikey"
}
}
},
{
"verb": "config",
"recognizer": {
"vendor": "google",
"language": "de-DE",
"label": "label1",
"azureOptions": {
"languageIdMode": "Continuous"
}
}
"onHoldMusic": "http://server.com/hold"
},
{
"verb": "config",
@@ -103,10 +50,6 @@ test("validate correct verbs", async (t) => {
}
}
},
{
"verb": "config",
"sipRequestWithinDialogHook": "https://jambonz.or/sipIndialogActionHook"
},
{
"verb": "config",
"record": {
@@ -208,51 +151,8 @@ test("validate correct verbs", async (t) => {
"fallbackLabel": "label1",
"fallbackVoice": "voice"
}
},
"say": {
"text": "To speak to Sales press 1 or say Sales. To speak to customer support press 2 or say Support",
"synthesizer": {
"vendor": "google",
"language": "en-US",
"voice": {
"reportedUsage":"REALTIME",
"model":"path/to/model",
},
"fallbackVendor": "google",
"fallbackLanguage": "en-US",
"fallbackLabel": "label1",
"fallbackVoice": {
"reportedUsage":"REALTIME",
"model":"path/to/model",
}
}
}
},
{
"verb": "gather",
"actionHook": "http://example.com/collect",
"input": ["digits", "speech"],
"bargein": true,
"dtmfBargein": true,
"finishOnKey": "#",
"numDigits": 5,
"timeout": 8,
"recognizer": {
"vendor": "verbio",
"language": "en-US",
"verbioOptions": {
"enable_formatting": true,
"enable_diarization": true,
"topic": 0,
"inline_grammar": "this is inline grammar",
"grammar_uri": "https://grammar_uri.com",
"label": "label",
"recognition_timeout": 500,
"speech_complete_timeout": 500,
"speech_incomplete_timeout": 500,
}
},
},
{
"verb": "gather",
"actionHook": "http://example.com/collect",
@@ -274,28 +174,6 @@ test("validate correct verbs", async (t) => {
"endpointing": true
}
},
"actionHookDelayAction": {
"noResponseTimeout": 5,
"noResponseGiveUpTimeout": 10,
"retries": 3,
"actions": [
{
"verb": "say",
"text": "To speak to Sales press 1 or say Sales. To speak to customer support press 2 or say Support",
"synthesizer": {
"vendor": "google",
"language": "en-US"
}
},
{
"verb": "play",
"url": "https://example.com/example.mp3",
"timeoutSecs": 10,
"seekOffset": 8000,
"actionHook": "/play/action"
}
]
}
},
{
"verb": "hangup",
@@ -339,39 +217,6 @@ test("validate correct verbs", async (t) => {
"url": "wss://myrecorder.example.com/calls",
"mixType" : "stereo"
},
{
"verb": "listen",
"url": "wss://myrecorder.example.com/calls",
"mixType" : "stereo",
"bidirectionalAudio": {
enabled: true,
streaming: true,
sampleRate: 8000
}
},
{
"verb": "config",
"listen": {
"enable": true,
"url": "wss://myrecorder.example.com/calls",
"mixType" : "stereo",
"bidirectionalAudio": {
enabled: true,
streaming: true,
sampleRate: 8000
}
}
},
{
"verb": "config",
"vad": {
"enable": true,
"voiceMs": 250,
"silenceMs": 150,
"strategy": "one-shot",
"mode": 2
}
},
{
"verb": "message",
"to": "15083084809",
@@ -447,28 +292,6 @@ test("validate correct verbs", async (t) => {
"interim": true
}
},
{
"verb": "transcribe",
"transcriptionHook": "http://example.com/transcribe",
"recognizer": {
"vendor": "nvidia",
"language" : "en-US",
"interim": true,
"googleOptions": {
"serviceVersion": "v2",
"speechStartTimeoutMs": 500,
"speechEndTimeoutMs": 1000,
"enableVoiceActivityEvents": true,
"transcriptNormalization" : [
{
"search": "dog",
"replace": "cat",
"case_sensitive": true
}
]
}
}
},
{
"verb": "rest:dial",
"account_sid": "1291964182631236912836123912",