@mastra/voice-deepgram 0.11.12-alpha.0 → 0.12.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -10
- package/dist/index.cjs +54 -60
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +54 -60
- package/dist/index.js.map +1 -1
- package/package.json +7 -11
package/CHANGELOG.md
CHANGED
|
@@ -1,22 +1,19 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## 0.
|
|
3
|
+
## 0.12.0-beta.0
|
|
4
4
|
|
|
5
|
-
###
|
|
5
|
+
### Minor Changes
|
|
6
6
|
|
|
7
|
-
-
|
|
7
|
+
- Update peer dependencies to match core package version bump (1.0.0) ([#9237](https://github.com/mastra-ai/mastra/pull/9237))
|
|
8
8
|
|
|
9
|
-
-
|
|
10
|
-
- @mastra/core@0.24.0-alpha.0
|
|
9
|
+
- Bump minimum required Node.js version to 22.13.0 ([#9706](https://github.com/mastra-ai/mastra/pull/9706))
|
|
11
10
|
|
|
12
|
-
|
|
11
|
+
- Removed old tracing code based on OpenTelemetry ([#9237](https://github.com/mastra-ai/mastra/pull/9237))
|
|
13
12
|
|
|
14
13
|
### Patch Changes
|
|
15
14
|
|
|
16
|
-
-
|
|
17
|
-
|
|
18
|
-
- Updated dependencies []:
|
|
19
|
-
- @mastra/core@0.23.1
|
|
15
|
+
- Updated dependencies [[`39c9743`](https://github.com/mastra-ai/mastra/commit/39c97432d084294f8ba85fbf3ef28098ff21459e), [`f743dbb`](https://github.com/mastra-ai/mastra/commit/f743dbb8b40d1627b5c10c0e6fc154f4ebb6e394), [`fec5129`](https://github.com/mastra-ai/mastra/commit/fec5129de7fc64423ea03661a56cef31dc747a0d), [`0491e7c`](https://github.com/mastra-ai/mastra/commit/0491e7c9b714cb0ba22187ee062147ec2dd7c712), [`f6f4903`](https://github.com/mastra-ai/mastra/commit/f6f4903397314f73362061dc5a3e8e7c61ea34aa), [`0e8ed46`](https://github.com/mastra-ai/mastra/commit/0e8ed467c54d6901a6a365f270ec15d6faadb36c), [`6c049d9`](https://github.com/mastra-ai/mastra/commit/6c049d94063fdcbd5b81c4912a2bf82a92c9cc0b), [`2f897df`](https://github.com/mastra-ai/mastra/commit/2f897df208508f46f51b7625e5dd20c37f93e0e3), [`3443770`](https://github.com/mastra-ai/mastra/commit/3443770662df8eb24c9df3589b2792d78cfcb811), [`f0a07e0`](https://github.com/mastra-ai/mastra/commit/f0a07e0111b3307c5fabfa4094c5c2cfb734fbe6), [`aaa40e7`](https://github.com/mastra-ai/mastra/commit/aaa40e788628b319baa8e889407d11ad626547fa), [`1521d71`](https://github.com/mastra-ai/mastra/commit/1521d716e5daedc74690c983fbd961123c56756b), [`9e1911d`](https://github.com/mastra-ai/mastra/commit/9e1911db2b4db85e0e768c3f15e0d61e319869f6), [`ebac155`](https://github.com/mastra-ai/mastra/commit/ebac15564a590117db7078233f927a7e28a85106), [`dd1c38d`](https://github.com/mastra-ai/mastra/commit/dd1c38d1b75f1b695c27b40d8d9d6ed00d5e0f6f), [`5948e6a`](https://github.com/mastra-ai/mastra/commit/5948e6a5146c83666ba3f294b2be576c82a513fb), [`8940859`](https://github.com/mastra-ai/mastra/commit/89408593658199b4ad67f7b65e888f344e64a442), [`e629310`](https://github.com/mastra-ai/mastra/commit/e629310f1a73fa236d49ec7a1d1cceb6229dc7cc), [`4c6b492`](https://github.com/mastra-ai/mastra/commit/4c6b492c4dd591c6a592520c1f6855d6e936d71f), [`dff01d8`](https://github.com/mastra-ai/mastra/commit/dff01d81ce1f4e4087cfac20fa868e6db138dd14), [`9d819d5`](https://github.com/mastra-ai/mastra/commit/9d819d54b61481639f4008e4694791bddf187edd), [`71c8d6c`](https://github.com/mastra-ai/mastra/commit/71c8d6c161253207b2b9588bdadb7eed604f7253), [`6179a9b`](https://github.com/mastra-ai/mastra/commit/6179a9ba36ffac326de3cc3c43cdc8028d37c251), [`00f4921`](https://github.com/mastra-ai/mastra/commit/00f4921dd2c91a1e5446799599ef7116a8214a1a), [`ca8041c`](https://github.com/mastra-ai/mastra/commit/ca8041cce0379fda22ed293a565bcb5b6ddca68a), [`7051bf3`](https://github.com/mastra-ai/mastra/commit/7051bf38b3b122a069008f861f7bfc004a6d9f6e), [`a8f1494`](https://github.com/mastra-ai/mastra/commit/a8f1494f4bbdc2770bcf327d4c7d869e332183f1), [`0793497`](https://github.com/mastra-ai/mastra/commit/079349753620c40246ffd673e3f9d7d9820beff3), [`5df9cce`](https://github.com/mastra-ai/mastra/commit/5df9cce1a753438413f64c11eeef8f845745c2a8), [`a854ede`](https://github.com/mastra-ai/mastra/commit/a854ede62bf5ac0945a624ac48913dd69c73aabf), [`c576fc0`](https://github.com/mastra-ai/mastra/commit/c576fc0b100b2085afded91a37c97a0ea0ec09c7), [`3defc80`](https://github.com/mastra-ai/mastra/commit/3defc80cf2b88a1b7fc1cc4ddcb91e982a614609), [`16153fe`](https://github.com/mastra-ai/mastra/commit/16153fe7eb13c99401f48e6ca32707c965ee28b9), [`9f4a683`](https://github.com/mastra-ai/mastra/commit/9f4a6833e88b52574665c028fd5508ad5c2f6004), [`bc94344`](https://github.com/mastra-ai/mastra/commit/bc943444a1342d8a662151b7bce1df7dae32f59c), [`57d157f`](https://github.com/mastra-ai/mastra/commit/57d157f0b163a95c3e6c9eae31bdb11d1bfc64f9), [`903f67d`](https://github.com/mastra-ai/mastra/commit/903f67d184504a273893818c02b961f5423a79ad), [`2a90c55`](https://github.com/mastra-ai/mastra/commit/2a90c55a86a9210697d5adaab5ee94584b079adc), [`eb09742`](https://github.com/mastra-ai/mastra/commit/eb09742197f66c4c38154c3beec78313e69760b2), [`96d35f6`](https://github.com/mastra-ai/mastra/commit/96d35f61376bc2b1bf148648a2c1985bd51bef55), [`5cbe88a`](https://github.com/mastra-ai/mastra/commit/5cbe88aefbd9f933bca669fd371ea36bf939ac6d), [`a1bd7b8`](https://github.com/mastra-ai/mastra/commit/a1bd7b8571db16b94eb01588f451a74758c96d65), [`d78b38d`](https://github.com/mastra-ai/mastra/commit/d78b38d898fce285260d3bbb4befade54331617f), [`0633100`](https://github.com/mastra-ai/mastra/commit/0633100a911ad22f5256471bdf753da21c104742), [`c710c16`](https://github.com/mastra-ai/mastra/commit/c710c1652dccfdc4111c8412bca7a6bb1d48b441), [`354ad0b`](https://github.com/mastra-ai/mastra/commit/354ad0b7b1b8183ac567f236a884fc7ede6d7138), [`cfae733`](https://github.com/mastra-ai/mastra/commit/cfae73394f4920635e6c919c8e95ff9a0788e2e5), [`e3dfda7`](https://github.com/mastra-ai/mastra/commit/e3dfda7b11bf3b8c4bb55637028befb5f387fc74), [`844ea5d`](https://github.com/mastra-ai/mastra/commit/844ea5dc0c248961e7bf73629ae7dcff503e853c), [`398fde3`](https://github.com/mastra-ai/mastra/commit/398fde3f39e707cda79372cdae8f9870e3b57c8d), [`f0f8f12`](https://github.com/mastra-ai/mastra/commit/f0f8f125c308f2d0fd36942ef652fd852df7522f), [`0d7618b`](https://github.com/mastra-ai/mastra/commit/0d7618bc650bf2800934b243eca5648f4aeed9c2), [`7b763e5`](https://github.com/mastra-ai/mastra/commit/7b763e52fc3eaf699c2a99f2adf418dd46e4e9a5), [`d36cfbb`](https://github.com/mastra-ai/mastra/commit/d36cfbbb6565ba5f827883cc9bb648eb14befdc1), [`3697853`](https://github.com/mastra-ai/mastra/commit/3697853deeb72017d90e0f38a93c1e29221aeca0), [`b2e45ec`](https://github.com/mastra-ai/mastra/commit/b2e45eca727a8db01a81ba93f1a5219c7183c839), [`d6d49f7`](https://github.com/mastra-ai/mastra/commit/d6d49f7b8714fa19a52ff9c7cf7fb7e73751901e), [`a534e95`](https://github.com/mastra-ai/mastra/commit/a534e9591f83b3cc1ebff99c67edf4cda7bf81d3), [`9d0e7fe`](https://github.com/mastra-ai/mastra/commit/9d0e7feca8ed98de959f53476ee1456073673348), [`53d927c`](https://github.com/mastra-ai/mastra/commit/53d927cc6f03bff33655b7e2b788da445a08731d), [`3f2faf2`](https://github.com/mastra-ai/mastra/commit/3f2faf2e2d685d6c053cc5af1bf9fedf267b2ce5), [`22f64bc`](https://github.com/mastra-ai/mastra/commit/22f64bc1d37149480b58bf2fefe35b79a1e3e7d5), [`83d5942`](https://github.com/mastra-ai/mastra/commit/83d5942669ce7bba4a6ca4fd4da697a10eb5ebdc), [`b7959e6`](https://github.com/mastra-ai/mastra/commit/b7959e6e25a46b480f9ea2217c4c6c588c423791), [`bda6370`](https://github.com/mastra-ai/mastra/commit/bda637009360649aaf579919e7873e33553c273e), [`d7acd8e`](https://github.com/mastra-ai/mastra/commit/d7acd8e987b5d7eff4fd98b0906c17c06a2e83d5), [`c7f1f7d`](https://github.com/mastra-ai/mastra/commit/c7f1f7d24f61f247f018cc2d1f33bf63212959a7), [`0bddc6d`](https://github.com/mastra-ai/mastra/commit/0bddc6d8dbd6f6008c0cba2e4960a2da75a55af1), [`735d8c1`](https://github.com/mastra-ai/mastra/commit/735d8c1c0d19fbc09e6f8b66cf41bc7655993838), [`acf322e`](https://github.com/mastra-ai/mastra/commit/acf322e0f1fd0189684cf529d91c694bea918a45), [`c942802`](https://github.com/mastra-ai/mastra/commit/c942802a477a925b01859a7b8688d4355715caaa), [`a0c8c1b`](https://github.com/mastra-ai/mastra/commit/a0c8c1b87d4fee252aebda73e8637fbe01d761c9), [`cc34739`](https://github.com/mastra-ai/mastra/commit/cc34739c34b6266a91bea561119240a7acf47887), [`c218bd3`](https://github.com/mastra-ai/mastra/commit/c218bd3759e32423735b04843a09404572631014), [`2c4438b`](https://github.com/mastra-ai/mastra/commit/2c4438b87817ab7eed818c7990fef010475af1a3), [`2b8893c`](https://github.com/mastra-ai/mastra/commit/2b8893cb108ef9acb72ee7835cd625610d2c1a4a), [`8e5c75b`](https://github.com/mastra-ai/mastra/commit/8e5c75bdb1d08a42d45309a4c72def4b6890230f), [`e59e0d3`](https://github.com/mastra-ai/mastra/commit/e59e0d32afb5fcf2c9f3c00c8f81f6c21d3a63fa), [`fa8409b`](https://github.com/mastra-ai/mastra/commit/fa8409bc39cfd8ba6643b9db5269b90b22e2a2f7), [`173c535`](https://github.com/mastra-ai/mastra/commit/173c535c0645b0da404fe09f003778f0b0d4e019)]:
|
|
16
|
+
- @mastra/core@1.0.0-beta.0
|
|
20
17
|
|
|
21
18
|
## 0.11.10
|
|
22
19
|
|
package/dist/index.cjs
CHANGED
|
@@ -65,11 +65,9 @@ var DeepgramVoice = class extends voice.MastraVoice {
|
|
|
65
65
|
this.speaker = speaker || "asteria-en";
|
|
66
66
|
}
|
|
67
67
|
async getSpeakers() {
|
|
68
|
-
return
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
}));
|
|
72
|
-
}, "voice.deepgram.getSpeakers")();
|
|
68
|
+
return DEEPGRAM_VOICES.map((voice) => ({
|
|
69
|
+
voiceId: voice
|
|
70
|
+
}));
|
|
73
71
|
}
|
|
74
72
|
async speak(input, options) {
|
|
75
73
|
if (!this.speechClient) {
|
|
@@ -92,48 +90,46 @@ var DeepgramVoice = class extends voice.MastraVoice {
|
|
|
92
90
|
if (text.trim().length === 0) {
|
|
93
91
|
throw new Error("Input text is empty");
|
|
94
92
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
...options
|
|
111
|
-
}
|
|
112
|
-
);
|
|
113
|
-
const webStream = await response.getStream();
|
|
114
|
-
if (!webStream) {
|
|
115
|
-
throw new Error("No stream returned from Deepgram");
|
|
93
|
+
if (!this.speechClient) {
|
|
94
|
+
throw new Error("No speech client configured");
|
|
95
|
+
}
|
|
96
|
+
let model;
|
|
97
|
+
if (options?.speaker) {
|
|
98
|
+
model = this.speechModel?.name + "-" + options.speaker;
|
|
99
|
+
} else if (this.speaker) {
|
|
100
|
+
model = this.speechModel?.name + "-" + this.speaker;
|
|
101
|
+
}
|
|
102
|
+
const speakClient = this.speechClient.speak;
|
|
103
|
+
const response = await speakClient.request(
|
|
104
|
+
{ text },
|
|
105
|
+
{
|
|
106
|
+
model,
|
|
107
|
+
...options
|
|
116
108
|
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
109
|
+
);
|
|
110
|
+
const webStream = await response.getStream();
|
|
111
|
+
if (!webStream) {
|
|
112
|
+
throw new Error("No stream returned from Deepgram");
|
|
113
|
+
}
|
|
114
|
+
const reader = webStream.getReader();
|
|
115
|
+
const nodeStream = new stream.PassThrough();
|
|
116
|
+
(async () => {
|
|
117
|
+
try {
|
|
118
|
+
while (true) {
|
|
119
|
+
const { done, value } = await reader.read();
|
|
120
|
+
if (done) {
|
|
121
|
+
nodeStream.end();
|
|
122
|
+
break;
|
|
128
123
|
}
|
|
129
|
-
|
|
130
|
-
nodeStream.destroy(error);
|
|
124
|
+
nodeStream.write(value);
|
|
131
125
|
}
|
|
132
|
-
}
|
|
126
|
+
} catch (error) {
|
|
133
127
|
nodeStream.destroy(error);
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
|
|
128
|
+
}
|
|
129
|
+
})().catch((error) => {
|
|
130
|
+
nodeStream.destroy(error);
|
|
131
|
+
});
|
|
132
|
+
return nodeStream;
|
|
137
133
|
}
|
|
138
134
|
/**
|
|
139
135
|
* Checks if listening capabilities are enabled.
|
|
@@ -156,23 +152,21 @@ var DeepgramVoice = class extends voice.MastraVoice {
|
|
|
156
152
|
}
|
|
157
153
|
}
|
|
158
154
|
const buffer = Buffer.concat(chunks);
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
return transcript;
|
|
175
|
-
}, "voice.deepgram.listen")();
|
|
155
|
+
if (!this.listeningClient) {
|
|
156
|
+
throw new Error("No listening client configured");
|
|
157
|
+
}
|
|
158
|
+
const { result, error } = await this.listeningClient.listen.prerecorded.transcribeFile(buffer, {
|
|
159
|
+
model: this.listeningModel?.name,
|
|
160
|
+
...options
|
|
161
|
+
});
|
|
162
|
+
if (error) {
|
|
163
|
+
throw error;
|
|
164
|
+
}
|
|
165
|
+
const transcript = result.results?.channels?.[0]?.alternatives?.[0]?.transcript;
|
|
166
|
+
if (!transcript) {
|
|
167
|
+
throw new Error("No transcript found in Deepgram response");
|
|
168
|
+
}
|
|
169
|
+
return transcript;
|
|
176
170
|
}
|
|
177
171
|
};
|
|
178
172
|
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/voices.ts","../src/index.ts"],"names":["MastraVoice","createClient","PassThrough"],"mappings":";;;;;;;;;AAKO,IAAM,eAAA,GAAkB;AAAA,EAC7B,YAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA;;;ACHO,IAAM,aAAA,GAAN,cAA4BA,iBAAA,CAAY;AAAA,EACrC,YAAA;AAAA,EACA,eAAA;AAAA,EAER,WAAA,CAAY;AAAA,IACV,WAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACF,GAA4G,EAAC,EAAG;AAC9G,IAAA,MAAM,aAAA,GAAgB,QAAQ,GAAA,CAAI,gBAAA;AAElC,IAAA,MAAM,kBAAA,GAAqB;AAAA,MACzB,IAAA,EAAM,MAAA;AAAA,MACN,MAAA,EAAQ;AAAA,KACV;AAEA,IAAA,MAAM,qBAAA,GAAwB;AAAA,MAC5B,IAAA,EAAM,MAAA;AAAA,MACN,MAAA,EAAQ;AAAA,KACV;AAEA,IAAA,KAAA,CAAM;AAAA,MACJ,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,WAAA,EAAa,IAAA,IAAQ,kBAAA,CAAmB,IAAA;AAAA,QAC9C,MAAA,EAAQ,WAAA,EAAa,MAAA,IAAU,kBAAA,CAAmB;AAAA,OACpD;AAAA,MACA,cAAA,EAAgB;AAAA,QACd,IAAA,EAAM,cAAA,EAAgB,IAAA,IAAQ,qBAAA,CAAsB,IAAA;AAAA,QACpD,MAAA,EAAQ,cAAA,EAAgB,MAAA,IAAU,qBAAA,CAAsB;AAAA,OAC1D;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,MAAM,YAAA,GAAe,aAAa,MAAA,IAAU,aAAA;AAC5C,IAAA,MAAM,eAAA,GAAkB,gBAAgB,MAAA,IAAU,aAAA;AAElD,IAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,eAAA,EAAiB;AACrC,MAAA,MAAM,IAAI,MAAM,4FAA4F,CAAA;AAAA,IAC9G;AAEA,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,IAAA,CAAK,YAAA,GAAeC,iBAAa,YAAY,CAAA;AAAA,IAC/C;AACA,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,IAAA,CAAK,eAAA,GAAkBA,iBAAa,eAAe,CAAA;AAAA,IACrD;AAEA,IAAA,IAAA,CAAK,UAAU,OAAA,IAAW,YAAA;AAAA,EAC5B;AAAA,EAEA,MAAM,WAAA,GAAc;AAClB,IAAA,OAAO,IAAA,CAAK,OAAO,YAAY;AAC7B,MAAA,OAAO,eAAA,CAAgB,IAAI,CAAA,KAAA,MAAU;AAAA,QACnC,OAAA,EAAS;AAAA,OACX,CAAE,CAAA;AAAA,IACJ,CAAA,EAAG,4BAA4B,CAAA,EAAE;AAAA,EACnC;AAAA,EAEA,MAAM,KAAA,CACJ,KAAA,EACA,OAAA,EAIgC;AAChC,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,IACzD;AAEA,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,MAAM,SAAmB,EAAC;AAC1B,MAAA,WAAA,MAAiB,SAAS,KAAA,EAAO;AAC/B,QAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,UAAA,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,QAChC,CAAA,MAAO;AACL,UAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,QACnB;AAAA,MACF;AACA,MAAA,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,CAAE,SAAS,OAAO,CAAA;AAAA,IAC/C,CAAA,MAAO;AACL,MAAA,IAAA,GAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI,IAAA,CAAK,IAAA,EAAK,CAAE,MAAA,KAAW,CAAA,EAAG;AAC5B,MAAA,MAAM,IAAI,MAAM,qBAAqB,CAAA;AAAA,IACvC;AAEA,IAAA,OAAO,IAAA,CAAK,OAAO,YAAY;AAC7B,MAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,QAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,MAC/C;AAEA,MAAA,IAAI,KAAA;AACJ,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,KAAA,GAAQ,IAAA,CAAK,WAAA,EAAa,IAAA,GAAO,GAAA,GAAM,OAAA,CAAQ,OAAA;AAAA,MACjD,CAAA,MAAA,IAAW,KAAK,OAAA,EAAS;AACvB,QAAA,KAAA,GAAQ,IAAA,CAAK,WAAA,EAAa,IAAA,GAAO,GAAA,GAAM,IAAA,CAAK,OAAA;AAAA,MAC9C;AAEA,MAAA,MAAM,WAAA,GAAc,KAAK,YAAA,CAAa,KAAA;AACtC,MAAA,MAAM,QAAA,GAAW,MAAM,WAAA,CAAY,OAAA;AAAA,QACjC,EAAE,IAAA,EAAK;AAAA,QACP;AAAA,UACE,KAAA;AAAA,UACA,GAAG;AAAA;AACL,OACF;AAEA,MAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,SAAA,EAAU;AAC3C,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAAA,MACpD;AAEA,MAAA,MAAM,MAAA,GAAS,UAAU,SAAA,EAAU;AACnC,MAAA,MAAM,UAAA,GAAa,IAAIC,kBAAA,EAAY;AAGnC,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,UAAA,CAAW,GAAA,EAAI;AACf,cAAA;AAAA,YACF;AACA,YAAA,UAAA,CAAW,MAAM,KAAK,CAAA;AAAA,UACxB;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,UAAA,CAAW,QAAQ,KAAc,CAAA;AAAA,QACnC;AAAA,MACF,CAAA,GAAG,CAAE,KAAA,CAAM,CAAA,KAAA,KAAS;AAClB,QAAA,UAAA,CAAW,QAAQ,KAAc,CAAA;AAAA,MACnC,CAAC,CAAA;AAED,MAAA,OAAO,UAAA;AAAA,IACT,CAAA,EAAG,sBAAsB,CAAA,EAAE;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,WAAA,GAAc;AAClB,IAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,EACzB;AAAA,EAEA,MAAM,MAAA,CACJ,WAAA,EACA,OAAA,EAGiB;AACjB,IAAA,IAAI,CAAC,KAAK,eAAA,EAAiB;AACzB,MAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAAA,IAC5D;AAEA,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,WAAA,MAAiB,SAAS,WAAA,EAAa;AACrC,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,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA;AAEnC,IAAA,OAAO,IAAA,CAAK,OAAO,YAAY;AAC7B,MAAA,IAAI,CAAC,KAAK,eAAA,EAAiB;AACzB,QAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,MAClD;AACA,MAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAM,GAAI,MAAM,KAAK,eAAA,CAAgB,MAAA,CAAO,WAAA,CAAY,cAAA,CAAe,MAAA,EAAQ;AAAA,QAC7F,KAAA,EAAO,KAAK,cAAA,EAAgB,IAAA;AAAA,QAC5B,GAAG;AAAA,OACJ,CAAA;AAED,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,KAAA;AAAA,MACR;AAEA,MAAA,MAAM,UAAA,GAAa,OAAO,OAAA,EAAS,QAAA,GAAW,CAAC,CAAA,EAAG,YAAA,GAAe,CAAC,CAAA,EAAG,UAAA;AACrE,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAAA,MAC5D;AAEA,MAAA,OAAO,UAAA;AAAA,IACT,CAAA,EAAG,uBAAuB,CAAA,EAAE;AAAA,EAC9B;AACF","file":"index.cjs","sourcesContent":["/**\n * List of available Deepgram voice models for text-to-speech\n * Each voice is designed for specific use cases and languages\n * Format: {name}-{language} (e.g. asteria-en)\n */\nexport const DEEPGRAM_VOICES = [\n 'asteria-en',\n 'luna-en',\n 'stella-en',\n 'athena-en',\n 'hera-en',\n 'orion-en',\n 'arcas-en',\n 'perseus-en',\n 'angus-en',\n 'orpheus-en',\n 'helios-en',\n 'zeus-en',\n] as const;\n\nexport type DeepgramVoiceId = (typeof DEEPGRAM_VOICES)[number];\n\n/**\n * List of available Deepgram models for text-to-speech and speech-to-text\n */\nexport const DEEPGRAM_MODELS = ['aura', 'whisper', 'base', 'enhanced', 'nova', 'nova-2', 'nova-3'] as const;\n\nexport type DeepgramModel = (typeof DEEPGRAM_MODELS)[number];\n","import { PassThrough } from 'stream';\n\nimport { createClient } from '@deepgram/sdk';\nimport { MastraVoice } from '@mastra/core/voice';\n\nimport { DEEPGRAM_VOICES } from './voices';\nimport type { DeepgramVoiceId, DeepgramModel } from './voices';\n\ninterface DeepgramVoiceConfig {\n name?: DeepgramModel;\n apiKey?: string;\n properties?: Record<string, any>;\n language?: string;\n}\n\nexport class DeepgramVoice extends MastraVoice {\n private speechClient?: ReturnType<typeof createClient>;\n private listeningClient?: ReturnType<typeof createClient>;\n\n constructor({\n speechModel,\n listeningModel,\n speaker,\n }: { speechModel?: DeepgramVoiceConfig; listeningModel?: DeepgramVoiceConfig; speaker?: DeepgramVoiceId } = {}) {\n const defaultApiKey = process.env.DEEPGRAM_API_KEY;\n\n const defaultSpeechModel = {\n name: 'aura',\n apiKey: defaultApiKey,\n };\n\n const defaultListeningModel = {\n name: 'nova',\n apiKey: defaultApiKey,\n };\n\n super({\n speechModel: {\n name: speechModel?.name ?? defaultSpeechModel.name,\n apiKey: speechModel?.apiKey ?? defaultSpeechModel.apiKey,\n },\n listeningModel: {\n name: listeningModel?.name ?? defaultListeningModel.name,\n apiKey: listeningModel?.apiKey ?? defaultListeningModel.apiKey,\n },\n speaker,\n });\n\n const speechApiKey = speechModel?.apiKey || defaultApiKey;\n const listeningApiKey = listeningModel?.apiKey || defaultApiKey;\n\n if (!speechApiKey && !listeningApiKey) {\n throw new Error('At least one of DEEPGRAM_API_KEY, speechModel.apiKey, or listeningModel.apiKey must be set');\n }\n\n if (speechApiKey) {\n this.speechClient = createClient(speechApiKey);\n }\n if (listeningApiKey) {\n this.listeningClient = createClient(listeningApiKey);\n }\n\n this.speaker = speaker || 'asteria-en';\n }\n\n async getSpeakers() {\n return this.traced(async () => {\n return DEEPGRAM_VOICES.map(voice => ({\n voiceId: voice,\n }));\n }, 'voice.deepgram.getSpeakers')();\n }\n\n async speak(\n input: string | NodeJS.ReadableStream,\n options?: {\n speaker?: string;\n [key: string]: any;\n },\n ): Promise<NodeJS.ReadableStream> {\n if (!this.speechClient) {\n throw new Error('Deepgram speech client not configured');\n }\n\n let text: string;\n if (typeof input !== 'string') {\n const chunks: Buffer[] = [];\n for await (const chunk of input) {\n if (typeof chunk === 'string') {\n chunks.push(Buffer.from(chunk));\n } else {\n chunks.push(chunk);\n }\n }\n text = Buffer.concat(chunks).toString('utf-8');\n } else {\n text = input;\n }\n\n if (text.trim().length === 0) {\n throw new Error('Input text is empty');\n }\n\n return this.traced(async () => {\n if (!this.speechClient) {\n throw new Error('No speech client configured');\n }\n\n let model;\n if (options?.speaker) {\n model = this.speechModel?.name + '-' + options.speaker;\n } else if (this.speaker) {\n model = this.speechModel?.name + '-' + this.speaker;\n }\n\n const speakClient = this.speechClient.speak;\n const response = await speakClient.request(\n { text },\n {\n model,\n ...options,\n },\n );\n\n const webStream = await response.getStream();\n if (!webStream) {\n throw new Error('No stream returned from Deepgram');\n }\n\n const reader = webStream.getReader();\n const nodeStream = new PassThrough();\n\n // Add error handling for the stream processing\n (async () => {\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n nodeStream.end();\n break;\n }\n nodeStream.write(value);\n }\n } catch (error) {\n nodeStream.destroy(error as Error);\n }\n })().catch(error => {\n nodeStream.destroy(error as Error);\n });\n\n return nodeStream;\n }, 'voice.deepgram.speak')();\n }\n\n /**\n * Checks if listening capabilities are enabled.\n *\n * @returns {Promise<{ enabled: boolean }>}\n */\n async getListener() {\n return { enabled: true };\n }\n\n async listen(\n audioStream: NodeJS.ReadableStream,\n options?: {\n [key: string]: any;\n },\n ): Promise<string> {\n if (!this.listeningClient) {\n throw new Error('Deepgram listening client not configured');\n }\n\n const chunks: Buffer[] = [];\n for await (const chunk of audioStream) {\n if (typeof chunk === 'string') {\n chunks.push(Buffer.from(chunk));\n } else {\n chunks.push(chunk);\n }\n }\n const buffer = Buffer.concat(chunks);\n\n return this.traced(async () => {\n if (!this.listeningClient) {\n throw new Error('No listening client configured');\n }\n const { result, error } = await this.listeningClient.listen.prerecorded.transcribeFile(buffer, {\n model: this.listeningModel?.name,\n ...options,\n });\n\n if (error) {\n throw error;\n }\n\n const transcript = result.results?.channels?.[0]?.alternatives?.[0]?.transcript;\n if (!transcript) {\n throw new Error('No transcript found in Deepgram response');\n }\n\n return transcript;\n }, 'voice.deepgram.listen')();\n }\n}\n\nexport type { DeepgramVoiceConfig, DeepgramVoiceId, DeepgramModel };\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/voices.ts","../src/index.ts"],"names":["MastraVoice","createClient","PassThrough"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * List of available Deepgram voice models for text-to-speech\n * Each voice is designed for specific use cases and languages\n * Format: {name}-{language} (e.g. asteria-en)\n */\nexport const DEEPGRAM_VOICES = [\n 'asteria-en',\n 'luna-en',\n 'stella-en',\n 'athena-en',\n 'hera-en',\n 'orion-en',\n 'arcas-en',\n 'perseus-en',\n 'angus-en',\n 'orpheus-en',\n 'helios-en',\n 'zeus-en',\n] as const;\n\nexport type DeepgramVoiceId = (typeof DEEPGRAM_VOICES)[number];\n\n/**\n * List of available Deepgram models for text-to-speech and speech-to-text\n */\nexport const DEEPGRAM_MODELS = ['aura', 'whisper', 'base', 'enhanced', 'nova', 'nova-2', 'nova-3'] as const;\n\nexport type DeepgramModel = (typeof DEEPGRAM_MODELS)[number];\n","import { PassThrough } from 'stream';\n\nimport { createClient } from '@deepgram/sdk';\nimport { MastraVoice } from '@mastra/core/voice';\n\nimport { DEEPGRAM_VOICES } from './voices';\nimport type { DeepgramVoiceId, DeepgramModel } from './voices';\n\ninterface DeepgramVoiceConfig {\n name?: DeepgramModel;\n apiKey?: string;\n properties?: Record<string, any>;\n language?: string;\n}\n\nexport class DeepgramVoice extends MastraVoice {\n private speechClient?: ReturnType<typeof createClient>;\n private listeningClient?: ReturnType<typeof createClient>;\n\n constructor({\n speechModel,\n listeningModel,\n speaker,\n }: { speechModel?: DeepgramVoiceConfig; listeningModel?: DeepgramVoiceConfig; speaker?: DeepgramVoiceId } = {}) {\n const defaultApiKey = process.env.DEEPGRAM_API_KEY;\n\n const defaultSpeechModel = {\n name: 'aura',\n apiKey: defaultApiKey,\n };\n\n const defaultListeningModel = {\n name: 'nova',\n apiKey: defaultApiKey,\n };\n\n super({\n speechModel: {\n name: speechModel?.name ?? defaultSpeechModel.name,\n apiKey: speechModel?.apiKey ?? defaultSpeechModel.apiKey,\n },\n listeningModel: {\n name: listeningModel?.name ?? defaultListeningModel.name,\n apiKey: listeningModel?.apiKey ?? defaultListeningModel.apiKey,\n },\n speaker,\n });\n\n const speechApiKey = speechModel?.apiKey || defaultApiKey;\n const listeningApiKey = listeningModel?.apiKey || defaultApiKey;\n\n if (!speechApiKey && !listeningApiKey) {\n throw new Error('At least one of DEEPGRAM_API_KEY, speechModel.apiKey, or listeningModel.apiKey must be set');\n }\n\n if (speechApiKey) {\n this.speechClient = createClient(speechApiKey);\n }\n if (listeningApiKey) {\n this.listeningClient = createClient(listeningApiKey);\n }\n\n this.speaker = speaker || 'asteria-en';\n }\n\n async getSpeakers() {\n return DEEPGRAM_VOICES.map(voice => ({\n voiceId: voice,\n }));\n }\n\n async speak(\n input: string | NodeJS.ReadableStream,\n options?: {\n speaker?: string;\n [key: string]: any;\n },\n ): Promise<NodeJS.ReadableStream> {\n if (!this.speechClient) {\n throw new Error('Deepgram speech client not configured');\n }\n\n let text: string;\n if (typeof input !== 'string') {\n const chunks: Buffer[] = [];\n for await (const chunk of input) {\n if (typeof chunk === 'string') {\n chunks.push(Buffer.from(chunk));\n } else {\n chunks.push(chunk);\n }\n }\n text = Buffer.concat(chunks).toString('utf-8');\n } else {\n text = input;\n }\n\n if (text.trim().length === 0) {\n throw new Error('Input text is empty');\n }\n\n if (!this.speechClient) {\n throw new Error('No speech client configured');\n }\n\n let model;\n if (options?.speaker) {\n model = this.speechModel?.name + '-' + options.speaker;\n } else if (this.speaker) {\n model = this.speechModel?.name + '-' + this.speaker;\n }\n\n const speakClient = this.speechClient.speak;\n const response = await speakClient.request(\n { text },\n {\n model,\n ...options,\n },\n );\n\n const webStream = await response.getStream();\n if (!webStream) {\n throw new Error('No stream returned from Deepgram');\n }\n\n const reader = webStream.getReader();\n const nodeStream = new PassThrough();\n\n // Add error handling for the stream processing\n (async () => {\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n nodeStream.end();\n break;\n }\n nodeStream.write(value);\n }\n } catch (error) {\n nodeStream.destroy(error as Error);\n }\n })().catch(error => {\n nodeStream.destroy(error as Error);\n });\n\n return nodeStream;\n }\n\n /**\n * Checks if listening capabilities are enabled.\n *\n * @returns {Promise<{ enabled: boolean }>}\n */\n async getListener() {\n return { enabled: true };\n }\n\n async listen(\n audioStream: NodeJS.ReadableStream,\n options?: {\n [key: string]: any;\n },\n ): Promise<string> {\n if (!this.listeningClient) {\n throw new Error('Deepgram listening client not configured');\n }\n\n const chunks: Buffer[] = [];\n for await (const chunk of audioStream) {\n if (typeof chunk === 'string') {\n chunks.push(Buffer.from(chunk));\n } else {\n chunks.push(chunk);\n }\n }\n const buffer = Buffer.concat(chunks);\n\n if (!this.listeningClient) {\n throw new Error('No listening client configured');\n }\n const { result, error } = await this.listeningClient.listen.prerecorded.transcribeFile(buffer, {\n model: this.listeningModel?.name,\n ...options,\n });\n\n if (error) {\n throw error;\n }\n\n const transcript = result.results?.channels?.[0]?.alternatives?.[0]?.transcript;\n if (!transcript) {\n throw new Error('No transcript found in Deepgram response');\n }\n\n return transcript;\n }\n}\n\nexport type { DeepgramVoiceConfig, DeepgramVoiceId, DeepgramModel };\n"]}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE/D,UAAU,mBAAmB;IAC3B,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,aAAc,SAAQ,WAAW;IAC5C,OAAO,CAAC,YAAY,CAAC,CAAkC;IACvD,OAAO,CAAC,eAAe,CAAC,CAAkC;gBAE9C,EACV,WAAW,EACX,cAAc,EACd,OAAO,GACR,GAAE;QAAE,WAAW,CAAC,EAAE,mBAAmB,CAAC;QAAC,cAAc,CAAC,EAAE,mBAAmB,CAAC;QAAC,OAAO,CAAC,EAAE,eAAe,CAAA;KAAO;IA0CxG,WAAW;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE/D,UAAU,mBAAmB;IAC3B,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,aAAc,SAAQ,WAAW;IAC5C,OAAO,CAAC,YAAY,CAAC,CAAkC;IACvD,OAAO,CAAC,eAAe,CAAC,CAAkC;gBAE9C,EACV,WAAW,EACX,cAAc,EACd,OAAO,GACR,GAAE;QAAE,WAAW,CAAC,EAAE,mBAAmB,CAAC;QAAC,cAAc,CAAC,EAAE,mBAAmB,CAAC;QAAC,OAAO,CAAC,EAAE,eAAe,CAAA;KAAO;IA0CxG,WAAW;;;IAMX,KAAK,CACT,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,cAAc,EACrC,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACpB,GACA,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC;IAyEjC;;;;OAIG;IACG,WAAW;;;IAIX,MAAM,CACV,WAAW,EAAE,MAAM,CAAC,cAAc,EAClC,OAAO,CAAC,EAAE;QACR,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACpB,GACA,OAAO,CAAC,MAAM,CAAC;CAkCnB;AAED,YAAY,EAAE,mBAAmB,EAAE,eAAe,EAAE,aAAa,EAAE,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -63,11 +63,9 @@ var DeepgramVoice = class extends MastraVoice {
|
|
|
63
63
|
this.speaker = speaker || "asteria-en";
|
|
64
64
|
}
|
|
65
65
|
async getSpeakers() {
|
|
66
|
-
return
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
}));
|
|
70
|
-
}, "voice.deepgram.getSpeakers")();
|
|
66
|
+
return DEEPGRAM_VOICES.map((voice) => ({
|
|
67
|
+
voiceId: voice
|
|
68
|
+
}));
|
|
71
69
|
}
|
|
72
70
|
async speak(input, options) {
|
|
73
71
|
if (!this.speechClient) {
|
|
@@ -90,48 +88,46 @@ var DeepgramVoice = class extends MastraVoice {
|
|
|
90
88
|
if (text.trim().length === 0) {
|
|
91
89
|
throw new Error("Input text is empty");
|
|
92
90
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
...options
|
|
109
|
-
}
|
|
110
|
-
);
|
|
111
|
-
const webStream = await response.getStream();
|
|
112
|
-
if (!webStream) {
|
|
113
|
-
throw new Error("No stream returned from Deepgram");
|
|
91
|
+
if (!this.speechClient) {
|
|
92
|
+
throw new Error("No speech client configured");
|
|
93
|
+
}
|
|
94
|
+
let model;
|
|
95
|
+
if (options?.speaker) {
|
|
96
|
+
model = this.speechModel?.name + "-" + options.speaker;
|
|
97
|
+
} else if (this.speaker) {
|
|
98
|
+
model = this.speechModel?.name + "-" + this.speaker;
|
|
99
|
+
}
|
|
100
|
+
const speakClient = this.speechClient.speak;
|
|
101
|
+
const response = await speakClient.request(
|
|
102
|
+
{ text },
|
|
103
|
+
{
|
|
104
|
+
model,
|
|
105
|
+
...options
|
|
114
106
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
107
|
+
);
|
|
108
|
+
const webStream = await response.getStream();
|
|
109
|
+
if (!webStream) {
|
|
110
|
+
throw new Error("No stream returned from Deepgram");
|
|
111
|
+
}
|
|
112
|
+
const reader = webStream.getReader();
|
|
113
|
+
const nodeStream = new PassThrough();
|
|
114
|
+
(async () => {
|
|
115
|
+
try {
|
|
116
|
+
while (true) {
|
|
117
|
+
const { done, value } = await reader.read();
|
|
118
|
+
if (done) {
|
|
119
|
+
nodeStream.end();
|
|
120
|
+
break;
|
|
126
121
|
}
|
|
127
|
-
|
|
128
|
-
nodeStream.destroy(error);
|
|
122
|
+
nodeStream.write(value);
|
|
129
123
|
}
|
|
130
|
-
}
|
|
124
|
+
} catch (error) {
|
|
131
125
|
nodeStream.destroy(error);
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
|
|
126
|
+
}
|
|
127
|
+
})().catch((error) => {
|
|
128
|
+
nodeStream.destroy(error);
|
|
129
|
+
});
|
|
130
|
+
return nodeStream;
|
|
135
131
|
}
|
|
136
132
|
/**
|
|
137
133
|
* Checks if listening capabilities are enabled.
|
|
@@ -154,23 +150,21 @@ var DeepgramVoice = class extends MastraVoice {
|
|
|
154
150
|
}
|
|
155
151
|
}
|
|
156
152
|
const buffer = Buffer.concat(chunks);
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
return transcript;
|
|
173
|
-
}, "voice.deepgram.listen")();
|
|
153
|
+
if (!this.listeningClient) {
|
|
154
|
+
throw new Error("No listening client configured");
|
|
155
|
+
}
|
|
156
|
+
const { result, error } = await this.listeningClient.listen.prerecorded.transcribeFile(buffer, {
|
|
157
|
+
model: this.listeningModel?.name,
|
|
158
|
+
...options
|
|
159
|
+
});
|
|
160
|
+
if (error) {
|
|
161
|
+
throw error;
|
|
162
|
+
}
|
|
163
|
+
const transcript = result.results?.channels?.[0]?.alternatives?.[0]?.transcript;
|
|
164
|
+
if (!transcript) {
|
|
165
|
+
throw new Error("No transcript found in Deepgram response");
|
|
166
|
+
}
|
|
167
|
+
return transcript;
|
|
174
168
|
}
|
|
175
169
|
};
|
|
176
170
|
|
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 Deepgram voice models for text-to-speech\n * Each voice is designed for specific use cases and languages\n * Format: {name}-{language} (e.g. asteria-en)\n */\nexport const DEEPGRAM_VOICES = [\n 'asteria-en',\n 'luna-en',\n 'stella-en',\n 'athena-en',\n 'hera-en',\n 'orion-en',\n 'arcas-en',\n 'perseus-en',\n 'angus-en',\n 'orpheus-en',\n 'helios-en',\n 'zeus-en',\n] as const;\n\nexport type DeepgramVoiceId = (typeof DEEPGRAM_VOICES)[number];\n\n/**\n * List of available Deepgram models for text-to-speech and speech-to-text\n */\nexport const DEEPGRAM_MODELS = ['aura', 'whisper', 'base', 'enhanced', 'nova', 'nova-2', 'nova-3'] as const;\n\nexport type DeepgramModel = (typeof DEEPGRAM_MODELS)[number];\n","import { PassThrough } from 'stream';\n\nimport { createClient } from '@deepgram/sdk';\nimport { MastraVoice } from '@mastra/core/voice';\n\nimport { DEEPGRAM_VOICES } from './voices';\nimport type { DeepgramVoiceId, DeepgramModel } from './voices';\n\ninterface DeepgramVoiceConfig {\n name?: DeepgramModel;\n apiKey?: string;\n properties?: Record<string, any>;\n language?: string;\n}\n\nexport class DeepgramVoice extends MastraVoice {\n private speechClient?: ReturnType<typeof createClient>;\n private listeningClient?: ReturnType<typeof createClient>;\n\n constructor({\n speechModel,\n listeningModel,\n speaker,\n }: { speechModel?: DeepgramVoiceConfig; listeningModel?: DeepgramVoiceConfig; speaker?: DeepgramVoiceId } = {}) {\n const defaultApiKey = process.env.DEEPGRAM_API_KEY;\n\n const defaultSpeechModel = {\n name: 'aura',\n apiKey: defaultApiKey,\n };\n\n const defaultListeningModel = {\n name: 'nova',\n apiKey: defaultApiKey,\n };\n\n super({\n speechModel: {\n name: speechModel?.name ?? defaultSpeechModel.name,\n apiKey: speechModel?.apiKey ?? defaultSpeechModel.apiKey,\n },\n listeningModel: {\n name: listeningModel?.name ?? defaultListeningModel.name,\n apiKey: listeningModel?.apiKey ?? defaultListeningModel.apiKey,\n },\n speaker,\n });\n\n const speechApiKey = speechModel?.apiKey || defaultApiKey;\n const listeningApiKey = listeningModel?.apiKey || defaultApiKey;\n\n if (!speechApiKey && !listeningApiKey) {\n throw new Error('At least one of DEEPGRAM_API_KEY, speechModel.apiKey, or listeningModel.apiKey must be set');\n }\n\n if (speechApiKey) {\n this.speechClient = createClient(speechApiKey);\n }\n if (listeningApiKey) {\n this.listeningClient = createClient(listeningApiKey);\n }\n\n this.speaker = speaker || 'asteria-en';\n }\n\n async getSpeakers() {\n return this.traced(async () => {\n return DEEPGRAM_VOICES.map(voice => ({\n voiceId: voice,\n }));\n }, 'voice.deepgram.getSpeakers')();\n }\n\n async speak(\n input: string | NodeJS.ReadableStream,\n options?: {\n speaker?: string;\n [key: string]: any;\n },\n ): Promise<NodeJS.ReadableStream> {\n if (!this.speechClient) {\n throw new Error('Deepgram speech client not configured');\n }\n\n let text: string;\n if (typeof input !== 'string') {\n const chunks: Buffer[] = [];\n for await (const chunk of input) {\n if (typeof chunk === 'string') {\n chunks.push(Buffer.from(chunk));\n } else {\n chunks.push(chunk);\n }\n }\n text = Buffer.concat(chunks).toString('utf-8');\n } else {\n text = input;\n }\n\n if (text.trim().length === 0) {\n throw new Error('Input text is empty');\n }\n\n return this.traced(async () => {\n if (!this.speechClient) {\n throw new Error('No speech client configured');\n }\n\n let model;\n if (options?.speaker) {\n model = this.speechModel?.name + '-' + options.speaker;\n } else if (this.speaker) {\n model = this.speechModel?.name + '-' + this.speaker;\n }\n\n const speakClient = this.speechClient.speak;\n const response = await speakClient.request(\n { text },\n {\n model,\n ...options,\n },\n );\n\n const webStream = await response.getStream();\n if (!webStream) {\n throw new Error('No stream returned from Deepgram');\n }\n\n const reader = webStream.getReader();\n const nodeStream = new PassThrough();\n\n // Add error handling for the stream processing\n (async () => {\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n nodeStream.end();\n break;\n }\n nodeStream.write(value);\n }\n } catch (error) {\n nodeStream.destroy(error as Error);\n }\n })().catch(error => {\n nodeStream.destroy(error as Error);\n });\n\n return nodeStream;\n }, 'voice.deepgram.speak')();\n }\n\n /**\n * Checks if listening capabilities are enabled.\n *\n * @returns {Promise<{ enabled: boolean }>}\n */\n async getListener() {\n return { enabled: true };\n }\n\n async listen(\n audioStream: NodeJS.ReadableStream,\n options?: {\n [key: string]: any;\n },\n ): Promise<string> {\n if (!this.listeningClient) {\n throw new Error('Deepgram listening client not configured');\n }\n\n const chunks: Buffer[] = [];\n for await (const chunk of audioStream) {\n if (typeof chunk === 'string') {\n chunks.push(Buffer.from(chunk));\n } else {\n chunks.push(chunk);\n }\n }\n const buffer = Buffer.concat(chunks);\n\n return this.traced(async () => {\n if (!this.listeningClient) {\n throw new Error('No listening client configured');\n }\n const { result, error } = await this.listeningClient.listen.prerecorded.transcribeFile(buffer, {\n model: this.listeningModel?.name,\n ...options,\n });\n\n if (error) {\n throw error;\n }\n\n const transcript = result.results?.channels?.[0]?.alternatives?.[0]?.transcript;\n if (!transcript) {\n throw new Error('No transcript found in Deepgram response');\n }\n\n return transcript;\n }, 'voice.deepgram.listen')();\n }\n}\n\nexport type { DeepgramVoiceConfig, DeepgramVoiceId, DeepgramModel };\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 Deepgram voice models for text-to-speech\n * Each voice is designed for specific use cases and languages\n * Format: {name}-{language} (e.g. asteria-en)\n */\nexport const DEEPGRAM_VOICES = [\n 'asteria-en',\n 'luna-en',\n 'stella-en',\n 'athena-en',\n 'hera-en',\n 'orion-en',\n 'arcas-en',\n 'perseus-en',\n 'angus-en',\n 'orpheus-en',\n 'helios-en',\n 'zeus-en',\n] as const;\n\nexport type DeepgramVoiceId = (typeof DEEPGRAM_VOICES)[number];\n\n/**\n * List of available Deepgram models for text-to-speech and speech-to-text\n */\nexport const DEEPGRAM_MODELS = ['aura', 'whisper', 'base', 'enhanced', 'nova', 'nova-2', 'nova-3'] as const;\n\nexport type DeepgramModel = (typeof DEEPGRAM_MODELS)[number];\n","import { PassThrough } from 'stream';\n\nimport { createClient } from '@deepgram/sdk';\nimport { MastraVoice } from '@mastra/core/voice';\n\nimport { DEEPGRAM_VOICES } from './voices';\nimport type { DeepgramVoiceId, DeepgramModel } from './voices';\n\ninterface DeepgramVoiceConfig {\n name?: DeepgramModel;\n apiKey?: string;\n properties?: Record<string, any>;\n language?: string;\n}\n\nexport class DeepgramVoice extends MastraVoice {\n private speechClient?: ReturnType<typeof createClient>;\n private listeningClient?: ReturnType<typeof createClient>;\n\n constructor({\n speechModel,\n listeningModel,\n speaker,\n }: { speechModel?: DeepgramVoiceConfig; listeningModel?: DeepgramVoiceConfig; speaker?: DeepgramVoiceId } = {}) {\n const defaultApiKey = process.env.DEEPGRAM_API_KEY;\n\n const defaultSpeechModel = {\n name: 'aura',\n apiKey: defaultApiKey,\n };\n\n const defaultListeningModel = {\n name: 'nova',\n apiKey: defaultApiKey,\n };\n\n super({\n speechModel: {\n name: speechModel?.name ?? defaultSpeechModel.name,\n apiKey: speechModel?.apiKey ?? defaultSpeechModel.apiKey,\n },\n listeningModel: {\n name: listeningModel?.name ?? defaultListeningModel.name,\n apiKey: listeningModel?.apiKey ?? defaultListeningModel.apiKey,\n },\n speaker,\n });\n\n const speechApiKey = speechModel?.apiKey || defaultApiKey;\n const listeningApiKey = listeningModel?.apiKey || defaultApiKey;\n\n if (!speechApiKey && !listeningApiKey) {\n throw new Error('At least one of DEEPGRAM_API_KEY, speechModel.apiKey, or listeningModel.apiKey must be set');\n }\n\n if (speechApiKey) {\n this.speechClient = createClient(speechApiKey);\n }\n if (listeningApiKey) {\n this.listeningClient = createClient(listeningApiKey);\n }\n\n this.speaker = speaker || 'asteria-en';\n }\n\n async getSpeakers() {\n return DEEPGRAM_VOICES.map(voice => ({\n voiceId: voice,\n }));\n }\n\n async speak(\n input: string | NodeJS.ReadableStream,\n options?: {\n speaker?: string;\n [key: string]: any;\n },\n ): Promise<NodeJS.ReadableStream> {\n if (!this.speechClient) {\n throw new Error('Deepgram speech client not configured');\n }\n\n let text: string;\n if (typeof input !== 'string') {\n const chunks: Buffer[] = [];\n for await (const chunk of input) {\n if (typeof chunk === 'string') {\n chunks.push(Buffer.from(chunk));\n } else {\n chunks.push(chunk);\n }\n }\n text = Buffer.concat(chunks).toString('utf-8');\n } else {\n text = input;\n }\n\n if (text.trim().length === 0) {\n throw new Error('Input text is empty');\n }\n\n if (!this.speechClient) {\n throw new Error('No speech client configured');\n }\n\n let model;\n if (options?.speaker) {\n model = this.speechModel?.name + '-' + options.speaker;\n } else if (this.speaker) {\n model = this.speechModel?.name + '-' + this.speaker;\n }\n\n const speakClient = this.speechClient.speak;\n const response = await speakClient.request(\n { text },\n {\n model,\n ...options,\n },\n );\n\n const webStream = await response.getStream();\n if (!webStream) {\n throw new Error('No stream returned from Deepgram');\n }\n\n const reader = webStream.getReader();\n const nodeStream = new PassThrough();\n\n // Add error handling for the stream processing\n (async () => {\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n nodeStream.end();\n break;\n }\n nodeStream.write(value);\n }\n } catch (error) {\n nodeStream.destroy(error as Error);\n }\n })().catch(error => {\n nodeStream.destroy(error as Error);\n });\n\n return nodeStream;\n }\n\n /**\n * Checks if listening capabilities are enabled.\n *\n * @returns {Promise<{ enabled: boolean }>}\n */\n async getListener() {\n return { enabled: true };\n }\n\n async listen(\n audioStream: NodeJS.ReadableStream,\n options?: {\n [key: string]: any;\n },\n ): Promise<string> {\n if (!this.listeningClient) {\n throw new Error('Deepgram listening client not configured');\n }\n\n const chunks: Buffer[] = [];\n for await (const chunk of audioStream) {\n if (typeof chunk === 'string') {\n chunks.push(Buffer.from(chunk));\n } else {\n chunks.push(chunk);\n }\n }\n const buffer = Buffer.concat(chunks);\n\n if (!this.listeningClient) {\n throw new Error('No listening client configured');\n }\n const { result, error } = await this.listeningClient.listen.prerecorded.transcribeFile(buffer, {\n model: this.listeningModel?.name,\n ...options,\n });\n\n if (error) {\n throw error;\n }\n\n const transcript = result.results?.channels?.[0]?.alternatives?.[0]?.transcript;\n if (!transcript) {\n throw new Error('No transcript found in Deepgram response');\n }\n\n return transcript;\n }\n}\n\nexport type { DeepgramVoiceConfig, DeepgramVoiceId, DeepgramModel };\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mastra/voice-deepgram",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.0-beta.0",
|
|
4
4
|
"description": "Mastra Deepgram voice integration",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
@@ -33,12 +33,12 @@
|
|
|
33
33
|
"tsup": "^8.5.0",
|
|
34
34
|
"typescript": "^5.8.3",
|
|
35
35
|
"vitest": "^3.2.4",
|
|
36
|
-
"@internal/lint": "0.0.
|
|
37
|
-
"@mastra/core": "0.
|
|
38
|
-
"@internal/types-builder": "0.0.
|
|
36
|
+
"@internal/lint": "0.0.53",
|
|
37
|
+
"@mastra/core": "1.0.0-beta.0",
|
|
38
|
+
"@internal/types-builder": "0.0.28"
|
|
39
39
|
},
|
|
40
40
|
"peerDependencies": {
|
|
41
|
-
"@mastra/core": ">=0.
|
|
41
|
+
"@mastra/core": ">=1.0.0-0 <2.0.0-0",
|
|
42
42
|
"zod": "^3.25.0 || ^4.0.0"
|
|
43
43
|
},
|
|
44
44
|
"homepage": "https://mastra.ai",
|
|
@@ -50,12 +50,8 @@
|
|
|
50
50
|
"bugs": {
|
|
51
51
|
"url": "https://github.com/mastra-ai/mastra/issues"
|
|
52
52
|
},
|
|
53
|
-
"
|
|
54
|
-
"
|
|
55
|
-
"publish-branch": [
|
|
56
|
-
"main",
|
|
57
|
-
"0.x"
|
|
58
|
-
]
|
|
53
|
+
"engines": {
|
|
54
|
+
"node": ">=22.13.0"
|
|
59
55
|
},
|
|
60
56
|
"scripts": {
|
|
61
57
|
"build": "tsup --silent --config tsup.config.ts",
|