@livekit/agents 0.5.2 → 0.6.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.cjs +3 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/job.cjs.map +1 -1
- package/dist/job.js.map +1 -1
- package/dist/llm/index.cjs +2 -0
- package/dist/llm/index.cjs.map +1 -1
- package/dist/llm/index.d.ts +1 -1
- package/dist/llm/index.d.ts.map +1 -1
- package/dist/llm/index.js +2 -0
- package/dist/llm/index.js.map +1 -1
- package/dist/llm/llm.cjs +47 -3
- package/dist/llm/llm.cjs.map +1 -1
- package/dist/llm/llm.d.ts +15 -2
- package/dist/llm/llm.d.ts.map +1 -1
- package/dist/llm/llm.js +46 -3
- package/dist/llm/llm.js.map +1 -1
- package/dist/metrics/base.cjs +44 -0
- package/dist/metrics/base.cjs.map +1 -0
- package/dist/metrics/base.d.ts +96 -0
- package/dist/metrics/base.d.ts.map +1 -0
- package/dist/metrics/base.js +20 -0
- package/dist/metrics/base.js.map +1 -0
- package/dist/metrics/index.cjs +35 -0
- package/dist/metrics/index.cjs.map +1 -0
- package/dist/metrics/index.d.ts +5 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js +9 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/usage_collector.cjs +53 -0
- package/dist/metrics/usage_collector.cjs.map +1 -0
- package/dist/metrics/usage_collector.d.ts +14 -0
- package/dist/metrics/usage_collector.d.ts.map +1 -0
- package/dist/metrics/usage_collector.js +29 -0
- package/dist/metrics/usage_collector.js.map +1 -0
- package/dist/metrics/utils.cjs +104 -0
- package/dist/metrics/utils.cjs.map +1 -0
- package/dist/metrics/utils.d.ts +10 -0
- package/dist/metrics/utils.d.ts.map +1 -0
- package/dist/metrics/utils.js +73 -0
- package/dist/metrics/utils.js.map +1 -0
- package/dist/multimodal/multimodal_agent.cjs +34 -16
- package/dist/multimodal/multimodal_agent.cjs.map +1 -1
- package/dist/multimodal/multimodal_agent.d.ts +4 -5
- package/dist/multimodal/multimodal_agent.d.ts.map +1 -1
- package/dist/multimodal/multimodal_agent.js +34 -16
- package/dist/multimodal/multimodal_agent.js.map +1 -1
- package/dist/pipeline/index.cjs +2 -0
- package/dist/pipeline/index.cjs.map +1 -1
- package/dist/pipeline/index.d.ts +1 -1
- package/dist/pipeline/index.d.ts.map +1 -1
- package/dist/pipeline/index.js +3 -1
- package/dist/pipeline/index.js.map +1 -1
- package/dist/pipeline/pipeline_agent.cjs +166 -66
- package/dist/pipeline/pipeline_agent.cjs.map +1 -1
- package/dist/pipeline/pipeline_agent.d.ts +10 -4
- package/dist/pipeline/pipeline_agent.d.ts.map +1 -1
- package/dist/pipeline/pipeline_agent.js +169 -69
- package/dist/pipeline/pipeline_agent.js.map +1 -1
- package/dist/pipeline/speech_handle.cjs +49 -1
- package/dist/pipeline/speech_handle.cjs.map +1 -1
- package/dist/pipeline/speech_handle.d.ts +12 -2
- package/dist/pipeline/speech_handle.d.ts.map +1 -1
- package/dist/pipeline/speech_handle.js +50 -2
- package/dist/pipeline/speech_handle.js.map +1 -1
- package/dist/stt/index.cjs.map +1 -1
- package/dist/stt/index.d.ts +1 -1
- package/dist/stt/index.d.ts.map +1 -1
- package/dist/stt/index.js.map +1 -1
- package/dist/stt/stream_adapter.cjs +15 -5
- package/dist/stt/stream_adapter.cjs.map +1 -1
- package/dist/stt/stream_adapter.d.ts +4 -1
- package/dist/stt/stream_adapter.d.ts.map +1 -1
- package/dist/stt/stream_adapter.js +15 -5
- package/dist/stt/stream_adapter.js.map +1 -1
- package/dist/stt/stt.cjs +46 -2
- package/dist/stt/stt.cjs.map +1 -1
- package/dist/stt/stt.d.ts +25 -3
- package/dist/stt/stt.d.ts.map +1 -1
- package/dist/stt/stt.js +46 -2
- package/dist/stt/stt.js.map +1 -1
- package/dist/tts/index.cjs +4 -2
- package/dist/tts/index.cjs.map +1 -1
- package/dist/tts/index.d.ts +1 -1
- package/dist/tts/index.d.ts.map +1 -1
- package/dist/tts/index.js +3 -1
- package/dist/tts/index.js.map +1 -1
- package/dist/tts/stream_adapter.cjs +14 -3
- package/dist/tts/stream_adapter.cjs.map +1 -1
- package/dist/tts/stream_adapter.d.ts +3 -0
- package/dist/tts/stream_adapter.d.ts.map +1 -1
- package/dist/tts/stream_adapter.js +15 -4
- package/dist/tts/stream_adapter.js.map +1 -1
- package/dist/tts/tts.cjs +109 -6
- package/dist/tts/tts.cjs.map +1 -1
- package/dist/tts/tts.d.ts +24 -1
- package/dist/tts/tts.d.ts.map +1 -1
- package/dist/tts/tts.js +107 -5
- package/dist/tts/tts.js.map +1 -1
- package/dist/utils.cjs +11 -4
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +11 -4
- package/dist/utils.js.map +1 -1
- package/dist/vad.cjs +43 -2
- package/dist/vad.cjs.map +1 -1
- package/dist/vad.d.ts +21 -4
- package/dist/vad.d.ts.map +1 -1
- package/dist/vad.js +43 -2
- package/dist/vad.js.map +1 -1
- package/dist/worker.cjs +5 -2
- package/dist/worker.cjs.map +1 -1
- package/dist/worker.d.ts.map +1 -1
- package/dist/worker.js +5 -2
- package/dist/worker.js.map +1 -1
- package/package.json +3 -3
- package/src/index.ts +2 -1
- package/src/job.ts +3 -3
- package/src/llm/index.ts +2 -0
- package/src/llm/llm.ts +55 -3
- package/src/metrics/base.ts +127 -0
- package/src/metrics/index.ts +20 -0
- package/src/metrics/usage_collector.ts +40 -0
- package/src/metrics/utils.ts +100 -0
- package/src/multimodal/multimodal_agent.ts +57 -23
- package/src/pipeline/index.ts +1 -1
- package/src/pipeline/pipeline_agent.ts +208 -89
- package/src/pipeline/speech_handle.ts +67 -2
- package/src/stt/index.ts +2 -0
- package/src/stt/stream_adapter.ts +17 -5
- package/src/stt/stt.ts +67 -3
- package/src/tts/index.ts +2 -0
- package/src/tts/stream_adapter.ts +17 -4
- package/src/tts/tts.ts +127 -4
- package/src/utils.ts +12 -4
- package/src/vad.ts +61 -4
- package/src/worker.ts +7 -3
|
@@ -31,16 +31,24 @@ class SpeechHandle {
|
|
|
31
31
|
#userQuestion;
|
|
32
32
|
#userCommitted = false;
|
|
33
33
|
#initFut = new import_utils.Future();
|
|
34
|
+
#doneFut = new import_utils.Future();
|
|
34
35
|
#speechCommitted = false;
|
|
35
36
|
#source;
|
|
36
37
|
#synthesisHandle;
|
|
37
38
|
#initialized = false;
|
|
38
|
-
|
|
39
|
+
#fncNestedDepth;
|
|
40
|
+
#fncExtraToolsMesages;
|
|
41
|
+
#nestedSpeechHandles = [];
|
|
42
|
+
#nestedSpeechChanged = new import_utils.AsyncIterableQueue();
|
|
43
|
+
#nestedSpeechFinished = false;
|
|
44
|
+
constructor(id, allowInterruptions, addToChatCtx, isReply, userQuestion, fncNestedDepth = 0, extraToolsMessages = void 0) {
|
|
39
45
|
this.#id = id;
|
|
40
46
|
this.#allowInterruptions = allowInterruptions;
|
|
41
47
|
this.#addToChatCtx = addToChatCtx;
|
|
42
48
|
this.#isReply = isReply;
|
|
43
49
|
this.#userQuestion = userQuestion;
|
|
50
|
+
this.#fncNestedDepth = fncNestedDepth;
|
|
51
|
+
this.#fncExtraToolsMesages = extraToolsMessages;
|
|
44
52
|
}
|
|
45
53
|
static createAssistantReply(allowInterruptions, addToChatCtx, userQuestion) {
|
|
46
54
|
return new SpeechHandle((0, import_crypto.randomUUID)(), allowInterruptions, addToChatCtx, true, userQuestion);
|
|
@@ -48,6 +56,17 @@ class SpeechHandle {
|
|
|
48
56
|
static createAssistantSpeech(allowInterruptions, addToChatCtx) {
|
|
49
57
|
return new SpeechHandle((0, import_crypto.randomUUID)(), allowInterruptions, addToChatCtx, false, "");
|
|
50
58
|
}
|
|
59
|
+
static createToolSpeech(allowInterruptions, addToChatCtx, fncNestedDepth, extraToolsMessages) {
|
|
60
|
+
return new SpeechHandle(
|
|
61
|
+
(0, import_crypto.randomUUID)(),
|
|
62
|
+
allowInterruptions,
|
|
63
|
+
addToChatCtx,
|
|
64
|
+
false,
|
|
65
|
+
"",
|
|
66
|
+
fncNestedDepth,
|
|
67
|
+
extraToolsMessages
|
|
68
|
+
);
|
|
69
|
+
}
|
|
51
70
|
async waitForInitialization() {
|
|
52
71
|
await this.#initFut.await;
|
|
53
72
|
}
|
|
@@ -109,6 +128,34 @@ class SpeechHandle {
|
|
|
109
128
|
var _a;
|
|
110
129
|
return !!((_a = this.#synthesisHandle) == null ? void 0 : _a.interrupted);
|
|
111
130
|
}
|
|
131
|
+
get fncNestedDepth() {
|
|
132
|
+
return this.#fncNestedDepth;
|
|
133
|
+
}
|
|
134
|
+
get extraToolsMessages() {
|
|
135
|
+
return this.#fncExtraToolsMesages;
|
|
136
|
+
}
|
|
137
|
+
addNestedSpeech(handle) {
|
|
138
|
+
this.#nestedSpeechHandles.push(handle);
|
|
139
|
+
this.#nestedSpeechChanged.put();
|
|
140
|
+
}
|
|
141
|
+
get nestedSpeechHandles() {
|
|
142
|
+
return this.#nestedSpeechHandles;
|
|
143
|
+
}
|
|
144
|
+
async nestedSpeechChanged() {
|
|
145
|
+
await this.#nestedSpeechChanged.next();
|
|
146
|
+
}
|
|
147
|
+
get nestedSpeechFinished() {
|
|
148
|
+
return this.#nestedSpeechFinished;
|
|
149
|
+
}
|
|
150
|
+
markNestedSpeechFinished() {
|
|
151
|
+
this.#nestedSpeechFinished = true;
|
|
152
|
+
}
|
|
153
|
+
join() {
|
|
154
|
+
return this.#doneFut.await;
|
|
155
|
+
}
|
|
156
|
+
setDone() {
|
|
157
|
+
this.#doneFut.resolve();
|
|
158
|
+
}
|
|
112
159
|
interrupt() {
|
|
113
160
|
if (!this.#allowInterruptions) {
|
|
114
161
|
throw new Error("interruptions are not allowed");
|
|
@@ -118,6 +165,7 @@ class SpeechHandle {
|
|
|
118
165
|
cancel() {
|
|
119
166
|
var _a;
|
|
120
167
|
this.#initFut.reject(new Error());
|
|
168
|
+
this.#nestedSpeechChanged.close();
|
|
121
169
|
(_a = this.#synthesisHandle) == null ? void 0 : _a.interrupt();
|
|
122
170
|
}
|
|
123
171
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/pipeline/speech_handle.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { randomUUID } from 'crypto';\nimport type { LLMStream } from '../llm/index.js';\nimport { Future } from '../utils.js';\nimport type { SynthesisHandle } from './agent_output.js';\n\nexport class SpeechHandle {\n #id: string;\n #allowInterruptions: boolean;\n #addToChatCtx: boolean;\n #isReply: boolean;\n #userQuestion: string;\n #userCommitted = false;\n #initFut = new Future();\n #speechCommitted = false;\n #source?: string | LLMStream | AsyncIterable<string>;\n #synthesisHandle?: SynthesisHandle;\n #initialized = false;\n\n constructor(\n id: string,\n allowInterruptions: boolean,\n addToChatCtx: boolean,\n isReply: boolean,\n userQuestion: string,\n ) {\n this.#id = id;\n this.#allowInterruptions = allowInterruptions;\n this.#addToChatCtx = addToChatCtx;\n this.#isReply = isReply;\n this.#userQuestion = userQuestion;\n }\n\n static createAssistantReply(\n allowInterruptions: boolean,\n addToChatCtx: boolean,\n userQuestion: string,\n ): SpeechHandle {\n return new SpeechHandle(randomUUID(), allowInterruptions, addToChatCtx, true, userQuestion);\n }\n\n static createAssistantSpeech(allowInterruptions: boolean, addToChatCtx: boolean): SpeechHandle {\n return new SpeechHandle(randomUUID(), allowInterruptions, addToChatCtx, false, '');\n }\n\n async waitForInitialization() {\n await this.#initFut.await;\n }\n\n initialize(source: string | LLMStream | AsyncIterable<string>, synthesisHandle: SynthesisHandle) {\n if (this.interrupted) {\n throw new Error('speech was interrupted');\n }\n\n this.#source = source;\n this.#synthesisHandle = synthesisHandle;\n this.#initialized = true;\n this.#initFut.resolve();\n }\n\n markUserCommitted() {\n this.#userCommitted = true;\n }\n\n markSpeechCommitted() {\n this.#speechCommitted = true;\n }\n\n get userCommitted(): boolean {\n return this.#userCommitted;\n }\n\n get speechCommitted(): boolean {\n return this.#speechCommitted;\n }\n\n get id(): string {\n return this.#id;\n }\n\n get allowInterruptions(): boolean {\n return this.#allowInterruptions;\n }\n\n get addToChatCtx(): boolean {\n return this.#addToChatCtx;\n }\n\n get source(): string | LLMStream | AsyncIterable<string> {\n if (!this.#source) {\n throw new Error('speech not initialized');\n }\n return this.#source;\n }\n\n get synthesisHandle(): SynthesisHandle {\n if (!this.#synthesisHandle) {\n throw new Error('speech not initialized');\n }\n return this.#synthesisHandle;\n }\n\n set synthesisHandle(handle: SynthesisHandle) {\n this.#synthesisHandle = handle;\n }\n\n get initialized(): boolean {\n return this.#initialized;\n }\n\n get isReply(): boolean {\n return this.#isReply;\n }\n\n get userQuestion(): string {\n return this.#userQuestion;\n }\n\n get interrupted(): boolean {\n return !!this.#synthesisHandle?.interrupted;\n }\n\n interrupt() {\n if (!this.#allowInterruptions) {\n throw new Error('interruptions are not allowed');\n }\n this.cancel();\n }\n\n cancel() {\n this.#initFut.reject(new Error());\n this.#synthesisHandle?.interrupt();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,oBAA2B;AAE3B,
|
|
1
|
+
{"version":3,"sources":["../../src/pipeline/speech_handle.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { randomUUID } from 'crypto';\nimport type { ChatMessage, LLMStream } from '../llm/index.js';\nimport { AsyncIterableQueue, Future } from '../utils.js';\nimport type { SynthesisHandle } from './agent_output.js';\n\nexport class SpeechHandle {\n #id: string;\n #allowInterruptions: boolean;\n #addToChatCtx: boolean;\n #isReply: boolean;\n #userQuestion: string;\n #userCommitted = false;\n #initFut = new Future();\n #doneFut = new Future();\n #speechCommitted = false;\n #source?: string | LLMStream | AsyncIterable<string>;\n #synthesisHandle?: SynthesisHandle;\n #initialized = false;\n #fncNestedDepth: number;\n #fncExtraToolsMesages?: ChatMessage[];\n #nestedSpeechHandles: SpeechHandle[] = [];\n #nestedSpeechChanged = new AsyncIterableQueue<void>();\n #nestedSpeechFinished = false;\n\n constructor(\n id: string,\n allowInterruptions: boolean,\n addToChatCtx: boolean,\n isReply: boolean,\n userQuestion: string,\n fncNestedDepth = 0,\n extraToolsMessages: ChatMessage[] | undefined = undefined,\n ) {\n this.#id = id;\n this.#allowInterruptions = allowInterruptions;\n this.#addToChatCtx = addToChatCtx;\n this.#isReply = isReply;\n this.#userQuestion = userQuestion;\n this.#fncNestedDepth = fncNestedDepth;\n this.#fncExtraToolsMesages = extraToolsMessages;\n }\n\n static createAssistantReply(\n allowInterruptions: boolean,\n addToChatCtx: boolean,\n userQuestion: string,\n ): SpeechHandle {\n return new SpeechHandle(randomUUID(), allowInterruptions, addToChatCtx, true, userQuestion);\n }\n\n static createAssistantSpeech(allowInterruptions: boolean, addToChatCtx: boolean): SpeechHandle {\n return new SpeechHandle(randomUUID(), allowInterruptions, addToChatCtx, false, '');\n }\n\n static createToolSpeech(\n allowInterruptions: boolean,\n addToChatCtx: boolean,\n fncNestedDepth: number,\n extraToolsMessages: ChatMessage[],\n ): SpeechHandle {\n return new SpeechHandle(\n randomUUID(),\n allowInterruptions,\n addToChatCtx,\n false,\n '',\n fncNestedDepth,\n extraToolsMessages,\n );\n }\n\n async waitForInitialization() {\n await this.#initFut.await;\n }\n\n initialize(source: string | LLMStream | AsyncIterable<string>, synthesisHandle: SynthesisHandle) {\n if (this.interrupted) {\n throw new Error('speech was interrupted');\n }\n\n this.#source = source;\n this.#synthesisHandle = synthesisHandle;\n this.#initialized = true;\n this.#initFut.resolve();\n }\n\n markUserCommitted() {\n this.#userCommitted = true;\n }\n\n markSpeechCommitted() {\n this.#speechCommitted = true;\n }\n\n get userCommitted(): boolean {\n return this.#userCommitted;\n }\n\n get speechCommitted(): boolean {\n return this.#speechCommitted;\n }\n\n get id(): string {\n return this.#id;\n }\n\n get allowInterruptions(): boolean {\n return this.#allowInterruptions;\n }\n\n get addToChatCtx(): boolean {\n return this.#addToChatCtx;\n }\n\n get source(): string | LLMStream | AsyncIterable<string> {\n if (!this.#source) {\n throw new Error('speech not initialized');\n }\n return this.#source;\n }\n\n get synthesisHandle(): SynthesisHandle {\n if (!this.#synthesisHandle) {\n throw new Error('speech not initialized');\n }\n return this.#synthesisHandle;\n }\n\n set synthesisHandle(handle: SynthesisHandle) {\n this.#synthesisHandle = handle;\n }\n\n get initialized(): boolean {\n return this.#initialized;\n }\n\n get isReply(): boolean {\n return this.#isReply;\n }\n\n get userQuestion(): string {\n return this.#userQuestion;\n }\n\n get interrupted(): boolean {\n return !!this.#synthesisHandle?.interrupted;\n }\n\n get fncNestedDepth(): number {\n return this.#fncNestedDepth;\n }\n\n get extraToolsMessages(): ChatMessage[] | undefined {\n return this.#fncExtraToolsMesages;\n }\n\n addNestedSpeech(handle: SpeechHandle) {\n this.#nestedSpeechHandles.push(handle);\n this.#nestedSpeechChanged.put();\n }\n\n get nestedSpeechHandles(): SpeechHandle[] {\n return this.#nestedSpeechHandles;\n }\n\n async nestedSpeechChanged() {\n await this.#nestedSpeechChanged.next();\n }\n\n get nestedSpeechFinished(): boolean {\n return this.#nestedSpeechFinished;\n }\n\n markNestedSpeechFinished() {\n this.#nestedSpeechFinished = true;\n }\n\n join() {\n return this.#doneFut.await;\n }\n\n setDone() {\n this.#doneFut.resolve();\n }\n\n interrupt() {\n if (!this.#allowInterruptions) {\n throw new Error('interruptions are not allowed');\n }\n this.cancel();\n }\n\n cancel() {\n this.#initFut.reject(new Error());\n this.#nestedSpeechChanged.close();\n this.#synthesisHandle?.interrupt();\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import type { LLMStream } from '../llm/index.js';
|
|
1
|
+
import type { ChatMessage, LLMStream } from '../llm/index.js';
|
|
2
2
|
import type { SynthesisHandle } from './agent_output.js';
|
|
3
3
|
export declare class SpeechHandle {
|
|
4
4
|
#private;
|
|
5
|
-
constructor(id: string, allowInterruptions: boolean, addToChatCtx: boolean, isReply: boolean, userQuestion: string);
|
|
5
|
+
constructor(id: string, allowInterruptions: boolean, addToChatCtx: boolean, isReply: boolean, userQuestion: string, fncNestedDepth?: number, extraToolsMessages?: ChatMessage[] | undefined);
|
|
6
6
|
static createAssistantReply(allowInterruptions: boolean, addToChatCtx: boolean, userQuestion: string): SpeechHandle;
|
|
7
7
|
static createAssistantSpeech(allowInterruptions: boolean, addToChatCtx: boolean): SpeechHandle;
|
|
8
|
+
static createToolSpeech(allowInterruptions: boolean, addToChatCtx: boolean, fncNestedDepth: number, extraToolsMessages: ChatMessage[]): SpeechHandle;
|
|
8
9
|
waitForInitialization(): Promise<void>;
|
|
9
10
|
initialize(source: string | LLMStream | AsyncIterable<string>, synthesisHandle: SynthesisHandle): void;
|
|
10
11
|
markUserCommitted(): void;
|
|
@@ -21,6 +22,15 @@ export declare class SpeechHandle {
|
|
|
21
22
|
get isReply(): boolean;
|
|
22
23
|
get userQuestion(): string;
|
|
23
24
|
get interrupted(): boolean;
|
|
25
|
+
get fncNestedDepth(): number;
|
|
26
|
+
get extraToolsMessages(): ChatMessage[] | undefined;
|
|
27
|
+
addNestedSpeech(handle: SpeechHandle): void;
|
|
28
|
+
get nestedSpeechHandles(): SpeechHandle[];
|
|
29
|
+
nestedSpeechChanged(): Promise<void>;
|
|
30
|
+
get nestedSpeechFinished(): boolean;
|
|
31
|
+
markNestedSpeechFinished(): void;
|
|
32
|
+
join(): Promise<void>;
|
|
33
|
+
setDone(): void;
|
|
24
34
|
interrupt(): void;
|
|
25
35
|
cancel(): void;
|
|
26
36
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"speech_handle.d.ts","sourceRoot":"","sources":["../../src/pipeline/speech_handle.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"speech_handle.d.ts","sourceRoot":"","sources":["../../src/pipeline/speech_handle.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,qBAAa,YAAY;;gBAoBrB,EAAE,EAAE,MAAM,EACV,kBAAkB,EAAE,OAAO,EAC3B,YAAY,EAAE,OAAO,EACrB,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,MAAM,EACpB,cAAc,SAAI,EAClB,kBAAkB,GAAE,WAAW,EAAE,GAAG,SAAqB;IAW3D,MAAM,CAAC,oBAAoB,CACzB,kBAAkB,EAAE,OAAO,EAC3B,YAAY,EAAE,OAAO,EACrB,YAAY,EAAE,MAAM,GACnB,YAAY;IAIf,MAAM,CAAC,qBAAqB,CAAC,kBAAkB,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,GAAG,YAAY;IAI9F,MAAM,CAAC,gBAAgB,CACrB,kBAAkB,EAAE,OAAO,EAC3B,YAAY,EAAE,OAAO,EACrB,cAAc,EAAE,MAAM,EACtB,kBAAkB,EAAE,WAAW,EAAE,GAChC,YAAY;IAYT,qBAAqB;IAI3B,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC,EAAE,eAAe,EAAE,eAAe;IAW/F,iBAAiB;IAIjB,mBAAmB;IAInB,IAAI,aAAa,IAAI,OAAO,CAE3B;IAED,IAAI,eAAe,IAAI,OAAO,CAE7B;IAED,IAAI,EAAE,IAAI,MAAM,CAEf;IAED,IAAI,kBAAkB,IAAI,OAAO,CAEhC;IAED,IAAI,YAAY,IAAI,OAAO,CAE1B;IAED,IAAI,MAAM,IAAI,MAAM,GAAG,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC,CAKvD;IAED,IAAI,eAAe,IAAI,eAAe,CAKrC;IAED,IAAI,eAAe,CAAC,MAAM,EAAE,eAAe,EAE1C;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED,IAAI,kBAAkB,IAAI,WAAW,EAAE,GAAG,SAAS,CAElD;IAED,eAAe,CAAC,MAAM,EAAE,YAAY;IAKpC,IAAI,mBAAmB,IAAI,YAAY,EAAE,CAExC;IAEK,mBAAmB;IAIzB,IAAI,oBAAoB,IAAI,OAAO,CAElC;IAED,wBAAwB;IAIxB,IAAI;IAIJ,OAAO;IAIP,SAAS;IAOT,MAAM;CAKP"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { randomUUID } from "crypto";
|
|
2
|
-
import { Future } from "../utils.js";
|
|
2
|
+
import { AsyncIterableQueue, Future } from "../utils.js";
|
|
3
3
|
class SpeechHandle {
|
|
4
4
|
#id;
|
|
5
5
|
#allowInterruptions;
|
|
@@ -8,16 +8,24 @@ class SpeechHandle {
|
|
|
8
8
|
#userQuestion;
|
|
9
9
|
#userCommitted = false;
|
|
10
10
|
#initFut = new Future();
|
|
11
|
+
#doneFut = new Future();
|
|
11
12
|
#speechCommitted = false;
|
|
12
13
|
#source;
|
|
13
14
|
#synthesisHandle;
|
|
14
15
|
#initialized = false;
|
|
15
|
-
|
|
16
|
+
#fncNestedDepth;
|
|
17
|
+
#fncExtraToolsMesages;
|
|
18
|
+
#nestedSpeechHandles = [];
|
|
19
|
+
#nestedSpeechChanged = new AsyncIterableQueue();
|
|
20
|
+
#nestedSpeechFinished = false;
|
|
21
|
+
constructor(id, allowInterruptions, addToChatCtx, isReply, userQuestion, fncNestedDepth = 0, extraToolsMessages = void 0) {
|
|
16
22
|
this.#id = id;
|
|
17
23
|
this.#allowInterruptions = allowInterruptions;
|
|
18
24
|
this.#addToChatCtx = addToChatCtx;
|
|
19
25
|
this.#isReply = isReply;
|
|
20
26
|
this.#userQuestion = userQuestion;
|
|
27
|
+
this.#fncNestedDepth = fncNestedDepth;
|
|
28
|
+
this.#fncExtraToolsMesages = extraToolsMessages;
|
|
21
29
|
}
|
|
22
30
|
static createAssistantReply(allowInterruptions, addToChatCtx, userQuestion) {
|
|
23
31
|
return new SpeechHandle(randomUUID(), allowInterruptions, addToChatCtx, true, userQuestion);
|
|
@@ -25,6 +33,17 @@ class SpeechHandle {
|
|
|
25
33
|
static createAssistantSpeech(allowInterruptions, addToChatCtx) {
|
|
26
34
|
return new SpeechHandle(randomUUID(), allowInterruptions, addToChatCtx, false, "");
|
|
27
35
|
}
|
|
36
|
+
static createToolSpeech(allowInterruptions, addToChatCtx, fncNestedDepth, extraToolsMessages) {
|
|
37
|
+
return new SpeechHandle(
|
|
38
|
+
randomUUID(),
|
|
39
|
+
allowInterruptions,
|
|
40
|
+
addToChatCtx,
|
|
41
|
+
false,
|
|
42
|
+
"",
|
|
43
|
+
fncNestedDepth,
|
|
44
|
+
extraToolsMessages
|
|
45
|
+
);
|
|
46
|
+
}
|
|
28
47
|
async waitForInitialization() {
|
|
29
48
|
await this.#initFut.await;
|
|
30
49
|
}
|
|
@@ -86,6 +105,34 @@ class SpeechHandle {
|
|
|
86
105
|
var _a;
|
|
87
106
|
return !!((_a = this.#synthesisHandle) == null ? void 0 : _a.interrupted);
|
|
88
107
|
}
|
|
108
|
+
get fncNestedDepth() {
|
|
109
|
+
return this.#fncNestedDepth;
|
|
110
|
+
}
|
|
111
|
+
get extraToolsMessages() {
|
|
112
|
+
return this.#fncExtraToolsMesages;
|
|
113
|
+
}
|
|
114
|
+
addNestedSpeech(handle) {
|
|
115
|
+
this.#nestedSpeechHandles.push(handle);
|
|
116
|
+
this.#nestedSpeechChanged.put();
|
|
117
|
+
}
|
|
118
|
+
get nestedSpeechHandles() {
|
|
119
|
+
return this.#nestedSpeechHandles;
|
|
120
|
+
}
|
|
121
|
+
async nestedSpeechChanged() {
|
|
122
|
+
await this.#nestedSpeechChanged.next();
|
|
123
|
+
}
|
|
124
|
+
get nestedSpeechFinished() {
|
|
125
|
+
return this.#nestedSpeechFinished;
|
|
126
|
+
}
|
|
127
|
+
markNestedSpeechFinished() {
|
|
128
|
+
this.#nestedSpeechFinished = true;
|
|
129
|
+
}
|
|
130
|
+
join() {
|
|
131
|
+
return this.#doneFut.await;
|
|
132
|
+
}
|
|
133
|
+
setDone() {
|
|
134
|
+
this.#doneFut.resolve();
|
|
135
|
+
}
|
|
89
136
|
interrupt() {
|
|
90
137
|
if (!this.#allowInterruptions) {
|
|
91
138
|
throw new Error("interruptions are not allowed");
|
|
@@ -95,6 +142,7 @@ class SpeechHandle {
|
|
|
95
142
|
cancel() {
|
|
96
143
|
var _a;
|
|
97
144
|
this.#initFut.reject(new Error());
|
|
145
|
+
this.#nestedSpeechChanged.close();
|
|
98
146
|
(_a = this.#synthesisHandle) == null ? void 0 : _a.interrupt();
|
|
99
147
|
}
|
|
100
148
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/pipeline/speech_handle.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { randomUUID } from 'crypto';\nimport type { LLMStream } from '../llm/index.js';\nimport { Future } from '../utils.js';\nimport type { SynthesisHandle } from './agent_output.js';\n\nexport class SpeechHandle {\n #id: string;\n #allowInterruptions: boolean;\n #addToChatCtx: boolean;\n #isReply: boolean;\n #userQuestion: string;\n #userCommitted = false;\n #initFut = new Future();\n #speechCommitted = false;\n #source?: string | LLMStream | AsyncIterable<string>;\n #synthesisHandle?: SynthesisHandle;\n #initialized = false;\n\n constructor(\n id: string,\n allowInterruptions: boolean,\n addToChatCtx: boolean,\n isReply: boolean,\n userQuestion: string,\n ) {\n this.#id = id;\n this.#allowInterruptions = allowInterruptions;\n this.#addToChatCtx = addToChatCtx;\n this.#isReply = isReply;\n this.#userQuestion = userQuestion;\n }\n\n static createAssistantReply(\n allowInterruptions: boolean,\n addToChatCtx: boolean,\n userQuestion: string,\n ): SpeechHandle {\n return new SpeechHandle(randomUUID(), allowInterruptions, addToChatCtx, true, userQuestion);\n }\n\n static createAssistantSpeech(allowInterruptions: boolean, addToChatCtx: boolean): SpeechHandle {\n return new SpeechHandle(randomUUID(), allowInterruptions, addToChatCtx, false, '');\n }\n\n async waitForInitialization() {\n await this.#initFut.await;\n }\n\n initialize(source: string | LLMStream | AsyncIterable<string>, synthesisHandle: SynthesisHandle) {\n if (this.interrupted) {\n throw new Error('speech was interrupted');\n }\n\n this.#source = source;\n this.#synthesisHandle = synthesisHandle;\n this.#initialized = true;\n this.#initFut.resolve();\n }\n\n markUserCommitted() {\n this.#userCommitted = true;\n }\n\n markSpeechCommitted() {\n this.#speechCommitted = true;\n }\n\n get userCommitted(): boolean {\n return this.#userCommitted;\n }\n\n get speechCommitted(): boolean {\n return this.#speechCommitted;\n }\n\n get id(): string {\n return this.#id;\n }\n\n get allowInterruptions(): boolean {\n return this.#allowInterruptions;\n }\n\n get addToChatCtx(): boolean {\n return this.#addToChatCtx;\n }\n\n get source(): string | LLMStream | AsyncIterable<string> {\n if (!this.#source) {\n throw new Error('speech not initialized');\n }\n return this.#source;\n }\n\n get synthesisHandle(): SynthesisHandle {\n if (!this.#synthesisHandle) {\n throw new Error('speech not initialized');\n }\n return this.#synthesisHandle;\n }\n\n set synthesisHandle(handle: SynthesisHandle) {\n this.#synthesisHandle = handle;\n }\n\n get initialized(): boolean {\n return this.#initialized;\n }\n\n get isReply(): boolean {\n return this.#isReply;\n }\n\n get userQuestion(): string {\n return this.#userQuestion;\n }\n\n get interrupted(): boolean {\n return !!this.#synthesisHandle?.interrupted;\n }\n\n interrupt() {\n if (!this.#allowInterruptions) {\n throw new Error('interruptions are not allowed');\n }\n this.cancel();\n }\n\n cancel() {\n this.#initFut.reject(new Error());\n this.#synthesisHandle?.interrupt();\n }\n}\n"],"mappings":"AAGA,SAAS,kBAAkB;AAE3B,SAAS,cAAc;
|
|
1
|
+
{"version":3,"sources":["../../src/pipeline/speech_handle.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { randomUUID } from 'crypto';\nimport type { ChatMessage, LLMStream } from '../llm/index.js';\nimport { AsyncIterableQueue, Future } from '../utils.js';\nimport type { SynthesisHandle } from './agent_output.js';\n\nexport class SpeechHandle {\n #id: string;\n #allowInterruptions: boolean;\n #addToChatCtx: boolean;\n #isReply: boolean;\n #userQuestion: string;\n #userCommitted = false;\n #initFut = new Future();\n #doneFut = new Future();\n #speechCommitted = false;\n #source?: string | LLMStream | AsyncIterable<string>;\n #synthesisHandle?: SynthesisHandle;\n #initialized = false;\n #fncNestedDepth: number;\n #fncExtraToolsMesages?: ChatMessage[];\n #nestedSpeechHandles: SpeechHandle[] = [];\n #nestedSpeechChanged = new AsyncIterableQueue<void>();\n #nestedSpeechFinished = false;\n\n constructor(\n id: string,\n allowInterruptions: boolean,\n addToChatCtx: boolean,\n isReply: boolean,\n userQuestion: string,\n fncNestedDepth = 0,\n extraToolsMessages: ChatMessage[] | undefined = undefined,\n ) {\n this.#id = id;\n this.#allowInterruptions = allowInterruptions;\n this.#addToChatCtx = addToChatCtx;\n this.#isReply = isReply;\n this.#userQuestion = userQuestion;\n this.#fncNestedDepth = fncNestedDepth;\n this.#fncExtraToolsMesages = extraToolsMessages;\n }\n\n static createAssistantReply(\n allowInterruptions: boolean,\n addToChatCtx: boolean,\n userQuestion: string,\n ): SpeechHandle {\n return new SpeechHandle(randomUUID(), allowInterruptions, addToChatCtx, true, userQuestion);\n }\n\n static createAssistantSpeech(allowInterruptions: boolean, addToChatCtx: boolean): SpeechHandle {\n return new SpeechHandle(randomUUID(), allowInterruptions, addToChatCtx, false, '');\n }\n\n static createToolSpeech(\n allowInterruptions: boolean,\n addToChatCtx: boolean,\n fncNestedDepth: number,\n extraToolsMessages: ChatMessage[],\n ): SpeechHandle {\n return new SpeechHandle(\n randomUUID(),\n allowInterruptions,\n addToChatCtx,\n false,\n '',\n fncNestedDepth,\n extraToolsMessages,\n );\n }\n\n async waitForInitialization() {\n await this.#initFut.await;\n }\n\n initialize(source: string | LLMStream | AsyncIterable<string>, synthesisHandle: SynthesisHandle) {\n if (this.interrupted) {\n throw new Error('speech was interrupted');\n }\n\n this.#source = source;\n this.#synthesisHandle = synthesisHandle;\n this.#initialized = true;\n this.#initFut.resolve();\n }\n\n markUserCommitted() {\n this.#userCommitted = true;\n }\n\n markSpeechCommitted() {\n this.#speechCommitted = true;\n }\n\n get userCommitted(): boolean {\n return this.#userCommitted;\n }\n\n get speechCommitted(): boolean {\n return this.#speechCommitted;\n }\n\n get id(): string {\n return this.#id;\n }\n\n get allowInterruptions(): boolean {\n return this.#allowInterruptions;\n }\n\n get addToChatCtx(): boolean {\n return this.#addToChatCtx;\n }\n\n get source(): string | LLMStream | AsyncIterable<string> {\n if (!this.#source) {\n throw new Error('speech not initialized');\n }\n return this.#source;\n }\n\n get synthesisHandle(): SynthesisHandle {\n if (!this.#synthesisHandle) {\n throw new Error('speech not initialized');\n }\n return this.#synthesisHandle;\n }\n\n set synthesisHandle(handle: SynthesisHandle) {\n this.#synthesisHandle = handle;\n }\n\n get initialized(): boolean {\n return this.#initialized;\n }\n\n get isReply(): boolean {\n return this.#isReply;\n }\n\n get userQuestion(): string {\n return this.#userQuestion;\n }\n\n get interrupted(): boolean {\n return !!this.#synthesisHandle?.interrupted;\n }\n\n get fncNestedDepth(): number {\n return this.#fncNestedDepth;\n }\n\n get extraToolsMessages(): ChatMessage[] | undefined {\n return this.#fncExtraToolsMesages;\n }\n\n addNestedSpeech(handle: SpeechHandle) {\n this.#nestedSpeechHandles.push(handle);\n this.#nestedSpeechChanged.put();\n }\n\n get nestedSpeechHandles(): SpeechHandle[] {\n return this.#nestedSpeechHandles;\n }\n\n async nestedSpeechChanged() {\n await this.#nestedSpeechChanged.next();\n }\n\n get nestedSpeechFinished(): boolean {\n return this.#nestedSpeechFinished;\n }\n\n markNestedSpeechFinished() {\n this.#nestedSpeechFinished = true;\n }\n\n join() {\n return this.#doneFut.await;\n }\n\n setDone() {\n this.#doneFut.resolve();\n }\n\n interrupt() {\n if (!this.#allowInterruptions) {\n throw new Error('interruptions are not allowed');\n }\n this.cancel();\n }\n\n cancel() {\n this.#initFut.reject(new Error());\n this.#nestedSpeechChanged.close();\n this.#synthesisHandle?.interrupt();\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/stt/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/stt/index.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\n\nexport {\n type SpeechEvent,\n type SpeechData,\n type STTCapabilities,\n SpeechEventType,\n STT,\n SpeechStream,\n} from './stt.js';\nexport { StreamAdapter, StreamAdapterWrapper } from './stream_adapter.js';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,
|
|
1
|
+
{"version":3,"sources":["../../src/stt/index.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\n\nexport {\n type SpeechEvent,\n type SpeechData,\n type STTCapabilities,\n type RecognitionUsage,\n type STTCallbacks,\n SpeechEventType,\n STT,\n SpeechStream,\n} from './stt.js';\nexport { StreamAdapter, StreamAdapterWrapper } from './stream_adapter.js';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,iBASO;AACP,4BAAoD;","names":[]}
|
package/dist/stt/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { type SpeechEvent, type SpeechData, type STTCapabilities, SpeechEventType, STT, SpeechStream, } from './stt.js';
|
|
1
|
+
export { type SpeechEvent, type SpeechData, type STTCapabilities, type RecognitionUsage, type STTCallbacks, SpeechEventType, STT, SpeechStream, } from './stt.js';
|
|
2
2
|
export { StreamAdapter, StreamAdapterWrapper } from './stream_adapter.js';
|
|
3
3
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/stt/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/stt/index.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,eAAe,EACf,GAAG,EACH,YAAY,GACb,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/stt/index.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,eAAe,EACf,GAAG,EACH,YAAY,GACb,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/stt/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/stt/index.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\n\nexport {\n type SpeechEvent,\n type SpeechData,\n type STTCapabilities,\n SpeechEventType,\n STT,\n SpeechStream,\n} from './stt.js';\nexport { StreamAdapter, StreamAdapterWrapper } from './stream_adapter.js';\n"],"mappings":"AAIA;AAAA,
|
|
1
|
+
{"version":3,"sources":["../../src/stt/index.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\n\nexport {\n type SpeechEvent,\n type SpeechData,\n type STTCapabilities,\n type RecognitionUsage,\n type STTCallbacks,\n SpeechEventType,\n STT,\n SpeechStream,\n} from './stt.js';\nexport { StreamAdapter, StreamAdapterWrapper } from './stream_adapter.js';\n"],"mappings":"AAIA;AAAA,EAME;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,eAAe,4BAA4B;","names":[]}
|
|
@@ -27,12 +27,17 @@ var import_stt = require("./stt.cjs");
|
|
|
27
27
|
class StreamAdapter extends import_stt.STT {
|
|
28
28
|
#stt;
|
|
29
29
|
#vad;
|
|
30
|
+
label;
|
|
30
31
|
constructor(stt, vad) {
|
|
31
32
|
super({ streaming: true, interimResults: false });
|
|
32
33
|
this.#stt = stt;
|
|
33
34
|
this.#vad = vad;
|
|
35
|
+
this.label = `stt.StreamAdapter<${this.#stt.label}>`;
|
|
36
|
+
this.#stt.on(import_stt.SpeechEventType.METRICS_COLLECTED, (metrics) => {
|
|
37
|
+
this.emit(import_stt.SpeechEventType.METRICS_COLLECTED, metrics);
|
|
38
|
+
});
|
|
34
39
|
}
|
|
35
|
-
|
|
40
|
+
_recognize(frame) {
|
|
36
41
|
return this.#stt.recognize(frame);
|
|
37
42
|
}
|
|
38
43
|
stream() {
|
|
@@ -42,12 +47,17 @@ class StreamAdapter extends import_stt.STT {
|
|
|
42
47
|
class StreamAdapterWrapper extends import_stt.SpeechStream {
|
|
43
48
|
#stt;
|
|
44
49
|
#vadStream;
|
|
50
|
+
label;
|
|
45
51
|
constructor(stt, vad) {
|
|
46
|
-
super();
|
|
52
|
+
super(stt);
|
|
47
53
|
this.#stt = stt;
|
|
48
54
|
this.#vadStream = vad.stream();
|
|
55
|
+
this.label = `stt.StreamAdapterWrapper<${this.#stt.label}>`;
|
|
49
56
|
this.#run();
|
|
50
57
|
}
|
|
58
|
+
async monitorMetrics() {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
51
61
|
async #run() {
|
|
52
62
|
const forwardInput = async () => {
|
|
53
63
|
for await (const input of this.input) {
|
|
@@ -63,15 +73,15 @@ class StreamAdapterWrapper extends import_stt.SpeechStream {
|
|
|
63
73
|
for await (const ev of this.#vadStream) {
|
|
64
74
|
switch (ev.type) {
|
|
65
75
|
case import_vad.VADEventType.START_OF_SPEECH:
|
|
66
|
-
this.
|
|
76
|
+
this.output.put({ type: import_stt.SpeechEventType.START_OF_SPEECH });
|
|
67
77
|
break;
|
|
68
78
|
case import_vad.VADEventType.END_OF_SPEECH:
|
|
69
|
-
this.
|
|
79
|
+
this.output.put({ type: import_stt.SpeechEventType.END_OF_SPEECH });
|
|
70
80
|
const event = await this.#stt.recognize(ev.frames);
|
|
71
81
|
if (!event.alternatives[0].text) {
|
|
72
82
|
continue;
|
|
73
83
|
}
|
|
74
|
-
this.
|
|
84
|
+
this.output.put(event);
|
|
75
85
|
break;
|
|
76
86
|
}
|
|
77
87
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/stt/stream_adapter.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { AudioFrame } from '@livekit/rtc-node';\nimport type { VAD, VADStream } from '../vad.js';\nimport { VADEventType } from '../vad.js';\nimport type { SpeechEvent } from './stt.js';\nimport { STT, SpeechEventType, SpeechStream } from './stt.js';\n\nexport class StreamAdapter extends STT {\n #stt: STT;\n #vad: VAD;\n\n constructor(stt: STT, vad: VAD) {\n super({ streaming: true, interimResults: false });\n this.#stt = stt;\n this.#vad = vad;\n }\n\n
|
|
1
|
+
{"version":3,"sources":["../../src/stt/stream_adapter.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { AudioFrame } from '@livekit/rtc-node';\nimport type { VAD, VADStream } from '../vad.js';\nimport { VADEventType } from '../vad.js';\nimport type { SpeechEvent } from './stt.js';\nimport { STT, SpeechEventType, SpeechStream } from './stt.js';\n\nexport class StreamAdapter extends STT {\n #stt: STT;\n #vad: VAD;\n label: string;\n\n constructor(stt: STT, vad: VAD) {\n super({ streaming: true, interimResults: false });\n this.#stt = stt;\n this.#vad = vad;\n this.label = `stt.StreamAdapter<${this.#stt.label}>`;\n\n this.#stt.on(SpeechEventType.METRICS_COLLECTED, (metrics) => {\n this.emit(SpeechEventType.METRICS_COLLECTED, metrics);\n });\n }\n\n _recognize(frame: AudioFrame): Promise<SpeechEvent> {\n return this.#stt.recognize(frame);\n }\n\n stream(): StreamAdapterWrapper {\n return new StreamAdapterWrapper(this.#stt, this.#vad);\n }\n}\n\nexport class StreamAdapterWrapper extends SpeechStream {\n #stt: STT;\n #vadStream: VADStream;\n label: string;\n\n constructor(stt: STT, vad: VAD) {\n super(stt);\n this.#stt = stt;\n this.#vadStream = vad.stream();\n this.label = `stt.StreamAdapterWrapper<${this.#stt.label}>`;\n\n this.#run();\n }\n\n async monitorMetrics() {\n return; // do nothing\n }\n\n async #run() {\n const forwardInput = async () => {\n for await (const input of this.input) {\n if (input === SpeechStream.FLUSH_SENTINEL) {\n this.#vadStream.flush();\n } else {\n this.#vadStream.pushFrame(input);\n }\n }\n this.#vadStream.endInput();\n };\n\n const recognize = async () => {\n for await (const ev of this.#vadStream) {\n switch (ev.type) {\n case VADEventType.START_OF_SPEECH:\n this.output.put({ type: SpeechEventType.START_OF_SPEECH });\n break;\n case VADEventType.END_OF_SPEECH:\n this.output.put({ type: SpeechEventType.END_OF_SPEECH });\n\n const event = await this.#stt.recognize(ev.frames);\n if (!event.alternatives![0].text) {\n continue;\n }\n\n this.output.put(event);\n break;\n }\n }\n };\n\n Promise.all([forwardInput(), recognize()]);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,iBAA6B;AAE7B,iBAAmD;AAE5C,MAAM,sBAAsB,eAAI;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,KAAU,KAAU;AAC9B,UAAM,EAAE,WAAW,MAAM,gBAAgB,MAAM,CAAC;AAChD,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,QAAQ,qBAAqB,KAAK,KAAK,KAAK;AAEjD,SAAK,KAAK,GAAG,2BAAgB,mBAAmB,CAAC,YAAY;AAC3D,WAAK,KAAK,2BAAgB,mBAAmB,OAAO;AAAA,IACtD,CAAC;AAAA,EACH;AAAA,EAEA,WAAW,OAAyC;AAClD,WAAO,KAAK,KAAK,UAAU,KAAK;AAAA,EAClC;AAAA,EAEA,SAA+B;AAC7B,WAAO,IAAI,qBAAqB,KAAK,MAAM,KAAK,IAAI;AAAA,EACtD;AACF;AAEO,MAAM,6BAA6B,wBAAa;AAAA,EACrD;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,KAAU,KAAU;AAC9B,UAAM,GAAG;AACT,SAAK,OAAO;AACZ,SAAK,aAAa,IAAI,OAAO;AAC7B,SAAK,QAAQ,4BAA4B,KAAK,KAAK,KAAK;AAExD,SAAK,KAAK;AAAA,EACZ;AAAA,EAEA,MAAM,iBAAiB;AACrB;AAAA,EACF;AAAA,EAEA,MAAM,OAAO;AACX,UAAM,eAAe,YAAY;AAC/B,uBAAiB,SAAS,KAAK,OAAO;AACpC,YAAI,UAAU,wBAAa,gBAAgB;AACzC,eAAK,WAAW,MAAM;AAAA,QACxB,OAAO;AACL,eAAK,WAAW,UAAU,KAAK;AAAA,QACjC;AAAA,MACF;AACA,WAAK,WAAW,SAAS;AAAA,IAC3B;AAEA,UAAM,YAAY,YAAY;AAC5B,uBAAiB,MAAM,KAAK,YAAY;AACtC,gBAAQ,GAAG,MAAM;AAAA,UACf,KAAK,wBAAa;AAChB,iBAAK,OAAO,IAAI,EAAE,MAAM,2BAAgB,gBAAgB,CAAC;AACzD;AAAA,UACF,KAAK,wBAAa;AAChB,iBAAK,OAAO,IAAI,EAAE,MAAM,2BAAgB,cAAc,CAAC;AAEvD,kBAAM,QAAQ,MAAM,KAAK,KAAK,UAAU,GAAG,MAAM;AACjD,gBAAI,CAAC,MAAM,aAAc,CAAC,EAAE,MAAM;AAChC;AAAA,YACF;AAEA,iBAAK,OAAO,IAAI,KAAK;AACrB;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAEA,YAAQ,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,CAAC;AAAA,EAC3C;AACF;","names":[]}
|
|
@@ -4,12 +4,15 @@ import type { SpeechEvent } from './stt.js';
|
|
|
4
4
|
import { STT, SpeechStream } from './stt.js';
|
|
5
5
|
export declare class StreamAdapter extends STT {
|
|
6
6
|
#private;
|
|
7
|
+
label: string;
|
|
7
8
|
constructor(stt: STT, vad: VAD);
|
|
8
|
-
|
|
9
|
+
_recognize(frame: AudioFrame): Promise<SpeechEvent>;
|
|
9
10
|
stream(): StreamAdapterWrapper;
|
|
10
11
|
}
|
|
11
12
|
export declare class StreamAdapterWrapper extends SpeechStream {
|
|
12
13
|
#private;
|
|
14
|
+
label: string;
|
|
13
15
|
constructor(stt: STT, vad: VAD);
|
|
16
|
+
monitorMetrics(): Promise<void>;
|
|
14
17
|
}
|
|
15
18
|
//# sourceMappingURL=stream_adapter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream_adapter.d.ts","sourceRoot":"","sources":["../../src/stt/stream_adapter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,GAAG,EAAa,MAAM,WAAW,CAAC;AAEhD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,GAAG,EAAmB,YAAY,EAAE,MAAM,UAAU,CAAC;AAE9D,qBAAa,aAAc,SAAQ,GAAG;;
|
|
1
|
+
{"version":3,"file":"stream_adapter.d.ts","sourceRoot":"","sources":["../../src/stt/stream_adapter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,GAAG,EAAa,MAAM,WAAW,CAAC;AAEhD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,GAAG,EAAmB,YAAY,EAAE,MAAM,UAAU,CAAC;AAE9D,qBAAa,aAAc,SAAQ,GAAG;;IAGpC,KAAK,EAAE,MAAM,CAAC;gBAEF,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;IAW9B,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IAInD,MAAM,IAAI,oBAAoB;CAG/B;AAED,qBAAa,oBAAqB,SAAQ,YAAY;;IAGpD,KAAK,EAAE,MAAM,CAAC;gBAEF,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;IASxB,cAAc;CAsCrB"}
|
|
@@ -3,12 +3,17 @@ import { STT, SpeechEventType, SpeechStream } from "./stt.js";
|
|
|
3
3
|
class StreamAdapter extends STT {
|
|
4
4
|
#stt;
|
|
5
5
|
#vad;
|
|
6
|
+
label;
|
|
6
7
|
constructor(stt, vad) {
|
|
7
8
|
super({ streaming: true, interimResults: false });
|
|
8
9
|
this.#stt = stt;
|
|
9
10
|
this.#vad = vad;
|
|
11
|
+
this.label = `stt.StreamAdapter<${this.#stt.label}>`;
|
|
12
|
+
this.#stt.on(SpeechEventType.METRICS_COLLECTED, (metrics) => {
|
|
13
|
+
this.emit(SpeechEventType.METRICS_COLLECTED, metrics);
|
|
14
|
+
});
|
|
10
15
|
}
|
|
11
|
-
|
|
16
|
+
_recognize(frame) {
|
|
12
17
|
return this.#stt.recognize(frame);
|
|
13
18
|
}
|
|
14
19
|
stream() {
|
|
@@ -18,12 +23,17 @@ class StreamAdapter extends STT {
|
|
|
18
23
|
class StreamAdapterWrapper extends SpeechStream {
|
|
19
24
|
#stt;
|
|
20
25
|
#vadStream;
|
|
26
|
+
label;
|
|
21
27
|
constructor(stt, vad) {
|
|
22
|
-
super();
|
|
28
|
+
super(stt);
|
|
23
29
|
this.#stt = stt;
|
|
24
30
|
this.#vadStream = vad.stream();
|
|
31
|
+
this.label = `stt.StreamAdapterWrapper<${this.#stt.label}>`;
|
|
25
32
|
this.#run();
|
|
26
33
|
}
|
|
34
|
+
async monitorMetrics() {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
27
37
|
async #run() {
|
|
28
38
|
const forwardInput = async () => {
|
|
29
39
|
for await (const input of this.input) {
|
|
@@ -39,15 +49,15 @@ class StreamAdapterWrapper extends SpeechStream {
|
|
|
39
49
|
for await (const ev of this.#vadStream) {
|
|
40
50
|
switch (ev.type) {
|
|
41
51
|
case VADEventType.START_OF_SPEECH:
|
|
42
|
-
this.
|
|
52
|
+
this.output.put({ type: SpeechEventType.START_OF_SPEECH });
|
|
43
53
|
break;
|
|
44
54
|
case VADEventType.END_OF_SPEECH:
|
|
45
|
-
this.
|
|
55
|
+
this.output.put({ type: SpeechEventType.END_OF_SPEECH });
|
|
46
56
|
const event = await this.#stt.recognize(ev.frames);
|
|
47
57
|
if (!event.alternatives[0].text) {
|
|
48
58
|
continue;
|
|
49
59
|
}
|
|
50
|
-
this.
|
|
60
|
+
this.output.put(event);
|
|
51
61
|
break;
|
|
52
62
|
}
|
|
53
63
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/stt/stream_adapter.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { AudioFrame } from '@livekit/rtc-node';\nimport type { VAD, VADStream } from '../vad.js';\nimport { VADEventType } from '../vad.js';\nimport type { SpeechEvent } from './stt.js';\nimport { STT, SpeechEventType, SpeechStream } from './stt.js';\n\nexport class StreamAdapter extends STT {\n #stt: STT;\n #vad: VAD;\n\n constructor(stt: STT, vad: VAD) {\n super({ streaming: true, interimResults: false });\n this.#stt = stt;\n this.#vad = vad;\n }\n\n
|
|
1
|
+
{"version":3,"sources":["../../src/stt/stream_adapter.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { AudioFrame } from '@livekit/rtc-node';\nimport type { VAD, VADStream } from '../vad.js';\nimport { VADEventType } from '../vad.js';\nimport type { SpeechEvent } from './stt.js';\nimport { STT, SpeechEventType, SpeechStream } from './stt.js';\n\nexport class StreamAdapter extends STT {\n #stt: STT;\n #vad: VAD;\n label: string;\n\n constructor(stt: STT, vad: VAD) {\n super({ streaming: true, interimResults: false });\n this.#stt = stt;\n this.#vad = vad;\n this.label = `stt.StreamAdapter<${this.#stt.label}>`;\n\n this.#stt.on(SpeechEventType.METRICS_COLLECTED, (metrics) => {\n this.emit(SpeechEventType.METRICS_COLLECTED, metrics);\n });\n }\n\n _recognize(frame: AudioFrame): Promise<SpeechEvent> {\n return this.#stt.recognize(frame);\n }\n\n stream(): StreamAdapterWrapper {\n return new StreamAdapterWrapper(this.#stt, this.#vad);\n }\n}\n\nexport class StreamAdapterWrapper extends SpeechStream {\n #stt: STT;\n #vadStream: VADStream;\n label: string;\n\n constructor(stt: STT, vad: VAD) {\n super(stt);\n this.#stt = stt;\n this.#vadStream = vad.stream();\n this.label = `stt.StreamAdapterWrapper<${this.#stt.label}>`;\n\n this.#run();\n }\n\n async monitorMetrics() {\n return; // do nothing\n }\n\n async #run() {\n const forwardInput = async () => {\n for await (const input of this.input) {\n if (input === SpeechStream.FLUSH_SENTINEL) {\n this.#vadStream.flush();\n } else {\n this.#vadStream.pushFrame(input);\n }\n }\n this.#vadStream.endInput();\n };\n\n const recognize = async () => {\n for await (const ev of this.#vadStream) {\n switch (ev.type) {\n case VADEventType.START_OF_SPEECH:\n this.output.put({ type: SpeechEventType.START_OF_SPEECH });\n break;\n case VADEventType.END_OF_SPEECH:\n this.output.put({ type: SpeechEventType.END_OF_SPEECH });\n\n const event = await this.#stt.recognize(ev.frames);\n if (!event.alternatives![0].text) {\n continue;\n }\n\n this.output.put(event);\n break;\n }\n }\n };\n\n Promise.all([forwardInput(), recognize()]);\n }\n}\n"],"mappings":"AAKA,SAAS,oBAAoB;AAE7B,SAAS,KAAK,iBAAiB,oBAAoB;AAE5C,MAAM,sBAAsB,IAAI;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,KAAU,KAAU;AAC9B,UAAM,EAAE,WAAW,MAAM,gBAAgB,MAAM,CAAC;AAChD,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,QAAQ,qBAAqB,KAAK,KAAK,KAAK;AAEjD,SAAK,KAAK,GAAG,gBAAgB,mBAAmB,CAAC,YAAY;AAC3D,WAAK,KAAK,gBAAgB,mBAAmB,OAAO;AAAA,IACtD,CAAC;AAAA,EACH;AAAA,EAEA,WAAW,OAAyC;AAClD,WAAO,KAAK,KAAK,UAAU,KAAK;AAAA,EAClC;AAAA,EAEA,SAA+B;AAC7B,WAAO,IAAI,qBAAqB,KAAK,MAAM,KAAK,IAAI;AAAA,EACtD;AACF;AAEO,MAAM,6BAA6B,aAAa;AAAA,EACrD;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,KAAU,KAAU;AAC9B,UAAM,GAAG;AACT,SAAK,OAAO;AACZ,SAAK,aAAa,IAAI,OAAO;AAC7B,SAAK,QAAQ,4BAA4B,KAAK,KAAK,KAAK;AAExD,SAAK,KAAK;AAAA,EACZ;AAAA,EAEA,MAAM,iBAAiB;AACrB;AAAA,EACF;AAAA,EAEA,MAAM,OAAO;AACX,UAAM,eAAe,YAAY;AAC/B,uBAAiB,SAAS,KAAK,OAAO;AACpC,YAAI,UAAU,aAAa,gBAAgB;AACzC,eAAK,WAAW,MAAM;AAAA,QACxB,OAAO;AACL,eAAK,WAAW,UAAU,KAAK;AAAA,QACjC;AAAA,MACF;AACA,WAAK,WAAW,SAAS;AAAA,IAC3B;AAEA,UAAM,YAAY,YAAY;AAC5B,uBAAiB,MAAM,KAAK,YAAY;AACtC,gBAAQ,GAAG,MAAM;AAAA,UACf,KAAK,aAAa;AAChB,iBAAK,OAAO,IAAI,EAAE,MAAM,gBAAgB,gBAAgB,CAAC;AACzD;AAAA,UACF,KAAK,aAAa;AAChB,iBAAK,OAAO,IAAI,EAAE,MAAM,gBAAgB,cAAc,CAAC;AAEvD,kBAAM,QAAQ,MAAM,KAAK,KAAK,UAAU,GAAG,MAAM;AACjD,gBAAI,CAAC,MAAM,aAAc,CAAC,EAAE,MAAM;AAChC;AAAA,YACF;AAEA,iBAAK,OAAO,IAAI,KAAK;AACrB;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAEA,YAAQ,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,CAAC;AAAA,EAC3C;AACF;","names":[]}
|
package/dist/stt/stt.cjs
CHANGED
|
@@ -23,29 +23,72 @@ __export(stt_exports, {
|
|
|
23
23
|
SpeechStream: () => SpeechStream
|
|
24
24
|
});
|
|
25
25
|
module.exports = __toCommonJS(stt_exports);
|
|
26
|
+
var import_node_events = require("node:events");
|
|
26
27
|
var import_utils = require("../utils.cjs");
|
|
27
28
|
var SpeechEventType = /* @__PURE__ */ ((SpeechEventType2) => {
|
|
28
29
|
SpeechEventType2[SpeechEventType2["START_OF_SPEECH"] = 0] = "START_OF_SPEECH";
|
|
29
30
|
SpeechEventType2[SpeechEventType2["INTERIM_TRANSCRIPT"] = 1] = "INTERIM_TRANSCRIPT";
|
|
30
31
|
SpeechEventType2[SpeechEventType2["FINAL_TRANSCRIPT"] = 2] = "FINAL_TRANSCRIPT";
|
|
31
32
|
SpeechEventType2[SpeechEventType2["END_OF_SPEECH"] = 3] = "END_OF_SPEECH";
|
|
33
|
+
SpeechEventType2[SpeechEventType2["RECOGNITION_USAGE"] = 4] = "RECOGNITION_USAGE";
|
|
34
|
+
SpeechEventType2[SpeechEventType2["METRICS_COLLECTED"] = 5] = "METRICS_COLLECTED";
|
|
32
35
|
return SpeechEventType2;
|
|
33
36
|
})(SpeechEventType || {});
|
|
34
|
-
class STT {
|
|
37
|
+
class STT extends import_node_events.EventEmitter {
|
|
35
38
|
#capabilities;
|
|
36
39
|
constructor(capabilities) {
|
|
40
|
+
super();
|
|
37
41
|
this.#capabilities = capabilities;
|
|
38
42
|
}
|
|
39
43
|
/** Returns this STT's capabilities */
|
|
40
44
|
get capabilities() {
|
|
41
45
|
return this.#capabilities;
|
|
42
46
|
}
|
|
47
|
+
/** Receives an audio buffer and returns transcription in the form of a {@link SpeechEvent} */
|
|
48
|
+
async recognize(frame) {
|
|
49
|
+
const startTime = process.hrtime.bigint();
|
|
50
|
+
const event = await this._recognize(frame);
|
|
51
|
+
const duration = Number((process.hrtime.bigint() - startTime) / BigInt(1e6));
|
|
52
|
+
this.emit(5 /* METRICS_COLLECTED */, {
|
|
53
|
+
requestId: event.requestId ?? "",
|
|
54
|
+
timestamp: Date.now(),
|
|
55
|
+
duration,
|
|
56
|
+
label: this.label,
|
|
57
|
+
audioDuration: Array.isArray(frame) ? frame.reduce((sum, a) => sum + a.samplesPerChannel / a.sampleRate, 0) : frame.samplesPerChannel / frame.sampleRate,
|
|
58
|
+
streamed: false
|
|
59
|
+
});
|
|
60
|
+
return event;
|
|
61
|
+
}
|
|
43
62
|
}
|
|
44
63
|
class SpeechStream {
|
|
45
64
|
static FLUSH_SENTINEL = Symbol("FLUSH_SENTINEL");
|
|
46
65
|
input = new import_utils.AsyncIterableQueue();
|
|
66
|
+
output = new import_utils.AsyncIterableQueue();
|
|
47
67
|
queue = new import_utils.AsyncIterableQueue();
|
|
48
68
|
closed = false;
|
|
69
|
+
#stt;
|
|
70
|
+
constructor(stt) {
|
|
71
|
+
this.#stt = stt;
|
|
72
|
+
this.monitorMetrics();
|
|
73
|
+
}
|
|
74
|
+
async monitorMetrics() {
|
|
75
|
+
const startTime = process.hrtime.bigint();
|
|
76
|
+
for await (const event of this.queue) {
|
|
77
|
+
this.output.put(event);
|
|
78
|
+
if (event.type !== 4 /* RECOGNITION_USAGE */) continue;
|
|
79
|
+
const duration = process.hrtime.bigint() - startTime;
|
|
80
|
+
const metrics = {
|
|
81
|
+
timestamp: Date.now(),
|
|
82
|
+
requestId: event.requestId,
|
|
83
|
+
duration: Math.trunc(Number(duration / BigInt(1e6))),
|
|
84
|
+
label: this.label,
|
|
85
|
+
audioDuration: event.recognitionUsage.audioDuration,
|
|
86
|
+
streamed: true
|
|
87
|
+
};
|
|
88
|
+
this.#stt.emit(5 /* METRICS_COLLECTED */, metrics);
|
|
89
|
+
}
|
|
90
|
+
this.output.close();
|
|
91
|
+
}
|
|
49
92
|
/** Push an audio frame to the STT */
|
|
50
93
|
pushFrame(frame) {
|
|
51
94
|
if (this.input.closed) {
|
|
@@ -77,12 +120,13 @@ class SpeechStream {
|
|
|
77
120
|
this.input.close();
|
|
78
121
|
}
|
|
79
122
|
next() {
|
|
80
|
-
return this.
|
|
123
|
+
return this.output.next();
|
|
81
124
|
}
|
|
82
125
|
/** Close both the input and output of the STT stream */
|
|
83
126
|
close() {
|
|
84
127
|
this.input.close();
|
|
85
128
|
this.queue.close();
|
|
129
|
+
this.output.close();
|
|
86
130
|
this.closed = true;
|
|
87
131
|
}
|
|
88
132
|
[Symbol.asyncIterator]() {
|
package/dist/stt/stt.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/stt/stt.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { AudioFrame } from '@livekit/rtc-node';\nimport type { AudioBuffer } from '../utils.js';\nimport { AsyncIterableQueue } from '../utils.js';\n\n/** Indicates start/middle/end of speech */\nexport enum SpeechEventType {\n /**\n * Indicate the start of speech.\n * If the STT doesn't support this event, this will be emitted at the same time\n * as the first INTERIM_TRANSCRIPT.\n */\n START_OF_SPEECH = 0,\n /**\n * Interim transcript, useful for real-time transcription.\n */\n INTERIM_TRANSCRIPT = 1,\n /**\n * Final transcript, emitted when the STT is confident enough that a certain\n * portion of the speech will not change.\n */\n FINAL_TRANSCRIPT = 2,\n /**\n * Indicate the end of speech, emitted when the user stops speaking.\n * The first alternative is a combination of all the previous FINAL_TRANSCRIPT events.\n */\n END_OF_SPEECH = 3,\n}\n\n/** SpeechData contains metadata about this {@link SpeechEvent}. */\nexport interface SpeechData {\n language: string;\n text: string;\n startTime: number;\n endTime: number;\n confidence: number;\n}\n\n/** SpeechEvent is a packet of speech-to-text data. */\nexport interface SpeechEvent {\n type: SpeechEventType;\n alternatives?: [SpeechData, ...SpeechData[]];\n}\n\n/**\n * Describes the capabilities of the STT provider.\n *\n * @remarks\n * At present, the framework only supports providers that have a streaming endpoint.\n */\nexport interface STTCapabilities {\n streaming: boolean;\n interimResults: boolean;\n}\n\n/**\n * An instance of a speech-to-text adapter.\n *\n * @remarks\n * This class is abstract, and as such cannot be used directly. Instead, use a provider plugin that\n * exports its own child STT class, which inherits this class's methods.\n */\nexport abstract class STT {\n #capabilities: STTCapabilities;\n\n constructor(capabilities: STTCapabilities) {\n this.#capabilities = capabilities;\n }\n\n /** Returns this STT's capabilities */\n get capabilities(): STTCapabilities {\n return this.#capabilities;\n }\n\n /** Receives an audio buffer and returns transcription in the form of a {@link SpeechEvent} */\n
|
|
1
|
+
{"version":3,"sources":["../../src/stt/stt.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { AudioFrame } from '@livekit/rtc-node';\nimport type { TypedEventEmitter as TypedEmitter } from '@livekit/typed-emitter';\nimport { EventEmitter } from 'node:events';\nimport type { STTMetrics } from '../metrics/base.js';\nimport type { AudioBuffer } from '../utils.js';\nimport { AsyncIterableQueue } from '../utils.js';\n\n/** Indicates start/middle/end of speech */\nexport enum SpeechEventType {\n /**\n * Indicate the start of speech.\n * If the STT doesn't support this event, this will be emitted at the same time\n * as the first INTERIM_TRANSCRIPT.\n */\n START_OF_SPEECH = 0,\n /**\n * Interim transcript, useful for real-time transcription.\n */\n INTERIM_TRANSCRIPT = 1,\n /**\n * Final transcript, emitted when the STT is confident enough that a certain\n * portion of the speech will not change.\n */\n FINAL_TRANSCRIPT = 2,\n /**\n * Indicate the end of speech, emitted when the user stops speaking.\n * The first alternative is a combination of all the previous FINAL_TRANSCRIPT events.\n */\n END_OF_SPEECH = 3,\n /** Usage event, emitted periodically to indicate usage metrics. */\n RECOGNITION_USAGE = 4,\n METRICS_COLLECTED = 5,\n}\n\n/** SpeechData contains metadata about this {@link SpeechEvent}. */\nexport interface SpeechData {\n language: string;\n text: string;\n startTime: number;\n endTime: number;\n confidence: number;\n}\n\nexport interface RecognitionUsage {\n audioDuration: number;\n}\n\n/** SpeechEvent is a packet of speech-to-text data. */\nexport interface SpeechEvent {\n type: SpeechEventType;\n alternatives?: [SpeechData, ...SpeechData[]];\n requestId?: string;\n recognitionUsage?: RecognitionUsage;\n}\n\n/**\n * Describes the capabilities of the STT provider.\n *\n * @remarks\n * At present, the framework only supports providers that have a streaming endpoint.\n */\nexport interface STTCapabilities {\n streaming: boolean;\n interimResults: boolean;\n}\n\nexport type STTCallbacks = {\n [SpeechEventType.METRICS_COLLECTED]: (metrics: STTMetrics) => void;\n};\n\n/**\n * An instance of a speech-to-text adapter.\n *\n * @remarks\n * This class is abstract, and as such cannot be used directly. Instead, use a provider plugin that\n * exports its own child STT class, which inherits this class's methods.\n */\nexport abstract class STT extends (EventEmitter as new () => TypedEmitter<STTCallbacks>) {\n abstract label: string;\n #capabilities: STTCapabilities;\n\n constructor(capabilities: STTCapabilities) {\n super();\n this.#capabilities = capabilities;\n }\n\n /** Returns this STT's capabilities */\n get capabilities(): STTCapabilities {\n return this.#capabilities;\n }\n\n /** Receives an audio buffer and returns transcription in the form of a {@link SpeechEvent} */\n async recognize(frame: AudioBuffer): Promise<SpeechEvent> {\n const startTime = process.hrtime.bigint();\n const event = await this._recognize(frame);\n const duration = Number((process.hrtime.bigint() - startTime) / BigInt(1000000));\n this.emit(SpeechEventType.METRICS_COLLECTED, {\n requestId: event.requestId ?? '',\n timestamp: Date.now(),\n duration,\n label: this.label,\n audioDuration: Array.isArray(frame)\n ? frame.reduce((sum, a) => sum + a.samplesPerChannel / a.sampleRate, 0)\n : frame.samplesPerChannel / frame.sampleRate,\n streamed: false,\n });\n return event;\n }\n\n protected abstract _recognize(frame: AudioBuffer): Promise<SpeechEvent>;\n\n /**\n * Returns a {@link SpeechStream} that can be used to push audio frames and receive\n * transcriptions\n */\n abstract stream(): SpeechStream;\n}\n\n/**\n * An instance of a speech-to-text stream, as an asynchronous iterable iterator.\n *\n * @example Looping through frames\n * ```ts\n * for await (const event of stream) {\n * if (event.type === SpeechEventType.FINAL_TRANSCRIPT) {\n * console.log(event.alternatives[0].text)\n * }\n * }\n * ```\n *\n * @remarks\n * This class is abstract, and as such cannot be used directly. Instead, use a provider plugin that\n * exports its own child SpeechStream class, which inherits this class's methods.\n */\nexport abstract class SpeechStream implements AsyncIterableIterator<SpeechEvent> {\n protected static readonly FLUSH_SENTINEL = Symbol('FLUSH_SENTINEL');\n protected input = new AsyncIterableQueue<AudioFrame | typeof SpeechStream.FLUSH_SENTINEL>();\n protected output = new AsyncIterableQueue<SpeechEvent>();\n protected queue = new AsyncIterableQueue<SpeechEvent>();\n abstract label: string;\n protected closed = false;\n #stt: STT;\n\n constructor(stt: STT) {\n this.#stt = stt;\n this.monitorMetrics();\n }\n\n protected async monitorMetrics() {\n const startTime = process.hrtime.bigint();\n\n for await (const event of this.queue) {\n this.output.put(event);\n if (event.type !== SpeechEventType.RECOGNITION_USAGE) continue;\n const duration = process.hrtime.bigint() - startTime;\n const metrics: STTMetrics = {\n timestamp: Date.now(),\n requestId: event.requestId!,\n duration: Math.trunc(Number(duration / BigInt(1000000))),\n label: this.label,\n audioDuration: event.recognitionUsage!.audioDuration,\n streamed: true,\n };\n this.#stt.emit(SpeechEventType.METRICS_COLLECTED, metrics);\n }\n this.output.close();\n }\n\n /** Push an audio frame to the STT */\n pushFrame(frame: AudioFrame) {\n if (this.input.closed) {\n throw new Error('Input is closed');\n }\n if (this.closed) {\n throw new Error('Stream is closed');\n }\n this.input.put(frame);\n }\n\n /** Flush the STT, causing it to process all pending text */\n flush() {\n if (this.input.closed) {\n throw new Error('Input is closed');\n }\n if (this.closed) {\n throw new Error('Stream is closed');\n }\n this.input.put(SpeechStream.FLUSH_SENTINEL);\n }\n\n /** Mark the input as ended and forbid additional pushes */\n endInput() {\n if (this.input.closed) {\n throw new Error('Input is closed');\n }\n if (this.closed) {\n throw new Error('Stream is closed');\n }\n this.input.close();\n }\n\n next(): Promise<IteratorResult<SpeechEvent>> {\n return this.output.next();\n }\n\n /** Close both the input and output of the STT stream */\n close() {\n this.input.close();\n this.queue.close();\n this.output.close();\n this.closed = true;\n }\n\n [Symbol.asyncIterator](): SpeechStream {\n return this;\n }\n}\n"],"mappings":"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","names":["SpeechEventType"]}
|