@kuralle-syrinx/pipecat-smart-turn 4.4.1 → 4.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/eos-plugin.d.ts +59 -0
- package/dist/eos-plugin.d.ts.map +1 -0
- package/dist/eos-plugin.js +504 -0
- package/dist/eos-plugin.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/interaction-policy.d.ts +41 -0
- package/dist/interaction-policy.d.ts.map +1 -0
- package/dist/interaction-policy.js +233 -0
- package/dist/interaction-policy.js.map +1 -0
- package/dist/predictor.d.ts +12 -0
- package/dist/predictor.d.ts.map +1 -0
- package/dist/predictor.js +57 -0
- package/dist/predictor.js.map +1 -0
- package/dist/semantic-completeness.d.ts +24 -0
- package/dist/semantic-completeness.d.ts.map +1 -0
- package/dist/semantic-completeness.js +116 -0
- package/dist/semantic-completeness.js.map +1 -0
- package/dist/semantic-fixtures.d.ts +7 -0
- package/dist/semantic-fixtures.d.ts.map +1 -0
- package/dist/semantic-fixtures.js +15 -0
- package/dist/semantic-fixtures.js.map +1 -0
- package/dist/smart-turn-types.d.ts +8 -0
- package/dist/smart-turn-types.d.ts.map +1 -0
- package/dist/smart-turn-types.js +3 -0
- package/dist/smart-turn-types.js.map +1 -0
- package/package.json +20 -7
- package/src/index.test.ts +1033 -0
- package/src/interaction-policy.test.ts +161 -0
- package/src/semantic-completeness.test.ts +207 -0
- package/models/README.md +0 -10
- package/models/smart-turn-v3.2-cpu.onnx +0 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { type PipelineBus, type PluginConfig, type VoicePlugin } from "@kuralle-syrinx/core";
|
|
2
|
+
import type { SmartTurnPredictor } from "./smart-turn-types.js";
|
|
3
|
+
export type { SmartTurnPredictor } from "./smart-turn-types.js";
|
|
4
|
+
export declare class PipecatEOSPlugin implements VoicePlugin {
|
|
5
|
+
private readonly predictor;
|
|
6
|
+
readonly endpointingCapability: {
|
|
7
|
+
owner: "smart_turn";
|
|
8
|
+
};
|
|
9
|
+
private bus;
|
|
10
|
+
private disposers;
|
|
11
|
+
private turns;
|
|
12
|
+
private finalizeDelayMs;
|
|
13
|
+
private sttQuietFallbackMs;
|
|
14
|
+
private maxDelayMs;
|
|
15
|
+
private incompleteFallbackMs;
|
|
16
|
+
private semanticShortcutDelayMs;
|
|
17
|
+
private semanticDeferFallbackMs;
|
|
18
|
+
private minSpeechMs;
|
|
19
|
+
private maxTurnDurationMs;
|
|
20
|
+
private semanticEndpointingEnabled;
|
|
21
|
+
private probabilityThreshold;
|
|
22
|
+
private readonly lockedContextIds;
|
|
23
|
+
private readonly lockedContextsWithAssistantAudio;
|
|
24
|
+
/**
|
|
25
|
+
* Playout estimate + fallback release timer for locked contexts that produced assistant
|
|
26
|
+
* audio. The lock is normally released by `tts.playout_progress {complete}` (a client
|
|
27
|
+
* signal), but some clients (e.g. the browser studio) never emit it — without this
|
|
28
|
+
* fallback the lock persists and the NEXT turn stalls forever. We estimate when the
|
|
29
|
+
* assistant audio should have finished playing (from the emitted bytes) and release then.
|
|
30
|
+
*/
|
|
31
|
+
private readonly lockedPlayout;
|
|
32
|
+
constructor(predictor: SmartTurnPredictor);
|
|
33
|
+
initialize(bus: PipelineBus, config: PluginConfig): Promise<void>;
|
|
34
|
+
close(): Promise<void>;
|
|
35
|
+
private handleAudio;
|
|
36
|
+
private handleInterim;
|
|
37
|
+
private handleFinal;
|
|
38
|
+
private handleSpeechStarted;
|
|
39
|
+
private handleSpeechEnded;
|
|
40
|
+
private analyzeBoundary;
|
|
41
|
+
private stateFor;
|
|
42
|
+
private scheduleAbsoluteCap;
|
|
43
|
+
private clearAbsoluteCap;
|
|
44
|
+
private onAbsoluteCap;
|
|
45
|
+
private scheduleFinalize;
|
|
46
|
+
private scheduleIncompleteFallback;
|
|
47
|
+
private scheduleSemanticShortcut;
|
|
48
|
+
private scheduleSemanticDefer;
|
|
49
|
+
private fusionConfig;
|
|
50
|
+
private armSttQuietFallback;
|
|
51
|
+
private scheduleMaxFinalize;
|
|
52
|
+
private handleTtsAudio;
|
|
53
|
+
private handleTtsEnd;
|
|
54
|
+
private handleTtsPlayoutProgress;
|
|
55
|
+
private releaseContextLock;
|
|
56
|
+
private finalize;
|
|
57
|
+
private requestSttFinalize;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=eos-plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eos-plugin.d.ts","sourceRoot":"","sources":["../src/eos-plugin.ts"],"names":[],"mappings":"AAYA,OAAO,EAML,KAAK,WAAW,EAChB,KAAK,YAAY,EASjB,KAAK,WAAW,EACjB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,YAAY,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AA4BhE,qBAAa,gBAAiB,YAAW,WAAW;IA8BtC,OAAO,CAAC,QAAQ,CAAC,SAAS;IA7BtC,QAAQ,CAAC,qBAAqB;;MAAoC;IAElE,OAAO,CAAC,GAAG,CAA4B;IACvC,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,KAAK,CAAgC;IAC7C,OAAO,CAAC,eAAe,CAAO;IAC9B,OAAO,CAAC,kBAAkB,CAAQ;IAClC,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,oBAAoB,CAAQ;IACpC,OAAO,CAAC,uBAAuB,CAAM;IACrC,OAAO,CAAC,uBAAuB,CAAQ;IACvC,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,0BAA0B,CAAQ;IAC1C,OAAO,CAAC,oBAAoB,CAAO;IACnC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAqB;IACtD,OAAO,CAAC,QAAQ,CAAC,gCAAgC,CAAqB;IACtE;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,CAAC,aAAa,CAG1B;gBAEyB,SAAS,EAAE,kBAAkB;IAEpD,UAAU,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IA6CjE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB5B,OAAO,CAAC,WAAW;IAgBnB,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,WAAW;IA0CnB,OAAO,CAAC,mBAAmB;YAkBb,iBAAiB;YAcjB,eAAe;IA8C7B,OAAO,CAAC,QAAQ;IA6BhB,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,0BAA0B;IAalC,OAAO,CAAC,wBAAwB;IAYhC,OAAO,CAAC,qBAAqB;IAoB7B,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,mBAAmB;IAiB3B,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,cAAc;IAiBtB,OAAO,CAAC,YAAY;IAsBpB,OAAO,CAAC,wBAAwB;IAIhC,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,QAAQ;IAmBhB,OAAO,CAAC,kBAAkB;CAO3B"}
|
|
@@ -0,0 +1,504 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
//
|
|
3
|
+
// Edge-safe Pipecat Smart Turn EOS plugin.
|
|
4
|
+
// Consumes an injected SmartTurnPredictor — does NOT import LocalSmartTurnV3
|
|
5
|
+
// or onnxruntime-node. Workers hosts import this subpath (`/eos`).
|
|
6
|
+
import { fuseEndpointDecision, latestTranscript, scoreSemanticCompleteness, } from "./semantic-completeness.js";
|
|
7
|
+
import { Route, } from "@kuralle-syrinx/core";
|
|
8
|
+
import { pcm16BytesToSamples } from "@kuralle-syrinx/core/audio";
|
|
9
|
+
const SAMPLE_RATE = 16000;
|
|
10
|
+
const MAX_AUDIO_SAMPLES = SAMPLE_RATE * 8;
|
|
11
|
+
/** Grace added to the estimated playout end before the fallback lock-release fires. */
|
|
12
|
+
const LOCK_RELEASE_GRACE_MS = 500;
|
|
13
|
+
export class PipecatEOSPlugin {
|
|
14
|
+
predictor;
|
|
15
|
+
endpointingCapability = { owner: "smart_turn" };
|
|
16
|
+
bus = null;
|
|
17
|
+
disposers = [];
|
|
18
|
+
turns = new Map();
|
|
19
|
+
finalizeDelayMs = 250;
|
|
20
|
+
sttQuietFallbackMs = 2500;
|
|
21
|
+
maxDelayMs = 2000;
|
|
22
|
+
incompleteFallbackMs = 2000;
|
|
23
|
+
semanticShortcutDelayMs = 50;
|
|
24
|
+
semanticDeferFallbackMs = 4000;
|
|
25
|
+
minSpeechMs = 0;
|
|
26
|
+
maxTurnDurationMs = 15000;
|
|
27
|
+
semanticEndpointingEnabled = true;
|
|
28
|
+
probabilityThreshold = 0.5;
|
|
29
|
+
lockedContextIds = new Set();
|
|
30
|
+
lockedContextsWithAssistantAudio = new Set();
|
|
31
|
+
/**
|
|
32
|
+
* Playout estimate + fallback release timer for locked contexts that produced assistant
|
|
33
|
+
* audio. The lock is normally released by `tts.playout_progress {complete}` (a client
|
|
34
|
+
* signal), but some clients (e.g. the browser studio) never emit it — without this
|
|
35
|
+
* fallback the lock persists and the NEXT turn stalls forever. We estimate when the
|
|
36
|
+
* assistant audio should have finished playing (from the emitted bytes) and release then.
|
|
37
|
+
*/
|
|
38
|
+
lockedPlayout = new Map();
|
|
39
|
+
constructor(predictor) {
|
|
40
|
+
this.predictor = predictor;
|
|
41
|
+
}
|
|
42
|
+
async initialize(bus, config) {
|
|
43
|
+
this.bus = bus;
|
|
44
|
+
this.finalizeDelayMs = readNonNegativeNumber(config["finalize_delay_ms"], 250);
|
|
45
|
+
this.sttQuietFallbackMs = readNonNegativeNumber(config["stt_quiet_fallback_ms"], 2500);
|
|
46
|
+
this.maxDelayMs = readNonNegativeNumber(config["max_delay_ms"], 2000);
|
|
47
|
+
this.incompleteFallbackMs = readNonNegativeNumber(config["incomplete_fallback_ms"], 2000);
|
|
48
|
+
this.semanticShortcutDelayMs = readNonNegativeNumber(config["semantic_shortcut_delay_ms"], 50);
|
|
49
|
+
this.semanticDeferFallbackMs = readNonNegativeNumber(config["semantic_defer_fallback_ms"], 4000);
|
|
50
|
+
this.minSpeechMs = readNonNegativeNumber(config["min_speech_ms"], 0);
|
|
51
|
+
this.maxTurnDurationMs = readNonNegativeNumber(config["max_turn_duration_ms"], 15000);
|
|
52
|
+
this.semanticEndpointingEnabled = readBooleanConfig(config["semantic_endpointing_enabled"], true);
|
|
53
|
+
this.probabilityThreshold = readProbability(config["probability_threshold"], 0.5);
|
|
54
|
+
await this.predictor.initialize(config);
|
|
55
|
+
this.disposers.push(bus.on("vad.audio", (pkt) => {
|
|
56
|
+
this.handleAudio(pkt);
|
|
57
|
+
}), bus.on("stt.interim", (pkt) => {
|
|
58
|
+
this.handleInterim(pkt);
|
|
59
|
+
}), bus.on("stt.result", (pkt) => {
|
|
60
|
+
this.handleFinal(pkt);
|
|
61
|
+
}), bus.on("vad.speech_started", (pkt) => {
|
|
62
|
+
this.handleSpeechStarted(pkt);
|
|
63
|
+
}), bus.on("vad.speech_ended", async (pkt) => {
|
|
64
|
+
await this.handleSpeechEnded(pkt);
|
|
65
|
+
}), bus.on("tts.audio", (pkt) => {
|
|
66
|
+
this.handleTtsAudio(pkt);
|
|
67
|
+
}), bus.on("tts.end", (pkt) => {
|
|
68
|
+
this.handleTtsEnd(pkt);
|
|
69
|
+
}), bus.on("tts.playout_progress", (pkt) => {
|
|
70
|
+
this.handleTtsPlayoutProgress(pkt);
|
|
71
|
+
}), bus.on("interrupt.detected", (pkt) => {
|
|
72
|
+
this.releaseContextLock(pkt.contextId);
|
|
73
|
+
}));
|
|
74
|
+
}
|
|
75
|
+
async close() {
|
|
76
|
+
for (const dispose of this.disposers.splice(0)) {
|
|
77
|
+
dispose();
|
|
78
|
+
}
|
|
79
|
+
for (const state of this.turns.values()) {
|
|
80
|
+
clearTurnTimers(state);
|
|
81
|
+
this.clearAbsoluteCap(state);
|
|
82
|
+
}
|
|
83
|
+
this.turns.clear();
|
|
84
|
+
for (const playout of this.lockedPlayout.values()) {
|
|
85
|
+
if (playout.timer)
|
|
86
|
+
clearTimeout(playout.timer);
|
|
87
|
+
}
|
|
88
|
+
this.lockedPlayout.clear();
|
|
89
|
+
this.lockedContextIds.clear();
|
|
90
|
+
this.lockedContextsWithAssistantAudio.clear();
|
|
91
|
+
await this.predictor.close();
|
|
92
|
+
this.bus = null;
|
|
93
|
+
}
|
|
94
|
+
handleAudio(pkt) {
|
|
95
|
+
if (this.lockedContextIds.has(pkt.contextId))
|
|
96
|
+
return;
|
|
97
|
+
if (pkt.audio.byteLength % 2 !== 0)
|
|
98
|
+
return;
|
|
99
|
+
const state = this.stateFor(pkt.contextId);
|
|
100
|
+
const samples = pcm16BytesToSamples(pkt.audio);
|
|
101
|
+
for (const sample of samples) {
|
|
102
|
+
state.audio.push(sample / 32768);
|
|
103
|
+
}
|
|
104
|
+
if (state.speechActive) {
|
|
105
|
+
state.speechMs += (samples.length / SAMPLE_RATE) * 1000;
|
|
106
|
+
}
|
|
107
|
+
if (state.audio.length > MAX_AUDIO_SAMPLES) {
|
|
108
|
+
state.audio.splice(0, state.audio.length - MAX_AUDIO_SAMPLES);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
handleInterim(pkt) {
|
|
112
|
+
if (this.lockedContextIds.has(pkt.contextId))
|
|
113
|
+
return;
|
|
114
|
+
if (!pkt.text.trim())
|
|
115
|
+
return;
|
|
116
|
+
const state = this.stateFor(pkt.contextId);
|
|
117
|
+
state.latestInterim = pkt.text.trim();
|
|
118
|
+
if (state.sttQuietTimer)
|
|
119
|
+
this.armSttQuietFallback(state);
|
|
120
|
+
this.bus?.push(Route.Main, {
|
|
121
|
+
kind: "eos.interim",
|
|
122
|
+
contextId: pkt.contextId,
|
|
123
|
+
timestampMs: Date.now(),
|
|
124
|
+
text: pkt.text,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
handleFinal(pkt) {
|
|
128
|
+
if (this.lockedContextIds.has(pkt.contextId))
|
|
129
|
+
return;
|
|
130
|
+
if (!pkt.text.trim())
|
|
131
|
+
return;
|
|
132
|
+
const state = this.stateFor(pkt.contextId);
|
|
133
|
+
appendFinalPacket(state, pkt);
|
|
134
|
+
state.latestInterim = "";
|
|
135
|
+
const transcript = latestTranscript(state.finalSegments, state.latestInterim);
|
|
136
|
+
const semantic = scoreSemanticCompleteness(transcript);
|
|
137
|
+
state.semanticComplete = semantic.complete;
|
|
138
|
+
if (state.boundaryAnalyzed &&
|
|
139
|
+
state.smartTurnComplete &&
|
|
140
|
+
state.semanticComplete &&
|
|
141
|
+
state.speechMs >= this.minSpeechMs) {
|
|
142
|
+
this.scheduleFinalize(state, this.finalizeDelayMs);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
if (state.smartTurnComplete && state.semanticComplete && state.speechMs >= this.minSpeechMs) {
|
|
146
|
+
this.scheduleFinalize(state, this.finalizeDelayMs);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
if (state.boundaryAnalyzed && state.smartTurnComplete && !state.semanticComplete) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
if (state.boundaryAnalyzed && !state.smartTurnComplete && state.semanticComplete) {
|
|
153
|
+
this.scheduleSemanticShortcut(state);
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
if (state.boundaryAnalyzed) {
|
|
157
|
+
this.scheduleIncompleteFallback(state);
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
if (state.speechActive) {
|
|
161
|
+
this.armSttQuietFallback(state);
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
this.scheduleMaxFinalize(state);
|
|
165
|
+
}
|
|
166
|
+
handleSpeechStarted(pkt) {
|
|
167
|
+
if (this.lockedContextIds.has(pkt.contextId))
|
|
168
|
+
return;
|
|
169
|
+
const state = this.stateFor(pkt.contextId);
|
|
170
|
+
const startsTurn = !state.boundaryAnalyzed && state.finalPackets.length === 0;
|
|
171
|
+
if (state.sttQuietTimer) {
|
|
172
|
+
clearTimeout(state.sttQuietTimer);
|
|
173
|
+
state.sttQuietTimer = null;
|
|
174
|
+
}
|
|
175
|
+
if (startsTurn)
|
|
176
|
+
state.speechMs = 0;
|
|
177
|
+
state.boundaryAnalyzed = false;
|
|
178
|
+
state.smartTurnComplete = false;
|
|
179
|
+
state.semanticComplete = false;
|
|
180
|
+
state.speechActive = true;
|
|
181
|
+
state.latestInterim = "";
|
|
182
|
+
state.analysisSequence += 1;
|
|
183
|
+
clearTurnTimers(state);
|
|
184
|
+
}
|
|
185
|
+
async handleSpeechEnded(pkt) {
|
|
186
|
+
if (this.lockedContextIds.has(pkt.contextId))
|
|
187
|
+
return;
|
|
188
|
+
const state = this.stateFor(pkt.contextId);
|
|
189
|
+
if (state.sttQuietTimer) {
|
|
190
|
+
clearTimeout(state.sttQuietTimer);
|
|
191
|
+
state.sttQuietTimer = null;
|
|
192
|
+
}
|
|
193
|
+
await this.analyzeBoundary(state);
|
|
194
|
+
}
|
|
195
|
+
// Shared end-of-speech boundary analysis: used by the VAD speech_ended path
|
|
196
|
+
// and by the STT-quiet fallback (when the provider transcript has gone quiet
|
|
197
|
+
// but the VAD never closed the segment — e.g. model state saturation on long
|
|
198
|
+
// telephony audio). The turn must never be held hostage by a wedged VAD.
|
|
199
|
+
async analyzeBoundary(state) {
|
|
200
|
+
state.speechActive = false;
|
|
201
|
+
const sequence = ++state.analysisSequence;
|
|
202
|
+
const probability = await this.predictor.predict(Float32Array.from(state.audio));
|
|
203
|
+
if (state.finalized || state.analysisSequence !== sequence)
|
|
204
|
+
return;
|
|
205
|
+
state.boundaryAnalyzed = true;
|
|
206
|
+
state.smartTurnComplete = probability > this.probabilityThreshold;
|
|
207
|
+
const transcript = latestTranscript(state.finalSegments, state.latestInterim);
|
|
208
|
+
const semantic = transcript.trim()
|
|
209
|
+
? scoreSemanticCompleteness(transcript)
|
|
210
|
+
: { complete: state.smartTurnComplete, label: "complete", confidence: 0 };
|
|
211
|
+
state.semanticComplete = semantic.complete;
|
|
212
|
+
const fusion = transcript.trim()
|
|
213
|
+
? fuseEndpointDecision(state.smartTurnComplete, semantic, state.speechMs, this.fusionConfig())
|
|
214
|
+
: {
|
|
215
|
+
release: state.smartTurnComplete && state.speechMs >= this.minSpeechMs,
|
|
216
|
+
requestFinalize: state.smartTurnComplete && state.speechMs >= this.minSpeechMs,
|
|
217
|
+
finalizeDelayMs: this.finalizeDelayMs,
|
|
218
|
+
};
|
|
219
|
+
if (state.maxTimer) {
|
|
220
|
+
clearTimeout(state.maxTimer);
|
|
221
|
+
state.maxTimer = null;
|
|
222
|
+
}
|
|
223
|
+
if (fusion.deferReason) {
|
|
224
|
+
this.scheduleSemanticDefer(state);
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
if (!fusion.release) {
|
|
228
|
+
this.scheduleIncompleteFallback(state);
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
if (fusion.requestFinalize) {
|
|
232
|
+
this.requestSttFinalize(state.contextId);
|
|
233
|
+
}
|
|
234
|
+
if (state.finalPackets.length > 0) {
|
|
235
|
+
this.scheduleFinalize(state, fusion.finalizeDelayMs);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
stateFor(contextId) {
|
|
239
|
+
const existing = this.turns.get(contextId);
|
|
240
|
+
if (existing)
|
|
241
|
+
return existing;
|
|
242
|
+
const state = {
|
|
243
|
+
contextId,
|
|
244
|
+
audio: [],
|
|
245
|
+
speechMs: 0,
|
|
246
|
+
finalPackets: [],
|
|
247
|
+
finalSegments: [],
|
|
248
|
+
latestInterim: "",
|
|
249
|
+
boundaryAnalyzed: false,
|
|
250
|
+
smartTurnComplete: false,
|
|
251
|
+
semanticComplete: false,
|
|
252
|
+
speechActive: false,
|
|
253
|
+
finalized: false,
|
|
254
|
+
analysisSequence: 0,
|
|
255
|
+
finalizeTimer: null,
|
|
256
|
+
sttQuietTimer: null,
|
|
257
|
+
maxTimer: null,
|
|
258
|
+
deferTimer: null,
|
|
259
|
+
absoluteTimer: null,
|
|
260
|
+
};
|
|
261
|
+
this.turns.set(contextId, state);
|
|
262
|
+
this.scheduleAbsoluteCap(state);
|
|
263
|
+
return state;
|
|
264
|
+
}
|
|
265
|
+
// Armed once at turn onset; never rescheduled so continuous noise cannot starve the ceiling.
|
|
266
|
+
scheduleAbsoluteCap(state) {
|
|
267
|
+
if (state.finalized || state.absoluteTimer || this.maxTurnDurationMs <= 0)
|
|
268
|
+
return;
|
|
269
|
+
state.absoluteTimer = setTimeout(() => {
|
|
270
|
+
state.absoluteTimer = null;
|
|
271
|
+
this.onAbsoluteCap(state);
|
|
272
|
+
}, this.maxTurnDurationMs);
|
|
273
|
+
}
|
|
274
|
+
clearAbsoluteCap(state) {
|
|
275
|
+
if (state.absoluteTimer)
|
|
276
|
+
clearTimeout(state.absoluteTimer);
|
|
277
|
+
state.absoluteTimer = null;
|
|
278
|
+
}
|
|
279
|
+
onAbsoluteCap(state) {
|
|
280
|
+
if (state.finalized)
|
|
281
|
+
return;
|
|
282
|
+
const transcript = latestTranscript(state.finalSegments, state.latestInterim);
|
|
283
|
+
if (!transcript.trim() && state.finalPackets.length === 0) {
|
|
284
|
+
clearTurnTimers(state);
|
|
285
|
+
this.clearAbsoluteCap(state);
|
|
286
|
+
this.turns.delete(state.contextId);
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
state.boundaryAnalyzed = true;
|
|
290
|
+
state.smartTurnComplete = true;
|
|
291
|
+
state.semanticComplete = true;
|
|
292
|
+
this.requestSttFinalize(state.contextId);
|
|
293
|
+
if (state.finalPackets.length > 0) {
|
|
294
|
+
this.finalize(state);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
scheduleFinalize(state, delayMs) {
|
|
298
|
+
if (state.finalized || state.finalizeTimer)
|
|
299
|
+
return;
|
|
300
|
+
state.finalizeTimer = setTimeout(() => {
|
|
301
|
+
state.finalizeTimer = null;
|
|
302
|
+
this.finalize(state);
|
|
303
|
+
}, delayMs);
|
|
304
|
+
}
|
|
305
|
+
scheduleIncompleteFallback(state) {
|
|
306
|
+
if (state.finalized || state.finalizeTimer)
|
|
307
|
+
return;
|
|
308
|
+
state.finalizeTimer = setTimeout(() => {
|
|
309
|
+
state.finalizeTimer = null;
|
|
310
|
+
state.smartTurnComplete = true;
|
|
311
|
+
if (state.finalPackets.length > 0) {
|
|
312
|
+
this.finalize(state);
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
this.requestSttFinalize(state.contextId);
|
|
316
|
+
}, this.incompleteFallbackMs);
|
|
317
|
+
}
|
|
318
|
+
scheduleSemanticShortcut(state) {
|
|
319
|
+
if (state.finalized || state.finalizeTimer)
|
|
320
|
+
return;
|
|
321
|
+
state.finalizeTimer = setTimeout(() => {
|
|
322
|
+
state.finalizeTimer = null;
|
|
323
|
+
state.smartTurnComplete = true;
|
|
324
|
+
this.requestSttFinalize(state.contextId);
|
|
325
|
+
if (state.finalPackets.length > 0) {
|
|
326
|
+
this.finalize(state);
|
|
327
|
+
}
|
|
328
|
+
}, this.semanticShortcutDelayMs);
|
|
329
|
+
}
|
|
330
|
+
scheduleSemanticDefer(state) {
|
|
331
|
+
if (state.finalized || state.deferTimer)
|
|
332
|
+
return;
|
|
333
|
+
state.deferTimer = setTimeout(() => {
|
|
334
|
+
state.deferTimer = null;
|
|
335
|
+
if (state.finalized || state.speechActive)
|
|
336
|
+
return;
|
|
337
|
+
const transcript = latestTranscript(state.finalSegments, state.latestInterim);
|
|
338
|
+
const semantic = scoreSemanticCompleteness(transcript);
|
|
339
|
+
state.smartTurnComplete = true;
|
|
340
|
+
this.requestSttFinalize(state.contextId);
|
|
341
|
+
if (state.finalPackets.length > 0) {
|
|
342
|
+
if (semantic.complete) {
|
|
343
|
+
state.semanticComplete = true;
|
|
344
|
+
this.scheduleFinalize(state, this.finalizeDelayMs);
|
|
345
|
+
}
|
|
346
|
+
else {
|
|
347
|
+
this.finalize(state);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}, this.semanticDeferFallbackMs);
|
|
351
|
+
}
|
|
352
|
+
fusionConfig() {
|
|
353
|
+
return {
|
|
354
|
+
enabled: this.semanticEndpointingEnabled,
|
|
355
|
+
finalizeDelayMs: this.finalizeDelayMs,
|
|
356
|
+
semanticShortcutDelayMs: this.semanticShortcutDelayMs,
|
|
357
|
+
incompleteFallbackMs: this.incompleteFallbackMs,
|
|
358
|
+
minSpeechMs: this.minSpeechMs,
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
armSttQuietFallback(state) {
|
|
362
|
+
if (this.sttQuietFallbackMs <= 0 || state.finalized)
|
|
363
|
+
return;
|
|
364
|
+
if (state.sttQuietTimer)
|
|
365
|
+
clearTimeout(state.sttQuietTimer);
|
|
366
|
+
state.sttQuietTimer = setTimeout(() => {
|
|
367
|
+
state.sttQuietTimer = null;
|
|
368
|
+
if (state.finalized || !state.speechActive || state.finalPackets.length === 0)
|
|
369
|
+
return;
|
|
370
|
+
this.bus?.push(Route.Main, {
|
|
371
|
+
kind: "metric.conversation",
|
|
372
|
+
contextId: state.contextId,
|
|
373
|
+
timestampMs: Date.now(),
|
|
374
|
+
name: "eos.stt_quiet_fallback",
|
|
375
|
+
value: String(this.sttQuietFallbackMs),
|
|
376
|
+
});
|
|
377
|
+
void this.analyzeBoundary(state);
|
|
378
|
+
}, this.sttQuietFallbackMs);
|
|
379
|
+
}
|
|
380
|
+
scheduleMaxFinalize(state) {
|
|
381
|
+
if (state.finalized || state.maxTimer || this.maxDelayMs <= 0)
|
|
382
|
+
return;
|
|
383
|
+
state.maxTimer = setTimeout(() => {
|
|
384
|
+
state.maxTimer = null;
|
|
385
|
+
this.finalize(state);
|
|
386
|
+
}, this.maxDelayMs);
|
|
387
|
+
}
|
|
388
|
+
handleTtsAudio(pkt) {
|
|
389
|
+
if (!this.lockedContextIds.has(pkt.contextId))
|
|
390
|
+
return;
|
|
391
|
+
this.lockedContextsWithAssistantAudio.add(pkt.contextId);
|
|
392
|
+
const sampleRate = pkt.sampleRateHz > 0 ? pkt.sampleRateHz : SAMPLE_RATE;
|
|
393
|
+
const chunkMs = (pkt.audio.byteLength / 2 / sampleRate) * 1000;
|
|
394
|
+
const existing = this.lockedPlayout.get(pkt.contextId);
|
|
395
|
+
if (existing) {
|
|
396
|
+
existing.audioMs += chunkMs;
|
|
397
|
+
}
|
|
398
|
+
else {
|
|
399
|
+
this.lockedPlayout.set(pkt.contextId, {
|
|
400
|
+
audioMs: chunkMs,
|
|
401
|
+
firstAudioAtMs: Date.now(),
|
|
402
|
+
timer: null,
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
handleTtsEnd(pkt) {
|
|
407
|
+
if (!this.lockedContextsWithAssistantAudio.has(pkt.contextId)) {
|
|
408
|
+
this.releaseContextLock(pkt.contextId);
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
411
|
+
// The lock is released by `tts.playout_progress {complete}` when the client sends it.
|
|
412
|
+
// Fallback for clients that never do: release once the assistant audio should have
|
|
413
|
+
// finished playing (estimated from the emitted bytes), so the next turn isn't stalled.
|
|
414
|
+
const contextId = pkt.contextId;
|
|
415
|
+
const playout = this.lockedPlayout.get(contextId);
|
|
416
|
+
const remainingMs = playout
|
|
417
|
+
? Math.max(0, playout.firstAudioAtMs + playout.audioMs - Date.now())
|
|
418
|
+
: 0;
|
|
419
|
+
const timer = setTimeout(() => this.releaseContextLock(contextId), remainingMs + LOCK_RELEASE_GRACE_MS);
|
|
420
|
+
if (playout) {
|
|
421
|
+
if (playout.timer)
|
|
422
|
+
clearTimeout(playout.timer);
|
|
423
|
+
playout.timer = timer;
|
|
424
|
+
}
|
|
425
|
+
else {
|
|
426
|
+
this.lockedPlayout.set(contextId, { audioMs: 0, firstAudioAtMs: Date.now(), timer });
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
handleTtsPlayoutProgress(pkt) {
|
|
430
|
+
if (pkt.complete)
|
|
431
|
+
this.releaseContextLock(pkt.contextId);
|
|
432
|
+
}
|
|
433
|
+
releaseContextLock(contextId) {
|
|
434
|
+
this.lockedContextIds.delete(contextId);
|
|
435
|
+
this.lockedContextsWithAssistantAudio.delete(contextId);
|
|
436
|
+
const playout = this.lockedPlayout.get(contextId);
|
|
437
|
+
if (playout?.timer)
|
|
438
|
+
clearTimeout(playout.timer);
|
|
439
|
+
this.lockedPlayout.delete(contextId);
|
|
440
|
+
}
|
|
441
|
+
finalize(state) {
|
|
442
|
+
const text = state.finalSegments.join(" ").replace(/\s+/g, " ").trim();
|
|
443
|
+
if (state.finalized || state.finalPackets.length === 0 || !text)
|
|
444
|
+
return;
|
|
445
|
+
state.finalized = true;
|
|
446
|
+
this.lockedContextIds.add(state.contextId);
|
|
447
|
+
clearTurnTimers(state);
|
|
448
|
+
this.clearAbsoluteCap(state);
|
|
449
|
+
this.bus?.push(Route.Main, {
|
|
450
|
+
kind: "eos.turn_complete",
|
|
451
|
+
contextId: state.contextId,
|
|
452
|
+
timestampMs: Date.now(),
|
|
453
|
+
text,
|
|
454
|
+
transcripts: state.finalPackets,
|
|
455
|
+
endpointingOwner: "smart_turn",
|
|
456
|
+
endpointingReason: "end_of_speech",
|
|
457
|
+
});
|
|
458
|
+
this.turns.delete(state.contextId);
|
|
459
|
+
}
|
|
460
|
+
requestSttFinalize(contextId) {
|
|
461
|
+
this.bus?.push(Route.Critical, {
|
|
462
|
+
kind: "stt.finalize",
|
|
463
|
+
contextId,
|
|
464
|
+
timestampMs: Date.now(),
|
|
465
|
+
});
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
function appendFinalPacket(state, packet) {
|
|
469
|
+
const text = packet.text.trim();
|
|
470
|
+
if (state.finalSegments.at(-1) === text)
|
|
471
|
+
return;
|
|
472
|
+
state.finalSegments.push(text);
|
|
473
|
+
state.finalPackets.push(packet);
|
|
474
|
+
}
|
|
475
|
+
function clearTurnTimers(state) {
|
|
476
|
+
if (state.finalizeTimer)
|
|
477
|
+
clearTimeout(state.finalizeTimer);
|
|
478
|
+
if (state.sttQuietTimer)
|
|
479
|
+
clearTimeout(state.sttQuietTimer);
|
|
480
|
+
if (state.maxTimer)
|
|
481
|
+
clearTimeout(state.maxTimer);
|
|
482
|
+
if (state.deferTimer)
|
|
483
|
+
clearTimeout(state.deferTimer);
|
|
484
|
+
state.finalizeTimer = null;
|
|
485
|
+
state.sttQuietTimer = null;
|
|
486
|
+
state.maxTimer = null;
|
|
487
|
+
state.deferTimer = null;
|
|
488
|
+
}
|
|
489
|
+
function readBooleanConfig(value, fallback) {
|
|
490
|
+
if (typeof value === "boolean")
|
|
491
|
+
return value;
|
|
492
|
+
return fallback;
|
|
493
|
+
}
|
|
494
|
+
function readNonNegativeNumber(value, fallback) {
|
|
495
|
+
if (typeof value !== "number" || !Number.isFinite(value))
|
|
496
|
+
return fallback;
|
|
497
|
+
return Math.max(0, Math.floor(value));
|
|
498
|
+
}
|
|
499
|
+
function readProbability(value, fallback) {
|
|
500
|
+
if (typeof value !== "number" || !Number.isFinite(value))
|
|
501
|
+
return fallback;
|
|
502
|
+
return Math.min(1, Math.max(0, value));
|
|
503
|
+
}
|
|
504
|
+
//# sourceMappingURL=eos-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eos-plugin.js","sourceRoot":"","sources":["../src/eos-plugin.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { PipecatEOSPlugin as PipecatEOSPluginBase } from "./eos-plugin.js";
|
|
2
|
+
import { type SmartTurnPredictor } from "./predictor.js";
|
|
3
|
+
/** Node-facing EOS plugin: defaults to the local ONNX Smart Turn predictor. */
|
|
4
|
+
export declare class PipecatEOSPlugin extends PipecatEOSPluginBase {
|
|
5
|
+
constructor(predictor?: SmartTurnPredictor);
|
|
6
|
+
}
|
|
7
|
+
export { fuseEndpointDecision, latestTranscript, scoreSemanticCompleteness, type EndpointFusionDecision, type SemanticCompletenessLabel, type SemanticCompletenessScore, type SemanticEndpointFusionConfig, } from "./semantic-completeness.js";
|
|
8
|
+
export { SEMANTIC_LABELED_UTTERANCES, type SemanticLabeledUtterance } from "./semantic-fixtures.js";
|
|
9
|
+
export { LocalSmartTurnV3Predictor, type SmartTurnPredictor } from "./predictor.js";
|
|
10
|
+
export { SmartTurnInteractionPolicy, type SmartTurnInteractionPolicyConfig, } from "./interaction-policy.js";
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,gBAAgB,IAAI,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAA6B,KAAK,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEpF,+EAA+E;AAC/E,qBAAa,gBAAiB,SAAQ,oBAAoB;gBAC5C,SAAS,GAAE,kBAAoD;CAG5E;AAED,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,yBAAyB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAC9B,KAAK,4BAA4B,GAClC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,2BAA2B,EAAE,KAAK,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AACpG,OAAO,EAAE,yBAAyB,EAAE,KAAK,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpF,OAAO,EACL,0BAA0B,EAC1B,KAAK,gCAAgC,GACtC,MAAM,yBAAyB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
//
|
|
3
|
+
// Syrinx Kernel v2 - Pipecat Smart Turn Plugin
|
|
4
|
+
//
|
|
5
|
+
// Mirrors Pipecat's LocalSmartTurnAnalyzerV3 turn-stop strategy:
|
|
6
|
+
// Silero determines candidate speech boundaries, then Smart Turn v3 decides
|
|
7
|
+
// whether a pause is an actual completed user turn.
|
|
8
|
+
//
|
|
9
|
+
// Node / local default: `new PipecatEOSPlugin()` uses LocalSmartTurnV3Predictor
|
|
10
|
+
// (onnxruntime-node). Edge hosts must import from `@kuralle-syrinx/pipecat-smart-turn/eos`
|
|
11
|
+
// and inject a non-ONNX predictor (e.g. WorkersAiSmartTurnPredictor).
|
|
12
|
+
import { PipecatEOSPlugin as PipecatEOSPluginBase } from "./eos-plugin.js";
|
|
13
|
+
import { LocalSmartTurnV3Predictor } from "./predictor.js";
|
|
14
|
+
/** Node-facing EOS plugin: defaults to the local ONNX Smart Turn predictor. */
|
|
15
|
+
export class PipecatEOSPlugin extends PipecatEOSPluginBase {
|
|
16
|
+
constructor(predictor = new LocalSmartTurnV3Predictor()) {
|
|
17
|
+
super(predictor);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export { fuseEndpointDecision, latestTranscript, scoreSemanticCompleteness, } from "./semantic-completeness.js";
|
|
21
|
+
export { SEMANTIC_LABELED_UTTERANCES } from "./semantic-fixtures.js";
|
|
22
|
+
export { LocalSmartTurnV3Predictor } from "./predictor.js";
|
|
23
|
+
export { SmartTurnInteractionPolicy, } from "./interaction-policy.js";
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,EAAE;AACF,+CAA+C;AAC/C,EAAE;AACF,iEAAiE;AACjE,4EAA4E;AAC5E,oDAAoD;AACpD,EAAE;AACF,gFAAgF;AAChF,2FAA2F;AAC3F,sEAAsE;AAEtE,OAAO,EAAE,gBAAgB,IAAI,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,yBAAyB,EAA2B,MAAM,gBAAgB,CAAC;AAEpF,+EAA+E;AAC/E,MAAM,OAAO,gBAAiB,SAAQ,oBAAoB;IACxD,YAAY,YAAgC,IAAI,yBAAyB,EAAE;QACzE,KAAK,CAAC,SAAS,CAAC,CAAC;IACnB,CAAC;CACF;AAED,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,yBAAyB,GAK1B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,2BAA2B,EAAiC,MAAM,wBAAwB,CAAC;AACpG,OAAO,EAAE,yBAAyB,EAA2B,MAAM,gBAAgB,CAAC;AACpF,OAAO,EACL,0BAA0B,GAE3B,MAAM,yBAAyB,CAAC"}
|