assemblyai 4.12.1 → 4.13.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/assemblyai.umd.js +210 -4
- package/dist/assemblyai.umd.min.js +1 -1
- package/dist/browser.mjs +207 -5
- package/dist/bun.mjs +207 -5
- package/dist/deno.mjs +207 -5
- package/dist/index.cjs +210 -4
- package/dist/index.mjs +210 -5
- package/dist/node.cjs +207 -4
- package/dist/node.mjs +207 -5
- package/dist/services/index.d.ts +6 -1
- package/dist/services/streaming/factory.d.ts +10 -0
- package/dist/services/streaming/index.d.ts +2 -0
- package/dist/services/streaming/service.d.ts +20 -0
- package/dist/types/index.d.ts +2 -1
- package/dist/types/openapi.generated.d.ts +1 -1
- package/dist/types/services/index.d.ts +1 -0
- package/dist/types/streaming/index.d.ts +71 -0
- package/dist/utils/errors/index.d.ts +1 -0
- package/dist/utils/errors/streaming.d.ts +23 -0
- package/dist/workerd.mjs +207 -5
- package/package.json +1 -1
- package/src/services/index.ts +14 -0
- package/src/services/streaming/factory.ts +39 -0
- package/src/services/streaming/index.ts +2 -0
- package/src/services/streaming/service.ts +219 -0
- package/src/types/index.ts +2 -1
- package/src/types/openapi.generated.ts +1 -1
- package/src/types/services/index.ts +1 -0
- package/src/types/streaming/index.ts +94 -0
- package/src/utils/errors/index.ts +6 -0
- package/src/utils/errors/streaming.ts +51 -0
package/dist/index.cjs
CHANGED
|
@@ -63,7 +63,7 @@ if (typeof navigator !== "undefined" && navigator.userAgent) {
|
|
|
63
63
|
defaultUserAgentString += navigator.userAgent;
|
|
64
64
|
}
|
|
65
65
|
const defaultUserAgent = {
|
|
66
|
-
sdk: { name: "JavaScript", version: "4.
|
|
66
|
+
sdk: { name: "JavaScript", version: "4.13.0-beta.1" },
|
|
67
67
|
};
|
|
68
68
|
if (typeof process !== "undefined") {
|
|
69
69
|
if (process.versions.node && defaultUserAgentString.indexOf("Node") === -1) {
|
|
@@ -256,9 +256,48 @@ const RealtimeErrorMessages = {
|
|
|
256
256
|
class RealtimeError extends Error {
|
|
257
257
|
}
|
|
258
258
|
|
|
259
|
+
const StreamingErrorType = {
|
|
260
|
+
BadSampleRate: 4000,
|
|
261
|
+
AuthFailed: 4001,
|
|
262
|
+
InsufficientFunds: 4002,
|
|
263
|
+
FreeTierUser: 4003,
|
|
264
|
+
NonexistentSessionId: 4004,
|
|
265
|
+
SessionExpired: 4008,
|
|
266
|
+
ClosedSession: 4010,
|
|
267
|
+
RateLimited: 4029,
|
|
268
|
+
UniqueSessionViolation: 4030,
|
|
269
|
+
SessionTimeout: 4031,
|
|
270
|
+
AudioTooShort: 4032,
|
|
271
|
+
AudioTooLong: 4033,
|
|
272
|
+
AudioTooSmallToTranscode: 4034,
|
|
273
|
+
BadSchema: 4101,
|
|
274
|
+
TooManyStreams: 4102,
|
|
275
|
+
Reconnected: 4103,
|
|
276
|
+
};
|
|
277
|
+
const StreamingErrorMessages = {
|
|
278
|
+
[StreamingErrorType.BadSampleRate]: "Sample rate must be a positive integer",
|
|
279
|
+
[StreamingErrorType.AuthFailed]: "Not Authorized",
|
|
280
|
+
[StreamingErrorType.InsufficientFunds]: "Insufficient funds",
|
|
281
|
+
[StreamingErrorType.FreeTierUser]: "This feature is paid-only and requires you to add a credit card. Please visit https://app.assemblyai.com/ to add a credit card to your account.",
|
|
282
|
+
[StreamingErrorType.NonexistentSessionId]: "Session ID does not exist",
|
|
283
|
+
[StreamingErrorType.SessionExpired]: "Session has expired",
|
|
284
|
+
[StreamingErrorType.ClosedSession]: "Session is closed",
|
|
285
|
+
[StreamingErrorType.RateLimited]: "Rate limited",
|
|
286
|
+
[StreamingErrorType.UniqueSessionViolation]: "Unique session violation",
|
|
287
|
+
[StreamingErrorType.SessionTimeout]: "Session Timeout",
|
|
288
|
+
[StreamingErrorType.AudioTooShort]: "Audio too short",
|
|
289
|
+
[StreamingErrorType.AudioTooLong]: "Audio too long",
|
|
290
|
+
[StreamingErrorType.AudioTooSmallToTranscode]: "Audio too small to transcode",
|
|
291
|
+
[StreamingErrorType.BadSchema]: "Bad schema",
|
|
292
|
+
[StreamingErrorType.TooManyStreams]: "Too many streams",
|
|
293
|
+
[StreamingErrorType.Reconnected]: "This session has been reconnected. This WebSocket is no longer valid.",
|
|
294
|
+
};
|
|
295
|
+
class StreamingError extends Error {
|
|
296
|
+
}
|
|
297
|
+
|
|
259
298
|
const defaultRealtimeUrl = "wss://api.assemblyai.com/v2/realtime/ws";
|
|
260
299
|
const forceEndOfUtteranceMessage = `{"force_end_utterance":true}`;
|
|
261
|
-
const terminateSessionMessage = `{"terminate_session":true}`;
|
|
300
|
+
const terminateSessionMessage$1 = `{"terminate_session":true}`;
|
|
262
301
|
/**
|
|
263
302
|
* RealtimeTranscriber connects to the Streaming Speech-to-Text API and lets you transcribe audio in real-time.
|
|
264
303
|
*/
|
|
@@ -453,11 +492,11 @@ class RealtimeTranscriber {
|
|
|
453
492
|
const sessionTerminatedPromise = new Promise((resolve) => {
|
|
454
493
|
this.sessionTerminatedResolve = resolve;
|
|
455
494
|
});
|
|
456
|
-
this.socket.send(terminateSessionMessage);
|
|
495
|
+
this.socket.send(terminateSessionMessage$1);
|
|
457
496
|
yield sessionTerminatedPromise;
|
|
458
497
|
}
|
|
459
498
|
else {
|
|
460
|
-
this.socket.send(terminateSessionMessage);
|
|
499
|
+
this.socket.send(terminateSessionMessage$1);
|
|
461
500
|
}
|
|
462
501
|
}
|
|
463
502
|
if ((_a = this.socket) === null || _a === void 0 ? void 0 : _a.removeAllListeners)
|
|
@@ -820,7 +859,172 @@ function dataUrlToBlob(dataUrl) {
|
|
|
820
859
|
return new Blob([u8arr], { type: mime });
|
|
821
860
|
}
|
|
822
861
|
|
|
862
|
+
const defaultStreamingUrl$1 = "wss://streaming.assemblyai.com/v3/ws";
|
|
863
|
+
const terminateSessionMessage = `{"type":"Terminate"}`;
|
|
864
|
+
class StreamingTranscriber {
|
|
865
|
+
constructor(params) {
|
|
866
|
+
this.listeners = {};
|
|
867
|
+
this.params = Object.assign(Object.assign({}, params), { websocketBaseUrl: params.websocketBaseUrl || defaultStreamingUrl$1 });
|
|
868
|
+
if ("token" in params && params.token)
|
|
869
|
+
this.token = params.token;
|
|
870
|
+
if ("apiKey" in params && params.apiKey)
|
|
871
|
+
this.apiKey = params.apiKey;
|
|
872
|
+
if (!(this.token || this.apiKey)) {
|
|
873
|
+
throw new Error("API key or temporary token is required.");
|
|
874
|
+
}
|
|
875
|
+
}
|
|
876
|
+
connectionUrl() {
|
|
877
|
+
var _a;
|
|
878
|
+
const url = new URL((_a = this.params.websocketBaseUrl) !== null && _a !== void 0 ? _a : "");
|
|
879
|
+
if (url.protocol !== "wss:") {
|
|
880
|
+
throw new Error("Invalid protocol, must be wss");
|
|
881
|
+
}
|
|
882
|
+
const searchParams = new URLSearchParams();
|
|
883
|
+
searchParams.set("sample_rate", this.params.sampleRate.toString());
|
|
884
|
+
if (this.params.wordFinalizationMaxWaitTime) {
|
|
885
|
+
searchParams.set("word_finalization_max_wait_time", this.params.wordFinalizationMaxWaitTime.toString());
|
|
886
|
+
}
|
|
887
|
+
if (this.params.endOfTurnConfidenceThreshold) {
|
|
888
|
+
searchParams.set("end_of_turn_confidence_threshold", this.params.endOfTurnConfidenceThreshold.toString());
|
|
889
|
+
}
|
|
890
|
+
if (this.params.minEndOfTurnSilenceWhenConfident) {
|
|
891
|
+
searchParams.set("min_end_of_turn_silence_when_confident", this.params.minEndOfTurnSilenceWhenConfident.toString());
|
|
892
|
+
}
|
|
893
|
+
if (this.params.maxTurnSilence) {
|
|
894
|
+
searchParams.set("max_turn_silence", this.params.maxTurnSilence.toString());
|
|
895
|
+
}
|
|
896
|
+
if (this.params.formattedFinals) {
|
|
897
|
+
searchParams.set("formatted_finals", this.params.formattedFinals.toString());
|
|
898
|
+
}
|
|
899
|
+
url.search = searchParams.toString();
|
|
900
|
+
return url;
|
|
901
|
+
}
|
|
902
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
903
|
+
on(event, listener) {
|
|
904
|
+
this.listeners[event] = listener;
|
|
905
|
+
}
|
|
906
|
+
connect() {
|
|
907
|
+
return new Promise((resolve) => {
|
|
908
|
+
if (this.socket) {
|
|
909
|
+
throw new Error("Already connected");
|
|
910
|
+
}
|
|
911
|
+
const url = this.connectionUrl();
|
|
912
|
+
this.socket = factory(url.toString(), {
|
|
913
|
+
headers: { Authorization: this.token || this.apiKey },
|
|
914
|
+
});
|
|
915
|
+
this.socket.binaryType = "arraybuffer";
|
|
916
|
+
this.socket.onopen = () => { };
|
|
917
|
+
this.socket.onclose = ({ code, reason }) => {
|
|
918
|
+
var _a, _b;
|
|
919
|
+
if (!reason) {
|
|
920
|
+
if (code in StreamingErrorMessages) {
|
|
921
|
+
reason = StreamingErrorMessages[code];
|
|
922
|
+
}
|
|
923
|
+
}
|
|
924
|
+
(_b = (_a = this.listeners).close) === null || _b === void 0 ? void 0 : _b.call(_a, code, reason);
|
|
925
|
+
};
|
|
926
|
+
this.socket.onerror = (event) => {
|
|
927
|
+
var _a, _b, _c, _d;
|
|
928
|
+
if (event.error)
|
|
929
|
+
(_b = (_a = this.listeners).error) === null || _b === void 0 ? void 0 : _b.call(_a, event.error);
|
|
930
|
+
else
|
|
931
|
+
(_d = (_c = this.listeners).error) === null || _d === void 0 ? void 0 : _d.call(_c, new Error(event.message));
|
|
932
|
+
};
|
|
933
|
+
this.socket.onmessage = ({ data }) => {
|
|
934
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
935
|
+
const message = JSON.parse(data.toString());
|
|
936
|
+
if ("error" in message) {
|
|
937
|
+
(_b = (_a = this.listeners).error) === null || _b === void 0 ? void 0 : _b.call(_a, new StreamingError(message.error));
|
|
938
|
+
return;
|
|
939
|
+
}
|
|
940
|
+
switch (message.type) {
|
|
941
|
+
case "Begin": {
|
|
942
|
+
resolve(message);
|
|
943
|
+
(_d = (_c = this.listeners).open) === null || _d === void 0 ? void 0 : _d.call(_c, message);
|
|
944
|
+
break;
|
|
945
|
+
}
|
|
946
|
+
case "Turn": {
|
|
947
|
+
(_f = (_e = this.listeners).turn) === null || _f === void 0 ? void 0 : _f.call(_e, message);
|
|
948
|
+
break;
|
|
949
|
+
}
|
|
950
|
+
case "Termination": {
|
|
951
|
+
(_g = this.sessionTerminatedResolve) === null || _g === void 0 ? void 0 : _g.call(this);
|
|
952
|
+
break;
|
|
953
|
+
}
|
|
954
|
+
}
|
|
955
|
+
};
|
|
956
|
+
});
|
|
957
|
+
}
|
|
958
|
+
stream() {
|
|
959
|
+
return new WritableStream({
|
|
960
|
+
write: (chunk) => {
|
|
961
|
+
this.sendAudio(chunk);
|
|
962
|
+
},
|
|
963
|
+
});
|
|
964
|
+
}
|
|
965
|
+
sendAudio(audio) {
|
|
966
|
+
this.send(audio);
|
|
967
|
+
}
|
|
968
|
+
send(data) {
|
|
969
|
+
if (!this.socket || this.socket.readyState !== this.socket.OPEN) {
|
|
970
|
+
throw new Error("Socket is not open for communication");
|
|
971
|
+
}
|
|
972
|
+
this.socket.send(data);
|
|
973
|
+
}
|
|
974
|
+
close() {
|
|
975
|
+
return __awaiter(this, arguments, void 0, function* (waitForSessionTermination = true) {
|
|
976
|
+
var _a;
|
|
977
|
+
if (this.socket) {
|
|
978
|
+
if (this.socket.readyState === this.socket.OPEN) {
|
|
979
|
+
if (waitForSessionTermination) {
|
|
980
|
+
const sessionTerminatedPromise = new Promise((resolve) => {
|
|
981
|
+
this.sessionTerminatedResolve = resolve;
|
|
982
|
+
});
|
|
983
|
+
this.socket.send(terminateSessionMessage);
|
|
984
|
+
yield sessionTerminatedPromise;
|
|
985
|
+
}
|
|
986
|
+
else {
|
|
987
|
+
this.socket.send(terminateSessionMessage);
|
|
988
|
+
}
|
|
989
|
+
}
|
|
990
|
+
if ((_a = this.socket) === null || _a === void 0 ? void 0 : _a.removeAllListeners)
|
|
991
|
+
this.socket.removeAllListeners();
|
|
992
|
+
this.socket.close();
|
|
993
|
+
}
|
|
994
|
+
this.listeners = {};
|
|
995
|
+
this.socket = undefined;
|
|
996
|
+
});
|
|
997
|
+
}
|
|
998
|
+
}
|
|
999
|
+
|
|
1000
|
+
class StreamingTranscriberFactory extends BaseService {
|
|
1001
|
+
constructor(params) {
|
|
1002
|
+
super(params);
|
|
1003
|
+
}
|
|
1004
|
+
transcriber(params) {
|
|
1005
|
+
return new StreamingTranscriber(params);
|
|
1006
|
+
}
|
|
1007
|
+
createTemporaryToken(params) {
|
|
1008
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1009
|
+
const searchParams = new URLSearchParams();
|
|
1010
|
+
// Add each param to the search params
|
|
1011
|
+
Object.entries(params).forEach(([key, value]) => {
|
|
1012
|
+
if (value !== undefined && value !== null) {
|
|
1013
|
+
searchParams.append(key, String(value));
|
|
1014
|
+
}
|
|
1015
|
+
});
|
|
1016
|
+
const queryString = searchParams.toString();
|
|
1017
|
+
const url = queryString ? `/v3/token?${queryString}` : "/v3/token";
|
|
1018
|
+
const data = yield this.fetchJson(url, {
|
|
1019
|
+
method: "GET",
|
|
1020
|
+
});
|
|
1021
|
+
return data.token;
|
|
1022
|
+
});
|
|
1023
|
+
}
|
|
1024
|
+
}
|
|
1025
|
+
|
|
823
1026
|
const defaultBaseUrl = "https://api.assemblyai.com";
|
|
1027
|
+
const defaultStreamingUrl = "https://streaming.assemblyai.com";
|
|
824
1028
|
class AssemblyAI {
|
|
825
1029
|
/**
|
|
826
1030
|
* Create a new AssemblyAI client.
|
|
@@ -835,6 +1039,7 @@ class AssemblyAI {
|
|
|
835
1039
|
this.transcripts = new TranscriptService(params, this.files);
|
|
836
1040
|
this.lemur = new LemurService(params);
|
|
837
1041
|
this.realtime = new RealtimeTranscriberFactory(params);
|
|
1042
|
+
this.streaming = new StreamingTranscriberFactory(Object.assign(Object.assign({}, params), { baseUrl: params.streamingBaseUrl || defaultStreamingUrl }));
|
|
838
1043
|
}
|
|
839
1044
|
}
|
|
840
1045
|
|
|
@@ -845,4 +1050,5 @@ exports.RealtimeService = RealtimeService;
|
|
|
845
1050
|
exports.RealtimeServiceFactory = RealtimeServiceFactory;
|
|
846
1051
|
exports.RealtimeTranscriber = RealtimeTranscriber;
|
|
847
1052
|
exports.RealtimeTranscriberFactory = RealtimeTranscriberFactory;
|
|
1053
|
+
exports.StreamingTranscriber = StreamingTranscriber;
|
|
848
1054
|
exports.TranscriptService = TranscriptService;
|
package/dist/index.mjs
CHANGED
|
@@ -61,7 +61,7 @@ if (typeof navigator !== "undefined" && navigator.userAgent) {
|
|
|
61
61
|
defaultUserAgentString += navigator.userAgent;
|
|
62
62
|
}
|
|
63
63
|
const defaultUserAgent = {
|
|
64
|
-
sdk: { name: "JavaScript", version: "4.
|
|
64
|
+
sdk: { name: "JavaScript", version: "4.13.0-beta.1" },
|
|
65
65
|
};
|
|
66
66
|
if (typeof process !== "undefined") {
|
|
67
67
|
if (process.versions.node && defaultUserAgentString.indexOf("Node") === -1) {
|
|
@@ -254,9 +254,48 @@ const RealtimeErrorMessages = {
|
|
|
254
254
|
class RealtimeError extends Error {
|
|
255
255
|
}
|
|
256
256
|
|
|
257
|
+
const StreamingErrorType = {
|
|
258
|
+
BadSampleRate: 4000,
|
|
259
|
+
AuthFailed: 4001,
|
|
260
|
+
InsufficientFunds: 4002,
|
|
261
|
+
FreeTierUser: 4003,
|
|
262
|
+
NonexistentSessionId: 4004,
|
|
263
|
+
SessionExpired: 4008,
|
|
264
|
+
ClosedSession: 4010,
|
|
265
|
+
RateLimited: 4029,
|
|
266
|
+
UniqueSessionViolation: 4030,
|
|
267
|
+
SessionTimeout: 4031,
|
|
268
|
+
AudioTooShort: 4032,
|
|
269
|
+
AudioTooLong: 4033,
|
|
270
|
+
AudioTooSmallToTranscode: 4034,
|
|
271
|
+
BadSchema: 4101,
|
|
272
|
+
TooManyStreams: 4102,
|
|
273
|
+
Reconnected: 4103,
|
|
274
|
+
};
|
|
275
|
+
const StreamingErrorMessages = {
|
|
276
|
+
[StreamingErrorType.BadSampleRate]: "Sample rate must be a positive integer",
|
|
277
|
+
[StreamingErrorType.AuthFailed]: "Not Authorized",
|
|
278
|
+
[StreamingErrorType.InsufficientFunds]: "Insufficient funds",
|
|
279
|
+
[StreamingErrorType.FreeTierUser]: "This feature is paid-only and requires you to add a credit card. Please visit https://app.assemblyai.com/ to add a credit card to your account.",
|
|
280
|
+
[StreamingErrorType.NonexistentSessionId]: "Session ID does not exist",
|
|
281
|
+
[StreamingErrorType.SessionExpired]: "Session has expired",
|
|
282
|
+
[StreamingErrorType.ClosedSession]: "Session is closed",
|
|
283
|
+
[StreamingErrorType.RateLimited]: "Rate limited",
|
|
284
|
+
[StreamingErrorType.UniqueSessionViolation]: "Unique session violation",
|
|
285
|
+
[StreamingErrorType.SessionTimeout]: "Session Timeout",
|
|
286
|
+
[StreamingErrorType.AudioTooShort]: "Audio too short",
|
|
287
|
+
[StreamingErrorType.AudioTooLong]: "Audio too long",
|
|
288
|
+
[StreamingErrorType.AudioTooSmallToTranscode]: "Audio too small to transcode",
|
|
289
|
+
[StreamingErrorType.BadSchema]: "Bad schema",
|
|
290
|
+
[StreamingErrorType.TooManyStreams]: "Too many streams",
|
|
291
|
+
[StreamingErrorType.Reconnected]: "This session has been reconnected. This WebSocket is no longer valid.",
|
|
292
|
+
};
|
|
293
|
+
class StreamingError extends Error {
|
|
294
|
+
}
|
|
295
|
+
|
|
257
296
|
const defaultRealtimeUrl = "wss://api.assemblyai.com/v2/realtime/ws";
|
|
258
297
|
const forceEndOfUtteranceMessage = `{"force_end_utterance":true}`;
|
|
259
|
-
const terminateSessionMessage = `{"terminate_session":true}`;
|
|
298
|
+
const terminateSessionMessage$1 = `{"terminate_session":true}`;
|
|
260
299
|
/**
|
|
261
300
|
* RealtimeTranscriber connects to the Streaming Speech-to-Text API and lets you transcribe audio in real-time.
|
|
262
301
|
*/
|
|
@@ -451,11 +490,11 @@ class RealtimeTranscriber {
|
|
|
451
490
|
const sessionTerminatedPromise = new Promise((resolve) => {
|
|
452
491
|
this.sessionTerminatedResolve = resolve;
|
|
453
492
|
});
|
|
454
|
-
this.socket.send(terminateSessionMessage);
|
|
493
|
+
this.socket.send(terminateSessionMessage$1);
|
|
455
494
|
yield sessionTerminatedPromise;
|
|
456
495
|
}
|
|
457
496
|
else {
|
|
458
|
-
this.socket.send(terminateSessionMessage);
|
|
497
|
+
this.socket.send(terminateSessionMessage$1);
|
|
459
498
|
}
|
|
460
499
|
}
|
|
461
500
|
if ((_a = this.socket) === null || _a === void 0 ? void 0 : _a.removeAllListeners)
|
|
@@ -818,7 +857,172 @@ function dataUrlToBlob(dataUrl) {
|
|
|
818
857
|
return new Blob([u8arr], { type: mime });
|
|
819
858
|
}
|
|
820
859
|
|
|
860
|
+
const defaultStreamingUrl$1 = "wss://streaming.assemblyai.com/v3/ws";
|
|
861
|
+
const terminateSessionMessage = `{"type":"Terminate"}`;
|
|
862
|
+
class StreamingTranscriber {
|
|
863
|
+
constructor(params) {
|
|
864
|
+
this.listeners = {};
|
|
865
|
+
this.params = Object.assign(Object.assign({}, params), { websocketBaseUrl: params.websocketBaseUrl || defaultStreamingUrl$1 });
|
|
866
|
+
if ("token" in params && params.token)
|
|
867
|
+
this.token = params.token;
|
|
868
|
+
if ("apiKey" in params && params.apiKey)
|
|
869
|
+
this.apiKey = params.apiKey;
|
|
870
|
+
if (!(this.token || this.apiKey)) {
|
|
871
|
+
throw new Error("API key or temporary token is required.");
|
|
872
|
+
}
|
|
873
|
+
}
|
|
874
|
+
connectionUrl() {
|
|
875
|
+
var _a;
|
|
876
|
+
const url = new URL((_a = this.params.websocketBaseUrl) !== null && _a !== void 0 ? _a : "");
|
|
877
|
+
if (url.protocol !== "wss:") {
|
|
878
|
+
throw new Error("Invalid protocol, must be wss");
|
|
879
|
+
}
|
|
880
|
+
const searchParams = new URLSearchParams();
|
|
881
|
+
searchParams.set("sample_rate", this.params.sampleRate.toString());
|
|
882
|
+
if (this.params.wordFinalizationMaxWaitTime) {
|
|
883
|
+
searchParams.set("word_finalization_max_wait_time", this.params.wordFinalizationMaxWaitTime.toString());
|
|
884
|
+
}
|
|
885
|
+
if (this.params.endOfTurnConfidenceThreshold) {
|
|
886
|
+
searchParams.set("end_of_turn_confidence_threshold", this.params.endOfTurnConfidenceThreshold.toString());
|
|
887
|
+
}
|
|
888
|
+
if (this.params.minEndOfTurnSilenceWhenConfident) {
|
|
889
|
+
searchParams.set("min_end_of_turn_silence_when_confident", this.params.minEndOfTurnSilenceWhenConfident.toString());
|
|
890
|
+
}
|
|
891
|
+
if (this.params.maxTurnSilence) {
|
|
892
|
+
searchParams.set("max_turn_silence", this.params.maxTurnSilence.toString());
|
|
893
|
+
}
|
|
894
|
+
if (this.params.formattedFinals) {
|
|
895
|
+
searchParams.set("formatted_finals", this.params.formattedFinals.toString());
|
|
896
|
+
}
|
|
897
|
+
url.search = searchParams.toString();
|
|
898
|
+
return url;
|
|
899
|
+
}
|
|
900
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
901
|
+
on(event, listener) {
|
|
902
|
+
this.listeners[event] = listener;
|
|
903
|
+
}
|
|
904
|
+
connect() {
|
|
905
|
+
return new Promise((resolve) => {
|
|
906
|
+
if (this.socket) {
|
|
907
|
+
throw new Error("Already connected");
|
|
908
|
+
}
|
|
909
|
+
const url = this.connectionUrl();
|
|
910
|
+
this.socket = factory(url.toString(), {
|
|
911
|
+
headers: { Authorization: this.token || this.apiKey },
|
|
912
|
+
});
|
|
913
|
+
this.socket.binaryType = "arraybuffer";
|
|
914
|
+
this.socket.onopen = () => { };
|
|
915
|
+
this.socket.onclose = ({ code, reason }) => {
|
|
916
|
+
var _a, _b;
|
|
917
|
+
if (!reason) {
|
|
918
|
+
if (code in StreamingErrorMessages) {
|
|
919
|
+
reason = StreamingErrorMessages[code];
|
|
920
|
+
}
|
|
921
|
+
}
|
|
922
|
+
(_b = (_a = this.listeners).close) === null || _b === void 0 ? void 0 : _b.call(_a, code, reason);
|
|
923
|
+
};
|
|
924
|
+
this.socket.onerror = (event) => {
|
|
925
|
+
var _a, _b, _c, _d;
|
|
926
|
+
if (event.error)
|
|
927
|
+
(_b = (_a = this.listeners).error) === null || _b === void 0 ? void 0 : _b.call(_a, event.error);
|
|
928
|
+
else
|
|
929
|
+
(_d = (_c = this.listeners).error) === null || _d === void 0 ? void 0 : _d.call(_c, new Error(event.message));
|
|
930
|
+
};
|
|
931
|
+
this.socket.onmessage = ({ data }) => {
|
|
932
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
933
|
+
const message = JSON.parse(data.toString());
|
|
934
|
+
if ("error" in message) {
|
|
935
|
+
(_b = (_a = this.listeners).error) === null || _b === void 0 ? void 0 : _b.call(_a, new StreamingError(message.error));
|
|
936
|
+
return;
|
|
937
|
+
}
|
|
938
|
+
switch (message.type) {
|
|
939
|
+
case "Begin": {
|
|
940
|
+
resolve(message);
|
|
941
|
+
(_d = (_c = this.listeners).open) === null || _d === void 0 ? void 0 : _d.call(_c, message);
|
|
942
|
+
break;
|
|
943
|
+
}
|
|
944
|
+
case "Turn": {
|
|
945
|
+
(_f = (_e = this.listeners).turn) === null || _f === void 0 ? void 0 : _f.call(_e, message);
|
|
946
|
+
break;
|
|
947
|
+
}
|
|
948
|
+
case "Termination": {
|
|
949
|
+
(_g = this.sessionTerminatedResolve) === null || _g === void 0 ? void 0 : _g.call(this);
|
|
950
|
+
break;
|
|
951
|
+
}
|
|
952
|
+
}
|
|
953
|
+
};
|
|
954
|
+
});
|
|
955
|
+
}
|
|
956
|
+
stream() {
|
|
957
|
+
return new WritableStream({
|
|
958
|
+
write: (chunk) => {
|
|
959
|
+
this.sendAudio(chunk);
|
|
960
|
+
},
|
|
961
|
+
});
|
|
962
|
+
}
|
|
963
|
+
sendAudio(audio) {
|
|
964
|
+
this.send(audio);
|
|
965
|
+
}
|
|
966
|
+
send(data) {
|
|
967
|
+
if (!this.socket || this.socket.readyState !== this.socket.OPEN) {
|
|
968
|
+
throw new Error("Socket is not open for communication");
|
|
969
|
+
}
|
|
970
|
+
this.socket.send(data);
|
|
971
|
+
}
|
|
972
|
+
close() {
|
|
973
|
+
return __awaiter(this, arguments, void 0, function* (waitForSessionTermination = true) {
|
|
974
|
+
var _a;
|
|
975
|
+
if (this.socket) {
|
|
976
|
+
if (this.socket.readyState === this.socket.OPEN) {
|
|
977
|
+
if (waitForSessionTermination) {
|
|
978
|
+
const sessionTerminatedPromise = new Promise((resolve) => {
|
|
979
|
+
this.sessionTerminatedResolve = resolve;
|
|
980
|
+
});
|
|
981
|
+
this.socket.send(terminateSessionMessage);
|
|
982
|
+
yield sessionTerminatedPromise;
|
|
983
|
+
}
|
|
984
|
+
else {
|
|
985
|
+
this.socket.send(terminateSessionMessage);
|
|
986
|
+
}
|
|
987
|
+
}
|
|
988
|
+
if ((_a = this.socket) === null || _a === void 0 ? void 0 : _a.removeAllListeners)
|
|
989
|
+
this.socket.removeAllListeners();
|
|
990
|
+
this.socket.close();
|
|
991
|
+
}
|
|
992
|
+
this.listeners = {};
|
|
993
|
+
this.socket = undefined;
|
|
994
|
+
});
|
|
995
|
+
}
|
|
996
|
+
}
|
|
997
|
+
|
|
998
|
+
class StreamingTranscriberFactory extends BaseService {
|
|
999
|
+
constructor(params) {
|
|
1000
|
+
super(params);
|
|
1001
|
+
}
|
|
1002
|
+
transcriber(params) {
|
|
1003
|
+
return new StreamingTranscriber(params);
|
|
1004
|
+
}
|
|
1005
|
+
createTemporaryToken(params) {
|
|
1006
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1007
|
+
const searchParams = new URLSearchParams();
|
|
1008
|
+
// Add each param to the search params
|
|
1009
|
+
Object.entries(params).forEach(([key, value]) => {
|
|
1010
|
+
if (value !== undefined && value !== null) {
|
|
1011
|
+
searchParams.append(key, String(value));
|
|
1012
|
+
}
|
|
1013
|
+
});
|
|
1014
|
+
const queryString = searchParams.toString();
|
|
1015
|
+
const url = queryString ? `/v3/token?${queryString}` : "/v3/token";
|
|
1016
|
+
const data = yield this.fetchJson(url, {
|
|
1017
|
+
method: "GET",
|
|
1018
|
+
});
|
|
1019
|
+
return data.token;
|
|
1020
|
+
});
|
|
1021
|
+
}
|
|
1022
|
+
}
|
|
1023
|
+
|
|
821
1024
|
const defaultBaseUrl = "https://api.assemblyai.com";
|
|
1025
|
+
const defaultStreamingUrl = "https://streaming.assemblyai.com";
|
|
822
1026
|
class AssemblyAI {
|
|
823
1027
|
/**
|
|
824
1028
|
* Create a new AssemblyAI client.
|
|
@@ -833,7 +1037,8 @@ class AssemblyAI {
|
|
|
833
1037
|
this.transcripts = new TranscriptService(params, this.files);
|
|
834
1038
|
this.lemur = new LemurService(params);
|
|
835
1039
|
this.realtime = new RealtimeTranscriberFactory(params);
|
|
1040
|
+
this.streaming = new StreamingTranscriberFactory(Object.assign(Object.assign({}, params), { baseUrl: params.streamingBaseUrl || defaultStreamingUrl }));
|
|
836
1041
|
}
|
|
837
1042
|
}
|
|
838
1043
|
|
|
839
|
-
export { AssemblyAI, FileService, LemurService, RealtimeService, RealtimeServiceFactory, RealtimeTranscriber, RealtimeTranscriberFactory, TranscriptService };
|
|
1044
|
+
export { AssemblyAI, FileService, LemurService, RealtimeService, RealtimeServiceFactory, RealtimeTranscriber, RealtimeTranscriberFactory, StreamingTranscriber, TranscriptService };
|