@elizaos/plugin-elevenlabs 1.0.0-alpha.7 → 1.0.0-beta.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/dist/index.js +4 -14
- package/dist/index.js.map +1 -1
- package/package.json +14 -4
package/dist/index.js
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
// src/index.ts
|
|
2
2
|
import { Readable } from "node:stream";
|
|
3
|
-
import {
|
|
4
|
-
ModelTypes,
|
|
5
|
-
logger
|
|
6
|
-
} from "@elizaos/core";
|
|
3
|
+
import { ModelType, logger } from "@elizaos/core";
|
|
7
4
|
|
|
8
5
|
// src/utils.ts
|
|
9
6
|
import { PassThrough } from "node:stream";
|
|
@@ -25,12 +22,7 @@ function getWavHeader(audioLength, sampleRate, channelCount = 1, bitsPerSample =
|
|
|
25
22
|
return wavHeader;
|
|
26
23
|
}
|
|
27
24
|
function prependWavHeader(readable, audioLength, sampleRate, channelCount = 1, bitsPerSample = 16) {
|
|
28
|
-
const wavHeader = getWavHeader(
|
|
29
|
-
audioLength,
|
|
30
|
-
sampleRate,
|
|
31
|
-
channelCount,
|
|
32
|
-
bitsPerSample
|
|
33
|
-
);
|
|
25
|
+
const wavHeader = getWavHeader(audioLength, sampleRate, channelCount, bitsPerSample);
|
|
34
26
|
let pushedHeader = false;
|
|
35
27
|
const passThrough = new PassThrough();
|
|
36
28
|
readable.on("data", (data) => {
|
|
@@ -104,7 +96,7 @@ var elevenLabsPlugin = {
|
|
|
104
96
|
name: "elevenLabs",
|
|
105
97
|
description: "ElevenLabs plugin",
|
|
106
98
|
models: {
|
|
107
|
-
[
|
|
99
|
+
[ModelType.TEXT_TO_SPEECH]: async (runtime, text) => {
|
|
108
100
|
try {
|
|
109
101
|
const stream = await fetchSpeech(runtime, text);
|
|
110
102
|
return getVoiceSettings(runtime).outputFormat.startsWith("pcm_") ? prependWavHeader(
|
|
@@ -129,9 +121,7 @@ var elevenLabsPlugin = {
|
|
|
129
121
|
name: "Eleven Labs API key validation",
|
|
130
122
|
fn: async (runtime) => {
|
|
131
123
|
if (!getVoiceSettings(runtime).apiKey) {
|
|
132
|
-
throw new Error(
|
|
133
|
-
"Missing API key: Please provide a valid Eleven Labs API key."
|
|
134
|
-
);
|
|
124
|
+
throw new Error("Missing API key: Please provide a valid Eleven Labs API key.");
|
|
135
125
|
}
|
|
136
126
|
}
|
|
137
127
|
},
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/utils.ts"],"sourcesContent":["import { Readable } from \"node:stream\";\nimport {\n\ttype IAgentRuntime,\n\tModelTypes,\n\ttype Plugin,\n\tlogger,\n} from \"@elizaos/core\";\nimport { prependWavHeader } from \"./utils\";\n\n/**\n * Function to retrieve voice settings based on runtime and environment variables.\n * @param {IAgentRuntime} runtime - The agent runtime object.\n * @returns {Object} - Object containing various voice settings.\n */\nfunction getVoiceSettings(runtime: IAgentRuntime) {\n\tconst getSetting = (key: string, fallback = \"\") =>\n\t\tprocess.env[key] || runtime.getSetting(key) || fallback;\n\n\treturn {\n\t\tapiKey:\n\t\t\tgetSetting(\"ELEVENLABS_API_KEY\") || getSetting(\"ELEVENLABS_XI_API_KEY\"),\n\t\tvoiceId: getSetting(\"ELEVENLABS_VOICE_ID\", \"EXAVITQu4vr4xnSDxMaL\"),\n\t\tmodel: getSetting(\"ELEVENLABS_MODEL_ID\", \"eleven_monolingual_v1\"),\n\t\tstability: getSetting(\"ELEVENLABS_VOICE_STABILITY\", \"0.5\"),\n\t\tlatency: getSetting(\"ELEVENLABS_OPTIMIZE_STREAMING_LATENCY\", \"0\"),\n\t\toutputFormat: getSetting(\"ELEVENLABS_OUTPUT_FORMAT\", \"pcm_16000\"),\n\t\tsimilarity: getSetting(\"ELEVENLABS_VOICE_SIMILARITY_BOOST\", \"0.75\"),\n\t\tstyle: getSetting(\"ELEVENLABS_VOICE_STYLE\", \"0\"),\n\t\tspeakerBoost: getSetting(\"ELEVENLABS_VOICE_USE_SPEAKER_BOOST\", \"true\"),\n\t};\n}\n\n/**\n * Fetch speech from Eleven Labs API using given text and runtime settings.\n * @param {IAgentRuntime} runtime - The runtime interface containing necessary data for the API call.\n * @param {string} text - The text to be converted into speech.\n * @returns {Promise<Readable>} A promise resolving to a readable stream of the fetched speech.\n */\nasync function fetchSpeech(runtime: IAgentRuntime, text: string) {\n\tconst settings = getVoiceSettings(runtime);\n\ttry {\n\t\tconst response = await fetch(\n\t\t\t`https://api.elevenlabs.io/v1/text-to-speech/${settings.voiceId}/stream?optimize_streaming_latency=${settings.latency}&output_format=${settings.outputFormat}`,\n\t\t\t{\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\t\"xi-api-key\": settings.apiKey,\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\tmodel_id: settings.model,\n\t\t\t\t\ttext,\n\t\t\t\t\tvoice_settings: {\n\t\t\t\t\t\tsimilarity_boost: settings.similarity,\n\t\t\t\t\t\tstability: settings.stability,\n\t\t\t\t\t\tstyle: settings.style,\n\t\t\t\t\t\tuse_speaker_boost: settings.speakerBoost,\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t},\n\t\t);\n\t\tif (response.status !== 200) {\n\t\t\tconst errorBodyString = await response.text();\n\t\t\tconst errorBody = JSON.parse(errorBodyString);\n\n\t\t\tif (\n\t\t\t\tresponse.status === 401 &&\n\t\t\t\terrorBody.detail?.status === \"quota_exceeded\"\n\t\t\t) {\n\t\t\t\tlogger.log(\"ElevenLabs quota exceeded\");\n\t\t\t\tthrow new Error(\"QUOTA_EXCEEDED\");\n\t\t\t}\n\t\t\tthrow new Error(\n\t\t\t\t`Received status ${response.status} from Eleven Labs API: ${JSON.stringify(errorBody)}`,\n\t\t\t);\n\t\t}\n\t\treturn Readable.fromWeb(response.body);\n\t} catch (error) {\n\t\tthrow new Error(error);\n\t}\n}\n\n/**\n * Represents the ElevenLabs plugin.\n * This plugin provides functionality related to ElevenLabs API, including text to speech conversion.\n * @type {Plugin}\n */\nexport const elevenLabsPlugin: Plugin = {\n\tname: \"elevenLabs\",\n\tdescription: \"ElevenLabs plugin\",\n\tmodels: {\n\t\t[ModelTypes.TEXT_TO_SPEECH]: async (runtime, text) => {\n\t\t\ttry {\n\t\t\t\tconst stream = await fetchSpeech(runtime, text);\n\t\t\t\treturn getVoiceSettings(runtime).outputFormat.startsWith(\"pcm_\")\n\t\t\t\t\t? prependWavHeader(\n\t\t\t\t\t\t\tstream,\n\t\t\t\t\t\t\t1024 * 1024 * 100,\n\t\t\t\t\t\t\tNumber.parseInt(getVoiceSettings(runtime).outputFormat.slice(4)),\n\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\t16,\n\t\t\t\t\t\t)\n\t\t\t\t\t: stream;\n\t\t\t} catch (error) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Failed to fetch speech from Eleven Labs API: ${error.message || \"Unknown error occurred\"}`,\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t},\n\ttests: [\n\t\t{\n\t\t\tname: \"test eleven labs\",\n\t\t\ttests: [\n\t\t\t\t{\n\t\t\t\t\tname: \"Eleven Labs API key validation\",\n\t\t\t\t\tfn: async (runtime: IAgentRuntime) => {\n\t\t\t\t\t\tif (!getVoiceSettings(runtime).apiKey) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\"Missing API key: Please provide a valid Eleven Labs API key.\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: \"Eleven Labs API response\",\n\t\t\t\t\tfn: async (runtime: IAgentRuntime) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait fetchSpeech(runtime, \"test\");\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`Failed to fetch speech from Eleven Labs API: ${error.message || \"Unknown error occurred\"}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t],\n};\nexport default elevenLabsPlugin;\n","import { PassThrough } from \"node:stream\";\nimport type { Readable } from \"node:stream\";\n\n/**\n * Generates a WAV file header based on the provided audio parameters.\n * @param {number} audioLength - The length of the audio data in bytes.\n * @param {number} sampleRate - The sample rate of the audio.\n * @param {number} [channelCount=1] - The number of channels (default is 1).\n * @param {number} [bitsPerSample=16] - The number of bits per sample (default is 16).\n * @returns {Buffer} The WAV file header as a Buffer object.\n */\nexport function getWavHeader(\n\taudioLength: number,\n\tsampleRate: number,\n\tchannelCount = 1,\n\tbitsPerSample = 16,\n): Buffer {\n\tconst wavHeader = Buffer.alloc(44);\n\twavHeader.write(\"RIFF\", 0);\n\twavHeader.writeUInt32LE(36 + audioLength, 4); // Length of entire file in bytes minus 8\n\twavHeader.write(\"WAVE\", 8);\n\twavHeader.write(\"fmt \", 12);\n\twavHeader.writeUInt32LE(16, 16); // Length of format data\n\twavHeader.writeUInt16LE(1, 20); // Type of format (1 is PCM)\n\twavHeader.writeUInt16LE(channelCount, 22); // Number of channels\n\twavHeader.writeUInt32LE(sampleRate, 24); // Sample rate\n\twavHeader.writeUInt32LE((sampleRate * bitsPerSample * channelCount) / 8, 28); // Byte rate\n\twavHeader.writeUInt16LE((bitsPerSample * channelCount) / 8, 32); // Block align ((BitsPerSample * Channels) / 8)\n\twavHeader.writeUInt16LE(bitsPerSample, 34); // Bits per sample\n\twavHeader.write(\"data\", 36); // Data chunk header\n\twavHeader.writeUInt32LE(audioLength, 40); // Data chunk size\n\treturn wavHeader;\n}\n\n/**\n * Prepends a WAV header to a readable stream of audio data.\n *\n * @param {Readable} readable - The readable stream containing the audio data.\n * @param {number} audioLength - The length of the audio data in seconds.\n * @param {number} sampleRate - The sample rate of the audio data.\n * @param {number} [channelCount=1] - The number of channels in the audio data (default is 1).\n * @param {number} [bitsPerSample=16] - The number of bits per sample in the audio data (default is 16).\n * @returns {Readable} A new readable stream with the WAV header prepended to the audio data.\n */\nexport function prependWavHeader(\n\treadable: Readable,\n\taudioLength: number,\n\tsampleRate: number,\n\tchannelCount = 1,\n\tbitsPerSample = 16,\n): Readable {\n\tconst wavHeader = getWavHeader(\n\t\taudioLength,\n\t\tsampleRate,\n\t\tchannelCount,\n\t\tbitsPerSample,\n\t);\n\tlet pushedHeader = false;\n\tconst passThrough = new PassThrough();\n\treadable.on(\"data\", (data) => {\n\t\tif (!pushedHeader) {\n\t\t\tpassThrough.push(wavHeader);\n\t\t\tpushedHeader = true;\n\t\t}\n\t\tpassThrough.push(data);\n\t});\n\treadable.on(\"end\", () => {\n\t\tpassThrough.end();\n\t});\n\treturn passThrough;\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/utils.ts"],"sourcesContent":["import { Readable } from 'node:stream';\nimport { type IAgentRuntime, ModelType, type Plugin, logger } from '@elizaos/core';\nimport { prependWavHeader } from './utils';\n\n/**\n * Function to retrieve voice settings based on runtime and environment variables.\n * @param {IAgentRuntime} runtime - The agent runtime object.\n * @returns {Object} - Object containing various voice settings.\n */\nfunction getVoiceSettings(runtime: IAgentRuntime) {\n const getSetting = (key: string, fallback = '') =>\n process.env[key] || runtime.getSetting(key) || fallback;\n\n return {\n apiKey: getSetting('ELEVENLABS_API_KEY') || getSetting('ELEVENLABS_XI_API_KEY'),\n voiceId: getSetting('ELEVENLABS_VOICE_ID', 'EXAVITQu4vr4xnSDxMaL'),\n model: getSetting('ELEVENLABS_MODEL_ID', 'eleven_monolingual_v1'),\n stability: getSetting('ELEVENLABS_VOICE_STABILITY', '0.5'),\n latency: getSetting('ELEVENLABS_OPTIMIZE_STREAMING_LATENCY', '0'),\n outputFormat: getSetting('ELEVENLABS_OUTPUT_FORMAT', 'pcm_16000'),\n similarity: getSetting('ELEVENLABS_VOICE_SIMILARITY_BOOST', '0.75'),\n style: getSetting('ELEVENLABS_VOICE_STYLE', '0'),\n speakerBoost: getSetting('ELEVENLABS_VOICE_USE_SPEAKER_BOOST', 'true'),\n };\n}\n\n/**\n * Fetch speech from Eleven Labs API using given text and runtime settings.\n * @param {IAgentRuntime} runtime - The runtime interface containing necessary data for the API call.\n * @param {string} text - The text to be converted into speech.\n * @returns {Promise<Readable>} A promise resolving to a readable stream of the fetched speech.\n */\nasync function fetchSpeech(runtime: IAgentRuntime, text: string) {\n const settings = getVoiceSettings(runtime);\n try {\n const response = await fetch(\n `https://api.elevenlabs.io/v1/text-to-speech/${settings.voiceId}/stream?optimize_streaming_latency=${settings.latency}&output_format=${settings.outputFormat}`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'xi-api-key': settings.apiKey,\n },\n body: JSON.stringify({\n model_id: settings.model,\n text,\n voice_settings: {\n similarity_boost: settings.similarity,\n stability: settings.stability,\n style: settings.style,\n use_speaker_boost: settings.speakerBoost,\n },\n }),\n }\n );\n if (response.status !== 200) {\n const errorBodyString = await response.text();\n const errorBody = JSON.parse(errorBodyString);\n\n if (response.status === 401 && errorBody.detail?.status === 'quota_exceeded') {\n logger.log('ElevenLabs quota exceeded');\n throw new Error('QUOTA_EXCEEDED');\n }\n throw new Error(\n `Received status ${response.status} from Eleven Labs API: ${JSON.stringify(errorBody)}`\n );\n }\n return Readable.fromWeb(response.body);\n } catch (error) {\n throw new Error(error);\n }\n}\n\n/**\n * Represents the ElevenLabs plugin.\n * This plugin provides functionality related to ElevenLabs API, including text to speech conversion.\n * @type {Plugin}\n */\nexport const elevenLabsPlugin: Plugin = {\n name: 'elevenLabs',\n description: 'ElevenLabs plugin',\n models: {\n [ModelType.TEXT_TO_SPEECH]: async (runtime, text) => {\n try {\n const stream = await fetchSpeech(runtime, text);\n return getVoiceSettings(runtime).outputFormat.startsWith('pcm_')\n ? prependWavHeader(\n stream,\n 1024 * 1024 * 100,\n Number.parseInt(getVoiceSettings(runtime).outputFormat.slice(4)),\n 1,\n 16\n )\n : stream;\n } catch (error) {\n throw new Error(\n `Failed to fetch speech from Eleven Labs API: ${error.message || 'Unknown error occurred'}`\n );\n }\n },\n },\n tests: [\n {\n name: 'test eleven labs',\n tests: [\n {\n name: 'Eleven Labs API key validation',\n fn: async (runtime: IAgentRuntime) => {\n if (!getVoiceSettings(runtime).apiKey) {\n throw new Error('Missing API key: Please provide a valid Eleven Labs API key.');\n }\n },\n },\n {\n name: 'Eleven Labs API response',\n fn: async (runtime: IAgentRuntime) => {\n try {\n await fetchSpeech(runtime, 'test');\n } catch (error) {\n throw new Error(\n `Failed to fetch speech from Eleven Labs API: ${error.message || 'Unknown error occurred'}`\n );\n }\n },\n },\n ],\n },\n ],\n};\nexport default elevenLabsPlugin;\n","import { PassThrough } from 'node:stream';\nimport type { Readable } from 'node:stream';\n\n/**\n * Generates a WAV file header based on the provided audio parameters.\n * @param {number} audioLength - The length of the audio data in bytes.\n * @param {number} sampleRate - The sample rate of the audio.\n * @param {number} [channelCount=1] - The number of channels (default is 1).\n * @param {number} [bitsPerSample=16] - The number of bits per sample (default is 16).\n * @returns {Buffer} The WAV file header as a Buffer object.\n */\nexport function getWavHeader(\n audioLength: number,\n sampleRate: number,\n channelCount = 1,\n bitsPerSample = 16\n): Buffer {\n const wavHeader = Buffer.alloc(44);\n wavHeader.write('RIFF', 0);\n wavHeader.writeUInt32LE(36 + audioLength, 4); // Length of entire file in bytes minus 8\n wavHeader.write('WAVE', 8);\n wavHeader.write('fmt ', 12);\n wavHeader.writeUInt32LE(16, 16); // Length of format data\n wavHeader.writeUInt16LE(1, 20); // Type of format (1 is PCM)\n wavHeader.writeUInt16LE(channelCount, 22); // Number of channels\n wavHeader.writeUInt32LE(sampleRate, 24); // Sample rate\n wavHeader.writeUInt32LE((sampleRate * bitsPerSample * channelCount) / 8, 28); // Byte rate\n wavHeader.writeUInt16LE((bitsPerSample * channelCount) / 8, 32); // Block align ((BitsPerSample * Channels) / 8)\n wavHeader.writeUInt16LE(bitsPerSample, 34); // Bits per sample\n wavHeader.write('data', 36); // Data chunk header\n wavHeader.writeUInt32LE(audioLength, 40); // Data chunk size\n return wavHeader;\n}\n\n/**\n * Prepends a WAV header to a readable stream of audio data.\n *\n * @param {Readable} readable - The readable stream containing the audio data.\n * @param {number} audioLength - The length of the audio data in seconds.\n * @param {number} sampleRate - The sample rate of the audio data.\n * @param {number} [channelCount=1] - The number of channels in the audio data (default is 1).\n * @param {number} [bitsPerSample=16] - The number of bits per sample in the audio data (default is 16).\n * @returns {Readable} A new readable stream with the WAV header prepended to the audio data.\n */\nexport function prependWavHeader(\n readable: Readable,\n audioLength: number,\n sampleRate: number,\n channelCount = 1,\n bitsPerSample = 16\n): Readable {\n const wavHeader = getWavHeader(audioLength, sampleRate, channelCount, bitsPerSample);\n let pushedHeader = false;\n const passThrough = new PassThrough();\n readable.on('data', (data) => {\n if (!pushedHeader) {\n passThrough.push(wavHeader);\n pushedHeader = true;\n }\n passThrough.push(data);\n });\n readable.on('end', () => {\n passThrough.end();\n });\n return passThrough;\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elizaos/plugin-elevenlabs",
|
|
3
|
-
"version": "1.0.0-
|
|
3
|
+
"version": "1.0.0-beta.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "https://github.com/elizaos-plugins/plugin-elevenlabs"
|
|
11
|
+
},
|
|
8
12
|
"exports": {
|
|
9
13
|
"./package.json": "./package.json",
|
|
10
14
|
".": {
|
|
@@ -18,13 +22,16 @@
|
|
|
18
22
|
"dist"
|
|
19
23
|
],
|
|
20
24
|
"dependencies": {
|
|
21
|
-
"@elizaos/core": "^1.0.0-
|
|
25
|
+
"@elizaos/core": "^1.0.0-beta.0",
|
|
22
26
|
"tsup": "8.4.0"
|
|
23
27
|
},
|
|
24
28
|
"scripts": {
|
|
25
29
|
"build": "tsup",
|
|
26
30
|
"dev": "tsup --watch",
|
|
27
|
-
"
|
|
31
|
+
"clean": "rm -rf dist .turbo node_modules .turbo-tsconfig.json tsconfig.tsbuildinfo",
|
|
32
|
+
"format": "prettier --write ./src",
|
|
33
|
+
"format:check": "prettier --check ./src",
|
|
34
|
+
"lint": "prettier --write ./src"
|
|
28
35
|
},
|
|
29
36
|
"publishConfig": {
|
|
30
37
|
"access": "public"
|
|
@@ -70,5 +77,8 @@
|
|
|
70
77
|
}
|
|
71
78
|
}
|
|
72
79
|
},
|
|
73
|
-
"gitHead": "
|
|
80
|
+
"gitHead": "a8eb749d82e370638c7124f2ddebc2ae7ef47f22",
|
|
81
|
+
"devDependencies": {
|
|
82
|
+
"prettier": "3.5.3"
|
|
83
|
+
}
|
|
74
84
|
}
|