@voiceinput/elevenlabs 0.1.0-beta.1
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 +21 -0
- package/README.md +114 -0
- package/dist/index.cjs +527 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +24 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +525 -0
- package/dist/index.js.map +1 -0
- package/dist/server.cjs +153 -0
- package/dist/server.cjs.map +1 -0
- package/dist/server.d.cts +34 -0
- package/dist/server.d.cts.map +1 -0
- package/dist/server.d.ts +34 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +152 -0
- package/dist/server.js.map +1 -0
- package/dist/session-config-D2GQf8TE.cjs +130 -0
- package/dist/session-config-D2GQf8TE.cjs.map +1 -0
- package/dist/session-config-DEaQLtZY.js +107 -0
- package/dist/session-config-DEaQLtZY.js.map +1 -0
- package/package.json +77 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
let _voiceinput_provider = require("@voiceinput/provider");
|
|
2
|
+
//#region src/session-config.ts
|
|
3
|
+
const ELEVENLABS_DEFAULT_MODEL = "scribe_v2_realtime";
|
|
4
|
+
const ELEVENLABS_SAMPLE_RATE = 16e3;
|
|
5
|
+
const ELEVENLABS_DEFAULT_ENDPOINTING_MS = 650;
|
|
6
|
+
function validateElevenLabsConfiguration(value) {
|
|
7
|
+
const model = nonEmptyString(value.model, "model");
|
|
8
|
+
const language = normalizeLanguage(value.language);
|
|
9
|
+
const vocabulary = validateVocabulary(value.vocabulary);
|
|
10
|
+
const endpointing = validateEndpointing(value.endpointing === void 0 ? { silenceMs: ELEVENLABS_DEFAULT_ENDPOINTING_MS } : value.endpointing);
|
|
11
|
+
const vadThreshold = optionalNumber(value.vadThreshold, "vadThreshold", .1, .9);
|
|
12
|
+
const minSpeechDurationMs = optionalInteger(value.minSpeechDurationMs, "minSpeechDurationMs", 50, 2e3);
|
|
13
|
+
const minSilenceDurationMs = optionalInteger(value.minSilenceDurationMs, "minSilenceDurationMs", 50, 2e3);
|
|
14
|
+
const noVerbatim = optionalBoolean(value.noVerbatim, "noVerbatim");
|
|
15
|
+
const filterBackgroundAudio = optionalBoolean(value.filterBackgroundAudio, "filterBackgroundAudio");
|
|
16
|
+
return Object.freeze({
|
|
17
|
+
model,
|
|
18
|
+
...language === void 0 ? {} : { language },
|
|
19
|
+
...vocabulary === void 0 ? {} : { vocabulary },
|
|
20
|
+
...endpointing === void 0 ? {} : { endpointing },
|
|
21
|
+
...vadThreshold === void 0 ? {} : { vadThreshold },
|
|
22
|
+
...minSpeechDurationMs === void 0 ? {} : { minSpeechDurationMs },
|
|
23
|
+
...minSilenceDurationMs === void 0 ? {} : { minSilenceDurationMs },
|
|
24
|
+
...noVerbatim === void 0 ? {} : { noVerbatim },
|
|
25
|
+
...filterBackgroundAudio === void 0 ? {} : { filterBackgroundAudio }
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
function createElevenLabsRealtimeUrl(baseUrl, token, configuration) {
|
|
29
|
+
const url = new URL(baseUrl);
|
|
30
|
+
url.searchParams.set("model_id", configuration.model);
|
|
31
|
+
url.searchParams.set("token", token);
|
|
32
|
+
url.searchParams.set("audio_format", "pcm_16000");
|
|
33
|
+
const hasVadSettings = configuration.vadThreshold !== void 0 || configuration.minSpeechDurationMs !== void 0 || configuration.minSilenceDurationMs !== void 0;
|
|
34
|
+
if (configuration.endpointing === false) url.searchParams.set("commit_strategy", "manual");
|
|
35
|
+
else if (configuration.endpointing !== void 0 || hasVadSettings) url.searchParams.set("commit_strategy", "vad");
|
|
36
|
+
if (configuration.language !== void 0) url.searchParams.set("language_code", configuration.language);
|
|
37
|
+
for (const term of configuration.vocabulary ?? []) url.searchParams.append("keyterms", term);
|
|
38
|
+
if (configuration.endpointing !== void 0 && configuration.endpointing !== false) url.searchParams.set("vad_silence_threshold_secs", String(configuration.endpointing.silenceMs / 1e3));
|
|
39
|
+
setOptional(url, "vad_threshold", configuration.vadThreshold);
|
|
40
|
+
setOptional(url, "min_speech_duration_ms", configuration.minSpeechDurationMs);
|
|
41
|
+
setOptional(url, "min_silence_duration_ms", configuration.minSilenceDurationMs);
|
|
42
|
+
setOptional(url, "no_verbatim", configuration.noVerbatim);
|
|
43
|
+
setOptional(url, "filter_background_audio", configuration.filterBackgroundAudio);
|
|
44
|
+
return url.href;
|
|
45
|
+
}
|
|
46
|
+
function normalizeLanguage(value) {
|
|
47
|
+
if (value === void 0) return;
|
|
48
|
+
if (typeof value !== "string") throw new TypeError("language must be a valid BCP 47 language tag.");
|
|
49
|
+
let language;
|
|
50
|
+
try {
|
|
51
|
+
language = new Intl.Locale(value).language;
|
|
52
|
+
} catch {
|
|
53
|
+
throw new TypeError("language must be a valid BCP 47 language tag.");
|
|
54
|
+
}
|
|
55
|
+
if (!/^[a-z]{2,3}$/u.test(language)) throw unsupportedFeature("ElevenLabs requires an ISO 639-1 or ISO 639-3 language code.");
|
|
56
|
+
return language;
|
|
57
|
+
}
|
|
58
|
+
function validateVocabulary(value) {
|
|
59
|
+
if (value === void 0) return;
|
|
60
|
+
if (!Array.isArray(value)) throw new TypeError("vocabulary must be an array of strings.");
|
|
61
|
+
const vocabulary = value.map((term) => {
|
|
62
|
+
if (typeof term !== "string" || term.length === 0) throw new TypeError("ElevenLabs vocabulary terms must be non-empty strings.");
|
|
63
|
+
if (term !== term.trim() || /[\r\n]/u.test(term)) throw new TypeError("ElevenLabs vocabulary terms must be trimmed strings without line breaks.");
|
|
64
|
+
return term;
|
|
65
|
+
});
|
|
66
|
+
if (vocabulary.length > 50) throw unsupportedFeature("ElevenLabs vocabulary supports at most 50 terms.");
|
|
67
|
+
if (vocabulary.some((term) => term.length > 20)) throw unsupportedFeature("ElevenLabs vocabulary terms support at most 20 characters.");
|
|
68
|
+
return Object.freeze(vocabulary);
|
|
69
|
+
}
|
|
70
|
+
function validateEndpointing(value) {
|
|
71
|
+
if (value === void 0 || value === false) return value;
|
|
72
|
+
if (typeof value !== "object" || value === null || Object.keys(value).some((key) => key !== "silenceMs") || !Number.isInteger(value.silenceMs) || value.silenceMs <= 0) throw new TypeError("ElevenLabs endpointing silenceMs must be a positive integer.");
|
|
73
|
+
if (value.silenceMs < 300 || value.silenceMs > 3e3) throw unsupportedFeature("ElevenLabs endpointing supports silenceMs from 300 to 3000.");
|
|
74
|
+
return Object.freeze({ silenceMs: value.silenceMs });
|
|
75
|
+
}
|
|
76
|
+
function nonEmptyString(value, name) {
|
|
77
|
+
if (typeof value !== "string" || value.trim().length === 0) throw new TypeError(`${name} must be a non-empty string.`);
|
|
78
|
+
return value;
|
|
79
|
+
}
|
|
80
|
+
function optionalNumber(value, name, minimum, maximum) {
|
|
81
|
+
if (value === void 0) return;
|
|
82
|
+
if (!Number.isFinite(value) || value < minimum || value > maximum) throw new TypeError(`${name} must be between ${minimum} and ${maximum}.`);
|
|
83
|
+
return value;
|
|
84
|
+
}
|
|
85
|
+
function optionalInteger(value, name, minimum, maximum) {
|
|
86
|
+
const result = optionalNumber(value, name, minimum, maximum);
|
|
87
|
+
if (result !== void 0 && !Number.isInteger(result)) throw new TypeError(`${name} must be an integer.`);
|
|
88
|
+
return result;
|
|
89
|
+
}
|
|
90
|
+
function optionalBoolean(value, name) {
|
|
91
|
+
if (value !== void 0 && typeof value !== "boolean") throw new TypeError(`${name} must be a boolean.`);
|
|
92
|
+
return value;
|
|
93
|
+
}
|
|
94
|
+
function setOptional(url, key, value) {
|
|
95
|
+
if (value !== void 0) url.searchParams.set(key, String(value));
|
|
96
|
+
}
|
|
97
|
+
function unsupportedFeature(message) {
|
|
98
|
+
return new _voiceinput_provider.VoiceInputError({
|
|
99
|
+
code: "unsupported-feature",
|
|
100
|
+
message,
|
|
101
|
+
provider: "elevenlabs"
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
//#endregion
|
|
105
|
+
Object.defineProperty(exports, "ELEVENLABS_DEFAULT_MODEL", {
|
|
106
|
+
enumerable: true,
|
|
107
|
+
get: function() {
|
|
108
|
+
return ELEVENLABS_DEFAULT_MODEL;
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
Object.defineProperty(exports, "ELEVENLABS_SAMPLE_RATE", {
|
|
112
|
+
enumerable: true,
|
|
113
|
+
get: function() {
|
|
114
|
+
return ELEVENLABS_SAMPLE_RATE;
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
Object.defineProperty(exports, "createElevenLabsRealtimeUrl", {
|
|
118
|
+
enumerable: true,
|
|
119
|
+
get: function() {
|
|
120
|
+
return createElevenLabsRealtimeUrl;
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
Object.defineProperty(exports, "validateElevenLabsConfiguration", {
|
|
124
|
+
enumerable: true,
|
|
125
|
+
get: function() {
|
|
126
|
+
return validateElevenLabsConfiguration;
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
//# sourceMappingURL=session-config-D2GQf8TE.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-config-D2GQf8TE.cjs","names":["VoiceInputError"],"sources":["../src/session-config.ts"],"sourcesContent":["import {\n VoiceInputError,\n type VoiceTranscriptionOptions,\n} from \"@voiceinput/provider\";\n\nexport const ELEVENLABS_DEFAULT_MODEL = \"scribe_v2_realtime\";\nexport const ELEVENLABS_SAMPLE_RATE = 16_000;\nconst ELEVENLABS_DEFAULT_ENDPOINTING_MS = 650;\n\nexport interface ElevenLabsRealtimeSettings {\n readonly vadThreshold?: number;\n readonly minSpeechDurationMs?: number;\n readonly minSilenceDurationMs?: number;\n readonly noVerbatim?: boolean;\n readonly filterBackgroundAudio?: boolean;\n}\n\nexport interface ElevenLabsSessionConfiguration {\n readonly model: string;\n readonly language?: string;\n readonly vocabulary?: readonly string[];\n readonly endpointing?: false | { readonly silenceMs: number };\n readonly vadThreshold?: number;\n readonly minSpeechDurationMs?: number;\n readonly minSilenceDurationMs?: number;\n readonly noVerbatim?: boolean;\n readonly filterBackgroundAudio?: boolean;\n}\n\nexport function validateElevenLabsConfiguration(\n value: VoiceTranscriptionOptions &\n ElevenLabsRealtimeSettings & { readonly model: string },\n): ElevenLabsSessionConfiguration {\n const model = nonEmptyString(value.model, \"model\");\n const language = normalizeLanguage(value.language);\n const vocabulary = validateVocabulary(value.vocabulary);\n const endpointing = validateEndpointing(\n value.endpointing === undefined\n ? { silenceMs: ELEVENLABS_DEFAULT_ENDPOINTING_MS }\n : value.endpointing,\n );\n const vadThreshold = optionalNumber(\n value.vadThreshold,\n \"vadThreshold\",\n 0.1,\n 0.9,\n );\n const minSpeechDurationMs = optionalInteger(\n value.minSpeechDurationMs,\n \"minSpeechDurationMs\",\n 50,\n 2_000,\n );\n const minSilenceDurationMs = optionalInteger(\n value.minSilenceDurationMs,\n \"minSilenceDurationMs\",\n 50,\n 2_000,\n );\n const noVerbatim = optionalBoolean(value.noVerbatim, \"noVerbatim\");\n const filterBackgroundAudio = optionalBoolean(\n value.filterBackgroundAudio,\n \"filterBackgroundAudio\",\n );\n\n return Object.freeze({\n model,\n ...(language === undefined ? {} : { language }),\n ...(vocabulary === undefined ? {} : { vocabulary }),\n ...(endpointing === undefined ? {} : { endpointing }),\n ...(vadThreshold === undefined ? {} : { vadThreshold }),\n ...(minSpeechDurationMs === undefined ? {} : { minSpeechDurationMs }),\n ...(minSilenceDurationMs === undefined ? {} : { minSilenceDurationMs }),\n ...(noVerbatim === undefined ? {} : { noVerbatim }),\n ...(filterBackgroundAudio === undefined ? {} : { filterBackgroundAudio }),\n });\n}\n\nexport function createElevenLabsRealtimeUrl(\n baseUrl: string,\n token: string,\n configuration: ElevenLabsSessionConfiguration,\n): string {\n const url = new URL(baseUrl);\n url.searchParams.set(\"model_id\", configuration.model);\n url.searchParams.set(\"token\", token);\n url.searchParams.set(\"audio_format\", \"pcm_16000\");\n const hasVadSettings =\n configuration.vadThreshold !== undefined ||\n configuration.minSpeechDurationMs !== undefined ||\n configuration.minSilenceDurationMs !== undefined;\n if (configuration.endpointing === false) {\n url.searchParams.set(\"commit_strategy\", \"manual\");\n } else if (configuration.endpointing !== undefined || hasVadSettings) {\n url.searchParams.set(\"commit_strategy\", \"vad\");\n }\n if (configuration.language !== undefined) {\n url.searchParams.set(\"language_code\", configuration.language);\n }\n for (const term of configuration.vocabulary ?? []) {\n url.searchParams.append(\"keyterms\", term);\n }\n if (\n configuration.endpointing !== undefined &&\n configuration.endpointing !== false\n ) {\n url.searchParams.set(\n \"vad_silence_threshold_secs\",\n String(configuration.endpointing.silenceMs / 1_000),\n );\n }\n setOptional(url, \"vad_threshold\", configuration.vadThreshold);\n setOptional(url, \"min_speech_duration_ms\", configuration.minSpeechDurationMs);\n setOptional(\n url,\n \"min_silence_duration_ms\",\n configuration.minSilenceDurationMs,\n );\n setOptional(url, \"no_verbatim\", configuration.noVerbatim);\n setOptional(\n url,\n \"filter_background_audio\",\n configuration.filterBackgroundAudio,\n );\n return url.href;\n}\n\nfunction normalizeLanguage(value: string | undefined): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value !== \"string\") {\n throw new TypeError(\"language must be a valid BCP 47 language tag.\");\n }\n let language: string;\n try {\n language = new Intl.Locale(value).language;\n } catch {\n throw new TypeError(\"language must be a valid BCP 47 language tag.\");\n }\n if (!/^[a-z]{2,3}$/u.test(language)) {\n throw unsupportedFeature(\n \"ElevenLabs requires an ISO 639-1 or ISO 639-3 language code.\",\n );\n }\n return language;\n}\n\nfunction validateVocabulary(\n value: readonly string[] | undefined,\n): readonly string[] | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (!Array.isArray(value)) {\n throw new TypeError(\"vocabulary must be an array of strings.\");\n }\n const vocabulary = value.map((term) => {\n if (typeof term !== \"string\" || term.length === 0) {\n throw new TypeError(\n \"ElevenLabs vocabulary terms must be non-empty strings.\",\n );\n }\n if (term !== term.trim() || /[\\r\\n]/u.test(term)) {\n throw new TypeError(\n \"ElevenLabs vocabulary terms must be trimmed strings without line breaks.\",\n );\n }\n return term;\n });\n if (vocabulary.length > 50) {\n throw unsupportedFeature(\n \"ElevenLabs vocabulary supports at most 50 terms.\",\n );\n }\n if (vocabulary.some((term) => term.length > 20)) {\n throw unsupportedFeature(\n \"ElevenLabs vocabulary terms support at most 20 characters.\",\n );\n }\n return Object.freeze(vocabulary);\n}\n\nfunction validateEndpointing(\n value: VoiceTranscriptionOptions[\"endpointing\"],\n): ElevenLabsSessionConfiguration[\"endpointing\"] {\n if (value === undefined || value === false) {\n return value;\n }\n if (\n typeof value !== \"object\" ||\n value === null ||\n Object.keys(value).some((key) => key !== \"silenceMs\") ||\n !Number.isInteger(value.silenceMs) ||\n value.silenceMs <= 0\n ) {\n throw new TypeError(\n \"ElevenLabs endpointing silenceMs must be a positive integer.\",\n );\n }\n if (value.silenceMs < 300 || value.silenceMs > 3_000) {\n throw unsupportedFeature(\n \"ElevenLabs endpointing supports silenceMs from 300 to 3000.\",\n );\n }\n return Object.freeze({ silenceMs: value.silenceMs });\n}\n\nfunction nonEmptyString(value: string, name: string): string {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new TypeError(`${name} must be a non-empty string.`);\n }\n return value;\n}\n\nfunction optionalNumber(\n value: number | undefined,\n name: string,\n minimum: number,\n maximum: number,\n): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (!Number.isFinite(value) || value < minimum || value > maximum) {\n throw new TypeError(`${name} must be between ${minimum} and ${maximum}.`);\n }\n return value;\n}\n\nfunction optionalInteger(\n value: number | undefined,\n name: string,\n minimum: number,\n maximum: number,\n): number | undefined {\n const result = optionalNumber(value, name, minimum, maximum);\n if (result !== undefined && !Number.isInteger(result)) {\n throw new TypeError(`${name} must be an integer.`);\n }\n return result;\n}\n\nfunction optionalBoolean(\n value: boolean | undefined,\n name: string,\n): boolean | undefined {\n if (value !== undefined && typeof value !== \"boolean\") {\n throw new TypeError(`${name} must be a boolean.`);\n }\n return value;\n}\n\nfunction setOptional(\n url: URL,\n key: string,\n value: boolean | number | undefined,\n): void {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n}\n\nfunction unsupportedFeature(message: string): VoiceInputError {\n return new VoiceInputError({\n code: \"unsupported-feature\",\n message,\n provider: \"elevenlabs\",\n });\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { VoiceInputError } from "@voiceinput/provider";
|
|
2
|
+
//#region src/session-config.ts
|
|
3
|
+
const ELEVENLABS_DEFAULT_MODEL = "scribe_v2_realtime";
|
|
4
|
+
const ELEVENLABS_SAMPLE_RATE = 16e3;
|
|
5
|
+
const ELEVENLABS_DEFAULT_ENDPOINTING_MS = 650;
|
|
6
|
+
function validateElevenLabsConfiguration(value) {
|
|
7
|
+
const model = nonEmptyString(value.model, "model");
|
|
8
|
+
const language = normalizeLanguage(value.language);
|
|
9
|
+
const vocabulary = validateVocabulary(value.vocabulary);
|
|
10
|
+
const endpointing = validateEndpointing(value.endpointing === void 0 ? { silenceMs: ELEVENLABS_DEFAULT_ENDPOINTING_MS } : value.endpointing);
|
|
11
|
+
const vadThreshold = optionalNumber(value.vadThreshold, "vadThreshold", .1, .9);
|
|
12
|
+
const minSpeechDurationMs = optionalInteger(value.minSpeechDurationMs, "minSpeechDurationMs", 50, 2e3);
|
|
13
|
+
const minSilenceDurationMs = optionalInteger(value.minSilenceDurationMs, "minSilenceDurationMs", 50, 2e3);
|
|
14
|
+
const noVerbatim = optionalBoolean(value.noVerbatim, "noVerbatim");
|
|
15
|
+
const filterBackgroundAudio = optionalBoolean(value.filterBackgroundAudio, "filterBackgroundAudio");
|
|
16
|
+
return Object.freeze({
|
|
17
|
+
model,
|
|
18
|
+
...language === void 0 ? {} : { language },
|
|
19
|
+
...vocabulary === void 0 ? {} : { vocabulary },
|
|
20
|
+
...endpointing === void 0 ? {} : { endpointing },
|
|
21
|
+
...vadThreshold === void 0 ? {} : { vadThreshold },
|
|
22
|
+
...minSpeechDurationMs === void 0 ? {} : { minSpeechDurationMs },
|
|
23
|
+
...minSilenceDurationMs === void 0 ? {} : { minSilenceDurationMs },
|
|
24
|
+
...noVerbatim === void 0 ? {} : { noVerbatim },
|
|
25
|
+
...filterBackgroundAudio === void 0 ? {} : { filterBackgroundAudio }
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
function createElevenLabsRealtimeUrl(baseUrl, token, configuration) {
|
|
29
|
+
const url = new URL(baseUrl);
|
|
30
|
+
url.searchParams.set("model_id", configuration.model);
|
|
31
|
+
url.searchParams.set("token", token);
|
|
32
|
+
url.searchParams.set("audio_format", "pcm_16000");
|
|
33
|
+
const hasVadSettings = configuration.vadThreshold !== void 0 || configuration.minSpeechDurationMs !== void 0 || configuration.minSilenceDurationMs !== void 0;
|
|
34
|
+
if (configuration.endpointing === false) url.searchParams.set("commit_strategy", "manual");
|
|
35
|
+
else if (configuration.endpointing !== void 0 || hasVadSettings) url.searchParams.set("commit_strategy", "vad");
|
|
36
|
+
if (configuration.language !== void 0) url.searchParams.set("language_code", configuration.language);
|
|
37
|
+
for (const term of configuration.vocabulary ?? []) url.searchParams.append("keyterms", term);
|
|
38
|
+
if (configuration.endpointing !== void 0 && configuration.endpointing !== false) url.searchParams.set("vad_silence_threshold_secs", String(configuration.endpointing.silenceMs / 1e3));
|
|
39
|
+
setOptional(url, "vad_threshold", configuration.vadThreshold);
|
|
40
|
+
setOptional(url, "min_speech_duration_ms", configuration.minSpeechDurationMs);
|
|
41
|
+
setOptional(url, "min_silence_duration_ms", configuration.minSilenceDurationMs);
|
|
42
|
+
setOptional(url, "no_verbatim", configuration.noVerbatim);
|
|
43
|
+
setOptional(url, "filter_background_audio", configuration.filterBackgroundAudio);
|
|
44
|
+
return url.href;
|
|
45
|
+
}
|
|
46
|
+
function normalizeLanguage(value) {
|
|
47
|
+
if (value === void 0) return;
|
|
48
|
+
if (typeof value !== "string") throw new TypeError("language must be a valid BCP 47 language tag.");
|
|
49
|
+
let language;
|
|
50
|
+
try {
|
|
51
|
+
language = new Intl.Locale(value).language;
|
|
52
|
+
} catch {
|
|
53
|
+
throw new TypeError("language must be a valid BCP 47 language tag.");
|
|
54
|
+
}
|
|
55
|
+
if (!/^[a-z]{2,3}$/u.test(language)) throw unsupportedFeature("ElevenLabs requires an ISO 639-1 or ISO 639-3 language code.");
|
|
56
|
+
return language;
|
|
57
|
+
}
|
|
58
|
+
function validateVocabulary(value) {
|
|
59
|
+
if (value === void 0) return;
|
|
60
|
+
if (!Array.isArray(value)) throw new TypeError("vocabulary must be an array of strings.");
|
|
61
|
+
const vocabulary = value.map((term) => {
|
|
62
|
+
if (typeof term !== "string" || term.length === 0) throw new TypeError("ElevenLabs vocabulary terms must be non-empty strings.");
|
|
63
|
+
if (term !== term.trim() || /[\r\n]/u.test(term)) throw new TypeError("ElevenLabs vocabulary terms must be trimmed strings without line breaks.");
|
|
64
|
+
return term;
|
|
65
|
+
});
|
|
66
|
+
if (vocabulary.length > 50) throw unsupportedFeature("ElevenLabs vocabulary supports at most 50 terms.");
|
|
67
|
+
if (vocabulary.some((term) => term.length > 20)) throw unsupportedFeature("ElevenLabs vocabulary terms support at most 20 characters.");
|
|
68
|
+
return Object.freeze(vocabulary);
|
|
69
|
+
}
|
|
70
|
+
function validateEndpointing(value) {
|
|
71
|
+
if (value === void 0 || value === false) return value;
|
|
72
|
+
if (typeof value !== "object" || value === null || Object.keys(value).some((key) => key !== "silenceMs") || !Number.isInteger(value.silenceMs) || value.silenceMs <= 0) throw new TypeError("ElevenLabs endpointing silenceMs must be a positive integer.");
|
|
73
|
+
if (value.silenceMs < 300 || value.silenceMs > 3e3) throw unsupportedFeature("ElevenLabs endpointing supports silenceMs from 300 to 3000.");
|
|
74
|
+
return Object.freeze({ silenceMs: value.silenceMs });
|
|
75
|
+
}
|
|
76
|
+
function nonEmptyString(value, name) {
|
|
77
|
+
if (typeof value !== "string" || value.trim().length === 0) throw new TypeError(`${name} must be a non-empty string.`);
|
|
78
|
+
return value;
|
|
79
|
+
}
|
|
80
|
+
function optionalNumber(value, name, minimum, maximum) {
|
|
81
|
+
if (value === void 0) return;
|
|
82
|
+
if (!Number.isFinite(value) || value < minimum || value > maximum) throw new TypeError(`${name} must be between ${minimum} and ${maximum}.`);
|
|
83
|
+
return value;
|
|
84
|
+
}
|
|
85
|
+
function optionalInteger(value, name, minimum, maximum) {
|
|
86
|
+
const result = optionalNumber(value, name, minimum, maximum);
|
|
87
|
+
if (result !== void 0 && !Number.isInteger(result)) throw new TypeError(`${name} must be an integer.`);
|
|
88
|
+
return result;
|
|
89
|
+
}
|
|
90
|
+
function optionalBoolean(value, name) {
|
|
91
|
+
if (value !== void 0 && typeof value !== "boolean") throw new TypeError(`${name} must be a boolean.`);
|
|
92
|
+
return value;
|
|
93
|
+
}
|
|
94
|
+
function setOptional(url, key, value) {
|
|
95
|
+
if (value !== void 0) url.searchParams.set(key, String(value));
|
|
96
|
+
}
|
|
97
|
+
function unsupportedFeature(message) {
|
|
98
|
+
return new VoiceInputError({
|
|
99
|
+
code: "unsupported-feature",
|
|
100
|
+
message,
|
|
101
|
+
provider: "elevenlabs"
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
//#endregion
|
|
105
|
+
export { validateElevenLabsConfiguration as i, ELEVENLABS_SAMPLE_RATE as n, createElevenLabsRealtimeUrl as r, ELEVENLABS_DEFAULT_MODEL as t };
|
|
106
|
+
|
|
107
|
+
//# sourceMappingURL=session-config-DEaQLtZY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-config-DEaQLtZY.js","names":[],"sources":["../src/session-config.ts"],"sourcesContent":["import {\n VoiceInputError,\n type VoiceTranscriptionOptions,\n} from \"@voiceinput/provider\";\n\nexport const ELEVENLABS_DEFAULT_MODEL = \"scribe_v2_realtime\";\nexport const ELEVENLABS_SAMPLE_RATE = 16_000;\nconst ELEVENLABS_DEFAULT_ENDPOINTING_MS = 650;\n\nexport interface ElevenLabsRealtimeSettings {\n readonly vadThreshold?: number;\n readonly minSpeechDurationMs?: number;\n readonly minSilenceDurationMs?: number;\n readonly noVerbatim?: boolean;\n readonly filterBackgroundAudio?: boolean;\n}\n\nexport interface ElevenLabsSessionConfiguration {\n readonly model: string;\n readonly language?: string;\n readonly vocabulary?: readonly string[];\n readonly endpointing?: false | { readonly silenceMs: number };\n readonly vadThreshold?: number;\n readonly minSpeechDurationMs?: number;\n readonly minSilenceDurationMs?: number;\n readonly noVerbatim?: boolean;\n readonly filterBackgroundAudio?: boolean;\n}\n\nexport function validateElevenLabsConfiguration(\n value: VoiceTranscriptionOptions &\n ElevenLabsRealtimeSettings & { readonly model: string },\n): ElevenLabsSessionConfiguration {\n const model = nonEmptyString(value.model, \"model\");\n const language = normalizeLanguage(value.language);\n const vocabulary = validateVocabulary(value.vocabulary);\n const endpointing = validateEndpointing(\n value.endpointing === undefined\n ? { silenceMs: ELEVENLABS_DEFAULT_ENDPOINTING_MS }\n : value.endpointing,\n );\n const vadThreshold = optionalNumber(\n value.vadThreshold,\n \"vadThreshold\",\n 0.1,\n 0.9,\n );\n const minSpeechDurationMs = optionalInteger(\n value.minSpeechDurationMs,\n \"minSpeechDurationMs\",\n 50,\n 2_000,\n );\n const minSilenceDurationMs = optionalInteger(\n value.minSilenceDurationMs,\n \"minSilenceDurationMs\",\n 50,\n 2_000,\n );\n const noVerbatim = optionalBoolean(value.noVerbatim, \"noVerbatim\");\n const filterBackgroundAudio = optionalBoolean(\n value.filterBackgroundAudio,\n \"filterBackgroundAudio\",\n );\n\n return Object.freeze({\n model,\n ...(language === undefined ? {} : { language }),\n ...(vocabulary === undefined ? {} : { vocabulary }),\n ...(endpointing === undefined ? {} : { endpointing }),\n ...(vadThreshold === undefined ? {} : { vadThreshold }),\n ...(minSpeechDurationMs === undefined ? {} : { minSpeechDurationMs }),\n ...(minSilenceDurationMs === undefined ? {} : { minSilenceDurationMs }),\n ...(noVerbatim === undefined ? {} : { noVerbatim }),\n ...(filterBackgroundAudio === undefined ? {} : { filterBackgroundAudio }),\n });\n}\n\nexport function createElevenLabsRealtimeUrl(\n baseUrl: string,\n token: string,\n configuration: ElevenLabsSessionConfiguration,\n): string {\n const url = new URL(baseUrl);\n url.searchParams.set(\"model_id\", configuration.model);\n url.searchParams.set(\"token\", token);\n url.searchParams.set(\"audio_format\", \"pcm_16000\");\n const hasVadSettings =\n configuration.vadThreshold !== undefined ||\n configuration.minSpeechDurationMs !== undefined ||\n configuration.minSilenceDurationMs !== undefined;\n if (configuration.endpointing === false) {\n url.searchParams.set(\"commit_strategy\", \"manual\");\n } else if (configuration.endpointing !== undefined || hasVadSettings) {\n url.searchParams.set(\"commit_strategy\", \"vad\");\n }\n if (configuration.language !== undefined) {\n url.searchParams.set(\"language_code\", configuration.language);\n }\n for (const term of configuration.vocabulary ?? []) {\n url.searchParams.append(\"keyterms\", term);\n }\n if (\n configuration.endpointing !== undefined &&\n configuration.endpointing !== false\n ) {\n url.searchParams.set(\n \"vad_silence_threshold_secs\",\n String(configuration.endpointing.silenceMs / 1_000),\n );\n }\n setOptional(url, \"vad_threshold\", configuration.vadThreshold);\n setOptional(url, \"min_speech_duration_ms\", configuration.minSpeechDurationMs);\n setOptional(\n url,\n \"min_silence_duration_ms\",\n configuration.minSilenceDurationMs,\n );\n setOptional(url, \"no_verbatim\", configuration.noVerbatim);\n setOptional(\n url,\n \"filter_background_audio\",\n configuration.filterBackgroundAudio,\n );\n return url.href;\n}\n\nfunction normalizeLanguage(value: string | undefined): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value !== \"string\") {\n throw new TypeError(\"language must be a valid BCP 47 language tag.\");\n }\n let language: string;\n try {\n language = new Intl.Locale(value).language;\n } catch {\n throw new TypeError(\"language must be a valid BCP 47 language tag.\");\n }\n if (!/^[a-z]{2,3}$/u.test(language)) {\n throw unsupportedFeature(\n \"ElevenLabs requires an ISO 639-1 or ISO 639-3 language code.\",\n );\n }\n return language;\n}\n\nfunction validateVocabulary(\n value: readonly string[] | undefined,\n): readonly string[] | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (!Array.isArray(value)) {\n throw new TypeError(\"vocabulary must be an array of strings.\");\n }\n const vocabulary = value.map((term) => {\n if (typeof term !== \"string\" || term.length === 0) {\n throw new TypeError(\n \"ElevenLabs vocabulary terms must be non-empty strings.\",\n );\n }\n if (term !== term.trim() || /[\\r\\n]/u.test(term)) {\n throw new TypeError(\n \"ElevenLabs vocabulary terms must be trimmed strings without line breaks.\",\n );\n }\n return term;\n });\n if (vocabulary.length > 50) {\n throw unsupportedFeature(\n \"ElevenLabs vocabulary supports at most 50 terms.\",\n );\n }\n if (vocabulary.some((term) => term.length > 20)) {\n throw unsupportedFeature(\n \"ElevenLabs vocabulary terms support at most 20 characters.\",\n );\n }\n return Object.freeze(vocabulary);\n}\n\nfunction validateEndpointing(\n value: VoiceTranscriptionOptions[\"endpointing\"],\n): ElevenLabsSessionConfiguration[\"endpointing\"] {\n if (value === undefined || value === false) {\n return value;\n }\n if (\n typeof value !== \"object\" ||\n value === null ||\n Object.keys(value).some((key) => key !== \"silenceMs\") ||\n !Number.isInteger(value.silenceMs) ||\n value.silenceMs <= 0\n ) {\n throw new TypeError(\n \"ElevenLabs endpointing silenceMs must be a positive integer.\",\n );\n }\n if (value.silenceMs < 300 || value.silenceMs > 3_000) {\n throw unsupportedFeature(\n \"ElevenLabs endpointing supports silenceMs from 300 to 3000.\",\n );\n }\n return Object.freeze({ silenceMs: value.silenceMs });\n}\n\nfunction nonEmptyString(value: string, name: string): string {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new TypeError(`${name} must be a non-empty string.`);\n }\n return value;\n}\n\nfunction optionalNumber(\n value: number | undefined,\n name: string,\n minimum: number,\n maximum: number,\n): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (!Number.isFinite(value) || value < minimum || value > maximum) {\n throw new TypeError(`${name} must be between ${minimum} and ${maximum}.`);\n }\n return value;\n}\n\nfunction optionalInteger(\n value: number | undefined,\n name: string,\n minimum: number,\n maximum: number,\n): number | undefined {\n const result = optionalNumber(value, name, minimum, maximum);\n if (result !== undefined && !Number.isInteger(result)) {\n throw new TypeError(`${name} must be an integer.`);\n }\n return result;\n}\n\nfunction optionalBoolean(\n value: boolean | undefined,\n name: string,\n): boolean | undefined {\n if (value !== undefined && typeof value !== \"boolean\") {\n throw new TypeError(`${name} must be a boolean.`);\n }\n return value;\n}\n\nfunction setOptional(\n url: URL,\n key: string,\n value: boolean | number | undefined,\n): void {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n}\n\nfunction unsupportedFeature(message: string): VoiceInputError {\n return new VoiceInputError({\n code: \"unsupported-feature\",\n message,\n provider: \"elevenlabs\",\n });\n}\n"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@voiceinput/elevenlabs",
|
|
3
|
+
"version": "0.1.0-beta.1",
|
|
4
|
+
"description": "ElevenLabs Realtime Scribe adapter and secure token handler for VoiceInput.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"voice-input",
|
|
7
|
+
"speech-to-text",
|
|
8
|
+
"transcription",
|
|
9
|
+
"elevenlabs"
|
|
10
|
+
],
|
|
11
|
+
"homepage": "https://voiceinput.dev/docs/providers/elevenlabs",
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/VoiceInput/voiceinput/issues"
|
|
14
|
+
},
|
|
15
|
+
"author": "VoiceInput contributors",
|
|
16
|
+
"maintainers": [
|
|
17
|
+
"Hirad Arshadi (https://github.com/hiradary)"
|
|
18
|
+
],
|
|
19
|
+
"type": "module",
|
|
20
|
+
"license": "MIT",
|
|
21
|
+
"engines": {
|
|
22
|
+
"node": ">=22"
|
|
23
|
+
},
|
|
24
|
+
"repository": {
|
|
25
|
+
"type": "git",
|
|
26
|
+
"url": "git+https://github.com/VoiceInput/voiceinput.git",
|
|
27
|
+
"directory": "packages/elevenlabs"
|
|
28
|
+
},
|
|
29
|
+
"files": [
|
|
30
|
+
"dist"
|
|
31
|
+
],
|
|
32
|
+
"sideEffects": false,
|
|
33
|
+
"main": "./dist/index.cjs",
|
|
34
|
+
"module": "./dist/index.js",
|
|
35
|
+
"types": "./dist/index.d.ts",
|
|
36
|
+
"exports": {
|
|
37
|
+
".": {
|
|
38
|
+
"import": {
|
|
39
|
+
"types": "./dist/index.d.ts",
|
|
40
|
+
"default": "./dist/index.js"
|
|
41
|
+
},
|
|
42
|
+
"require": {
|
|
43
|
+
"types": "./dist/index.d.cts",
|
|
44
|
+
"default": "./dist/index.cjs"
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
"./server": {
|
|
48
|
+
"browser": null,
|
|
49
|
+
"import": {
|
|
50
|
+
"types": "./dist/server.d.ts",
|
|
51
|
+
"default": "./dist/server.js"
|
|
52
|
+
},
|
|
53
|
+
"require": {
|
|
54
|
+
"types": "./dist/server.d.cts",
|
|
55
|
+
"default": "./dist/server.cjs"
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
"dependencies": {
|
|
60
|
+
"@voiceinput/provider": "0.1.0-beta.1"
|
|
61
|
+
},
|
|
62
|
+
"devDependencies": {
|
|
63
|
+
"@voiceinput/core": "0.1.0-beta.1"
|
|
64
|
+
},
|
|
65
|
+
"publishConfig": {
|
|
66
|
+
"access": "public"
|
|
67
|
+
},
|
|
68
|
+
"scripts": {
|
|
69
|
+
"build": "tsdown src/index.ts src/server.ts",
|
|
70
|
+
"dev": "tsdown src/index.ts src/server.ts --watch --no-clean",
|
|
71
|
+
"pack": "pnpm pack --pack-destination .",
|
|
72
|
+
"test": "vitest run",
|
|
73
|
+
"typecheck": "tsc --project tsconfig.json --noEmit",
|
|
74
|
+
"lint": "oxlint --config ../../.oxlintrc.json .",
|
|
75
|
+
"format:check": "prettier --check ."
|
|
76
|
+
}
|
|
77
|
+
}
|