@mastra/voice-murf 0.0.0-issue-7087-20250910004053 → 0.0.0-jail-fs-20260105160110
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/CHANGELOG.md +157 -3
- package/dist/docs/README.md +32 -0
- package/dist/docs/SKILL.md +33 -0
- package/dist/docs/SOURCE_MAP.json +6 -0
- package/dist/docs/agents/01-adding-voice.md +352 -0
- package/dist/docs/voice/01-overview.md +1019 -0
- package/dist/docs/voice/02-reference.md +83 -0
- package/dist/index.cjs +34 -38
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +34 -38
- package/dist/index.js.map +1 -1
- package/package.json +14 -9
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# Voice API Reference
|
|
2
|
+
|
|
3
|
+
> API reference for voice - 1 entries
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Reference: Murf
|
|
9
|
+
|
|
10
|
+
> Documentation for the Murf voice implementation, providing text-to-speech capabilities.
|
|
11
|
+
|
|
12
|
+
The Murf voice implementation in Mastra provides text-to-speech (TTS) capabilities using Murf's AI voice service. It supports multiple voices across different languages.
|
|
13
|
+
|
|
14
|
+
## Usage Example
|
|
15
|
+
|
|
16
|
+
```typescript
|
|
17
|
+
import { MurfVoice } from "@mastra/voice-murf";
|
|
18
|
+
|
|
19
|
+
// Initialize with default configuration (uses MURF_API_KEY environment variable)
|
|
20
|
+
const voice = new MurfVoice();
|
|
21
|
+
|
|
22
|
+
// Initialize with custom configuration
|
|
23
|
+
const voice = new MurfVoice({
|
|
24
|
+
speechModel: {
|
|
25
|
+
name: "GEN2",
|
|
26
|
+
apiKey: "your-api-key",
|
|
27
|
+
properties: {
|
|
28
|
+
format: "MP3",
|
|
29
|
+
rate: 1.0,
|
|
30
|
+
pitch: 1.0,
|
|
31
|
+
sampleRate: 48000,
|
|
32
|
+
channelType: "STEREO",
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
speaker: "en-US-cooper",
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
// Text-to-Speech with default settings
|
|
39
|
+
const audioStream = await voice.speak("Hello, world!");
|
|
40
|
+
|
|
41
|
+
// Text-to-Speech with custom properties
|
|
42
|
+
const audioStream = await voice.speak("Hello, world!", {
|
|
43
|
+
speaker: "en-UK-hazel",
|
|
44
|
+
properties: {
|
|
45
|
+
format: "WAV",
|
|
46
|
+
rate: 1.2,
|
|
47
|
+
style: "casual",
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
// Get available voices
|
|
52
|
+
const voices = await voice.getSpeakers();
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Constructor Parameters
|
|
56
|
+
|
|
57
|
+
### MurfConfig
|
|
58
|
+
|
|
59
|
+
### Speech Properties
|
|
60
|
+
|
|
61
|
+
## Methods
|
|
62
|
+
|
|
63
|
+
### speak()
|
|
64
|
+
|
|
65
|
+
Converts text to speech using Murf's API.
|
|
66
|
+
|
|
67
|
+
Returns: `Promise<NodeJS.ReadableStream>`
|
|
68
|
+
|
|
69
|
+
### getSpeakers()
|
|
70
|
+
|
|
71
|
+
Returns an array of available voice options, where each node contains:
|
|
72
|
+
|
|
73
|
+
### listen()
|
|
74
|
+
|
|
75
|
+
This method is not supported by Murf and will throw an error. Murf does not provide speech-to-text functionality.
|
|
76
|
+
|
|
77
|
+
## Important Notes
|
|
78
|
+
|
|
79
|
+
1. A Murf API key is required. Set it via the `MURF_API_KEY` environment variable or pass it in the constructor.
|
|
80
|
+
2. The service uses GEN2 as the default model version.
|
|
81
|
+
3. Speech properties can be set at the constructor level and overridden per request.
|
|
82
|
+
4. The service supports extensive audio customization through properties like format, sample rate, and channel type.
|
|
83
|
+
5. Speech-to-text functionality is not supported.
|
package/dist/index.cjs
CHANGED
|
@@ -194,40 +194,38 @@ var MurfVoice = class extends voice.MastraVoice {
|
|
|
194
194
|
}
|
|
195
195
|
async speak(input, options) {
|
|
196
196
|
const text = typeof input === "string" ? input : await this.streamToString(input);
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
...options?.properties
|
|
205
|
-
}
|
|
206
|
-
}).json();
|
|
207
|
-
const stream$1 = new stream.PassThrough();
|
|
208
|
-
const audioResponse = await fetch(response.audioFile);
|
|
209
|
-
if (!audioResponse.body) {
|
|
210
|
-
throw new Error("No response body received");
|
|
197
|
+
const response = await this.client.post("v1/speech/generate", {
|
|
198
|
+
json: {
|
|
199
|
+
voiceId: options?.speaker || this.defaultVoice,
|
|
200
|
+
text,
|
|
201
|
+
modelVersion: this.speechModel?.name,
|
|
202
|
+
...this.properties,
|
|
203
|
+
...options?.properties
|
|
211
204
|
}
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
205
|
+
}).json();
|
|
206
|
+
const stream$1 = new stream.PassThrough();
|
|
207
|
+
const audioResponse = await fetch(response.audioFile);
|
|
208
|
+
if (!audioResponse.body) {
|
|
209
|
+
throw new Error("No response body received");
|
|
210
|
+
}
|
|
211
|
+
const reader = audioResponse.body.getReader();
|
|
212
|
+
(async () => {
|
|
213
|
+
try {
|
|
214
|
+
while (true) {
|
|
215
|
+
const { done, value } = await reader.read();
|
|
216
|
+
if (done) {
|
|
217
|
+
stream$1.end();
|
|
218
|
+
break;
|
|
222
219
|
}
|
|
223
|
-
|
|
224
|
-
stream$1.destroy(error);
|
|
220
|
+
stream$1.write(value);
|
|
225
221
|
}
|
|
226
|
-
}
|
|
222
|
+
} catch (error) {
|
|
227
223
|
stream$1.destroy(error);
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
|
|
224
|
+
}
|
|
225
|
+
})().catch((error) => {
|
|
226
|
+
stream$1.destroy(error);
|
|
227
|
+
});
|
|
228
|
+
return stream$1;
|
|
231
229
|
}
|
|
232
230
|
/**
|
|
233
231
|
* Checks if listening capabilities are enabled.
|
|
@@ -241,14 +239,12 @@ var MurfVoice = class extends voice.MastraVoice {
|
|
|
241
239
|
throw new Error("Murf does not support speech recognition");
|
|
242
240
|
}
|
|
243
241
|
async getSpeakers() {
|
|
244
|
-
return
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
}));
|
|
251
|
-
}, "voice.murf.getSpeakers")();
|
|
242
|
+
return MURF_VOICES.map((voice) => ({
|
|
243
|
+
voiceId: voice,
|
|
244
|
+
name: voice,
|
|
245
|
+
language: voice.split("-")[0],
|
|
246
|
+
gender: "neutral"
|
|
247
|
+
}));
|
|
252
248
|
}
|
|
253
249
|
};
|
|
254
250
|
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/voices.ts","../src/index.ts"],"names":["MastraVoice","ky","stream","PassThrough"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * List of available voices for Murf TTS\n */\nexport const MURF_VOICES = [\n 'en-UK-hazel',\n 'en-US-cooper',\n 'en-US-imani',\n 'it-IT-giorgio',\n 'en-US-wayne',\n 'en-IN-shivani',\n 'en-US-daniel',\n 'bn-IN-anwesha',\n 'es-MX-alejandro',\n 'en-AU-joyce',\n 'en-US-zion',\n 'en-IN-isha',\n 'en-US-riley',\n 'ko-KR-hwan',\n 'fr-FR-adélie',\n 'en-US-carter',\n 'en-UK-gabriel',\n 'en-UK-juliet',\n 'en-IN-arohi',\n 'fr-FR-maxime',\n 'de-DE-josephine',\n 'en-UK-hugo',\n 'en-US-samantha',\n 'de-DE-erna',\n 'zh-CN-baolin',\n 'pt-BR-isadora',\n 'it-IT-vincenzo',\n 'en-US-terrell',\n 'en-US-denzel',\n 'en-UK-heidi',\n 'en-US-miles',\n 'en-US-abigail',\n 'fr-FR-justine',\n 'it-IT-greta',\n 'en-AU-shane',\n 'en-UK-peter',\n 'nl-NL-famke',\n 'en-AU-ivy',\n 'nl-NL-dirk',\n 'fr-FR-axel',\n 'es-ES-carla',\n 'en-US-claire',\n 'ko-KR-jangmi',\n 'ko-KR-sanghoon',\n 'it-IT-vera',\n 'hi-IN-rahul',\n 'es-ES-elvira',\n 'es-ES-enrique',\n 'en-UK-aiden',\n 'en-US-ronnie',\n 'en-UK-amber',\n 'hi-IN-shweta',\n 'hi-IN-amit',\n 'en-AU-jimm',\n 'en-UK-pearl',\n 'pt-BR-benício',\n 'en-UK-freddie',\n 'en-US-ryan',\n 'pt-BR-eloa',\n 'en-US-charlotte',\n 'de-DE-lia',\n 'en-US-natalie',\n 'en-US-michelle',\n 'en-US-phoebe',\n 'es-ES-carmen',\n 'en-US-caleb',\n 'en-US-iris',\n 'en-UK-harrison',\n 'en-US-marcus',\n 'en-US-josie',\n 'en-US-daisy',\n 'en-US-charles',\n 'en-UK-reggie',\n 'en-US-julia',\n 'en-SCOTT-emily',\n 'en-US-dylan',\n 'es-MX-valeria',\n 'en-IN-eashwar',\n 'en-AU-evelyn',\n 'de-DE-lara',\n 'en-US-evander',\n 'en-SCOTT-rory',\n 'ta-IN-iniya',\n 'en-AU-leyton',\n 'fr-FR-louise',\n 'zh-CN-wei',\n 'ko-KR-gyeong',\n 'de-DE-matthias',\n 'en-IN-rohan',\n 'en-US-delilah',\n 'bn-IN-abhik',\n 'en-US-angela',\n 'en-US-naomi',\n 'es-MX-carlos',\n 'nl-NL-merel',\n 'en-US-alicia',\n 'en-IN-alia',\n 'zh-CN-jiao',\n 'en-US-june',\n 'en-AU-ashton',\n 'en-UK-finley',\n 'pl-PL-blazej',\n 'zh-CN-zhang',\n 'en-AU-kylie',\n 'en-US-jayden',\n 'en-IN-aarav',\n 'de-DE-björn',\n 'bn-IN-ishani',\n 'zh-CN-yuxan',\n 'fr-FR-louis',\n 'ko-KR-jong-su',\n 'en-AU-harper',\n 'en-UK-ruby',\n 'en-US-ken',\n 'ta-IN-mani',\n 'de-DE-ralf',\n 'en-UK-jaxon',\n 'en-US-river',\n 'en-IN-priya',\n 'en-UK-theo',\n 'en-UK-katie',\n 'pl-PL-jacek',\n 'it-IT-lorenzo',\n 'hi-IN-shaan',\n 'en-US-amara',\n 'en-UK-mason',\n 'en-IN-surya',\n 'en-US-finn',\n 'pt-BR-gustavo',\n 'hi-IN-kabir',\n 'es-ES-javier',\n 'en-AU-mitch',\n 'pt-BR-heitor',\n 'en-US-edmund',\n 'hi-IN-ayushi',\n 'pl-PL-kasia',\n 'es-MX-luisa',\n 'zh-CN-tao',\n 'en-US-molly',\n] as const;\n\nexport type MurfVoiceId = (typeof MURF_VOICES)[number];\n","import { PassThrough } from 'stream';\n\nimport { MastraVoice } from '@mastra/core/voice';\nimport ky from 'ky';\n\nimport { MURF_VOICES } from './voices';\nimport type { MurfVoiceId } from './voices';\n\ntype MurfConfig = {\n name: 'GEN1' | 'GEN2';\n apiKey?: string;\n properties?: Omit<SpeechCreateParams, 'modelVersion' | 'voiceId' | 'text'>;\n};\n\ntype SpeechCreateParams = {\n voiceId: MurfVoiceId;\n text: string;\n modelVersion: 'GEN1' | 'GEN2';\n style?: string;\n rate?: number;\n pitch?: number;\n sampleRate?: 8000 | 24000 | 44100 | 48000;\n format?: 'MP3' | 'WAV' | 'FLAC' | 'ALAW' | 'ULAW';\n channelType?: 'STEREO' | 'MONO';\n pronunciationDictionary?: Record<string, string>;\n encodeAsBase64?: boolean;\n variation?: number;\n audioDuration?: number;\n multiNativeLocale?: string;\n};\n\ntype SpeechCreateResponse = {\n audioFile: string;\n audioLengthInSeconds: number;\n consumedCharacterCount: number;\n encodedAudio: string;\n remainingCharacterCount: number;\n warning: string;\n wordDurations: {\n endMs: number;\n pitchScaleMaximum: number;\n pitchScaleMinimum: number;\n sourceWordIndex: number;\n startMs: number;\n word: string;\n }[];\n};\n\nexport class MurfVoice extends MastraVoice {\n private client: typeof ky;\n private defaultVoice: MurfVoiceId;\n private properties: Omit<SpeechCreateParams, 'modelVersion' | 'voiceId' | 'text'>;\n\n constructor({ speechModel, speaker }: { speechModel?: MurfConfig; speaker?: string } = {}) {\n super({\n speechModel: {\n name: speechModel?.name ?? 'GEN2',\n apiKey: speechModel?.apiKey ?? process.env.MURF_API_KEY,\n },\n speaker: speaker ?? MURF_VOICES[0],\n });\n\n const apiKey = this.speechModel?.apiKey;\n if (!apiKey) {\n throw new Error('MURF_API_KEY is not set');\n }\n\n this.properties = {\n ...speechModel?.properties,\n };\n\n this.client = ky.create({\n prefixUrl: 'https://api.murf.ai',\n headers: {\n 'api-key': apiKey,\n },\n });\n\n this.defaultVoice = (speaker as MurfVoiceId) ?? MURF_VOICES[0];\n }\n\n private async streamToString(stream: NodeJS.ReadableStream): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of stream) {\n if (typeof chunk === 'string') {\n chunks.push(Buffer.from(chunk));\n } else {\n chunks.push(chunk);\n }\n }\n return Buffer.concat(chunks).toString('utf-8');\n }\n\n async speak(\n input: string | NodeJS.ReadableStream,\n options?: { speaker?: string; properties?: Omit<SpeechCreateParams, 'modelVersion' | 'voiceId' | 'text'> },\n ): Promise<NodeJS.ReadableStream> {\n const text = typeof input === 'string' ? input : await this.streamToString(input);\n\n return this.traced(async () => {\n const response = await this.client\n .post('v1/speech/generate', {\n json: {\n voiceId: (options?.speaker || this.defaultVoice) as MurfVoiceId,\n text,\n modelVersion: this.speechModel?.name,\n ...this.properties,\n ...options?.properties,\n },\n })\n .json<SpeechCreateResponse>();\n\n // Create a PassThrough stream for the audio\n const stream = new PassThrough();\n\n // Get the audio file as a stream\n const audioResponse = await fetch(response.audioFile);\n if (!audioResponse.body) {\n throw new Error('No response body received');\n }\n\n // Process the stream\n const reader = audioResponse.body.getReader();\n (async () => {\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n stream.end();\n break;\n }\n stream.write(value);\n }\n } catch (error) {\n stream.destroy(error as Error);\n }\n })().catch(error => {\n stream.destroy(error as Error);\n });\n\n return stream;\n }, 'voice.murf.speak')();\n }\n\n /**\n * Checks if listening capabilities are enabled.\n *\n * @returns {Promise<{ enabled: boolean }>}\n */\n async getListener() {\n return { enabled: false };\n }\n\n async listen(\n _input: NodeJS.ReadableStream,\n _options?: Record<string, unknown>,\n ): Promise<string | NodeJS.ReadableStream> {\n throw new Error('Murf does not support speech recognition');\n }\n\n async getSpeakers() {\n return this.traced(async () => {\n return MURF_VOICES.map(voice => ({\n voiceId: voice,\n name: voice,\n language: voice.split('-')[0],\n gender: 'neutral',\n }));\n }, 'voice.murf.getSpeakers')();\n }\n}\n\nexport type { MurfConfig, MurfVoiceId };\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/voices.ts","../src/index.ts"],"names":["MastraVoice","ky","stream","PassThrough"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * List of available voices for Murf TTS\n */\nexport const MURF_VOICES = [\n 'en-UK-hazel',\n 'en-US-cooper',\n 'en-US-imani',\n 'it-IT-giorgio',\n 'en-US-wayne',\n 'en-IN-shivani',\n 'en-US-daniel',\n 'bn-IN-anwesha',\n 'es-MX-alejandro',\n 'en-AU-joyce',\n 'en-US-zion',\n 'en-IN-isha',\n 'en-US-riley',\n 'ko-KR-hwan',\n 'fr-FR-adélie',\n 'en-US-carter',\n 'en-UK-gabriel',\n 'en-UK-juliet',\n 'en-IN-arohi',\n 'fr-FR-maxime',\n 'de-DE-josephine',\n 'en-UK-hugo',\n 'en-US-samantha',\n 'de-DE-erna',\n 'zh-CN-baolin',\n 'pt-BR-isadora',\n 'it-IT-vincenzo',\n 'en-US-terrell',\n 'en-US-denzel',\n 'en-UK-heidi',\n 'en-US-miles',\n 'en-US-abigail',\n 'fr-FR-justine',\n 'it-IT-greta',\n 'en-AU-shane',\n 'en-UK-peter',\n 'nl-NL-famke',\n 'en-AU-ivy',\n 'nl-NL-dirk',\n 'fr-FR-axel',\n 'es-ES-carla',\n 'en-US-claire',\n 'ko-KR-jangmi',\n 'ko-KR-sanghoon',\n 'it-IT-vera',\n 'hi-IN-rahul',\n 'es-ES-elvira',\n 'es-ES-enrique',\n 'en-UK-aiden',\n 'en-US-ronnie',\n 'en-UK-amber',\n 'hi-IN-shweta',\n 'hi-IN-amit',\n 'en-AU-jimm',\n 'en-UK-pearl',\n 'pt-BR-benício',\n 'en-UK-freddie',\n 'en-US-ryan',\n 'pt-BR-eloa',\n 'en-US-charlotte',\n 'de-DE-lia',\n 'en-US-natalie',\n 'en-US-michelle',\n 'en-US-phoebe',\n 'es-ES-carmen',\n 'en-US-caleb',\n 'en-US-iris',\n 'en-UK-harrison',\n 'en-US-marcus',\n 'en-US-josie',\n 'en-US-daisy',\n 'en-US-charles',\n 'en-UK-reggie',\n 'en-US-julia',\n 'en-SCOTT-emily',\n 'en-US-dylan',\n 'es-MX-valeria',\n 'en-IN-eashwar',\n 'en-AU-evelyn',\n 'de-DE-lara',\n 'en-US-evander',\n 'en-SCOTT-rory',\n 'ta-IN-iniya',\n 'en-AU-leyton',\n 'fr-FR-louise',\n 'zh-CN-wei',\n 'ko-KR-gyeong',\n 'de-DE-matthias',\n 'en-IN-rohan',\n 'en-US-delilah',\n 'bn-IN-abhik',\n 'en-US-angela',\n 'en-US-naomi',\n 'es-MX-carlos',\n 'nl-NL-merel',\n 'en-US-alicia',\n 'en-IN-alia',\n 'zh-CN-jiao',\n 'en-US-june',\n 'en-AU-ashton',\n 'en-UK-finley',\n 'pl-PL-blazej',\n 'zh-CN-zhang',\n 'en-AU-kylie',\n 'en-US-jayden',\n 'en-IN-aarav',\n 'de-DE-björn',\n 'bn-IN-ishani',\n 'zh-CN-yuxan',\n 'fr-FR-louis',\n 'ko-KR-jong-su',\n 'en-AU-harper',\n 'en-UK-ruby',\n 'en-US-ken',\n 'ta-IN-mani',\n 'de-DE-ralf',\n 'en-UK-jaxon',\n 'en-US-river',\n 'en-IN-priya',\n 'en-UK-theo',\n 'en-UK-katie',\n 'pl-PL-jacek',\n 'it-IT-lorenzo',\n 'hi-IN-shaan',\n 'en-US-amara',\n 'en-UK-mason',\n 'en-IN-surya',\n 'en-US-finn',\n 'pt-BR-gustavo',\n 'hi-IN-kabir',\n 'es-ES-javier',\n 'en-AU-mitch',\n 'pt-BR-heitor',\n 'en-US-edmund',\n 'hi-IN-ayushi',\n 'pl-PL-kasia',\n 'es-MX-luisa',\n 'zh-CN-tao',\n 'en-US-molly',\n] as const;\n\nexport type MurfVoiceId = (typeof MURF_VOICES)[number];\n","import { PassThrough } from 'node:stream';\n\nimport { MastraVoice } from '@mastra/core/voice';\nimport ky from 'ky';\n\nimport { MURF_VOICES } from './voices';\nimport type { MurfVoiceId } from './voices';\n\ntype MurfConfig = {\n name: 'GEN1' | 'GEN2';\n apiKey?: string;\n properties?: Omit<SpeechCreateParams, 'modelVersion' | 'voiceId' | 'text'>;\n};\n\ntype SpeechCreateParams = {\n voiceId: MurfVoiceId;\n text: string;\n modelVersion: 'GEN1' | 'GEN2';\n style?: string;\n rate?: number;\n pitch?: number;\n sampleRate?: 8000 | 24000 | 44100 | 48000;\n format?: 'MP3' | 'WAV' | 'FLAC' | 'ALAW' | 'ULAW';\n channelType?: 'STEREO' | 'MONO';\n pronunciationDictionary?: Record<string, string>;\n encodeAsBase64?: boolean;\n variation?: number;\n audioDuration?: number;\n multiNativeLocale?: string;\n};\n\ntype SpeechCreateResponse = {\n audioFile: string;\n audioLengthInSeconds: number;\n consumedCharacterCount: number;\n encodedAudio: string;\n remainingCharacterCount: number;\n warning: string;\n wordDurations: {\n endMs: number;\n pitchScaleMaximum: number;\n pitchScaleMinimum: number;\n sourceWordIndex: number;\n startMs: number;\n word: string;\n }[];\n};\n\nexport class MurfVoice extends MastraVoice {\n private client: typeof ky;\n private defaultVoice: MurfVoiceId;\n private properties: Omit<SpeechCreateParams, 'modelVersion' | 'voiceId' | 'text'>;\n\n constructor({ speechModel, speaker }: { speechModel?: MurfConfig; speaker?: string } = {}) {\n super({\n speechModel: {\n name: speechModel?.name ?? 'GEN2',\n apiKey: speechModel?.apiKey ?? process.env.MURF_API_KEY,\n },\n speaker: speaker ?? MURF_VOICES[0],\n });\n\n const apiKey = this.speechModel?.apiKey;\n if (!apiKey) {\n throw new Error('MURF_API_KEY is not set');\n }\n\n this.properties = {\n ...speechModel?.properties,\n };\n\n this.client = ky.create({\n prefixUrl: 'https://api.murf.ai',\n headers: {\n 'api-key': apiKey,\n },\n });\n\n this.defaultVoice = (speaker as MurfVoiceId) ?? MURF_VOICES[0];\n }\n\n private async streamToString(stream: NodeJS.ReadableStream): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of stream) {\n if (typeof chunk === 'string') {\n chunks.push(Buffer.from(chunk));\n } else {\n chunks.push(chunk);\n }\n }\n return Buffer.concat(chunks).toString('utf-8');\n }\n\n async speak(\n input: string | NodeJS.ReadableStream,\n options?: { speaker?: string; properties?: Omit<SpeechCreateParams, 'modelVersion' | 'voiceId' | 'text'> },\n ): Promise<NodeJS.ReadableStream> {\n const text = typeof input === 'string' ? input : await this.streamToString(input);\n\n const response = await this.client\n .post('v1/speech/generate', {\n json: {\n voiceId: (options?.speaker || this.defaultVoice) as MurfVoiceId,\n text,\n modelVersion: this.speechModel?.name,\n ...this.properties,\n ...options?.properties,\n },\n })\n .json<SpeechCreateResponse>();\n\n // Create a PassThrough stream for the audio\n const stream = new PassThrough();\n\n // Get the audio file as a stream\n const audioResponse = await fetch(response.audioFile);\n if (!audioResponse.body) {\n throw new Error('No response body received');\n }\n\n // Process the stream\n const reader = audioResponse.body.getReader();\n (async () => {\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n stream.end();\n break;\n }\n stream.write(value);\n }\n } catch (error) {\n stream.destroy(error as Error);\n }\n })().catch(error => {\n stream.destroy(error as Error);\n });\n\n return stream;\n }\n\n /**\n * Checks if listening capabilities are enabled.\n *\n * @returns {Promise<{ enabled: boolean }>}\n */\n async getListener() {\n return { enabled: false };\n }\n\n async listen(\n _input: NodeJS.ReadableStream,\n _options?: Record<string, unknown>,\n ): Promise<string | NodeJS.ReadableStream> {\n throw new Error('Murf does not support speech recognition');\n }\n\n async getSpeakers() {\n return MURF_VOICES.map(voice => ({\n voiceId: voice,\n name: voice,\n language: voice.split('-')[0],\n gender: 'neutral',\n }));\n }\n}\n\nexport type { MurfConfig, MurfVoiceId };\n"]}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAIjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,KAAK,UAAU,GAAG;IAChB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,IAAI,CAAC,kBAAkB,EAAE,cAAc,GAAG,SAAS,GAAG,MAAM,CAAC,CAAC;CAC5E,CAAC;AAEF,KAAK,kBAAkB,GAAG;IACxB,OAAO,EAAE,WAAW,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;IAC1C,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAClD,WAAW,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAChC,uBAAuB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAmBF,qBAAa,SAAU,SAAQ,WAAW;IACxC,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,UAAU,CAAgE;gBAEtE,EAAE,WAAW,EAAE,OAAO,EAAE,GAAE;QAAE,WAAW,CAAC,EAAE,UAAU,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAO;YA4B3E,cAAc;IAYtB,KAAK,CACT,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,cAAc,EACrC,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,IAAI,CAAC,kBAAkB,EAAE,cAAc,GAAG,SAAS,GAAG,MAAM,CAAC,CAAA;KAAE,GACzG,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAIjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,KAAK,UAAU,GAAG;IAChB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,IAAI,CAAC,kBAAkB,EAAE,cAAc,GAAG,SAAS,GAAG,MAAM,CAAC,CAAC;CAC5E,CAAC;AAEF,KAAK,kBAAkB,GAAG;IACxB,OAAO,EAAE,WAAW,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;IAC1C,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAClD,WAAW,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAChC,uBAAuB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAmBF,qBAAa,SAAU,SAAQ,WAAW;IACxC,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,UAAU,CAAgE;gBAEtE,EAAE,WAAW,EAAE,OAAO,EAAE,GAAE;QAAE,WAAW,CAAC,EAAE,UAAU,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAO;YA4B3E,cAAc;IAYtB,KAAK,CACT,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,cAAc,EACrC,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,IAAI,CAAC,kBAAkB,EAAE,cAAc,GAAG,SAAS,GAAG,MAAM,CAAC,CAAA;KAAE,GACzG,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC;IA8CjC;;;;OAIG;IACG,WAAW;;;IAIX,MAAM,CACV,MAAM,EAAE,MAAM,CAAC,cAAc,EAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC;IAIpC,WAAW;;;;;;CAQlB;AAED,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -188,40 +188,38 @@ var MurfVoice = class extends MastraVoice {
|
|
|
188
188
|
}
|
|
189
189
|
async speak(input, options) {
|
|
190
190
|
const text = typeof input === "string" ? input : await this.streamToString(input);
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
...options?.properties
|
|
199
|
-
}
|
|
200
|
-
}).json();
|
|
201
|
-
const stream = new PassThrough();
|
|
202
|
-
const audioResponse = await fetch(response.audioFile);
|
|
203
|
-
if (!audioResponse.body) {
|
|
204
|
-
throw new Error("No response body received");
|
|
191
|
+
const response = await this.client.post("v1/speech/generate", {
|
|
192
|
+
json: {
|
|
193
|
+
voiceId: options?.speaker || this.defaultVoice,
|
|
194
|
+
text,
|
|
195
|
+
modelVersion: this.speechModel?.name,
|
|
196
|
+
...this.properties,
|
|
197
|
+
...options?.properties
|
|
205
198
|
}
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
199
|
+
}).json();
|
|
200
|
+
const stream = new PassThrough();
|
|
201
|
+
const audioResponse = await fetch(response.audioFile);
|
|
202
|
+
if (!audioResponse.body) {
|
|
203
|
+
throw new Error("No response body received");
|
|
204
|
+
}
|
|
205
|
+
const reader = audioResponse.body.getReader();
|
|
206
|
+
(async () => {
|
|
207
|
+
try {
|
|
208
|
+
while (true) {
|
|
209
|
+
const { done, value } = await reader.read();
|
|
210
|
+
if (done) {
|
|
211
|
+
stream.end();
|
|
212
|
+
break;
|
|
216
213
|
}
|
|
217
|
-
|
|
218
|
-
stream.destroy(error);
|
|
214
|
+
stream.write(value);
|
|
219
215
|
}
|
|
220
|
-
}
|
|
216
|
+
} catch (error) {
|
|
221
217
|
stream.destroy(error);
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
|
|
218
|
+
}
|
|
219
|
+
})().catch((error) => {
|
|
220
|
+
stream.destroy(error);
|
|
221
|
+
});
|
|
222
|
+
return stream;
|
|
225
223
|
}
|
|
226
224
|
/**
|
|
227
225
|
* Checks if listening capabilities are enabled.
|
|
@@ -235,14 +233,12 @@ var MurfVoice = class extends MastraVoice {
|
|
|
235
233
|
throw new Error("Murf does not support speech recognition");
|
|
236
234
|
}
|
|
237
235
|
async getSpeakers() {
|
|
238
|
-
return
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
}));
|
|
245
|
-
}, "voice.murf.getSpeakers")();
|
|
236
|
+
return MURF_VOICES.map((voice) => ({
|
|
237
|
+
voiceId: voice,
|
|
238
|
+
name: voice,
|
|
239
|
+
language: voice.split("-")[0],
|
|
240
|
+
gender: "neutral"
|
|
241
|
+
}));
|
|
246
242
|
}
|
|
247
243
|
};
|
|
248
244
|
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/voices.ts","../src/index.ts"],"names":[],"mappings":";;;;;;;AAGO,IAAM,WAAA,GAAc;AAAA,EACzB,aAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA;AAAA,EACA,eAAA;AAAA,EACA,iBAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,iBAAA;AAAA,EACA,cAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,iBAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA,EACA,eAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,gBAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,kBAAA;AAAA,EACA,eAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,iBAAA;AAAA,EACA,WAAA;AAAA,EACA,eAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,gBAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA;;;AC/FO,IAAM,SAAA,GAAN,cAAwB,WAAA,CAAY;AAAA,EACjC,MAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EAER,YAAY,EAAE,WAAA,EAAa,OAAA,EAAQ,GAAoD,EAAC,EAAG;AACzF,IAAA,KAAA,CAAM;AAAA,MACJ,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,aAAa,IAAA,IAAQ,MAAA;AAAA,QAC3B,MAAA,EAAQ,WAAA,EAAa,MAAA,IAAU,OAAA,CAAQ,GAAA,CAAI;AAAA,OAC7C;AAAA,MACA,OAAA,EAAS,OAAA,IAAW,WAAA,CAAY,CAAC;AAAA,KAClC,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,KAAK,WAAA,EAAa,MAAA;AACjC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,IAC3C;AAEA,IAAA,IAAA,CAAK,UAAA,GAAa;AAAA,MAChB,GAAG,WAAA,EAAa;AAAA,KAClB;AAEA,IAAA,IAAA,CAAK,MAAA,GAAS,GAAG,MAAA,CAAO;AAAA,MACtB,SAAA,EAAW,qBAAA;AAAA,MACX,OAAA,EAAS;AAAA,QACP,SAAA,EAAW;AAAA;AACb,KACD,CAAA;AAED,IAAA,IAAA,CAAK,YAAA,GAAgB,OAAA,IAA2B,WAAA,CAAY,CAAC,CAAA;AAAA,EAC/D;AAAA,EAEA,MAAc,eAAe,MAAA,EAAgD;AAC3E,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AAChC,MAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,QAAA,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,MAChC,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,MACnB;AAAA,IACF;AACA,IAAA,OAAO,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,CAAE,SAAS,OAAO,CAAA;AAAA,EAC/C;AAAA,EAEA,MAAM,KAAA,CACJ,KAAA,EACA,OAAA,EACgC;AAChC,IAAA,MAAM,IAAA,GAAO,OAAO,KAAA,KAAU,QAAA,GAAW,QAAQ,MAAM,IAAA,CAAK,eAAe,KAAK,CAAA;AAEhF,IAAA,OAAO,IAAA,CAAK,OAAO,YAAY;AAC7B,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CACzB,KAAK,oBAAA,EAAsB;AAAA,QAC1B,IAAA,EAAM;AAAA,UACJ,OAAA,EAAU,OAAA,EAAS,OAAA,IAAW,IAAA,CAAK,YAAA;AAAA,UACnC,IAAA;AAAA,UACA,YAAA,EAAc,KAAK,WAAA,EAAa,IAAA;AAAA,UAChC,GAAG,IAAA,CAAK,UAAA;AAAA,UACR,GAAG,OAAA,EAAS;AAAA;AACd,OACD,EACA,IAAA,EAA2B;AAG9B,MAAA,MAAM,MAAA,GAAS,IAAI,WAAA,EAAY;AAG/B,MAAA,MAAM,aAAA,GAAgB,MAAM,KAAA,CAAM,QAAA,CAAS,SAAS,CAAA;AACpD,MAAA,IAAI,CAAC,cAAc,IAAA,EAAM;AACvB,QAAA,MAAM,IAAI,MAAM,2BAA2B,CAAA;AAAA,MAC7C;AAGA,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc,IAAA,CAAK,SAAA,EAAU;AAC5C,MAAA,CAAC,YAAY;AACX,QAAA,IAAI;AACF,UAAA,OAAO,IAAA,EAAM;AACX,YAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,YAAA,IAAI,IAAA,EAAM;AACR,cAAA,MAAA,CAAO,GAAA,EAAI;AACX,cAAA;AAAA,YACF;AACA,YAAA,MAAA,CAAO,MAAM,KAAK,CAAA;AAAA,UACpB;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,MAAA,CAAO,QAAQ,KAAc,CAAA;AAAA,QAC/B;AAAA,MACF,CAAA,GAAG,CAAE,KAAA,CAAM,CAAA,KAAA,KAAS;AAClB,QAAA,MAAA,CAAO,QAAQ,KAAc,CAAA;AAAA,MAC/B,CAAC,CAAA;AAED,MAAA,OAAO,MAAA;AAAA,IACT,CAAA,EAAG,kBAAkB,CAAA,EAAE;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,WAAA,GAAc;AAClB,IAAA,OAAO,EAAE,SAAS,KAAA,EAAM;AAAA,EAC1B;AAAA,EAEA,MAAM,MAAA,CACJ,MAAA,EACA,QAAA,EACyC;AACzC,IAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAAA,EAC5D;AAAA,EAEA,MAAM,WAAA,GAAc;AAClB,IAAA,OAAO,IAAA,CAAK,OAAO,YAAY;AAC7B,MAAA,OAAO,WAAA,CAAY,IAAI,CAAA,KAAA,MAAU;AAAA,QAC/B,OAAA,EAAS,KAAA;AAAA,QACT,IAAA,EAAM,KAAA;AAAA,QACN,QAAA,EAAU,KAAA,CAAM,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAAA,QAC5B,MAAA,EAAQ;AAAA,OACV,CAAE,CAAA;AAAA,IACJ,CAAA,EAAG,wBAAwB,CAAA,EAAE;AAAA,EAC/B;AACF","file":"index.js","sourcesContent":["/**\n * List of available voices for Murf TTS\n */\nexport const MURF_VOICES = [\n 'en-UK-hazel',\n 'en-US-cooper',\n 'en-US-imani',\n 'it-IT-giorgio',\n 'en-US-wayne',\n 'en-IN-shivani',\n 'en-US-daniel',\n 'bn-IN-anwesha',\n 'es-MX-alejandro',\n 'en-AU-joyce',\n 'en-US-zion',\n 'en-IN-isha',\n 'en-US-riley',\n 'ko-KR-hwan',\n 'fr-FR-adélie',\n 'en-US-carter',\n 'en-UK-gabriel',\n 'en-UK-juliet',\n 'en-IN-arohi',\n 'fr-FR-maxime',\n 'de-DE-josephine',\n 'en-UK-hugo',\n 'en-US-samantha',\n 'de-DE-erna',\n 'zh-CN-baolin',\n 'pt-BR-isadora',\n 'it-IT-vincenzo',\n 'en-US-terrell',\n 'en-US-denzel',\n 'en-UK-heidi',\n 'en-US-miles',\n 'en-US-abigail',\n 'fr-FR-justine',\n 'it-IT-greta',\n 'en-AU-shane',\n 'en-UK-peter',\n 'nl-NL-famke',\n 'en-AU-ivy',\n 'nl-NL-dirk',\n 'fr-FR-axel',\n 'es-ES-carla',\n 'en-US-claire',\n 'ko-KR-jangmi',\n 'ko-KR-sanghoon',\n 'it-IT-vera',\n 'hi-IN-rahul',\n 'es-ES-elvira',\n 'es-ES-enrique',\n 'en-UK-aiden',\n 'en-US-ronnie',\n 'en-UK-amber',\n 'hi-IN-shweta',\n 'hi-IN-amit',\n 'en-AU-jimm',\n 'en-UK-pearl',\n 'pt-BR-benício',\n 'en-UK-freddie',\n 'en-US-ryan',\n 'pt-BR-eloa',\n 'en-US-charlotte',\n 'de-DE-lia',\n 'en-US-natalie',\n 'en-US-michelle',\n 'en-US-phoebe',\n 'es-ES-carmen',\n 'en-US-caleb',\n 'en-US-iris',\n 'en-UK-harrison',\n 'en-US-marcus',\n 'en-US-josie',\n 'en-US-daisy',\n 'en-US-charles',\n 'en-UK-reggie',\n 'en-US-julia',\n 'en-SCOTT-emily',\n 'en-US-dylan',\n 'es-MX-valeria',\n 'en-IN-eashwar',\n 'en-AU-evelyn',\n 'de-DE-lara',\n 'en-US-evander',\n 'en-SCOTT-rory',\n 'ta-IN-iniya',\n 'en-AU-leyton',\n 'fr-FR-louise',\n 'zh-CN-wei',\n 'ko-KR-gyeong',\n 'de-DE-matthias',\n 'en-IN-rohan',\n 'en-US-delilah',\n 'bn-IN-abhik',\n 'en-US-angela',\n 'en-US-naomi',\n 'es-MX-carlos',\n 'nl-NL-merel',\n 'en-US-alicia',\n 'en-IN-alia',\n 'zh-CN-jiao',\n 'en-US-june',\n 'en-AU-ashton',\n 'en-UK-finley',\n 'pl-PL-blazej',\n 'zh-CN-zhang',\n 'en-AU-kylie',\n 'en-US-jayden',\n 'en-IN-aarav',\n 'de-DE-björn',\n 'bn-IN-ishani',\n 'zh-CN-yuxan',\n 'fr-FR-louis',\n 'ko-KR-jong-su',\n 'en-AU-harper',\n 'en-UK-ruby',\n 'en-US-ken',\n 'ta-IN-mani',\n 'de-DE-ralf',\n 'en-UK-jaxon',\n 'en-US-river',\n 'en-IN-priya',\n 'en-UK-theo',\n 'en-UK-katie',\n 'pl-PL-jacek',\n 'it-IT-lorenzo',\n 'hi-IN-shaan',\n 'en-US-amara',\n 'en-UK-mason',\n 'en-IN-surya',\n 'en-US-finn',\n 'pt-BR-gustavo',\n 'hi-IN-kabir',\n 'es-ES-javier',\n 'en-AU-mitch',\n 'pt-BR-heitor',\n 'en-US-edmund',\n 'hi-IN-ayushi',\n 'pl-PL-kasia',\n 'es-MX-luisa',\n 'zh-CN-tao',\n 'en-US-molly',\n] as const;\n\nexport type MurfVoiceId = (typeof MURF_VOICES)[number];\n","import { PassThrough } from 'stream';\n\nimport { MastraVoice } from '@mastra/core/voice';\nimport ky from 'ky';\n\nimport { MURF_VOICES } from './voices';\nimport type { MurfVoiceId } from './voices';\n\ntype MurfConfig = {\n name: 'GEN1' | 'GEN2';\n apiKey?: string;\n properties?: Omit<SpeechCreateParams, 'modelVersion' | 'voiceId' | 'text'>;\n};\n\ntype SpeechCreateParams = {\n voiceId: MurfVoiceId;\n text: string;\n modelVersion: 'GEN1' | 'GEN2';\n style?: string;\n rate?: number;\n pitch?: number;\n sampleRate?: 8000 | 24000 | 44100 | 48000;\n format?: 'MP3' | 'WAV' | 'FLAC' | 'ALAW' | 'ULAW';\n channelType?: 'STEREO' | 'MONO';\n pronunciationDictionary?: Record<string, string>;\n encodeAsBase64?: boolean;\n variation?: number;\n audioDuration?: number;\n multiNativeLocale?: string;\n};\n\ntype SpeechCreateResponse = {\n audioFile: string;\n audioLengthInSeconds: number;\n consumedCharacterCount: number;\n encodedAudio: string;\n remainingCharacterCount: number;\n warning: string;\n wordDurations: {\n endMs: number;\n pitchScaleMaximum: number;\n pitchScaleMinimum: number;\n sourceWordIndex: number;\n startMs: number;\n word: string;\n }[];\n};\n\nexport class MurfVoice extends MastraVoice {\n private client: typeof ky;\n private defaultVoice: MurfVoiceId;\n private properties: Omit<SpeechCreateParams, 'modelVersion' | 'voiceId' | 'text'>;\n\n constructor({ speechModel, speaker }: { speechModel?: MurfConfig; speaker?: string } = {}) {\n super({\n speechModel: {\n name: speechModel?.name ?? 'GEN2',\n apiKey: speechModel?.apiKey ?? process.env.MURF_API_KEY,\n },\n speaker: speaker ?? MURF_VOICES[0],\n });\n\n const apiKey = this.speechModel?.apiKey;\n if (!apiKey) {\n throw new Error('MURF_API_KEY is not set');\n }\n\n this.properties = {\n ...speechModel?.properties,\n };\n\n this.client = ky.create({\n prefixUrl: 'https://api.murf.ai',\n headers: {\n 'api-key': apiKey,\n },\n });\n\n this.defaultVoice = (speaker as MurfVoiceId) ?? MURF_VOICES[0];\n }\n\n private async streamToString(stream: NodeJS.ReadableStream): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of stream) {\n if (typeof chunk === 'string') {\n chunks.push(Buffer.from(chunk));\n } else {\n chunks.push(chunk);\n }\n }\n return Buffer.concat(chunks).toString('utf-8');\n }\n\n async speak(\n input: string | NodeJS.ReadableStream,\n options?: { speaker?: string; properties?: Omit<SpeechCreateParams, 'modelVersion' | 'voiceId' | 'text'> },\n ): Promise<NodeJS.ReadableStream> {\n const text = typeof input === 'string' ? input : await this.streamToString(input);\n\n return this.traced(async () => {\n const response = await this.client\n .post('v1/speech/generate', {\n json: {\n voiceId: (options?.speaker || this.defaultVoice) as MurfVoiceId,\n text,\n modelVersion: this.speechModel?.name,\n ...this.properties,\n ...options?.properties,\n },\n })\n .json<SpeechCreateResponse>();\n\n // Create a PassThrough stream for the audio\n const stream = new PassThrough();\n\n // Get the audio file as a stream\n const audioResponse = await fetch(response.audioFile);\n if (!audioResponse.body) {\n throw new Error('No response body received');\n }\n\n // Process the stream\n const reader = audioResponse.body.getReader();\n (async () => {\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n stream.end();\n break;\n }\n stream.write(value);\n }\n } catch (error) {\n stream.destroy(error as Error);\n }\n })().catch(error => {\n stream.destroy(error as Error);\n });\n\n return stream;\n }, 'voice.murf.speak')();\n }\n\n /**\n * Checks if listening capabilities are enabled.\n *\n * @returns {Promise<{ enabled: boolean }>}\n */\n async getListener() {\n return { enabled: false };\n }\n\n async listen(\n _input: NodeJS.ReadableStream,\n _options?: Record<string, unknown>,\n ): Promise<string | NodeJS.ReadableStream> {\n throw new Error('Murf does not support speech recognition');\n }\n\n async getSpeakers() {\n return this.traced(async () => {\n return MURF_VOICES.map(voice => ({\n voiceId: voice,\n name: voice,\n language: voice.split('-')[0],\n gender: 'neutral',\n }));\n }, 'voice.murf.getSpeakers')();\n }\n}\n\nexport type { MurfConfig, MurfVoiceId };\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/voices.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * List of available voices for Murf TTS\n */\nexport const MURF_VOICES = [\n 'en-UK-hazel',\n 'en-US-cooper',\n 'en-US-imani',\n 'it-IT-giorgio',\n 'en-US-wayne',\n 'en-IN-shivani',\n 'en-US-daniel',\n 'bn-IN-anwesha',\n 'es-MX-alejandro',\n 'en-AU-joyce',\n 'en-US-zion',\n 'en-IN-isha',\n 'en-US-riley',\n 'ko-KR-hwan',\n 'fr-FR-adélie',\n 'en-US-carter',\n 'en-UK-gabriel',\n 'en-UK-juliet',\n 'en-IN-arohi',\n 'fr-FR-maxime',\n 'de-DE-josephine',\n 'en-UK-hugo',\n 'en-US-samantha',\n 'de-DE-erna',\n 'zh-CN-baolin',\n 'pt-BR-isadora',\n 'it-IT-vincenzo',\n 'en-US-terrell',\n 'en-US-denzel',\n 'en-UK-heidi',\n 'en-US-miles',\n 'en-US-abigail',\n 'fr-FR-justine',\n 'it-IT-greta',\n 'en-AU-shane',\n 'en-UK-peter',\n 'nl-NL-famke',\n 'en-AU-ivy',\n 'nl-NL-dirk',\n 'fr-FR-axel',\n 'es-ES-carla',\n 'en-US-claire',\n 'ko-KR-jangmi',\n 'ko-KR-sanghoon',\n 'it-IT-vera',\n 'hi-IN-rahul',\n 'es-ES-elvira',\n 'es-ES-enrique',\n 'en-UK-aiden',\n 'en-US-ronnie',\n 'en-UK-amber',\n 'hi-IN-shweta',\n 'hi-IN-amit',\n 'en-AU-jimm',\n 'en-UK-pearl',\n 'pt-BR-benício',\n 'en-UK-freddie',\n 'en-US-ryan',\n 'pt-BR-eloa',\n 'en-US-charlotte',\n 'de-DE-lia',\n 'en-US-natalie',\n 'en-US-michelle',\n 'en-US-phoebe',\n 'es-ES-carmen',\n 'en-US-caleb',\n 'en-US-iris',\n 'en-UK-harrison',\n 'en-US-marcus',\n 'en-US-josie',\n 'en-US-daisy',\n 'en-US-charles',\n 'en-UK-reggie',\n 'en-US-julia',\n 'en-SCOTT-emily',\n 'en-US-dylan',\n 'es-MX-valeria',\n 'en-IN-eashwar',\n 'en-AU-evelyn',\n 'de-DE-lara',\n 'en-US-evander',\n 'en-SCOTT-rory',\n 'ta-IN-iniya',\n 'en-AU-leyton',\n 'fr-FR-louise',\n 'zh-CN-wei',\n 'ko-KR-gyeong',\n 'de-DE-matthias',\n 'en-IN-rohan',\n 'en-US-delilah',\n 'bn-IN-abhik',\n 'en-US-angela',\n 'en-US-naomi',\n 'es-MX-carlos',\n 'nl-NL-merel',\n 'en-US-alicia',\n 'en-IN-alia',\n 'zh-CN-jiao',\n 'en-US-june',\n 'en-AU-ashton',\n 'en-UK-finley',\n 'pl-PL-blazej',\n 'zh-CN-zhang',\n 'en-AU-kylie',\n 'en-US-jayden',\n 'en-IN-aarav',\n 'de-DE-björn',\n 'bn-IN-ishani',\n 'zh-CN-yuxan',\n 'fr-FR-louis',\n 'ko-KR-jong-su',\n 'en-AU-harper',\n 'en-UK-ruby',\n 'en-US-ken',\n 'ta-IN-mani',\n 'de-DE-ralf',\n 'en-UK-jaxon',\n 'en-US-river',\n 'en-IN-priya',\n 'en-UK-theo',\n 'en-UK-katie',\n 'pl-PL-jacek',\n 'it-IT-lorenzo',\n 'hi-IN-shaan',\n 'en-US-amara',\n 'en-UK-mason',\n 'en-IN-surya',\n 'en-US-finn',\n 'pt-BR-gustavo',\n 'hi-IN-kabir',\n 'es-ES-javier',\n 'en-AU-mitch',\n 'pt-BR-heitor',\n 'en-US-edmund',\n 'hi-IN-ayushi',\n 'pl-PL-kasia',\n 'es-MX-luisa',\n 'zh-CN-tao',\n 'en-US-molly',\n] as const;\n\nexport type MurfVoiceId = (typeof MURF_VOICES)[number];\n","import { PassThrough } from 'node:stream';\n\nimport { MastraVoice } from '@mastra/core/voice';\nimport ky from 'ky';\n\nimport { MURF_VOICES } from './voices';\nimport type { MurfVoiceId } from './voices';\n\ntype MurfConfig = {\n name: 'GEN1' | 'GEN2';\n apiKey?: string;\n properties?: Omit<SpeechCreateParams, 'modelVersion' | 'voiceId' | 'text'>;\n};\n\ntype SpeechCreateParams = {\n voiceId: MurfVoiceId;\n text: string;\n modelVersion: 'GEN1' | 'GEN2';\n style?: string;\n rate?: number;\n pitch?: number;\n sampleRate?: 8000 | 24000 | 44100 | 48000;\n format?: 'MP3' | 'WAV' | 'FLAC' | 'ALAW' | 'ULAW';\n channelType?: 'STEREO' | 'MONO';\n pronunciationDictionary?: Record<string, string>;\n encodeAsBase64?: boolean;\n variation?: number;\n audioDuration?: number;\n multiNativeLocale?: string;\n};\n\ntype SpeechCreateResponse = {\n audioFile: string;\n audioLengthInSeconds: number;\n consumedCharacterCount: number;\n encodedAudio: string;\n remainingCharacterCount: number;\n warning: string;\n wordDurations: {\n endMs: number;\n pitchScaleMaximum: number;\n pitchScaleMinimum: number;\n sourceWordIndex: number;\n startMs: number;\n word: string;\n }[];\n};\n\nexport class MurfVoice extends MastraVoice {\n private client: typeof ky;\n private defaultVoice: MurfVoiceId;\n private properties: Omit<SpeechCreateParams, 'modelVersion' | 'voiceId' | 'text'>;\n\n constructor({ speechModel, speaker }: { speechModel?: MurfConfig; speaker?: string } = {}) {\n super({\n speechModel: {\n name: speechModel?.name ?? 'GEN2',\n apiKey: speechModel?.apiKey ?? process.env.MURF_API_KEY,\n },\n speaker: speaker ?? MURF_VOICES[0],\n });\n\n const apiKey = this.speechModel?.apiKey;\n if (!apiKey) {\n throw new Error('MURF_API_KEY is not set');\n }\n\n this.properties = {\n ...speechModel?.properties,\n };\n\n this.client = ky.create({\n prefixUrl: 'https://api.murf.ai',\n headers: {\n 'api-key': apiKey,\n },\n });\n\n this.defaultVoice = (speaker as MurfVoiceId) ?? MURF_VOICES[0];\n }\n\n private async streamToString(stream: NodeJS.ReadableStream): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of stream) {\n if (typeof chunk === 'string') {\n chunks.push(Buffer.from(chunk));\n } else {\n chunks.push(chunk);\n }\n }\n return Buffer.concat(chunks).toString('utf-8');\n }\n\n async speak(\n input: string | NodeJS.ReadableStream,\n options?: { speaker?: string; properties?: Omit<SpeechCreateParams, 'modelVersion' | 'voiceId' | 'text'> },\n ): Promise<NodeJS.ReadableStream> {\n const text = typeof input === 'string' ? input : await this.streamToString(input);\n\n const response = await this.client\n .post('v1/speech/generate', {\n json: {\n voiceId: (options?.speaker || this.defaultVoice) as MurfVoiceId,\n text,\n modelVersion: this.speechModel?.name,\n ...this.properties,\n ...options?.properties,\n },\n })\n .json<SpeechCreateResponse>();\n\n // Create a PassThrough stream for the audio\n const stream = new PassThrough();\n\n // Get the audio file as a stream\n const audioResponse = await fetch(response.audioFile);\n if (!audioResponse.body) {\n throw new Error('No response body received');\n }\n\n // Process the stream\n const reader = audioResponse.body.getReader();\n (async () => {\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n stream.end();\n break;\n }\n stream.write(value);\n }\n } catch (error) {\n stream.destroy(error as Error);\n }\n })().catch(error => {\n stream.destroy(error as Error);\n });\n\n return stream;\n }\n\n /**\n * Checks if listening capabilities are enabled.\n *\n * @returns {Promise<{ enabled: boolean }>}\n */\n async getListener() {\n return { enabled: false };\n }\n\n async listen(\n _input: NodeJS.ReadableStream,\n _options?: Record<string, unknown>,\n ): Promise<string | NodeJS.ReadableStream> {\n throw new Error('Murf does not support speech recognition');\n }\n\n async getSpeakers() {\n return MURF_VOICES.map(voice => ({\n voiceId: voice,\n name: voice,\n language: voice.split('-')[0],\n gender: 'neutral',\n }));\n }\n}\n\nexport type { MurfConfig, MurfVoiceId };\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mastra/voice-murf",
|
|
3
|
-
"version": "0.0.0-
|
|
3
|
+
"version": "0.0.0-jail-fs-20260105160110",
|
|
4
4
|
"description": "Mastra Murf voice integration",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
@@ -27,19 +27,20 @@
|
|
|
27
27
|
"ky": "^1.8.2"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
|
-
"@
|
|
31
|
-
"@
|
|
32
|
-
"
|
|
30
|
+
"@types/node": "22.13.17",
|
|
31
|
+
"@vitest/coverage-v8": "4.0.12",
|
|
32
|
+
"@vitest/ui": "4.0.12",
|
|
33
|
+
"eslint": "^9.37.0",
|
|
33
34
|
"tsup": "^8.5.0",
|
|
34
35
|
"typescript": "^5.8.3",
|
|
35
|
-
"vitest": "
|
|
36
|
-
"@internal/lint": "0.0.0-
|
|
37
|
-
"@internal/types-builder": "0.0.0-
|
|
38
|
-
"@mastra/core": "0.0.0-
|
|
36
|
+
"vitest": "4.0.16",
|
|
37
|
+
"@internal/lint": "0.0.0-jail-fs-20260105160110",
|
|
38
|
+
"@internal/types-builder": "0.0.0-jail-fs-20260105160110",
|
|
39
|
+
"@mastra/core": "0.0.0-jail-fs-20260105160110"
|
|
39
40
|
},
|
|
40
41
|
"peerDependencies": {
|
|
41
42
|
"zod": "^3.25.0 || ^4.0.0",
|
|
42
|
-
"@mastra/core": "0.0.0-
|
|
43
|
+
"@mastra/core": "0.0.0-jail-fs-20260105160110"
|
|
43
44
|
},
|
|
44
45
|
"homepage": "https://mastra.ai",
|
|
45
46
|
"repository": {
|
|
@@ -50,8 +51,12 @@
|
|
|
50
51
|
"bugs": {
|
|
51
52
|
"url": "https://github.com/mastra-ai/mastra/issues"
|
|
52
53
|
},
|
|
54
|
+
"engines": {
|
|
55
|
+
"node": ">=22.13.0"
|
|
56
|
+
},
|
|
53
57
|
"scripts": {
|
|
54
58
|
"build": "tsup --silent --config tsup.config.ts",
|
|
59
|
+
"postbuild": "pnpx tsx ../../scripts/generate-package-docs.ts voice/murf",
|
|
55
60
|
"build:watch": "tsup --watch --silent --config tsup.config.ts",
|
|
56
61
|
"test": "vitest run",
|
|
57
62
|
"lint": "eslint ."
|