@voicethere/client 0.8.0 → 0.8.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/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## 0.8.1 — 2026-09-01
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
|
|
9
|
+
- **Mic-denied synthetic fallback** — When microphone permission is denied or unavailable, the synthetic outbound track now sends inaudible looping white noise instead of silence so WebRTC is not DTX-suppressed, the runner receives `ontrack`, and the voice conversation can start. The production embed API `createVoiceThereWidget({ apiBase, projectId, clientKey, mode })` (no `configUrl`) is unchanged.
|
|
10
|
+
|
|
5
11
|
## 0.8.0 — 2026-08-31
|
|
6
12
|
|
|
7
13
|
### Added
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Browser microphone acquisition with
|
|
3
|
-
* or unavailable. Used by voice sessions to keep an outbound audio track
|
|
2
|
+
* Browser microphone acquisition with low-level noise synthetic fallback when GUM
|
|
3
|
+
* is denied or unavailable. Used by voice sessions to keep an outbound audio track
|
|
4
|
+
* live so WebRTC sends RTP (silent gain=0 is DTX-suppressed and the runner never
|
|
5
|
+
* receives ontrack).
|
|
4
6
|
*/
|
|
5
7
|
export type AudioInputState = "live" | "denied" | "unavailable" | "synthetic";
|
|
8
|
+
/** Peak gain for synthetic mic white noise — inaudible but enough to avoid DTX. */
|
|
9
|
+
export declare const SYNTHETIC_MIC_NOISE_GAIN = 0.004;
|
|
6
10
|
export type AudioInputDevice = {
|
|
7
11
|
deviceId: string;
|
|
8
12
|
label: string;
|
|
@@ -21,16 +25,19 @@ export type AcquireAudioInputResult = {
|
|
|
21
25
|
/** Stop every track on a stream (no-op for null). */
|
|
22
26
|
export declare function stopMicStream(stream: MediaStream | null): void;
|
|
23
27
|
/**
|
|
24
|
-
*
|
|
25
|
-
* when real microphone access is denied or unavailable.
|
|
28
|
+
* Low-level noise outbound mic substitute — keeps WebRTC outbound audio negotiation
|
|
29
|
+
* alive when real microphone access is denied or unavailable. Emits looping white
|
|
30
|
+
* noise at {@link SYNTHETIC_MIC_NOISE_GAIN} so RTP is not DTX-suppressed and the
|
|
31
|
+
* runner receives ontrack and can start VoiceAgent.
|
|
26
32
|
*/
|
|
27
33
|
export declare function createSyntheticMicStream(): {
|
|
28
34
|
stream: MediaStream;
|
|
29
35
|
dispose: () => void;
|
|
30
36
|
};
|
|
31
37
|
/**
|
|
32
|
-
* Acquire microphone audio, falling back to a
|
|
33
|
-
* Never throws solely because GUM failed — callers always receive a
|
|
38
|
+
* Acquire microphone audio, falling back to a low-level noise synthetic stream on
|
|
39
|
+
* deny or error. Never throws solely because GUM failed — callers always receive a
|
|
40
|
+
* usable stream that produces outbound RTP for the runner.
|
|
34
41
|
*/
|
|
35
42
|
export declare function acquireAudioInput(options?: AcquireAudioInputOptions): Promise<AcquireAudioInputResult>;
|
|
36
43
|
/** List audio input devices (empty when `mediaDevices` is unavailable). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"microphone.d.ts","sourceRoot":"","sources":["../../src/browser/microphone.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"microphone.d.ts","sourceRoot":"","sources":["../../src/browser/microphone.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,QAAQ,GAAG,aAAa,GAAG,WAAW,CAAC;AAE9E,mFAAmF;AACnF,eAAO,MAAM,wBAAwB,QAAQ,CAAC;AAK9C,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,YAAY,CAAC,EAAE,CAAC,WAAW,EAAE,sBAAsB,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IAC7E,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,eAAe,CAAC;IACvB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,gFAAgF;IAChF,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AA2CF,qDAAqD;AACrD,wBAAgB,aAAa,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI,CAQ9D;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,IAAI;IAC1C,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAmEA;AAcD;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,uBAAuB,CAAC,CAsBlC;AAED,2EAA2E;AAC3E,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAczE;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAG3E"}
|
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Browser microphone acquisition with
|
|
3
|
-
* or unavailable. Used by voice sessions to keep an outbound audio track
|
|
2
|
+
* Browser microphone acquisition with low-level noise synthetic fallback when GUM
|
|
3
|
+
* is denied or unavailable. Used by voice sessions to keep an outbound audio track
|
|
4
|
+
* live so WebRTC sends RTP (silent gain=0 is DTX-suppressed and the runner never
|
|
5
|
+
* receives ontrack).
|
|
4
6
|
*/
|
|
7
|
+
/** Peak gain for synthetic mic white noise — inaudible but enough to avoid DTX. */
|
|
8
|
+
export const SYNTHETIC_MIC_NOISE_GAIN = 0.004;
|
|
9
|
+
/** Duration of one loop of synthetic white noise (seconds). */
|
|
10
|
+
const SYNTHETIC_MIC_NOISE_BUFFER_SECONDS = 0.25;
|
|
5
11
|
function buildAudioConstraints(deviceId) {
|
|
6
12
|
if (deviceId) {
|
|
7
13
|
return { deviceId: { ideal: deviceId } };
|
|
@@ -47,8 +53,10 @@ export function stopMicStream(stream) {
|
|
|
47
53
|
});
|
|
48
54
|
}
|
|
49
55
|
/**
|
|
50
|
-
*
|
|
51
|
-
* when real microphone access is denied or unavailable.
|
|
56
|
+
* Low-level noise outbound mic substitute — keeps WebRTC outbound audio negotiation
|
|
57
|
+
* alive when real microphone access is denied or unavailable. Emits looping white
|
|
58
|
+
* noise at {@link SYNTHETIC_MIC_NOISE_GAIN} so RTP is not DTX-suppressed and the
|
|
59
|
+
* runner receives ontrack and can start VoiceAgent.
|
|
52
60
|
*/
|
|
53
61
|
export function createSyntheticMicStream() {
|
|
54
62
|
const AudioCtx = typeof globalThis.AudioContext !== "undefined"
|
|
@@ -77,19 +85,27 @@ export function createSyntheticMicStream() {
|
|
|
77
85
|
};
|
|
78
86
|
}
|
|
79
87
|
const ctx = new AudioCtx();
|
|
88
|
+
void ctx.resume();
|
|
80
89
|
const dest = ctx.createMediaStreamDestination();
|
|
81
90
|
const gain = ctx.createGain();
|
|
82
|
-
gain.gain.value =
|
|
83
|
-
const
|
|
84
|
-
|
|
91
|
+
gain.gain.value = SYNTHETIC_MIC_NOISE_GAIN;
|
|
92
|
+
const buffer = ctx.createBuffer(1, Math.ceil(ctx.sampleRate * SYNTHETIC_MIC_NOISE_BUFFER_SECONDS), ctx.sampleRate);
|
|
93
|
+
const channel = buffer.getChannelData(0);
|
|
94
|
+
for (let i = 0; i < channel.length; i++) {
|
|
95
|
+
channel[i] = Math.random() * 2 - 1;
|
|
96
|
+
}
|
|
97
|
+
const source = ctx.createBufferSource();
|
|
98
|
+
source.buffer = buffer;
|
|
99
|
+
source.loop = true;
|
|
100
|
+
source.connect(gain);
|
|
85
101
|
gain.connect(dest);
|
|
86
|
-
|
|
102
|
+
source.start();
|
|
87
103
|
const stream = dest.stream;
|
|
88
104
|
return {
|
|
89
105
|
stream,
|
|
90
106
|
dispose: () => {
|
|
91
107
|
try {
|
|
92
|
-
|
|
108
|
+
source.stop();
|
|
93
109
|
}
|
|
94
110
|
catch {
|
|
95
111
|
/* ignore */
|
|
@@ -109,8 +125,9 @@ function syntheticAcquireResult(state) {
|
|
|
109
125
|
};
|
|
110
126
|
}
|
|
111
127
|
/**
|
|
112
|
-
* Acquire microphone audio, falling back to a
|
|
113
|
-
* Never throws solely because GUM failed — callers always receive a
|
|
128
|
+
* Acquire microphone audio, falling back to a low-level noise synthetic stream on
|
|
129
|
+
* deny or error. Never throws solely because GUM failed — callers always receive a
|
|
130
|
+
* usable stream that produces outbound RTP for the runner.
|
|
114
131
|
*/
|
|
115
132
|
export async function acquireAudioInput(options = {}) {
|
|
116
133
|
const getUserMedia = options.getUserMedia;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"microphone.js","sourceRoot":"","sources":["../../src/browser/microphone.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"microphone.js","sourceRoot":"","sources":["../../src/browser/microphone.ts"],"names":[],"mappings":"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"}
|