@mastra/voice-playai 0.11.12 → 0.12.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -171,34 +171,32 @@ var PlayAIVoice = class extends MastraVoice {
171
171
  }
172
172
  async speak(input, options) {
173
173
  const text = typeof input === "string" ? input : await this.streamToString(input);
174
- return this.traced(async () => {
175
- const payload = {
176
- text,
177
- voice: options?.speaker || this.speaker,
178
- model: this.speechModel?.name
179
- };
180
- const response = await this.makeRequest("/tts/stream", payload);
181
- if (!response.body) {
182
- throw new Error("No response body received");
183
- }
184
- const stream = new PassThrough();
185
- const reader = response.body.getReader();
186
- void (async () => {
187
- try {
188
- while (true) {
189
- const { done, value } = await reader.read();
190
- if (done) {
191
- stream.end();
192
- break;
193
- }
194
- stream.write(value);
174
+ const payload = {
175
+ text,
176
+ voice: options?.speaker || this.speaker,
177
+ model: this.speechModel?.name
178
+ };
179
+ const response = await this.makeRequest("/tts/stream", payload);
180
+ if (!response.body) {
181
+ throw new Error("No response body received");
182
+ }
183
+ const stream = new PassThrough();
184
+ const reader = response.body.getReader();
185
+ void (async () => {
186
+ try {
187
+ while (true) {
188
+ const { done, value } = await reader.read();
189
+ if (done) {
190
+ stream.end();
191
+ break;
195
192
  }
196
- } catch (error) {
197
- stream.destroy(error);
193
+ stream.write(value);
198
194
  }
199
- })();
200
- return stream;
201
- }, "voice.playai.speak")();
195
+ } catch (error) {
196
+ stream.destroy(error);
197
+ }
198
+ })();
199
+ return stream;
202
200
  }
203
201
  /**
204
202
  * Checks if listening capabilities are enabled.
@@ -212,19 +210,16 @@ var PlayAIVoice = class extends MastraVoice {
212
210
  throw new Error("PlayAI does not support speech recognition");
213
211
  }
214
212
  async getSpeakers() {
215
- return this.traced(
216
- () => Promise.resolve(
217
- PLAYAI_VOICES.map((voice) => ({
218
- voiceId: voice.id,
219
- name: voice.name,
220
- accent: voice.accent,
221
- gender: voice.gender,
222
- age: voice.age,
223
- style: voice.style
224
- }))
225
- ),
226
- "voice.playai.voices"
227
- )();
213
+ return Promise.resolve(
214
+ PLAYAI_VOICES.map((voice) => ({
215
+ voiceId: voice.id,
216
+ name: voice.name,
217
+ accent: voice.accent,
218
+ gender: voice.gender,
219
+ age: voice.age,
220
+ style: voice.style
221
+ }))
222
+ );
228
223
  }
229
224
  };
230
225
 
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { PassThrough } from 'stream';\n\nimport { MastraVoice } from '@mastra/core/voice';\n\ninterface PlayAIVoiceInfo {\n name: string;\n accent: string;\n gender: 'M' | 'F';\n age: 'Young' | 'Middle' | 'Old';\n style: 'Conversational' | 'Narrative';\n id: string;\n}\n\nexport const PLAYAI_VOICES: PlayAIVoiceInfo[] = [\n {\n name: 'Angelo',\n accent: 'US',\n gender: 'M',\n age: 'Young',\n style: 'Conversational',\n id: 's3://voice-cloning-zero-shot/baf1ef41-36b6-428c-9bdf-50ba54682bd8/original/manifest.json',\n },\n {\n name: 'Arsenio',\n accent: 'US African American',\n gender: 'M',\n age: 'Middle',\n style: 'Conversational',\n id: 's3://voice-cloning-zero-shot/65977f5e-a22a-4b36-861b-ecede19bdd65/original/manifest.json',\n },\n {\n name: 'Cillian',\n accent: 'Irish',\n gender: 'M',\n age: 'Middle',\n style: 'Conversational',\n id: 's3://voice-cloning-zero-shot/1591b954-8760-41a9-bc58-9176a68c5726/original/manifest.json',\n },\n {\n name: 'Timo',\n accent: 'US',\n gender: 'M',\n age: 'Middle',\n style: 'Conversational',\n id: 's3://voice-cloning-zero-shot/677a4ae3-252f-476e-85ce-eeed68e85951/original/manifest.json',\n },\n {\n name: 'Dexter',\n accent: 'US',\n gender: 'M',\n age: 'Middle',\n style: 'Conversational',\n id: 's3://voice-cloning-zero-shot/b27bc13e-996f-4841-b584-4d35801aea98/original/manifest.json',\n },\n {\n name: 'Miles',\n accent: 'US African American',\n gender: 'M',\n age: 'Young',\n style: 'Conversational',\n id: 's3://voice-cloning-zero-shot/29dd9a52-bd32-4a6e-bff1-bbb98dcc286a/original/manifest.json',\n },\n {\n name: 'Briggs',\n accent: 'US Southern (Oklahoma)',\n gender: 'M',\n age: 'Old',\n style: 'Conversational',\n id: 's3://voice-cloning-zero-shot/71cdb799-1e03-41c6-8a05-f7cd55134b0b/original/manifest.json',\n },\n {\n name: 'Deedee',\n accent: 'US African American',\n gender: 'F',\n age: 'Middle',\n style: 'Conversational',\n id: 's3://voice-cloning-zero-shot/e040bd1b-f190-4bdb-83f0-75ef85b18f84/original/manifest.json',\n },\n {\n name: 'Nia',\n accent: 'US',\n gender: 'F',\n age: 'Young',\n style: 'Conversational',\n id: 's3://voice-cloning-zero-shot/831bd330-85c6-4333-b2b4-10c476ea3491/original/manifest.json',\n },\n {\n name: 'Inara',\n accent: 'US African American',\n gender: 'F',\n age: 'Middle',\n style: 'Conversational',\n id: 's3://voice-cloning-zero-shot/adb83b67-8d75-48ff-ad4d-a0840d231ef1/original/manifest.json',\n },\n {\n name: 'Constanza',\n accent: 'US Latin American',\n gender: 'F',\n age: 'Young',\n style: 'Conversational',\n id: 's3://voice-cloning-zero-shot/b0aca4d7-1738-4848-a80b-307ac44a7298/original/manifest.json',\n },\n {\n name: 'Gideon',\n accent: 'British',\n gender: 'M',\n age: 'Old',\n style: 'Narrative',\n id: 's3://voice-cloning-zero-shot/5a3a1168-7793-4b2c-8f90-aff2b5232131/original/manifest.json',\n },\n {\n name: 'Casper',\n accent: 'US',\n gender: 'M',\n age: 'Middle',\n style: 'Narrative',\n id: 's3://voice-cloning-zero-shot/1bbc6986-fadf-4bd8-98aa-b86fed0476e9/original/manifest.json',\n },\n {\n name: 'Mitch',\n accent: 'Australian',\n gender: 'M',\n age: 'Middle',\n style: 'Narrative',\n id: 's3://voice-cloning-zero-shot/c14e50f2-c5e3-47d1-8c45-fa4b67803d19/original/manifest.json',\n },\n {\n name: 'Ava',\n accent: 'Australian',\n gender: 'F',\n age: 'Middle',\n style: 'Narrative',\n id: 's3://voice-cloning-zero-shot/50381567-ff7b-46d2-bfdc-a9584a85e08d/original/manifest.json',\n },\n];\n\ninterface PlayAIConfig {\n name?: 'PlayDialog' | 'Play3.0-mini';\n apiKey?: string;\n userId?: string;\n}\n\nexport class PlayAIVoice extends MastraVoice {\n private baseUrl = 'https://api.play.ai/api/v1';\n private userId: string;\n\n constructor({ speechModel, speaker }: { speechModel?: PlayAIConfig; speaker?: string } = {}) {\n super({\n speechModel: {\n name: speechModel?.name ?? 'PlayDialog',\n apiKey: speechModel?.apiKey ?? process.env.PLAYAI_API_KEY,\n },\n speaker: speaker ?? PLAYAI_VOICES[0]?.id,\n });\n const userId = speechModel?.userId ?? process.env.PLAYAI_USER_ID;\n if (!userId) {\n throw new Error('userId is required');\n }\n\n this.userId = userId;\n }\n\n private async makeRequest(endpoint: string, payload?: any, method: 'GET' | 'POST' = 'POST') {\n const headers = new Headers({\n Authorization: `Bearer ${this.speechModel?.apiKey}`,\n 'Content-Type': 'application/json',\n 'X-USER-ID': this.userId,\n });\n\n const response = await fetch(`${this.baseUrl}${endpoint}`, {\n method,\n headers,\n body: payload ? JSON.stringify(payload) : undefined,\n });\n\n if (!response.ok) {\n const error = (await response.json()) as { message: string };\n\n throw new Error(`PlayAI API Error: ${error.message || response.statusText}`);\n }\n\n return response;\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(input: string | NodeJS.ReadableStream, options?: { speaker?: string }): Promise<NodeJS.ReadableStream> {\n const text = typeof input === 'string' ? input : await this.streamToString(input);\n\n return this.traced(async () => {\n const payload = {\n text,\n voice: options?.speaker || this.speaker,\n model: this.speechModel?.name,\n };\n\n const response = await this.makeRequest('/tts/stream', payload);\n if (!response.body) {\n throw new Error('No response body received');\n }\n\n // Create a PassThrough stream for the audio\n const stream = new PassThrough();\n\n // Process the stream\n const reader = response.body.getReader();\n void (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 })();\n\n return stream;\n }, 'voice.playai.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('PlayAI does not support speech recognition');\n }\n\n async getSpeakers() {\n return this.traced(\n () =>\n Promise.resolve(\n PLAYAI_VOICES.map(voice => ({\n voiceId: voice.id,\n name: voice.name,\n accent: voice.accent,\n gender: voice.gender,\n age: voice.age,\n style: voice.style,\n })),\n ),\n 'voice.playai.voices',\n )();\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { PassThrough } from 'node:stream';\n\nimport { MastraVoice } from '@mastra/core/voice';\n\ninterface PlayAIVoiceInfo {\n name: string;\n accent: string;\n gender: 'M' | 'F';\n age: 'Young' | 'Middle' | 'Old';\n style: 'Conversational' | 'Narrative';\n id: string;\n}\n\nexport const PLAYAI_VOICES: PlayAIVoiceInfo[] = [\n {\n name: 'Angelo',\n accent: 'US',\n gender: 'M',\n age: 'Young',\n style: 'Conversational',\n id: 's3://voice-cloning-zero-shot/baf1ef41-36b6-428c-9bdf-50ba54682bd8/original/manifest.json',\n },\n {\n name: 'Arsenio',\n accent: 'US African American',\n gender: 'M',\n age: 'Middle',\n style: 'Conversational',\n id: 's3://voice-cloning-zero-shot/65977f5e-a22a-4b36-861b-ecede19bdd65/original/manifest.json',\n },\n {\n name: 'Cillian',\n accent: 'Irish',\n gender: 'M',\n age: 'Middle',\n style: 'Conversational',\n id: 's3://voice-cloning-zero-shot/1591b954-8760-41a9-bc58-9176a68c5726/original/manifest.json',\n },\n {\n name: 'Timo',\n accent: 'US',\n gender: 'M',\n age: 'Middle',\n style: 'Conversational',\n id: 's3://voice-cloning-zero-shot/677a4ae3-252f-476e-85ce-eeed68e85951/original/manifest.json',\n },\n {\n name: 'Dexter',\n accent: 'US',\n gender: 'M',\n age: 'Middle',\n style: 'Conversational',\n id: 's3://voice-cloning-zero-shot/b27bc13e-996f-4841-b584-4d35801aea98/original/manifest.json',\n },\n {\n name: 'Miles',\n accent: 'US African American',\n gender: 'M',\n age: 'Young',\n style: 'Conversational',\n id: 's3://voice-cloning-zero-shot/29dd9a52-bd32-4a6e-bff1-bbb98dcc286a/original/manifest.json',\n },\n {\n name: 'Briggs',\n accent: 'US Southern (Oklahoma)',\n gender: 'M',\n age: 'Old',\n style: 'Conversational',\n id: 's3://voice-cloning-zero-shot/71cdb799-1e03-41c6-8a05-f7cd55134b0b/original/manifest.json',\n },\n {\n name: 'Deedee',\n accent: 'US African American',\n gender: 'F',\n age: 'Middle',\n style: 'Conversational',\n id: 's3://voice-cloning-zero-shot/e040bd1b-f190-4bdb-83f0-75ef85b18f84/original/manifest.json',\n },\n {\n name: 'Nia',\n accent: 'US',\n gender: 'F',\n age: 'Young',\n style: 'Conversational',\n id: 's3://voice-cloning-zero-shot/831bd330-85c6-4333-b2b4-10c476ea3491/original/manifest.json',\n },\n {\n name: 'Inara',\n accent: 'US African American',\n gender: 'F',\n age: 'Middle',\n style: 'Conversational',\n id: 's3://voice-cloning-zero-shot/adb83b67-8d75-48ff-ad4d-a0840d231ef1/original/manifest.json',\n },\n {\n name: 'Constanza',\n accent: 'US Latin American',\n gender: 'F',\n age: 'Young',\n style: 'Conversational',\n id: 's3://voice-cloning-zero-shot/b0aca4d7-1738-4848-a80b-307ac44a7298/original/manifest.json',\n },\n {\n name: 'Gideon',\n accent: 'British',\n gender: 'M',\n age: 'Old',\n style: 'Narrative',\n id: 's3://voice-cloning-zero-shot/5a3a1168-7793-4b2c-8f90-aff2b5232131/original/manifest.json',\n },\n {\n name: 'Casper',\n accent: 'US',\n gender: 'M',\n age: 'Middle',\n style: 'Narrative',\n id: 's3://voice-cloning-zero-shot/1bbc6986-fadf-4bd8-98aa-b86fed0476e9/original/manifest.json',\n },\n {\n name: 'Mitch',\n accent: 'Australian',\n gender: 'M',\n age: 'Middle',\n style: 'Narrative',\n id: 's3://voice-cloning-zero-shot/c14e50f2-c5e3-47d1-8c45-fa4b67803d19/original/manifest.json',\n },\n {\n name: 'Ava',\n accent: 'Australian',\n gender: 'F',\n age: 'Middle',\n style: 'Narrative',\n id: 's3://voice-cloning-zero-shot/50381567-ff7b-46d2-bfdc-a9584a85e08d/original/manifest.json',\n },\n];\n\ninterface PlayAIConfig {\n name?: 'PlayDialog' | 'Play3.0-mini';\n apiKey?: string;\n userId?: string;\n}\n\nexport class PlayAIVoice extends MastraVoice {\n private baseUrl = 'https://api.play.ai/api/v1';\n private userId: string;\n\n constructor({ speechModel, speaker }: { speechModel?: PlayAIConfig; speaker?: string } = {}) {\n super({\n speechModel: {\n name: speechModel?.name ?? 'PlayDialog',\n apiKey: speechModel?.apiKey ?? process.env.PLAYAI_API_KEY,\n },\n speaker: speaker ?? PLAYAI_VOICES[0]?.id,\n });\n const userId = speechModel?.userId ?? process.env.PLAYAI_USER_ID;\n if (!userId) {\n throw new Error('userId is required');\n }\n\n this.userId = userId;\n }\n\n private async makeRequest(endpoint: string, payload?: any, method: 'GET' | 'POST' = 'POST') {\n const headers = new Headers({\n Authorization: `Bearer ${this.speechModel?.apiKey}`,\n 'Content-Type': 'application/json',\n 'X-USER-ID': this.userId,\n });\n\n const response = await fetch(`${this.baseUrl}${endpoint}`, {\n method,\n headers,\n body: payload ? JSON.stringify(payload) : undefined,\n });\n\n if (!response.ok) {\n const error = (await response.json()) as { message: string };\n\n throw new Error(`PlayAI API Error: ${error.message || response.statusText}`);\n }\n\n return response;\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(input: string | NodeJS.ReadableStream, options?: { speaker?: string }): Promise<NodeJS.ReadableStream> {\n const text = typeof input === 'string' ? input : await this.streamToString(input);\n\n const payload = {\n text,\n voice: options?.speaker || this.speaker,\n model: this.speechModel?.name,\n };\n\n const response = await this.makeRequest('/tts/stream', payload);\n if (!response.body) {\n throw new Error('No response body received');\n }\n\n // Create a PassThrough stream for the audio\n const stream = new PassThrough();\n\n // Process the stream\n const reader = response.body.getReader();\n void (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 })();\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('PlayAI does not support speech recognition');\n }\n\n async getSpeakers() {\n return Promise.resolve(\n PLAYAI_VOICES.map(voice => ({\n voiceId: voice.id,\n name: voice.name,\n accent: voice.accent,\n gender: voice.gender,\n age: voice.age,\n style: voice.style,\n })),\n );\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mastra/voice-playai",
3
- "version": "0.11.12",
3
+ "version": "0.12.0-beta.1",
4
4
  "description": "Mastra PlayAI voice integration",
5
5
  "type": "module",
6
6
  "files": [
@@ -23,20 +23,20 @@
23
23
  "./package.json": "./package.json"
24
24
  },
25
25
  "license": "Apache-2.0",
26
- "dependencies": {},
27
26
  "devDependencies": {
28
- "@microsoft/api-extractor": "^7.52.8",
29
- "@types/node": "^20.19.0",
27
+ "@types/node": "22.13.17",
28
+ "@vitest/coverage-v8": "4.0.12",
29
+ "@vitest/ui": "4.0.12",
30
30
  "eslint": "^9.37.0",
31
31
  "tsup": "^8.5.0",
32
- "typescript": "^5.8.3",
33
- "vitest": "^3.2.4",
34
- "@internal/types-builder": "0.0.33",
35
- "@mastra/core": "0.24.0",
36
- "@internal/lint": "0.0.58"
32
+ "typescript": "^5.9.3",
33
+ "vitest": "4.0.16",
34
+ "@internal/lint": "0.0.53",
35
+ "@internal/types-builder": "0.0.28",
36
+ "@mastra/core": "1.0.0-beta.20"
37
37
  },
38
38
  "peerDependencies": {
39
- "@mastra/core": ">=0.18.1-0 <0.25.0-0",
39
+ "@mastra/core": ">=1.0.0-0 <2.0.0-0",
40
40
  "zod": "^3.25.0 || ^4.0.0"
41
41
  },
42
42
  "homepage": "https://mastra.ai",
@@ -48,15 +48,12 @@
48
48
  "bugs": {
49
49
  "url": "https://github.com/mastra-ai/mastra/issues"
50
50
  },
51
- "publishConfig": {
52
- "access": "public",
53
- "publish-branch": [
54
- "main",
55
- "0.x"
56
- ]
51
+ "engines": {
52
+ "node": ">=22.13.0"
57
53
  },
58
54
  "scripts": {
59
55
  "build": "tsup --silent --config tsup.config.ts",
56
+ "postbuild": "pnpx tsx ../../scripts/generate-package-docs.ts voice/playai",
60
57
  "build:watch": "tsup --watch --silent --config tsup.config.ts",
61
58
  "test": "vitest run",
62
59
  "lint": "eslint ."