@mastra/voice-murf 0.0.0-mssql-store-20250804200341 → 0.0.0-netlify-no-bundle-20251127120354

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.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
- return this.traced(async () => {
198
- const response = await this.client.post("v1/speech/generate", {
199
- json: {
200
- voiceId: options?.speaker || this.defaultVoice,
201
- text,
202
- modelVersion: this.speechModel?.name,
203
- ...this.properties,
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
- const reader = audioResponse.body.getReader();
213
- (async () => {
214
- try {
215
- while (true) {
216
- const { done, value } = await reader.read();
217
- if (done) {
218
- stream$1.end();
219
- break;
220
- }
221
- stream$1.write(value);
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
- } catch (error) {
224
- stream$1.destroy(error);
220
+ stream$1.write(value);
225
221
  }
226
- })().catch((error) => {
222
+ } catch (error) {
227
223
  stream$1.destroy(error);
228
- });
229
- return stream$1;
230
- }, "voice.murf.speak")();
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 this.traced(async () => {
245
- return MURF_VOICES.map((voice) => ({
246
- voiceId: voice,
247
- name: voice,
248
- language: voice.split("-")[0],
249
- gender: "neutral"
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
 
@@ -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":";;;;;;;;;;;;;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,cAAwBA,iBAAA,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,GAASC,oBAAG,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,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CACzB,KAAK,oBAAA,EAAsB;AAAA,MAC1B,IAAA,EAAM;AAAA,QACJ,OAAA,EAAU,OAAA,EAAS,OAAA,IAAW,IAAA,CAAK,YAAA;AAAA,QACnC,IAAA;AAAA,QACA,YAAA,EAAc,KAAK,WAAA,EAAa,IAAA;AAAA,QAChC,GAAG,IAAA,CAAK,UAAA;AAAA,QACR,GAAG,OAAA,EAAS;AAAA;AACd,KACD,EACA,IAAA,EAA2B;AAG9B,IAAA,MAAMC,QAAA,GAAS,IAAIC,kBAAA,EAAY;AAG/B,IAAA,MAAM,aAAA,GAAgB,MAAM,KAAA,CAAM,QAAA,CAAS,SAAS,CAAA;AACpD,IAAA,IAAI,CAAC,cAAc,IAAA,EAAM;AACvB,MAAA,MAAM,IAAI,MAAM,2BAA2B,CAAA;AAAA,IAC7C;AAGA,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,IAAA,CAAK,SAAA,EAAU;AAC5C,IAAA,CAAC,YAAY;AACX,MAAA,IAAI;AACF,QAAA,OAAO,IAAA,EAAM;AACX,UAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,UAAA,IAAI,IAAA,EAAM;AACR,YAAAD,QAAA,CAAO,GAAA,EAAI;AACX,YAAA;AAAA,UACF;AACA,UAAAA,QAAA,CAAO,MAAM,KAAK,CAAA;AAAA,QACpB;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAAA,QAAA,CAAO,QAAQ,KAAc,CAAA;AAAA,MAC/B;AAAA,IACF,CAAA,GAAG,CAAE,KAAA,CAAM,CAAA,KAAA,KAAS;AAClB,MAAAA,QAAA,CAAO,QAAQ,KAAc,CAAA;AAAA,IAC/B,CAAC,CAAA;AAED,IAAA,OAAOA,QAAA;AAAA,EACT;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,WAAA,CAAY,IAAI,CAAA,KAAA,MAAU;AAAA,MAC/B,OAAA,EAAS,KAAA;AAAA,MACT,IAAA,EAAM,KAAA;AAAA,MACN,QAAA,EAAU,KAAA,CAAM,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAAA,MAC5B,MAAA,EAAQ;AAAA,KACV,CAAE,CAAA;AAAA,EACJ;AACF","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 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 CHANGED
@@ -1,5 +1,5 @@
1
1
  import { MastraVoice } from '@mastra/core/voice';
2
- import type { MurfVoiceId } from './voices';
2
+ import type { MurfVoiceId } from './voices.js';
3
3
  type MurfConfig = {
4
4
  name: 'GEN1' | 'GEN2';
5
5
  apiKey?: string;
@@ -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;IAgDjC;;;;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;;;;;;CAUlB;AAED,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,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
- return this.traced(async () => {
192
- const response = await this.client.post("v1/speech/generate", {
193
- json: {
194
- voiceId: options?.speaker || this.defaultVoice,
195
- text,
196
- modelVersion: this.speechModel?.name,
197
- ...this.properties,
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
- const reader = audioResponse.body.getReader();
207
- (async () => {
208
- try {
209
- while (true) {
210
- const { done, value } = await reader.read();
211
- if (done) {
212
- stream.end();
213
- break;
214
- }
215
- stream.write(value);
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
- } catch (error) {
218
- stream.destroy(error);
214
+ stream.write(value);
219
215
  }
220
- })().catch((error) => {
216
+ } catch (error) {
221
217
  stream.destroy(error);
222
- });
223
- return stream;
224
- }, "voice.murf.speak")();
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 this.traced(async () => {
239
- return MURF_VOICES.map((voice) => ({
240
- voiceId: voice,
241
- name: voice,
242
- language: voice.split("-")[0],
243
- gender: "neutral"
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":"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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 '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":";;;;;;;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,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CACzB,KAAK,oBAAA,EAAsB;AAAA,MAC1B,IAAA,EAAM;AAAA,QACJ,OAAA,EAAU,OAAA,EAAS,OAAA,IAAW,IAAA,CAAK,YAAA;AAAA,QACnC,IAAA;AAAA,QACA,YAAA,EAAc,KAAK,WAAA,EAAa,IAAA;AAAA,QAChC,GAAG,IAAA,CAAK,UAAA;AAAA,QACR,GAAG,OAAA,EAAS;AAAA;AACd,KACD,EACA,IAAA,EAA2B;AAG9B,IAAA,MAAM,MAAA,GAAS,IAAI,WAAA,EAAY;AAG/B,IAAA,MAAM,aAAA,GAAgB,MAAM,KAAA,CAAM,QAAA,CAAS,SAAS,CAAA;AACpD,IAAA,IAAI,CAAC,cAAc,IAAA,EAAM;AACvB,MAAA,MAAM,IAAI,MAAM,2BAA2B,CAAA;AAAA,IAC7C;AAGA,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,IAAA,CAAK,SAAA,EAAU;AAC5C,IAAA,CAAC,YAAY;AACX,MAAA,IAAI;AACF,QAAA,OAAO,IAAA,EAAM;AACX,UAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,UAAA,IAAI,IAAA,EAAM;AACR,YAAA,MAAA,CAAO,GAAA,EAAI;AACX,YAAA;AAAA,UACF;AACA,UAAA,MAAA,CAAO,MAAM,KAAK,CAAA;AAAA,QACpB;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,QAAQ,KAAc,CAAA;AAAA,MAC/B;AAAA,IACF,CAAA,GAAG,CAAE,KAAA,CAAM,CAAA,KAAA,KAAS;AAClB,MAAA,MAAA,CAAO,QAAQ,KAAc,CAAA;AAAA,IAC/B,CAAC,CAAA;AAED,IAAA,OAAO,MAAA;AAAA,EACT;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,WAAA,CAAY,IAAI,CAAA,KAAA,MAAU;AAAA,MAC/B,OAAA,EAAS,KAAA;AAAA,MACT,IAAA,EAAM,KAAA;AAAA,MACN,QAAA,EAAU,KAAA,CAAM,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAAA,MAC5B,MAAA,EAAQ;AAAA,KACV,CAAE,CAAA;AAAA,EACJ;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 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,10 +1,11 @@
1
1
  {
2
2
  "name": "@mastra/voice-murf",
3
- "version": "0.0.0-mssql-store-20250804200341",
3
+ "version": "0.0.0-netlify-no-bundle-20251127120354",
4
4
  "description": "Mastra Murf voice integration",
5
5
  "type": "module",
6
6
  "files": [
7
- "dist"
7
+ "dist",
8
+ "CHANGELOG.md"
8
9
  ],
9
10
  "main": "dist/index.js",
10
11
  "types": "dist/index.d.ts",
@@ -15,7 +16,7 @@
15
16
  "default": "./dist/index.js"
16
17
  },
17
18
  "require": {
18
- "types": "./dist/index.d.cts",
19
+ "types": "./dist/index.d.ts",
19
20
  "default": "./dist/index.cjs"
20
21
  }
21
22
  },
@@ -23,21 +24,36 @@
23
24
  },
24
25
  "license": "Apache-2.0",
25
26
  "dependencies": {
26
- "ky": "^1.8.2",
27
- "zod": "^3.25.67"
27
+ "ky": "^1.8.2"
28
28
  },
29
29
  "devDependencies": {
30
30
  "@microsoft/api-extractor": "^7.52.8",
31
- "@types/node": "^20.19.0",
32
- "eslint": "^9.30.1",
31
+ "@types/node": "22.13.17",
32
+ "@vitest/coverage-v8": "4.0.12",
33
+ "@vitest/ui": "4.0.12",
34
+ "eslint": "^9.37.0",
33
35
  "tsup": "^8.5.0",
34
36
  "typescript": "^5.8.3",
35
- "vitest": "^3.2.4",
36
- "@mastra/core": "0.0.0-mssql-store-20250804200341",
37
- "@internal/lint": "0.0.0-mssql-store-20250804200341"
37
+ "vitest": "4.0.12",
38
+ "@internal/lint": "0.0.0-netlify-no-bundle-20251127120354",
39
+ "@mastra/core": "0.0.0-netlify-no-bundle-20251127120354",
40
+ "@internal/types-builder": "0.0.0-netlify-no-bundle-20251127120354"
38
41
  },
39
42
  "peerDependencies": {
40
- "@mastra/core": "0.0.0-mssql-store-20250804200341"
43
+ "zod": "^3.25.0 || ^4.0.0",
44
+ "@mastra/core": "0.0.0-netlify-no-bundle-20251127120354"
45
+ },
46
+ "homepage": "https://mastra.ai",
47
+ "repository": {
48
+ "type": "git",
49
+ "url": "git+https://github.com/mastra-ai/mastra.git",
50
+ "directory": "voice/murf"
51
+ },
52
+ "bugs": {
53
+ "url": "https://github.com/mastra-ai/mastra/issues"
54
+ },
55
+ "engines": {
56
+ "node": ">=22.13.0"
41
57
  },
42
58
  "scripts": {
43
59
  "build": "tsup --silent --config tsup.config.ts",