@cartesia/cartesia-js 0.0.4-alpha.0 → 1.0.0-alpha.2
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/.turbo/turbo-build.log +63 -45
- package/CHANGELOG.md +12 -0
- package/README.md +123 -16
- package/dist/chunk-36JBKJUN.js +119 -0
- package/dist/chunk-3F5E46FT.js +212 -0
- package/dist/{chunk-XPIMIAAE.js → chunk-3FL2SNIR.js} +1 -1
- package/dist/chunk-JGP5BIUV.js +34 -0
- package/dist/chunk-KWBSQZTY.js +25 -0
- package/dist/chunk-PQ6CIPFW.js +120 -0
- package/dist/chunk-RO7TY474.js +81 -0
- package/dist/chunk-T3RG6WV4.js +22 -0
- package/dist/{chunk-R4P7LWVZ.js → chunk-WIFMLPT5.js} +31 -6
- package/dist/chunk-WVTITUXX.js +58 -0
- package/dist/chunk-XHTDPLFR.js +19 -0
- package/dist/index.cjs +425 -166
- package/dist/index.d.cts +7 -3
- package/dist/index.d.ts +7 -3
- package/dist/index.js +13 -6
- package/dist/lib/client.cjs +49 -1
- package/dist/lib/client.d.cts +2 -0
- package/dist/lib/client.d.ts +2 -0
- package/dist/lib/client.js +3 -3
- package/dist/lib/constants.cjs +15 -8
- package/dist/lib/constants.d.cts +4 -4
- package/dist/lib/constants.d.ts +4 -4
- package/dist/lib/constants.js +6 -6
- package/dist/lib/index.cjs +310 -171
- package/dist/lib/index.d.cts +6 -2
- package/dist/lib/index.d.ts +6 -2
- package/dist/lib/index.js +9 -6
- package/dist/react/index.cjs +573 -290
- package/dist/react/index.d.cts +20 -14
- package/dist/react/index.d.ts +20 -14
- package/dist/react/index.js +157 -105
- package/dist/react/utils.js +2 -2
- package/dist/tts/index.cjs +496 -0
- package/dist/tts/index.d.cts +17 -0
- package/dist/tts/index.d.ts +17 -0
- package/dist/tts/index.js +12 -0
- package/dist/tts/player.cjs +198 -0
- package/dist/tts/player.d.cts +43 -0
- package/dist/tts/player.d.ts +43 -0
- package/dist/tts/player.js +8 -0
- package/dist/tts/source.cjs +181 -0
- package/dist/tts/source.d.cts +53 -0
- package/dist/tts/source.d.ts +53 -0
- package/dist/tts/source.js +7 -0
- package/dist/{audio → tts}/utils.cjs +25 -60
- package/dist/tts/utils.d.cts +67 -0
- package/dist/tts/utils.d.ts +67 -0
- package/dist/{audio → tts}/utils.js +2 -7
- package/dist/tts/websocket.cjs +479 -0
- package/dist/tts/websocket.d.cts +53 -0
- package/dist/tts/websocket.d.ts +53 -0
- package/dist/tts/websocket.js +11 -0
- package/dist/types/index.d.cts +50 -1
- package/dist/types/index.d.ts +50 -1
- package/dist/voices/index.cjs +157 -0
- package/dist/voices/index.d.cts +12 -0
- package/dist/voices/index.d.ts +12 -0
- package/dist/voices/index.js +9 -0
- package/package.json +2 -1
- package/src/index.ts +1 -0
- package/src/lib/client.ts +15 -1
- package/src/lib/constants.ts +15 -4
- package/src/lib/index.ts +6 -3
- package/src/react/index.ts +176 -110
- package/src/tts/index.ts +17 -0
- package/src/tts/player.ts +110 -0
- package/src/tts/source.ts +115 -0
- package/src/tts/utils.ts +150 -0
- package/src/tts/websocket.ts +214 -0
- package/src/types/index.ts +63 -0
- package/src/voices/index.ts +47 -0
- package/dist/audio/index.cjs +0 -404
- package/dist/audio/index.d.cts +0 -5
- package/dist/audio/index.d.ts +0 -5
- package/dist/audio/index.js +0 -10
- package/dist/audio/utils.d.cts +0 -5
- package/dist/audio/utils.d.ts +0 -5
- package/dist/chunk-4MHF74A7.js +0 -272
- package/dist/chunk-5TSWLYOW.js +0 -113
- package/dist/chunk-MJIFZWHS.js +0 -18
- package/dist/chunk-OVI3W3GG.js +0 -12
- package/dist/chunk-S6A27RQL.js +0 -18
- package/dist/index-C2_3XFxn.d.cts +0 -163
- package/dist/index-DgwnZezj.d.ts +0 -163
- package/src/audio/index.ts +0 -297
- package/src/audio/utils.ts +0 -220
package/dist/react/index.d.cts
CHANGED
|
@@ -1,27 +1,33 @@
|
|
|
1
|
-
import
|
|
1
|
+
import Source from '../tts/source.cjs';
|
|
2
2
|
import 'emittery';
|
|
3
|
-
import 'partysocket';
|
|
4
|
-
import '../lib/client.cjs';
|
|
5
3
|
import '../types/index.cjs';
|
|
6
4
|
|
|
7
|
-
type
|
|
5
|
+
type UseTTSOptions = {
|
|
8
6
|
apiKey: string | null;
|
|
9
7
|
baseUrl?: string;
|
|
8
|
+
sampleRate: number;
|
|
10
9
|
};
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
type PlaybackStatus = "inactive" | "playing" | "paused" | "finished";
|
|
11
|
+
type BufferStatus = "inactive" | "buffering" | "buffered";
|
|
12
|
+
type Metrics = {
|
|
13
|
+
modelLatency: number | null;
|
|
14
|
+
};
|
|
15
|
+
interface UseTTSReturn {
|
|
16
|
+
buffer: (options: object) => Promise<void>;
|
|
13
17
|
play: (bufferDuration?: number) => Promise<void>;
|
|
14
|
-
|
|
15
|
-
|
|
18
|
+
pause: () => Promise<void>;
|
|
19
|
+
resume: () => Promise<void>;
|
|
20
|
+
toggle: () => Promise<void>;
|
|
21
|
+
source: Source | null;
|
|
22
|
+
playbackStatus: PlaybackStatus;
|
|
23
|
+
bufferStatus: BufferStatus;
|
|
24
|
+
isWaiting: boolean;
|
|
16
25
|
isConnected: boolean;
|
|
17
|
-
|
|
18
|
-
isBuffering: boolean;
|
|
19
|
-
chunks: Chunk[];
|
|
20
|
-
messages: StreamEventData["message"][];
|
|
26
|
+
metrics: Metrics;
|
|
21
27
|
}
|
|
22
28
|
/**
|
|
23
29
|
* React hook to use the Cartesia audio API.
|
|
24
30
|
*/
|
|
25
|
-
declare function
|
|
31
|
+
declare function useTTS({ apiKey, baseUrl, sampleRate, }: UseTTSOptions): UseTTSReturn;
|
|
26
32
|
|
|
27
|
-
export { type
|
|
33
|
+
export { type BufferStatus, type Metrics, type PlaybackStatus, type UseTTSOptions, type UseTTSReturn, useTTS };
|
package/dist/react/index.d.ts
CHANGED
|
@@ -1,27 +1,33 @@
|
|
|
1
|
-
import
|
|
1
|
+
import Source from '../tts/source.js';
|
|
2
2
|
import 'emittery';
|
|
3
|
-
import 'partysocket';
|
|
4
|
-
import '../lib/client.js';
|
|
5
3
|
import '../types/index.js';
|
|
6
4
|
|
|
7
|
-
type
|
|
5
|
+
type UseTTSOptions = {
|
|
8
6
|
apiKey: string | null;
|
|
9
7
|
baseUrl?: string;
|
|
8
|
+
sampleRate: number;
|
|
10
9
|
};
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
type PlaybackStatus = "inactive" | "playing" | "paused" | "finished";
|
|
11
|
+
type BufferStatus = "inactive" | "buffering" | "buffered";
|
|
12
|
+
type Metrics = {
|
|
13
|
+
modelLatency: number | null;
|
|
14
|
+
};
|
|
15
|
+
interface UseTTSReturn {
|
|
16
|
+
buffer: (options: object) => Promise<void>;
|
|
13
17
|
play: (bufferDuration?: number) => Promise<void>;
|
|
14
|
-
|
|
15
|
-
|
|
18
|
+
pause: () => Promise<void>;
|
|
19
|
+
resume: () => Promise<void>;
|
|
20
|
+
toggle: () => Promise<void>;
|
|
21
|
+
source: Source | null;
|
|
22
|
+
playbackStatus: PlaybackStatus;
|
|
23
|
+
bufferStatus: BufferStatus;
|
|
24
|
+
isWaiting: boolean;
|
|
16
25
|
isConnected: boolean;
|
|
17
|
-
|
|
18
|
-
isBuffering: boolean;
|
|
19
|
-
chunks: Chunk[];
|
|
20
|
-
messages: StreamEventData["message"][];
|
|
26
|
+
metrics: Metrics;
|
|
21
27
|
}
|
|
22
28
|
/**
|
|
23
29
|
* React hook to use the Cartesia audio API.
|
|
24
30
|
*/
|
|
25
|
-
declare function
|
|
31
|
+
declare function useTTS({ apiKey, baseUrl, sampleRate, }: UseTTSOptions): UseTTSReturn;
|
|
26
32
|
|
|
27
|
-
export { type
|
|
33
|
+
export { type BufferStatus, type Metrics, type PlaybackStatus, type UseTTSOptions, type UseTTSReturn, useTTS };
|
package/dist/react/index.js
CHANGED
|
@@ -1,108 +1,144 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
} from "../chunk-
|
|
4
|
-
import
|
|
5
|
-
base64ToArray,
|
|
6
|
-
bufferToWav
|
|
7
|
-
} from "../chunk-5TSWLYOW.js";
|
|
8
|
-
import "../chunk-MJIFZWHS.js";
|
|
9
|
-
import {
|
|
10
|
-
SAMPLE_RATE
|
|
11
|
-
} from "../chunk-OVI3W3GG.js";
|
|
2
|
+
Cartesia
|
|
3
|
+
} from "../chunk-T3RG6WV4.js";
|
|
4
|
+
import "../chunk-WVTITUXX.js";
|
|
12
5
|
import {
|
|
13
6
|
pingServer
|
|
14
|
-
} from "../chunk-
|
|
7
|
+
} from "../chunk-3FL2SNIR.js";
|
|
8
|
+
import "../chunk-KWBSQZTY.js";
|
|
9
|
+
import "../chunk-3F5E46FT.js";
|
|
10
|
+
import "../chunk-PQ6CIPFW.js";
|
|
11
|
+
import "../chunk-JGP5BIUV.js";
|
|
12
|
+
import "../chunk-XHTDPLFR.js";
|
|
13
|
+
import {
|
|
14
|
+
Player
|
|
15
|
+
} from "../chunk-36JBKJUN.js";
|
|
16
|
+
import "../chunk-RO7TY474.js";
|
|
15
17
|
import {
|
|
16
18
|
__async
|
|
17
|
-
} from "../chunk-
|
|
19
|
+
} from "../chunk-WIFMLPT5.js";
|
|
18
20
|
|
|
19
21
|
// src/react/index.ts
|
|
20
22
|
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
21
|
-
|
|
23
|
+
var PING_INTERVAL = 5e3;
|
|
24
|
+
var DEFAULT_BUFFER_DURATION = 0.01;
|
|
25
|
+
function useTTS({
|
|
26
|
+
apiKey,
|
|
27
|
+
baseUrl,
|
|
28
|
+
sampleRate
|
|
29
|
+
}) {
|
|
30
|
+
var _a, _b;
|
|
22
31
|
if (typeof window === "undefined") {
|
|
23
32
|
return {
|
|
24
|
-
|
|
25
|
-
},
|
|
33
|
+
buffer: () => __async(this, null, function* () {
|
|
34
|
+
}),
|
|
26
35
|
play: () => __async(this, null, function* () {
|
|
27
36
|
}),
|
|
28
|
-
|
|
37
|
+
pause: () => __async(this, null, function* () {
|
|
38
|
+
}),
|
|
39
|
+
resume: () => __async(this, null, function* () {
|
|
40
|
+
}),
|
|
41
|
+
toggle: () => __async(this, null, function* () {
|
|
42
|
+
}),
|
|
43
|
+
playbackStatus: "inactive",
|
|
44
|
+
bufferStatus: "inactive",
|
|
45
|
+
isWaiting: false,
|
|
46
|
+
source: null,
|
|
29
47
|
isConnected: false,
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
chunks: [],
|
|
34
|
-
messages: []
|
|
48
|
+
metrics: {
|
|
49
|
+
modelLatency: null
|
|
50
|
+
}
|
|
35
51
|
};
|
|
36
52
|
}
|
|
37
|
-
const
|
|
53
|
+
const websocket = useMemo(() => {
|
|
38
54
|
if (!apiKey) {
|
|
39
55
|
return null;
|
|
40
56
|
}
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
const
|
|
46
|
-
const
|
|
47
|
-
const [
|
|
57
|
+
const cartesia = new Cartesia({ apiKey, baseUrl });
|
|
58
|
+
baseUrl = baseUrl != null ? baseUrl : cartesia.baseUrl;
|
|
59
|
+
return cartesia.tts.websocket({ sampleRate });
|
|
60
|
+
}, [apiKey, baseUrl, sampleRate]);
|
|
61
|
+
const websocketReturn = useRef(null);
|
|
62
|
+
const player = useRef(null);
|
|
63
|
+
const [playbackStatus, setPlaybackStatus] = useState("inactive");
|
|
64
|
+
const [bufferStatus, setBufferStatus] = useState("inactive");
|
|
65
|
+
const [isWaiting, setIsWaiting] = useState(false);
|
|
48
66
|
const [isConnected, setIsConnected] = useState(false);
|
|
49
|
-
const [
|
|
67
|
+
const [bufferDuration, setBufferDuration] = useState(null);
|
|
50
68
|
const [messages, setMessages] = useState([]);
|
|
51
|
-
const
|
|
52
|
-
const stream = useCallback(
|
|
69
|
+
const buffer = useCallback(
|
|
53
70
|
(options) => __async(this, null, function* () {
|
|
54
|
-
var
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
71
|
+
var _a2;
|
|
72
|
+
setMessages([]);
|
|
73
|
+
setBufferStatus("buffering");
|
|
74
|
+
websocketReturn.current = (_a2 = websocket == null ? void 0 : websocket.send(options)) != null ? _a2 : null;
|
|
75
|
+
if (!websocketReturn.current) {
|
|
58
76
|
return;
|
|
59
77
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
);
|
|
67
|
-
streamReturn.current.on(
|
|
68
|
-
"message",
|
|
69
|
-
(message) => {
|
|
70
|
-
setMessages((messages2) => [...messages2, message]);
|
|
71
|
-
}
|
|
72
|
-
);
|
|
73
|
-
const { chunks: chunks2 } = yield streamReturn.current.once("streamed");
|
|
74
|
-
setChunks(chunks2);
|
|
75
|
-
setIsStreamed(true);
|
|
78
|
+
const unsubscribe = websocketReturn.current.on("message", (message) => {
|
|
79
|
+
setMessages((messages2) => [...messages2, JSON.parse(message)]);
|
|
80
|
+
});
|
|
81
|
+
yield websocketReturn.current.source.once("close");
|
|
82
|
+
setBufferStatus("buffered");
|
|
83
|
+
unsubscribe();
|
|
76
84
|
}),
|
|
77
|
-
[
|
|
85
|
+
[websocket]
|
|
78
86
|
);
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
|
|
87
|
+
const metrics = useMemo(() => {
|
|
88
|
+
var _a2;
|
|
89
|
+
if (messages.length === 0) {
|
|
90
|
+
return {
|
|
91
|
+
modelLatency: null
|
|
92
|
+
};
|
|
82
93
|
}
|
|
83
|
-
const
|
|
84
|
-
return
|
|
85
|
-
|
|
94
|
+
const modelLatency = (_a2 = messages[0].step_time) != null ? _a2 : null;
|
|
95
|
+
return {
|
|
96
|
+
modelLatency: Math.trunc(modelLatency)
|
|
97
|
+
};
|
|
98
|
+
}, [messages]);
|
|
86
99
|
useEffect(() => {
|
|
87
100
|
let cleanup = () => {
|
|
88
101
|
};
|
|
89
102
|
function setupConnection() {
|
|
90
103
|
return __async(this, null, function* () {
|
|
91
104
|
try {
|
|
92
|
-
const connection = yield
|
|
105
|
+
const connection = yield websocket == null ? void 0 : websocket.connect();
|
|
93
106
|
if (!connection) {
|
|
94
107
|
return;
|
|
95
108
|
}
|
|
109
|
+
const unsubscribes = [];
|
|
96
110
|
setIsConnected(true);
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
111
|
+
unsubscribes.push(
|
|
112
|
+
connection.on("open", () => {
|
|
113
|
+
setIsConnected(true);
|
|
114
|
+
})
|
|
115
|
+
);
|
|
116
|
+
unsubscribes.push(
|
|
117
|
+
connection.on("close", () => {
|
|
118
|
+
setIsConnected(false);
|
|
119
|
+
})
|
|
120
|
+
);
|
|
121
|
+
const intervalId = setInterval(() => {
|
|
122
|
+
if (baseUrl) {
|
|
123
|
+
pingServer(new URL(baseUrl).origin).then((ping) => {
|
|
124
|
+
let bufferDuration2;
|
|
125
|
+
if (ping < 300) {
|
|
126
|
+
bufferDuration2 = 0.01;
|
|
127
|
+
} else if (ping > 1500) {
|
|
128
|
+
bufferDuration2 = 6;
|
|
129
|
+
} else {
|
|
130
|
+
bufferDuration2 = ping / 1e3 * 4;
|
|
131
|
+
}
|
|
132
|
+
setBufferDuration(bufferDuration2);
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
}, PING_INTERVAL);
|
|
103
136
|
return () => {
|
|
104
|
-
unsubscribe
|
|
105
|
-
|
|
137
|
+
for (const unsubscribe of unsubscribes) {
|
|
138
|
+
unsubscribe();
|
|
139
|
+
}
|
|
140
|
+
clearInterval(intervalId);
|
|
141
|
+
websocket == null ? void 0 : websocket.disconnect();
|
|
106
142
|
};
|
|
107
143
|
} catch (e) {
|
|
108
144
|
console.error(e);
|
|
@@ -113,53 +149,69 @@ function useAudio({ apiKey, baseUrl }) {
|
|
|
113
149
|
cleanup = cleanupConnection;
|
|
114
150
|
});
|
|
115
151
|
return () => cleanup == null ? void 0 : cleanup();
|
|
116
|
-
}, [
|
|
152
|
+
}, [websocket, baseUrl]);
|
|
117
153
|
const play = useCallback(() => __async(this, null, function* () {
|
|
118
|
-
|
|
119
|
-
if (isPlaying || !streamReturn.current) {
|
|
154
|
+
if (playbackStatus === "playing" || !websocketReturn.current) {
|
|
120
155
|
return;
|
|
121
156
|
}
|
|
122
|
-
|
|
123
|
-
const
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
}, 250);
|
|
157
|
+
setPlaybackStatus("playing");
|
|
158
|
+
const unsubscribes = [];
|
|
159
|
+
unsubscribes.push(
|
|
160
|
+
websocketReturn.current.source.on("wait", () => {
|
|
161
|
+
setIsWaiting(true);
|
|
162
|
+
})
|
|
163
|
+
);
|
|
164
|
+
unsubscribes.push(
|
|
165
|
+
websocketReturn.current.source.on("read", () => {
|
|
166
|
+
setIsWaiting(false);
|
|
167
|
+
})
|
|
168
|
+
);
|
|
169
|
+
player.current = new Player({
|
|
170
|
+
bufferDuration: bufferDuration != null ? bufferDuration : DEFAULT_BUFFER_DURATION
|
|
137
171
|
});
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
172
|
+
yield player.current.play(websocketReturn.current.source);
|
|
173
|
+
for (const unsubscribe of unsubscribes) {
|
|
174
|
+
unsubscribe();
|
|
175
|
+
}
|
|
176
|
+
setPlaybackStatus("finished");
|
|
177
|
+
}), [playbackStatus, bufferDuration]);
|
|
178
|
+
const pause = useCallback(() => __async(this, null, function* () {
|
|
179
|
+
var _a2;
|
|
180
|
+
yield (_a2 = player.current) == null ? void 0 : _a2.pause();
|
|
181
|
+
setPlaybackStatus("paused");
|
|
182
|
+
}), []);
|
|
183
|
+
const resume = useCallback(() => __async(this, null, function* () {
|
|
184
|
+
var _a2;
|
|
185
|
+
yield (_a2 = player.current) == null ? void 0 : _a2.resume();
|
|
186
|
+
setPlaybackStatus("playing");
|
|
187
|
+
}), []);
|
|
188
|
+
const toggle = useCallback(() => __async(this, null, function* () {
|
|
189
|
+
var _a2;
|
|
190
|
+
yield (_a2 = player.current) == null ? void 0 : _a2.toggle();
|
|
191
|
+
setPlaybackStatus((status) => {
|
|
192
|
+
if (status === "playing") {
|
|
193
|
+
return "paused";
|
|
141
194
|
}
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
setIsPlaying(false);
|
|
147
|
-
}, data.playbackEndsIn);
|
|
195
|
+
if (status === "paused") {
|
|
196
|
+
return "playing";
|
|
197
|
+
}
|
|
198
|
+
return status;
|
|
148
199
|
});
|
|
149
|
-
|
|
150
|
-
}), [isPlaying]);
|
|
200
|
+
}), []);
|
|
151
201
|
return {
|
|
152
|
-
|
|
202
|
+
buffer,
|
|
153
203
|
play,
|
|
154
|
-
|
|
155
|
-
|
|
204
|
+
pause,
|
|
205
|
+
source: (_b = (_a = websocketReturn.current) == null ? void 0 : _a.source) != null ? _b : null,
|
|
206
|
+
resume,
|
|
207
|
+
toggle,
|
|
208
|
+
playbackStatus,
|
|
209
|
+
bufferStatus,
|
|
210
|
+
isWaiting,
|
|
156
211
|
isConnected,
|
|
157
|
-
|
|
158
|
-
isBuffering,
|
|
159
|
-
chunks,
|
|
160
|
-
messages
|
|
212
|
+
metrics
|
|
161
213
|
};
|
|
162
214
|
}
|
|
163
215
|
export {
|
|
164
|
-
|
|
216
|
+
useTTS
|
|
165
217
|
};
|