aillom-vox-client 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +15 -0
- package/README.md +272 -0
- package/dist/AillomVox.d.ts +36 -0
- package/dist/AillomVox.js +152 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +18 -0
- package/dist/types.d.ts +36 -0
- package/dist/types.js +2 -0
- package/docs/ASTERISK.md +411 -0
- package/docs/PROTOCOL.md +156 -0
- package/docs/PROVIDERS.md +40 -0
- package/docs/TOOLS.md +314 -0
- package/docs/TROUBLESHOOTING.md +86 -0
- package/docs/VOICES.md +219 -0
- package/docs/providers/AILLOMVOX.md +185 -0
- package/docs/providers/AWS.md +32 -0
- package/docs/providers/GEMINI.md +33 -0
- package/docs/providers/GROK.md +25 -0
- package/docs/providers/OPENAI.md +39 -0
- package/docs/providers/QWEN.md +27 -0
- package/docs/providers/ULTRAVOX.md +29 -0
- package/examples/01-basic/app.js +196 -0
- package/examples/01-basic/index.html +27 -0
- package/examples/02-advanced-dashboard/app.js +465 -0
- package/examples/02-advanced-dashboard/index.html +200 -0
- package/examples/02-advanced-dashboard/style.css +501 -0
- package/examples/03-smart-home/index.html +377 -0
- package/examples/04-customer-support/index.html +474 -0
- package/examples/sdk-usage.ts +44 -0
- package/integrations/n8n-nodes-aillomvox/README.md +56 -0
- package/integrations/n8n-nodes-aillomvox/credentials/AillomVoxApi.credentials.ts +29 -0
- package/integrations/n8n-nodes-aillomvox/dist/credentials/AillomVoxApi.credentials.js +30 -0
- package/integrations/n8n-nodes-aillomvox/dist/nodes/AillomVox/AillomVox.node.js +219 -0
- package/integrations/n8n-nodes-aillomvox/dist/nodes/AillomVox/aillomvox.svg +6 -0
- package/integrations/n8n-nodes-aillomvox/gulpfile.js +10 -0
- package/integrations/n8n-nodes-aillomvox/nodes/AillomVox/AillomVox.node.ts +229 -0
- package/integrations/n8n-nodes-aillomvox/nodes/AillomVox/aillomvox.svg +6 -0
- package/integrations/n8n-nodes-aillomvox/package-lock.json +11741 -0
- package/integrations/n8n-nodes-aillomvox/package.json +56 -0
- package/integrations/n8n-nodes-aillomvox/tsconfig.json +32 -0
- package/package.json +55 -0
- package/src/AillomVox.ts +169 -0
- package/src/index.ts +2 -0
- package/src/types.ts +50 -0
- package/tsconfig.json +23 -0
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AillomVox = void 0;
|
|
4
|
+
class AillomVox {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.description = {
|
|
7
|
+
displayName: 'AillomVox',
|
|
8
|
+
name: 'aillomVox',
|
|
9
|
+
icon: 'file:aillomvox.svg',
|
|
10
|
+
group: ['transform'],
|
|
11
|
+
version: 1,
|
|
12
|
+
subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}',
|
|
13
|
+
description: 'Interact with AillomVox API (Voices, Providers, Recordings)',
|
|
14
|
+
defaults: {
|
|
15
|
+
name: 'AillomVox',
|
|
16
|
+
},
|
|
17
|
+
inputs: ['main'],
|
|
18
|
+
outputs: ['main'],
|
|
19
|
+
credentials: [
|
|
20
|
+
{
|
|
21
|
+
name: 'aillomVoxApi',
|
|
22
|
+
required: true,
|
|
23
|
+
},
|
|
24
|
+
],
|
|
25
|
+
properties: [
|
|
26
|
+
{
|
|
27
|
+
displayName: 'Resource',
|
|
28
|
+
name: 'resource',
|
|
29
|
+
type: 'options',
|
|
30
|
+
noDataExpression: true,
|
|
31
|
+
options: [
|
|
32
|
+
{
|
|
33
|
+
name: 'Info',
|
|
34
|
+
value: 'info',
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
name: 'Recording',
|
|
38
|
+
value: 'recording',
|
|
39
|
+
},
|
|
40
|
+
],
|
|
41
|
+
default: 'info',
|
|
42
|
+
},
|
|
43
|
+
// ----------------------------------
|
|
44
|
+
// Resource: Info
|
|
45
|
+
// ----------------------------------
|
|
46
|
+
{
|
|
47
|
+
displayName: 'Operation',
|
|
48
|
+
name: 'operation',
|
|
49
|
+
type: 'options',
|
|
50
|
+
noDataExpression: true,
|
|
51
|
+
displayOptions: {
|
|
52
|
+
show: {
|
|
53
|
+
resource: [
|
|
54
|
+
'info',
|
|
55
|
+
],
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
options: [
|
|
59
|
+
{
|
|
60
|
+
name: 'Get Voices',
|
|
61
|
+
value: 'getVoices',
|
|
62
|
+
description: 'Returns the list of available voices',
|
|
63
|
+
action: 'Get voices',
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
name: 'Get Providers',
|
|
67
|
+
value: 'getProviders',
|
|
68
|
+
description: 'Returns the list of AI providers and pricing',
|
|
69
|
+
action: 'Get providers',
|
|
70
|
+
},
|
|
71
|
+
],
|
|
72
|
+
default: 'getVoices',
|
|
73
|
+
},
|
|
74
|
+
// ----------------------------------
|
|
75
|
+
// Resource: Recording
|
|
76
|
+
// ----------------------------------
|
|
77
|
+
{
|
|
78
|
+
displayName: 'Operation',
|
|
79
|
+
name: 'operation',
|
|
80
|
+
type: 'options',
|
|
81
|
+
noDataExpression: true,
|
|
82
|
+
displayOptions: {
|
|
83
|
+
show: {
|
|
84
|
+
resource: [
|
|
85
|
+
'recording',
|
|
86
|
+
],
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
options: [
|
|
90
|
+
{
|
|
91
|
+
name: 'Get Download URL',
|
|
92
|
+
value: 'getDownloadUrl',
|
|
93
|
+
description: 'Generates a temporary link to download the recording',
|
|
94
|
+
action: 'Get download url',
|
|
95
|
+
},
|
|
96
|
+
],
|
|
97
|
+
default: 'getDownloadUrl',
|
|
98
|
+
},
|
|
99
|
+
// ----------------------------------
|
|
100
|
+
// Fields: getVoices
|
|
101
|
+
// ----------------------------------
|
|
102
|
+
{
|
|
103
|
+
displayName: 'Provider (Optional)',
|
|
104
|
+
name: 'provider',
|
|
105
|
+
type: 'options',
|
|
106
|
+
displayOptions: {
|
|
107
|
+
show: {
|
|
108
|
+
resource: [
|
|
109
|
+
'info',
|
|
110
|
+
],
|
|
111
|
+
operation: [
|
|
112
|
+
'getVoices',
|
|
113
|
+
],
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
options: [
|
|
117
|
+
{
|
|
118
|
+
name: 'AillomVox (Default)',
|
|
119
|
+
value: 'aillomvox',
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
name: 'ElevenLabs',
|
|
123
|
+
value: 'elevenlabs',
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
name: 'PlayHT',
|
|
127
|
+
value: 'playht',
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
name: 'Inworld',
|
|
131
|
+
value: 'inworld',
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
name: 'Azure',
|
|
135
|
+
value: 'azure',
|
|
136
|
+
},
|
|
137
|
+
],
|
|
138
|
+
default: 'aillomvox',
|
|
139
|
+
description: 'Filter voices by specific provider',
|
|
140
|
+
},
|
|
141
|
+
// ----------------------------------
|
|
142
|
+
// Fields: getDownloadUrl
|
|
143
|
+
// ----------------------------------
|
|
144
|
+
{
|
|
145
|
+
displayName: 'Recording ID',
|
|
146
|
+
name: 'recordingId',
|
|
147
|
+
type: 'string',
|
|
148
|
+
default: '',
|
|
149
|
+
required: true,
|
|
150
|
+
displayOptions: {
|
|
151
|
+
show: {
|
|
152
|
+
resource: [
|
|
153
|
+
'recording',
|
|
154
|
+
],
|
|
155
|
+
operation: [
|
|
156
|
+
'getDownloadUrl',
|
|
157
|
+
],
|
|
158
|
+
},
|
|
159
|
+
},
|
|
160
|
+
description: 'The recording ID (UUID) or the S3/Supabase file path',
|
|
161
|
+
},
|
|
162
|
+
],
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
async execute() {
|
|
166
|
+
const items = this.getInputData();
|
|
167
|
+
const returnData = [];
|
|
168
|
+
const resource = this.getNodeParameter('resource', 0);
|
|
169
|
+
const operation = this.getNodeParameter('operation', 0);
|
|
170
|
+
for (let i = 0; i < items.length; i++) {
|
|
171
|
+
try {
|
|
172
|
+
if (resource === 'info') {
|
|
173
|
+
if (operation === 'getVoices') {
|
|
174
|
+
const provider = this.getNodeParameter('provider', i);
|
|
175
|
+
const qs = {};
|
|
176
|
+
if (provider) {
|
|
177
|
+
qs.provider = provider;
|
|
178
|
+
}
|
|
179
|
+
const response = await this.helpers.requestWithAuthentication.call(this, 'aillomVoxApi', {
|
|
180
|
+
method: 'GET',
|
|
181
|
+
uri: '/api/voices',
|
|
182
|
+
qs,
|
|
183
|
+
json: true,
|
|
184
|
+
});
|
|
185
|
+
returnData.push(response);
|
|
186
|
+
}
|
|
187
|
+
else if (operation === 'getProviders') {
|
|
188
|
+
const response = await this.helpers.requestWithAuthentication.call(this, 'aillomVoxApi', {
|
|
189
|
+
method: 'GET',
|
|
190
|
+
uri: '/api/providers',
|
|
191
|
+
json: true,
|
|
192
|
+
});
|
|
193
|
+
returnData.push(response);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
else if (resource === 'recording') {
|
|
197
|
+
if (operation === 'getDownloadUrl') {
|
|
198
|
+
const recordingId = this.getNodeParameter('recordingId', i);
|
|
199
|
+
const response = await this.helpers.requestWithAuthentication.call(this, 'aillomVoxApi', {
|
|
200
|
+
method: 'GET',
|
|
201
|
+
uri: `/api/recording/${recordingId}`,
|
|
202
|
+
json: true,
|
|
203
|
+
});
|
|
204
|
+
returnData.push(response);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
catch (error) {
|
|
209
|
+
if (this.continueOnFail()) {
|
|
210
|
+
returnData.push({ error: error.message });
|
|
211
|
+
continue;
|
|
212
|
+
}
|
|
213
|
+
throw error;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return [this.helpers.returnJsonArray(returnData)];
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
exports.AillomVox = AillomVox;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
|
|
2
|
+
<circle cx="50" cy="50" r="45" fill="#4A90E2" />
|
|
3
|
+
<path d="M30 50 Q50 20 70 50 T30 50" stroke="white" stroke-width="5" fill="none" />
|
|
4
|
+
<circle cx="30" cy="50" r="5" fill="white" />
|
|
5
|
+
<circle cx="70" cy="50" r="5" fill="white" />
|
|
6
|
+
</svg>
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import {
|
|
2
|
+
IExecuteFunctions,
|
|
3
|
+
IDataObject,
|
|
4
|
+
INodeExecutionData,
|
|
5
|
+
INodeType,
|
|
6
|
+
INodeTypeDescription,
|
|
7
|
+
} from 'n8n-workflow';
|
|
8
|
+
|
|
9
|
+
export class AillomVox implements INodeType {
|
|
10
|
+
description: INodeTypeDescription = {
|
|
11
|
+
displayName: 'AillomVox',
|
|
12
|
+
name: 'aillomVox',
|
|
13
|
+
icon: 'file:aillomvox.svg',
|
|
14
|
+
group: ['transform'],
|
|
15
|
+
version: 1,
|
|
16
|
+
subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}',
|
|
17
|
+
description: 'Interact with AillomVox API (Voices, Providers, Recordings)',
|
|
18
|
+
defaults: {
|
|
19
|
+
name: 'AillomVox',
|
|
20
|
+
},
|
|
21
|
+
inputs: ['main'],
|
|
22
|
+
outputs: ['main'],
|
|
23
|
+
credentials: [
|
|
24
|
+
{
|
|
25
|
+
name: 'aillomVoxApi',
|
|
26
|
+
required: true,
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
properties: [
|
|
30
|
+
{
|
|
31
|
+
displayName: 'Resource',
|
|
32
|
+
name: 'resource',
|
|
33
|
+
type: 'options',
|
|
34
|
+
noDataExpression: true,
|
|
35
|
+
options: [
|
|
36
|
+
{
|
|
37
|
+
name: 'Info',
|
|
38
|
+
value: 'info',
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
name: 'Recording',
|
|
42
|
+
value: 'recording',
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
default: 'info',
|
|
46
|
+
},
|
|
47
|
+
|
|
48
|
+
// ----------------------------------
|
|
49
|
+
// Resource: Info
|
|
50
|
+
// ----------------------------------
|
|
51
|
+
{
|
|
52
|
+
displayName: 'Operation',
|
|
53
|
+
name: 'operation',
|
|
54
|
+
type: 'options',
|
|
55
|
+
noDataExpression: true,
|
|
56
|
+
displayOptions: {
|
|
57
|
+
show: {
|
|
58
|
+
resource: [
|
|
59
|
+
'info',
|
|
60
|
+
],
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
options: [
|
|
64
|
+
{
|
|
65
|
+
name: 'Get Voices',
|
|
66
|
+
value: 'getVoices',
|
|
67
|
+
description: 'Returns the list of available voices',
|
|
68
|
+
action: 'Get voices',
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
name: 'Get Providers',
|
|
72
|
+
value: 'getProviders',
|
|
73
|
+
description: 'Returns the list of AI providers and pricing',
|
|
74
|
+
action: 'Get providers',
|
|
75
|
+
},
|
|
76
|
+
],
|
|
77
|
+
default: 'getVoices',
|
|
78
|
+
},
|
|
79
|
+
|
|
80
|
+
// ----------------------------------
|
|
81
|
+
// Resource: Recording
|
|
82
|
+
// ----------------------------------
|
|
83
|
+
{
|
|
84
|
+
displayName: 'Operation',
|
|
85
|
+
name: 'operation',
|
|
86
|
+
type: 'options',
|
|
87
|
+
noDataExpression: true,
|
|
88
|
+
displayOptions: {
|
|
89
|
+
show: {
|
|
90
|
+
resource: [
|
|
91
|
+
'recording',
|
|
92
|
+
],
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
options: [
|
|
96
|
+
{
|
|
97
|
+
name: 'Get Download URL',
|
|
98
|
+
value: 'getDownloadUrl',
|
|
99
|
+
description: 'Generates a temporary link to download the recording',
|
|
100
|
+
action: 'Get download url',
|
|
101
|
+
},
|
|
102
|
+
],
|
|
103
|
+
default: 'getDownloadUrl',
|
|
104
|
+
},
|
|
105
|
+
|
|
106
|
+
// ----------------------------------
|
|
107
|
+
// Fields: getVoices
|
|
108
|
+
// ----------------------------------
|
|
109
|
+
{
|
|
110
|
+
displayName: 'Provider (Optional)',
|
|
111
|
+
name: 'provider',
|
|
112
|
+
type: 'options',
|
|
113
|
+
displayOptions: {
|
|
114
|
+
show: {
|
|
115
|
+
resource: [
|
|
116
|
+
'info',
|
|
117
|
+
],
|
|
118
|
+
operation: [
|
|
119
|
+
'getVoices',
|
|
120
|
+
],
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
options: [
|
|
124
|
+
{
|
|
125
|
+
name: 'AillomVox (Default)',
|
|
126
|
+
value: 'aillomvox',
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
name: 'ElevenLabs',
|
|
130
|
+
value: 'elevenlabs',
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
name: 'PlayHT',
|
|
134
|
+
value: 'playht',
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
name: 'Inworld',
|
|
138
|
+
value: 'inworld',
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
name: 'Azure',
|
|
142
|
+
value: 'azure',
|
|
143
|
+
},
|
|
144
|
+
],
|
|
145
|
+
default: 'aillomvox',
|
|
146
|
+
description: 'Filter voices by specific provider',
|
|
147
|
+
},
|
|
148
|
+
|
|
149
|
+
// ----------------------------------
|
|
150
|
+
// Fields: getDownloadUrl
|
|
151
|
+
// ----------------------------------
|
|
152
|
+
{
|
|
153
|
+
displayName: 'Recording ID',
|
|
154
|
+
name: 'recordingId',
|
|
155
|
+
type: 'string',
|
|
156
|
+
default: '',
|
|
157
|
+
required: true,
|
|
158
|
+
displayOptions: {
|
|
159
|
+
show: {
|
|
160
|
+
resource: [
|
|
161
|
+
'recording',
|
|
162
|
+
],
|
|
163
|
+
operation: [
|
|
164
|
+
'getDownloadUrl',
|
|
165
|
+
],
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
description: 'The recording ID (UUID) or the S3/Supabase file path',
|
|
169
|
+
},
|
|
170
|
+
],
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
async execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]> {
|
|
174
|
+
const items = this.getInputData();
|
|
175
|
+
const returnData: IDataObject[] = [];
|
|
176
|
+
const resource = this.getNodeParameter('resource', 0) as string;
|
|
177
|
+
const operation = this.getNodeParameter('operation', 0) as string;
|
|
178
|
+
|
|
179
|
+
for (let i = 0; i < items.length; i++) {
|
|
180
|
+
try {
|
|
181
|
+
if (resource === 'info') {
|
|
182
|
+
if (operation === 'getVoices') {
|
|
183
|
+
const provider = this.getNodeParameter('provider', i) as string;
|
|
184
|
+
const qs: IDataObject = {};
|
|
185
|
+
if (provider) {
|
|
186
|
+
qs.provider = provider;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
const response = await this.helpers.requestWithAuthentication.call(this, 'aillomVoxApi', {
|
|
190
|
+
method: 'GET',
|
|
191
|
+
uri: '/api/voices',
|
|
192
|
+
qs,
|
|
193
|
+
json: true,
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
returnData.push(response as IDataObject);
|
|
197
|
+
} else if (operation === 'getProviders') {
|
|
198
|
+
const response = await this.helpers.requestWithAuthentication.call(this, 'aillomVoxApi', {
|
|
199
|
+
method: 'GET',
|
|
200
|
+
uri: '/api/providers',
|
|
201
|
+
json: true,
|
|
202
|
+
});
|
|
203
|
+
returnData.push(response as IDataObject);
|
|
204
|
+
}
|
|
205
|
+
} else if (resource === 'recording') {
|
|
206
|
+
if (operation === 'getDownloadUrl') {
|
|
207
|
+
const recordingId = this.getNodeParameter('recordingId', i) as string;
|
|
208
|
+
|
|
209
|
+
const response = await this.helpers.requestWithAuthentication.call(this, 'aillomVoxApi', {
|
|
210
|
+
method: 'GET',
|
|
211
|
+
uri: `/api/recording/${recordingId}`,
|
|
212
|
+
json: true,
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
returnData.push(response as IDataObject);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
} catch (error) {
|
|
219
|
+
if (this.continueOnFail()) {
|
|
220
|
+
returnData.push({ error: error.message });
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
throw error;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
return [this.helpers.returnJsonArray(returnData)];
|
|
228
|
+
}
|
|
229
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
|
|
2
|
+
<circle cx="50" cy="50" r="45" fill="#4A90E2" />
|
|
3
|
+
<path d="M30 50 Q50 20 70 50 T30 50" stroke="white" stroke-width="5" fill="none" />
|
|
4
|
+
<circle cx="30" cy="50" r="5" fill="white" />
|
|
5
|
+
<circle cx="70" cy="50" r="5" fill="white" />
|
|
6
|
+
</svg>
|