@absolutejs/voice 0.0.22-beta.664 → 0.0.22-beta.666
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/angular/index.js +21 -0
- package/dist/client/actions.d.ts +37 -0
- package/dist/client/htmxBootstrap.js +21 -0
- package/dist/client/index.js +29 -0
- package/dist/core/types.d.ts +15 -1
- package/dist/embed/index.js +21 -0
- package/dist/embed/voice-widget.js +4 -4
- package/dist/index.js +45 -102
- package/dist/react/index.js +21 -0
- package/dist/react/useVoiceController.d.ts +1 -0
- package/dist/react/useVoiceStream.d.ts +1 -0
- package/dist/svelte/index.js +21 -0
- package/dist/telephony/plivo.d.ts +3 -4
- package/dist/telephony/telnyx.d.ts +3 -4
- package/dist/testing/index.js +69 -24
- package/dist/vue/index.js +21 -0
- package/package.json +1 -1
package/dist/angular/index.js
CHANGED
|
@@ -511,6 +511,11 @@ var serverMessageToAction = (message) => {
|
|
|
511
511
|
transcript: message.transcript,
|
|
512
512
|
type: "partial"
|
|
513
513
|
};
|
|
514
|
+
case "playback_rate":
|
|
515
|
+
return {
|
|
516
|
+
rate: message.rate,
|
|
517
|
+
type: "playback_rate"
|
|
518
|
+
};
|
|
514
519
|
case "replay":
|
|
515
520
|
return {
|
|
516
521
|
assistantTexts: message.assistantTexts,
|
|
@@ -693,6 +698,7 @@ var isVoiceServerMessage = (value) => {
|
|
|
693
698
|
case "error":
|
|
694
699
|
case "final":
|
|
695
700
|
case "partial":
|
|
701
|
+
case "playback_rate":
|
|
696
702
|
case "pong":
|
|
697
703
|
case "replay":
|
|
698
704
|
case "session":
|
|
@@ -1119,6 +1125,7 @@ var createInitialState = () => ({
|
|
|
1119
1125
|
isConnected: false,
|
|
1120
1126
|
paused: false,
|
|
1121
1127
|
partial: "",
|
|
1128
|
+
playbackRate: null,
|
|
1122
1129
|
reconnect: createInitialReconnectState(),
|
|
1123
1130
|
scenarioId: null,
|
|
1124
1131
|
sessionId: null,
|
|
@@ -1227,6 +1234,12 @@ var createVoiceStreamStore = () => {
|
|
|
1227
1234
|
partial: joinPartial(turnFinalText, action.transcript.text)
|
|
1228
1235
|
};
|
|
1229
1236
|
break;
|
|
1237
|
+
case "playback_rate":
|
|
1238
|
+
state = {
|
|
1239
|
+
...state,
|
|
1240
|
+
playbackRate: Math.max(0.5, Math.min(2, action.rate))
|
|
1241
|
+
};
|
|
1242
|
+
break;
|
|
1230
1243
|
case "replay":
|
|
1231
1244
|
turnFinalText = action.partial;
|
|
1232
1245
|
state = {
|
|
@@ -1392,6 +1405,9 @@ var createVoiceStream = (path, options = {}) => {
|
|
|
1392
1405
|
get partial() {
|
|
1393
1406
|
return store.getSnapshot().partial;
|
|
1394
1407
|
},
|
|
1408
|
+
get playbackRate() {
|
|
1409
|
+
return store.getSnapshot().playbackRate;
|
|
1410
|
+
},
|
|
1395
1411
|
get paused() {
|
|
1396
1412
|
return store.getSnapshot().paused;
|
|
1397
1413
|
},
|
|
@@ -1764,6 +1780,7 @@ var createInitialState2 = (stream) => ({
|
|
|
1764
1780
|
paused: stream.paused,
|
|
1765
1781
|
pauseExpiresAt: stream.pauseExpiresAt,
|
|
1766
1782
|
partial: stream.partial,
|
|
1783
|
+
playbackRate: stream.playbackRate,
|
|
1767
1784
|
reconnect: stream.reconnect,
|
|
1768
1785
|
recordingError: null,
|
|
1769
1786
|
sessionId: stream.sessionId,
|
|
@@ -1801,6 +1818,7 @@ var createVoiceController = (path, options = {}) => {
|
|
|
1801
1818
|
paused: stream.paused,
|
|
1802
1819
|
pauseExpiresAt: stream.pauseExpiresAt,
|
|
1803
1820
|
partial: stream.partial,
|
|
1821
|
+
playbackRate: stream.playbackRate,
|
|
1804
1822
|
reconnect: stream.reconnect,
|
|
1805
1823
|
sessionId: stream.sessionId,
|
|
1806
1824
|
sessionMetadata: stream.sessionMetadata,
|
|
@@ -1947,6 +1965,9 @@ var createVoiceController = (path, options = {}) => {
|
|
|
1947
1965
|
get partial() {
|
|
1948
1966
|
return state.partial;
|
|
1949
1967
|
},
|
|
1968
|
+
get playbackRate() {
|
|
1969
|
+
return state.playbackRate;
|
|
1970
|
+
},
|
|
1950
1971
|
get paused() {
|
|
1951
1972
|
return state.paused;
|
|
1952
1973
|
},
|
package/dist/client/actions.d.ts
CHANGED
|
@@ -13,6 +13,7 @@ export declare const serverMessageToAction: <TResult = unknown>(message: VoiceSe
|
|
|
13
13
|
message?: undefined;
|
|
14
14
|
recoverable?: undefined;
|
|
15
15
|
transcript?: undefined;
|
|
16
|
+
rate?: undefined;
|
|
16
17
|
assistantTexts?: undefined;
|
|
17
18
|
call?: undefined;
|
|
18
19
|
partial?: undefined;
|
|
@@ -37,6 +38,7 @@ export declare const serverMessageToAction: <TResult = unknown>(message: VoiceSe
|
|
|
37
38
|
message?: undefined;
|
|
38
39
|
recoverable?: undefined;
|
|
39
40
|
transcript?: undefined;
|
|
41
|
+
rate?: undefined;
|
|
40
42
|
assistantTexts?: undefined;
|
|
41
43
|
call?: undefined;
|
|
42
44
|
partial?: undefined;
|
|
@@ -61,6 +63,7 @@ export declare const serverMessageToAction: <TResult = unknown>(message: VoiceSe
|
|
|
61
63
|
message?: undefined;
|
|
62
64
|
recoverable?: undefined;
|
|
63
65
|
transcript?: undefined;
|
|
66
|
+
rate?: undefined;
|
|
64
67
|
assistantTexts?: undefined;
|
|
65
68
|
call?: undefined;
|
|
66
69
|
partial?: undefined;
|
|
@@ -85,6 +88,7 @@ export declare const serverMessageToAction: <TResult = unknown>(message: VoiceSe
|
|
|
85
88
|
message?: undefined;
|
|
86
89
|
recoverable?: undefined;
|
|
87
90
|
transcript?: undefined;
|
|
91
|
+
rate?: undefined;
|
|
88
92
|
assistantTexts?: undefined;
|
|
89
93
|
call?: undefined;
|
|
90
94
|
partial?: undefined;
|
|
@@ -109,6 +113,7 @@ export declare const serverMessageToAction: <TResult = unknown>(message: VoiceSe
|
|
|
109
113
|
message?: undefined;
|
|
110
114
|
recoverable?: undefined;
|
|
111
115
|
transcript?: undefined;
|
|
116
|
+
rate?: undefined;
|
|
112
117
|
assistantTexts?: undefined;
|
|
113
118
|
call?: undefined;
|
|
114
119
|
partial?: undefined;
|
|
@@ -133,6 +138,7 @@ export declare const serverMessageToAction: <TResult = unknown>(message: VoiceSe
|
|
|
133
138
|
message?: undefined;
|
|
134
139
|
recoverable?: undefined;
|
|
135
140
|
transcript?: undefined;
|
|
141
|
+
rate?: undefined;
|
|
136
142
|
assistantTexts?: undefined;
|
|
137
143
|
call?: undefined;
|
|
138
144
|
partial?: undefined;
|
|
@@ -157,6 +163,7 @@ export declare const serverMessageToAction: <TResult = unknown>(message: VoiceSe
|
|
|
157
163
|
reconnect?: undefined;
|
|
158
164
|
event?: undefined;
|
|
159
165
|
transcript?: undefined;
|
|
166
|
+
rate?: undefined;
|
|
160
167
|
assistantTexts?: undefined;
|
|
161
168
|
call?: undefined;
|
|
162
169
|
partial?: undefined;
|
|
@@ -181,6 +188,7 @@ export declare const serverMessageToAction: <TResult = unknown>(message: VoiceSe
|
|
|
181
188
|
event?: undefined;
|
|
182
189
|
message?: undefined;
|
|
183
190
|
recoverable?: undefined;
|
|
191
|
+
rate?: undefined;
|
|
184
192
|
assistantTexts?: undefined;
|
|
185
193
|
call?: undefined;
|
|
186
194
|
partial?: undefined;
|
|
@@ -205,6 +213,32 @@ export declare const serverMessageToAction: <TResult = unknown>(message: VoiceSe
|
|
|
205
213
|
event?: undefined;
|
|
206
214
|
message?: undefined;
|
|
207
215
|
recoverable?: undefined;
|
|
216
|
+
rate?: undefined;
|
|
217
|
+
assistantTexts?: undefined;
|
|
218
|
+
call?: undefined;
|
|
219
|
+
partial?: undefined;
|
|
220
|
+
scenarioId?: undefined;
|
|
221
|
+
sessionMetadata?: undefined;
|
|
222
|
+
status?: undefined;
|
|
223
|
+
turns?: undefined;
|
|
224
|
+
paused?: undefined;
|
|
225
|
+
pauseExpiresAt?: undefined;
|
|
226
|
+
turn?: undefined;
|
|
227
|
+
} | {
|
|
228
|
+
rate: number;
|
|
229
|
+
type: "playback_rate";
|
|
230
|
+
chunk?: undefined;
|
|
231
|
+
format?: undefined;
|
|
232
|
+
receivedAt?: undefined;
|
|
233
|
+
turnId?: undefined;
|
|
234
|
+
text?: undefined;
|
|
235
|
+
delta?: undefined;
|
|
236
|
+
sessionId?: undefined;
|
|
237
|
+
reconnect?: undefined;
|
|
238
|
+
event?: undefined;
|
|
239
|
+
message?: undefined;
|
|
240
|
+
recoverable?: undefined;
|
|
241
|
+
transcript?: undefined;
|
|
208
242
|
assistantTexts?: undefined;
|
|
209
243
|
call?: undefined;
|
|
210
244
|
partial?: undefined;
|
|
@@ -236,6 +270,7 @@ export declare const serverMessageToAction: <TResult = unknown>(message: VoiceSe
|
|
|
236
270
|
message?: undefined;
|
|
237
271
|
recoverable?: undefined;
|
|
238
272
|
transcript?: undefined;
|
|
273
|
+
rate?: undefined;
|
|
239
274
|
paused?: undefined;
|
|
240
275
|
pauseExpiresAt?: undefined;
|
|
241
276
|
turn?: undefined;
|
|
@@ -258,6 +293,7 @@ export declare const serverMessageToAction: <TResult = unknown>(message: VoiceSe
|
|
|
258
293
|
message?: undefined;
|
|
259
294
|
recoverable?: undefined;
|
|
260
295
|
transcript?: undefined;
|
|
296
|
+
rate?: undefined;
|
|
261
297
|
assistantTexts?: undefined;
|
|
262
298
|
call?: undefined;
|
|
263
299
|
partial?: undefined;
|
|
@@ -278,6 +314,7 @@ export declare const serverMessageToAction: <TResult = unknown>(message: VoiceSe
|
|
|
278
314
|
message?: undefined;
|
|
279
315
|
recoverable?: undefined;
|
|
280
316
|
transcript?: undefined;
|
|
317
|
+
rate?: undefined;
|
|
281
318
|
assistantTexts?: undefined;
|
|
282
319
|
call?: undefined;
|
|
283
320
|
partial?: undefined;
|
|
@@ -279,6 +279,11 @@ var serverMessageToAction = (message) => {
|
|
|
279
279
|
transcript: message.transcript,
|
|
280
280
|
type: "partial"
|
|
281
281
|
};
|
|
282
|
+
case "playback_rate":
|
|
283
|
+
return {
|
|
284
|
+
rate: message.rate,
|
|
285
|
+
type: "playback_rate"
|
|
286
|
+
};
|
|
282
287
|
case "replay":
|
|
283
288
|
return {
|
|
284
289
|
assistantTexts: message.assistantTexts,
|
|
@@ -610,6 +615,7 @@ var isVoiceServerMessage = (value) => {
|
|
|
610
615
|
case "error":
|
|
611
616
|
case "final":
|
|
612
617
|
case "partial":
|
|
618
|
+
case "playback_rate":
|
|
613
619
|
case "pong":
|
|
614
620
|
case "replay":
|
|
615
621
|
case "session":
|
|
@@ -1036,6 +1042,7 @@ var createInitialState = () => ({
|
|
|
1036
1042
|
isConnected: false,
|
|
1037
1043
|
paused: false,
|
|
1038
1044
|
partial: "",
|
|
1045
|
+
playbackRate: null,
|
|
1039
1046
|
reconnect: createInitialReconnectState(),
|
|
1040
1047
|
scenarioId: null,
|
|
1041
1048
|
sessionId: null,
|
|
@@ -1144,6 +1151,12 @@ var createVoiceStreamStore = () => {
|
|
|
1144
1151
|
partial: joinPartial(turnFinalText, action.transcript.text)
|
|
1145
1152
|
};
|
|
1146
1153
|
break;
|
|
1154
|
+
case "playback_rate":
|
|
1155
|
+
state = {
|
|
1156
|
+
...state,
|
|
1157
|
+
playbackRate: Math.max(0.5, Math.min(2, action.rate))
|
|
1158
|
+
};
|
|
1159
|
+
break;
|
|
1147
1160
|
case "replay":
|
|
1148
1161
|
turnFinalText = action.partial;
|
|
1149
1162
|
state = {
|
|
@@ -1309,6 +1322,9 @@ var createVoiceStream = (path, options = {}) => {
|
|
|
1309
1322
|
get partial() {
|
|
1310
1323
|
return store.getSnapshot().partial;
|
|
1311
1324
|
},
|
|
1325
|
+
get playbackRate() {
|
|
1326
|
+
return store.getSnapshot().playbackRate;
|
|
1327
|
+
},
|
|
1312
1328
|
get paused() {
|
|
1313
1329
|
return store.getSnapshot().paused;
|
|
1314
1330
|
},
|
|
@@ -1644,6 +1660,7 @@ var createInitialState2 = (stream) => ({
|
|
|
1644
1660
|
paused: stream.paused,
|
|
1645
1661
|
pauseExpiresAt: stream.pauseExpiresAt,
|
|
1646
1662
|
partial: stream.partial,
|
|
1663
|
+
playbackRate: stream.playbackRate,
|
|
1647
1664
|
reconnect: stream.reconnect,
|
|
1648
1665
|
recordingError: null,
|
|
1649
1666
|
sessionId: stream.sessionId,
|
|
@@ -1681,6 +1698,7 @@ var createVoiceController = (path, options = {}) => {
|
|
|
1681
1698
|
paused: stream.paused,
|
|
1682
1699
|
pauseExpiresAt: stream.pauseExpiresAt,
|
|
1683
1700
|
partial: stream.partial,
|
|
1701
|
+
playbackRate: stream.playbackRate,
|
|
1684
1702
|
reconnect: stream.reconnect,
|
|
1685
1703
|
sessionId: stream.sessionId,
|
|
1686
1704
|
sessionMetadata: stream.sessionMetadata,
|
|
@@ -1827,6 +1845,9 @@ var createVoiceController = (path, options = {}) => {
|
|
|
1827
1845
|
get partial() {
|
|
1828
1846
|
return state.partial;
|
|
1829
1847
|
},
|
|
1848
|
+
get playbackRate() {
|
|
1849
|
+
return state.playbackRate;
|
|
1850
|
+
},
|
|
1830
1851
|
get paused() {
|
|
1831
1852
|
return state.paused;
|
|
1832
1853
|
},
|
package/dist/client/index.js
CHANGED
|
@@ -172,6 +172,7 @@ var isVoiceServerMessage = (value) => {
|
|
|
172
172
|
case "error":
|
|
173
173
|
case "final":
|
|
174
174
|
case "partial":
|
|
175
|
+
case "playback_rate":
|
|
175
176
|
case "pong":
|
|
176
177
|
case "replay":
|
|
177
178
|
case "session":
|
|
@@ -1376,6 +1377,11 @@ var serverMessageToAction = (message) => {
|
|
|
1376
1377
|
transcript: message.transcript,
|
|
1377
1378
|
type: "partial"
|
|
1378
1379
|
};
|
|
1380
|
+
case "playback_rate":
|
|
1381
|
+
return {
|
|
1382
|
+
rate: message.rate,
|
|
1383
|
+
type: "playback_rate"
|
|
1384
|
+
};
|
|
1379
1385
|
case "replay":
|
|
1380
1386
|
return {
|
|
1381
1387
|
assistantTexts: message.assistantTexts,
|
|
@@ -1522,6 +1528,7 @@ var createInitialState2 = () => ({
|
|
|
1522
1528
|
isConnected: false,
|
|
1523
1529
|
paused: false,
|
|
1524
1530
|
partial: "",
|
|
1531
|
+
playbackRate: null,
|
|
1525
1532
|
reconnect: createInitialReconnectState(),
|
|
1526
1533
|
scenarioId: null,
|
|
1527
1534
|
sessionId: null,
|
|
@@ -1630,6 +1637,12 @@ var createVoiceStreamStore = () => {
|
|
|
1630
1637
|
partial: joinPartial(turnFinalText, action.transcript.text)
|
|
1631
1638
|
};
|
|
1632
1639
|
break;
|
|
1640
|
+
case "playback_rate":
|
|
1641
|
+
state = {
|
|
1642
|
+
...state,
|
|
1643
|
+
playbackRate: Math.max(0.5, Math.min(2, action.rate))
|
|
1644
|
+
};
|
|
1645
|
+
break;
|
|
1633
1646
|
case "replay":
|
|
1634
1647
|
turnFinalText = action.partial;
|
|
1635
1648
|
state = {
|
|
@@ -1795,6 +1808,9 @@ var createVoiceStream = (path, options = {}) => {
|
|
|
1795
1808
|
get partial() {
|
|
1796
1809
|
return store.getSnapshot().partial;
|
|
1797
1810
|
},
|
|
1811
|
+
get playbackRate() {
|
|
1812
|
+
return store.getSnapshot().playbackRate;
|
|
1813
|
+
},
|
|
1798
1814
|
get paused() {
|
|
1799
1815
|
return store.getSnapshot().paused;
|
|
1800
1816
|
},
|
|
@@ -2360,6 +2376,7 @@ var createInitialState3 = (stream) => ({
|
|
|
2360
2376
|
paused: stream.paused,
|
|
2361
2377
|
pauseExpiresAt: stream.pauseExpiresAt,
|
|
2362
2378
|
partial: stream.partial,
|
|
2379
|
+
playbackRate: stream.playbackRate,
|
|
2363
2380
|
reconnect: stream.reconnect,
|
|
2364
2381
|
recordingError: null,
|
|
2365
2382
|
sessionId: stream.sessionId,
|
|
@@ -2397,6 +2414,7 @@ var createVoiceController = (path, options = {}) => {
|
|
|
2397
2414
|
paused: stream.paused,
|
|
2398
2415
|
pauseExpiresAt: stream.pauseExpiresAt,
|
|
2399
2416
|
partial: stream.partial,
|
|
2417
|
+
playbackRate: stream.playbackRate,
|
|
2400
2418
|
reconnect: stream.reconnect,
|
|
2401
2419
|
sessionId: stream.sessionId,
|
|
2402
2420
|
sessionMetadata: stream.sessionMetadata,
|
|
@@ -2543,6 +2561,9 @@ var createVoiceController = (path, options = {}) => {
|
|
|
2543
2561
|
get partial() {
|
|
2544
2562
|
return state.partial;
|
|
2545
2563
|
},
|
|
2564
|
+
get playbackRate() {
|
|
2565
|
+
return state.playbackRate;
|
|
2566
|
+
},
|
|
2546
2567
|
get paused() {
|
|
2547
2568
|
return state.paused;
|
|
2548
2569
|
},
|
|
@@ -2651,10 +2672,18 @@ var createVoiceDuplexController = (path, options = {}) => {
|
|
|
2651
2672
|
}
|
|
2652
2673
|
});
|
|
2653
2674
|
const audioPlayer = createVoiceAudioPlayer(controller, options.audioPlayer);
|
|
2675
|
+
let appliedPlaybackRate = controller.playbackRate;
|
|
2676
|
+
const unsubscribePlaybackRate = controller.subscribe(() => {
|
|
2677
|
+
if (controller.playbackRate !== null && controller.playbackRate !== appliedPlaybackRate) {
|
|
2678
|
+
appliedPlaybackRate = controller.playbackRate;
|
|
2679
|
+
audioPlayer.setPlaybackRate(controller.playbackRate);
|
|
2680
|
+
}
|
|
2681
|
+
});
|
|
2654
2682
|
bargeInBinding = bindVoiceBargeIn(controller, audioPlayer, options.bargeIn);
|
|
2655
2683
|
const close = () => {
|
|
2656
2684
|
bargeInBinding?.close();
|
|
2657
2685
|
bargeInBinding = null;
|
|
2686
|
+
unsubscribePlaybackRate();
|
|
2658
2687
|
audioPlayer.close();
|
|
2659
2688
|
controller.close();
|
|
2660
2689
|
};
|
package/dist/core/types.d.ts
CHANGED
|
@@ -601,6 +601,8 @@ export type VoiceSessionHandle<TContext = unknown, TSession extends VoiceSession
|
|
|
601
601
|
/** Lift a caller-driven pause: watchdogs re-arm and turns process again. */
|
|
602
602
|
resume: () => Promise<void>;
|
|
603
603
|
snapshot: () => Promise<TSession>;
|
|
604
|
+
/** Ask connected browser clients to change assistant-audio playback speed. */
|
|
605
|
+
setPlaybackRate: (rate: number) => Promise<number>;
|
|
604
606
|
/**
|
|
605
607
|
* Mutate the live turn-detection config for this session — useful when a
|
|
606
608
|
* tool call wants to dial silenceMs up ("the caller asked for more time")
|
|
@@ -1335,6 +1337,11 @@ export type VoiceServerAudioMessage = {
|
|
|
1335
1337
|
receivedAt: number;
|
|
1336
1338
|
turnId?: string;
|
|
1337
1339
|
};
|
|
1340
|
+
/** Requests a live assistant-audio playback-rate change in browser clients. */
|
|
1341
|
+
export type VoiceServerPlaybackRateMessage = {
|
|
1342
|
+
type: "playback_rate";
|
|
1343
|
+
rate: number;
|
|
1344
|
+
};
|
|
1338
1345
|
export type VoiceServerCompleteMessage = {
|
|
1339
1346
|
type: "complete";
|
|
1340
1347
|
sessionId: string;
|
|
@@ -1356,7 +1363,7 @@ export type VoiceServerConnectionMessage = {
|
|
|
1356
1363
|
type: "connection";
|
|
1357
1364
|
reconnect: VoiceReconnectClientState;
|
|
1358
1365
|
};
|
|
1359
|
-
export type VoiceServerMessage<TResult = unknown> = VoiceServerSessionMessage | VoiceServerReplayMessage<TResult> | VoiceServerPartialMessage | VoiceServerFinalMessage | VoiceServerTurnMessage<TResult> | VoiceServerAssistantMessage | VoiceServerAssistantDeltaMessage | VoiceServerAudioMessage | VoiceServerCallControlAckMessage | VoiceServerCallLifecycleMessage | VoiceServerCompleteMessage | VoiceServerErrorMessage | VoiceServerPongMessage | VoiceServerConnectionMessage;
|
|
1366
|
+
export type VoiceServerMessage<TResult = unknown> = VoiceServerSessionMessage | VoiceServerReplayMessage<TResult> | VoiceServerPartialMessage | VoiceServerFinalMessage | VoiceServerTurnMessage<TResult> | VoiceServerAssistantMessage | VoiceServerAssistantDeltaMessage | VoiceServerAudioMessage | VoiceServerPlaybackRateMessage | VoiceServerCallControlAckMessage | VoiceServerCallLifecycleMessage | VoiceServerCompleteMessage | VoiceServerErrorMessage | VoiceServerPongMessage | VoiceServerConnectionMessage;
|
|
1360
1367
|
export type VoiceConnectionOptions = {
|
|
1361
1368
|
browserMedia?: false | VoiceBrowserMediaReporterOptions;
|
|
1362
1369
|
protocols?: string[];
|
|
@@ -1559,6 +1566,8 @@ export type VoiceStreamState<TResult = unknown> = {
|
|
|
1559
1566
|
}>;
|
|
1560
1567
|
error: string | null;
|
|
1561
1568
|
isConnected: boolean;
|
|
1569
|
+
/** Latest server-requested assistant playback rate, or null if unchanged. */
|
|
1570
|
+
playbackRate: number | null;
|
|
1562
1571
|
};
|
|
1563
1572
|
export type VoiceStream<TResult = unknown> = {
|
|
1564
1573
|
call: VoiceCallLifecycleState | null;
|
|
@@ -1578,6 +1587,7 @@ export type VoiceStream<TResult = unknown> = {
|
|
|
1578
1587
|
getSnapshot: () => VoiceStreamState<TResult>;
|
|
1579
1588
|
isConnected: boolean;
|
|
1580
1589
|
partial: string;
|
|
1590
|
+
playbackRate: number | null;
|
|
1581
1591
|
reconnect: VoiceReconnectClientState;
|
|
1582
1592
|
sendAudio: (audio: Uint8Array | ArrayBuffer) => void;
|
|
1583
1593
|
simulateDisconnect: () => void;
|
|
@@ -1678,6 +1688,7 @@ export type VoiceController<TResult = unknown> = {
|
|
|
1678
1688
|
isConnected: boolean;
|
|
1679
1689
|
isRecording: boolean;
|
|
1680
1690
|
partial: string;
|
|
1691
|
+
playbackRate: number | null;
|
|
1681
1692
|
reconnect: VoiceReconnectClientState;
|
|
1682
1693
|
recordingError: string | null;
|
|
1683
1694
|
sendAudio: (audio: Uint8Array | ArrayBuffer) => void;
|
|
@@ -1762,6 +1773,9 @@ export type VoiceStoreAction<TResult = unknown> = {
|
|
|
1762
1773
|
type: "error";
|
|
1763
1774
|
message: string;
|
|
1764
1775
|
recoverable?: boolean;
|
|
1776
|
+
} | {
|
|
1777
|
+
type: "playback_rate";
|
|
1778
|
+
rate: number;
|
|
1765
1779
|
} | {
|
|
1766
1780
|
type: "connected";
|
|
1767
1781
|
} | {
|
package/dist/embed/index.js
CHANGED
|
@@ -276,6 +276,11 @@ var serverMessageToAction = (message) => {
|
|
|
276
276
|
transcript: message.transcript,
|
|
277
277
|
type: "partial"
|
|
278
278
|
};
|
|
279
|
+
case "playback_rate":
|
|
280
|
+
return {
|
|
281
|
+
rate: message.rate,
|
|
282
|
+
type: "playback_rate"
|
|
283
|
+
};
|
|
279
284
|
case "replay":
|
|
280
285
|
return {
|
|
281
286
|
assistantTexts: message.assistantTexts,
|
|
@@ -607,6 +612,7 @@ var isVoiceServerMessage = (value) => {
|
|
|
607
612
|
case "error":
|
|
608
613
|
case "final":
|
|
609
614
|
case "partial":
|
|
615
|
+
case "playback_rate":
|
|
610
616
|
case "pong":
|
|
611
617
|
case "replay":
|
|
612
618
|
case "session":
|
|
@@ -1033,6 +1039,7 @@ var createInitialState = () => ({
|
|
|
1033
1039
|
isConnected: false,
|
|
1034
1040
|
paused: false,
|
|
1035
1041
|
partial: "",
|
|
1042
|
+
playbackRate: null,
|
|
1036
1043
|
reconnect: createInitialReconnectState(),
|
|
1037
1044
|
scenarioId: null,
|
|
1038
1045
|
sessionId: null,
|
|
@@ -1141,6 +1148,12 @@ var createVoiceStreamStore = () => {
|
|
|
1141
1148
|
partial: joinPartial(turnFinalText, action.transcript.text)
|
|
1142
1149
|
};
|
|
1143
1150
|
break;
|
|
1151
|
+
case "playback_rate":
|
|
1152
|
+
state = {
|
|
1153
|
+
...state,
|
|
1154
|
+
playbackRate: Math.max(0.5, Math.min(2, action.rate))
|
|
1155
|
+
};
|
|
1156
|
+
break;
|
|
1144
1157
|
case "replay":
|
|
1145
1158
|
turnFinalText = action.partial;
|
|
1146
1159
|
state = {
|
|
@@ -1306,6 +1319,9 @@ var createVoiceStream = (path, options = {}) => {
|
|
|
1306
1319
|
get partial() {
|
|
1307
1320
|
return store.getSnapshot().partial;
|
|
1308
1321
|
},
|
|
1322
|
+
get playbackRate() {
|
|
1323
|
+
return store.getSnapshot().playbackRate;
|
|
1324
|
+
},
|
|
1309
1325
|
get paused() {
|
|
1310
1326
|
return store.getSnapshot().paused;
|
|
1311
1327
|
},
|
|
@@ -1641,6 +1657,7 @@ var createInitialState2 = (stream) => ({
|
|
|
1641
1657
|
paused: stream.paused,
|
|
1642
1658
|
pauseExpiresAt: stream.pauseExpiresAt,
|
|
1643
1659
|
partial: stream.partial,
|
|
1660
|
+
playbackRate: stream.playbackRate,
|
|
1644
1661
|
reconnect: stream.reconnect,
|
|
1645
1662
|
recordingError: null,
|
|
1646
1663
|
sessionId: stream.sessionId,
|
|
@@ -1678,6 +1695,7 @@ var createVoiceController = (path, options = {}) => {
|
|
|
1678
1695
|
paused: stream.paused,
|
|
1679
1696
|
pauseExpiresAt: stream.pauseExpiresAt,
|
|
1680
1697
|
partial: stream.partial,
|
|
1698
|
+
playbackRate: stream.playbackRate,
|
|
1681
1699
|
reconnect: stream.reconnect,
|
|
1682
1700
|
sessionId: stream.sessionId,
|
|
1683
1701
|
sessionMetadata: stream.sessionMetadata,
|
|
@@ -1824,6 +1842,9 @@ var createVoiceController = (path, options = {}) => {
|
|
|
1824
1842
|
get partial() {
|
|
1825
1843
|
return state.partial;
|
|
1826
1844
|
},
|
|
1845
|
+
get playbackRate() {
|
|
1846
|
+
return state.playbackRate;
|
|
1847
|
+
},
|
|
1827
1848
|
get paused() {
|
|
1828
1849
|
return state.paused;
|
|
1829
1850
|
},
|