@agimon-ai/doompi-voice 0.0.1-alpha.39 → 0.0.1-alpha.40
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/README.md +27 -9
- package/dist/clientMedia.cjs +1 -0
- package/dist/clientMedia.d.cts +3 -0
- package/dist/clientMedia.d.mts +3 -0
- package/dist/clientMedia.mjs +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +6 -4
- package/dist/index.d.mts +6 -4
- package/dist/index.mjs +1 -1
- package/dist/sessionApi.cjs +1 -0
- package/dist/sessionApi.d.cts +2 -0
- package/dist/sessionApi.d.mts +2 -0
- package/dist/sessionApi.mjs +1 -0
- package/dist/src/adapters/audio/clientMedia.cjs +2 -0
- package/dist/src/adapters/audio/clientMedia.cjs.map +1 -0
- package/dist/src/adapters/audio/clientMedia.d.cts +53 -0
- package/dist/src/adapters/audio/clientMedia.d.cts.map +1 -0
- package/dist/src/adapters/audio/clientMedia.d.mts +53 -0
- package/dist/src/adapters/audio/clientMedia.d.mts.map +1 -0
- package/dist/src/adapters/audio/clientMedia.mjs +2 -0
- package/dist/src/adapters/audio/clientMedia.mjs.map +1 -0
- package/dist/src/adapters/audio/infrastructure.cjs +2 -2
- package/dist/src/adapters/audio/infrastructure.cjs.map +1 -1
- package/dist/src/adapters/audio/infrastructure.d.cts +8 -1
- package/dist/src/adapters/audio/infrastructure.d.cts.map +1 -1
- package/dist/src/adapters/audio/infrastructure.d.mts +8 -1
- package/dist/src/adapters/audio/infrastructure.d.mts.map +1 -1
- package/dist/src/adapters/audio/infrastructure.mjs +2 -2
- package/dist/src/adapters/audio/infrastructure.mjs.map +1 -1
- package/dist/src/adapters/clientMediaApi.cjs +2 -0
- package/dist/src/adapters/clientMediaApi.cjs.map +1 -0
- package/dist/src/adapters/clientMediaApi.d.cts +16 -0
- package/dist/src/adapters/clientMediaApi.d.cts.map +1 -0
- package/dist/src/adapters/clientMediaApi.d.mts +16 -0
- package/dist/src/adapters/clientMediaApi.d.mts.map +1 -0
- package/dist/src/adapters/clientMediaApi.mjs +2 -0
- package/dist/src/adapters/clientMediaApi.mjs.map +1 -0
- package/dist/src/adapters/pi/voice.cjs +1 -1
- package/dist/src/adapters/pi/voice.cjs.map +1 -1
- package/dist/src/adapters/pi/voice.d.cts +5 -3
- package/dist/src/adapters/pi/voice.d.cts.map +1 -1
- package/dist/src/adapters/pi/voice.d.mts +5 -3
- package/dist/src/adapters/pi/voice.d.mts.map +1 -1
- package/dist/src/adapters/pi/voice.mjs +1 -1
- package/dist/src/adapters/pi/voice.mjs.map +1 -1
- package/dist/src/adapters/process/turnSpool.cjs +1 -1
- package/dist/src/adapters/process/turnSpool.cjs.map +1 -1
- package/dist/src/adapters/process/turnSpool.mjs +1 -1
- package/dist/src/adapters/process/turnSpool.mjs.map +1 -1
- package/dist/src/adapters/process/voiceWorkerAutoCaptureController.cjs +1 -1
- package/dist/src/adapters/process/voiceWorkerAutoCaptureController.cjs.map +1 -1
- package/dist/src/adapters/process/voiceWorkerAutoCaptureController.d.cts +3 -1
- package/dist/src/adapters/process/voiceWorkerAutoCaptureController.d.cts.map +1 -1
- package/dist/src/adapters/process/voiceWorkerAutoCaptureController.d.mts +3 -1
- package/dist/src/adapters/process/voiceWorkerAutoCaptureController.d.mts.map +1 -1
- package/dist/src/adapters/process/voiceWorkerAutoCaptureController.mjs +1 -1
- package/dist/src/adapters/process/voiceWorkerAutoCaptureController.mjs.map +1 -1
- package/dist/src/adapters/process/voiceWorkerClient.cjs +1 -1
- package/dist/src/adapters/process/voiceWorkerClient.cjs.map +1 -1
- package/dist/src/adapters/process/voiceWorkerClient.d.cts +1 -0
- package/dist/src/adapters/process/voiceWorkerClient.d.cts.map +1 -1
- package/dist/src/adapters/process/voiceWorkerClient.d.mts +1 -0
- package/dist/src/adapters/process/voiceWorkerClient.d.mts.map +1 -1
- package/dist/src/adapters/process/voiceWorkerClient.mjs +1 -1
- package/dist/src/adapters/process/voiceWorkerClient.mjs.map +1 -1
- package/dist/src/adapters/process/voiceWorkerPipeline.cjs +1 -1
- package/dist/src/adapters/process/voiceWorkerPipeline.cjs.map +1 -1
- package/dist/src/adapters/process/voiceWorkerPipeline.mjs +1 -1
- package/dist/src/adapters/process/voiceWorkerPipeline.mjs.map +1 -1
- package/dist/src/adapters/process/voiceWorkerSessionController.cjs +1 -1
- package/dist/src/adapters/process/voiceWorkerSessionController.cjs.map +1 -1
- package/dist/src/adapters/process/voiceWorkerSessionController.d.cts +1 -1
- package/dist/src/adapters/process/voiceWorkerSessionController.d.mts +1 -1
- package/dist/src/adapters/process/voiceWorkerSessionController.mjs +1 -1
- package/dist/src/adapters/process/voiceWorkerSessionController.mjs.map +1 -1
- package/dist/src/adapters/voiceMediaHubChannel.cjs +2 -0
- package/dist/src/adapters/voiceMediaHubChannel.cjs.map +1 -0
- package/dist/src/adapters/voiceMediaHubChannel.d.cts +8 -0
- package/dist/src/adapters/voiceMediaHubChannel.d.cts.map +1 -0
- package/dist/src/adapters/voiceMediaHubChannel.d.mts +8 -0
- package/dist/src/adapters/voiceMediaHubChannel.d.mts.map +1 -0
- package/dist/src/adapters/voiceMediaHubChannel.mjs +2 -0
- package/dist/src/adapters/voiceMediaHubChannel.mjs.map +1 -0
- package/dist/src/adapters/voiceMediaWakeFile.cjs +2 -0
- package/dist/src/adapters/voiceMediaWakeFile.cjs.map +1 -0
- package/dist/src/adapters/voiceMediaWakeFile.d.cts +21 -0
- package/dist/src/adapters/voiceMediaWakeFile.d.cts.map +1 -0
- package/dist/src/adapters/voiceMediaWakeFile.d.mts +21 -0
- package/dist/src/adapters/voiceMediaWakeFile.d.mts.map +1 -0
- package/dist/src/adapters/voiceMediaWakeFile.mjs +2 -0
- package/dist/src/adapters/voiceMediaWakeFile.mjs.map +1 -0
- package/dist/src/services/autonomousVoiceMachine.cjs +1 -1
- package/dist/src/services/autonomousVoiceMachine.cjs.map +1 -1
- package/dist/src/services/autonomousVoiceMachine.d.cts +1 -0
- package/dist/src/services/autonomousVoiceMachine.d.mts +1 -0
- package/dist/src/services/autonomousVoiceMachine.mjs +1 -1
- package/dist/src/services/autonomousVoiceMachine.mjs.map +1 -1
- package/dist/src/services/autonomousVoiceSession.cjs +1 -1
- package/dist/src/services/autonomousVoiceSession.cjs.map +1 -1
- package/dist/src/services/autonomousVoiceSession.mjs +1 -1
- package/dist/src/services/autonomousVoiceSession.mjs.map +1 -1
- package/dist/src/services/captureSession.cjs +1 -1
- package/dist/src/services/captureSession.cjs.map +1 -1
- package/dist/src/services/captureSession.mjs +1 -1
- package/dist/src/services/captureSession.mjs.map +1 -1
- package/dist/src/services/narrationBargeIn.cjs +1 -1
- package/dist/src/services/narrationBargeIn.cjs.map +1 -1
- package/dist/src/services/narrationBargeIn.d.cts +2 -0
- package/dist/src/services/narrationBargeIn.d.cts.map +1 -1
- package/dist/src/services/narrationBargeIn.d.mts +2 -0
- package/dist/src/services/narrationBargeIn.d.mts.map +1 -1
- package/dist/src/services/narrationBargeIn.mjs +1 -1
- package/dist/src/services/narrationBargeIn.mjs.map +1 -1
- package/dist/src/services/transcriptAdmission.cjs +7 -0
- package/dist/src/services/transcriptAdmission.cjs.map +1 -0
- package/dist/src/services/transcriptAdmission.d.cts +44 -0
- package/dist/src/services/transcriptAdmission.d.cts.map +1 -0
- package/dist/src/services/transcriptAdmission.d.mts +44 -0
- package/dist/src/services/transcriptAdmission.d.mts.map +1 -0
- package/dist/src/services/transcriptAdmission.mjs +7 -0
- package/dist/src/services/transcriptAdmission.mjs.map +1 -0
- package/dist/src/services/transcriptPolicy.cjs +1 -1
- package/dist/src/services/transcriptPolicy.cjs.map +1 -1
- package/dist/src/services/transcriptPolicy.mjs +1 -1
- package/dist/src/services/transcriptPolicy.mjs.map +1 -1
- package/dist/src/services/transcriptionCoordinator.cjs +1 -1
- package/dist/src/services/transcriptionCoordinator.cjs.map +1 -1
- package/dist/src/services/transcriptionCoordinator.mjs +1 -1
- package/dist/src/services/transcriptionCoordinator.mjs.map +1 -1
- package/dist/src/services/voiceDelivery.cjs +1 -1
- package/dist/src/services/voiceDelivery.cjs.map +1 -1
- package/dist/src/services/voiceDelivery.mjs +1 -1
- package/dist/src/services/voiceDelivery.mjs.map +1 -1
- package/dist/src/services/voiceWorkerProtocol.cjs +1 -1
- package/dist/src/services/voiceWorkerProtocol.cjs.map +1 -1
- package/dist/src/services/voiceWorkerProtocol.d.cts +2 -0
- package/dist/src/services/voiceWorkerProtocol.d.cts.map +1 -1
- package/dist/src/services/voiceWorkerProtocol.d.mts +2 -0
- package/dist/src/services/voiceWorkerProtocol.d.mts.map +1 -1
- package/dist/src/services/voiceWorkerProtocol.mjs +1 -1
- package/dist/src/services/voiceWorkerProtocol.mjs.map +1 -1
- package/dist/src/services/voiceWorkerSupervisor.cjs +1 -1
- package/dist/src/services/voiceWorkerSupervisor.cjs.map +1 -1
- package/dist/src/services/voiceWorkerSupervisor.d.cts +1 -0
- package/dist/src/services/voiceWorkerSupervisor.d.cts.map +1 -1
- package/dist/src/services/voiceWorkerSupervisor.d.mts +1 -0
- package/dist/src/services/voiceWorkerSupervisor.d.mts.map +1 -1
- package/dist/src/services/voiceWorkerSupervisor.mjs +1 -1
- package/dist/src/services/voiceWorkerSupervisor.mjs.map +1 -1
- package/dist/src/types/clientCaptureActivity.cjs +2 -0
- package/dist/src/types/clientCaptureActivity.cjs.map +1 -0
- package/dist/src/types/clientCaptureActivity.d.cts +32 -0
- package/dist/src/types/clientCaptureActivity.d.cts.map +1 -0
- package/dist/src/types/clientCaptureActivity.d.mts +32 -0
- package/dist/src/types/clientCaptureActivity.d.mts.map +1 -0
- package/dist/src/types/clientCaptureActivity.mjs +2 -0
- package/dist/src/types/clientCaptureActivity.mjs.map +1 -0
- package/dist/src/types/clientMedia.cjs +2 -0
- package/dist/src/types/clientMedia.cjs.map +1 -0
- package/dist/src/types/clientMedia.d.cts +152 -0
- package/dist/src/types/clientMedia.d.cts.map +1 -0
- package/dist/src/types/clientMedia.d.mts +152 -0
- package/dist/src/types/clientMedia.d.mts.map +1 -0
- package/dist/src/types/clientMedia.mjs +2 -0
- package/dist/src/types/clientMedia.mjs.map +1 -0
- package/dist/src/types/index.d.cts +31 -3
- package/dist/src/types/index.d.cts.map +1 -1
- package/dist/src/types/index.d.mts +31 -3
- package/dist/src/types/index.d.mts.map +1 -1
- package/dist/voiceWorker.cjs +1 -1
- package/dist/voiceWorker.cjs.map +1 -1
- package/dist/voiceWorker.mjs +1 -1
- package/dist/voiceWorker.mjs.map +1 -1
- package/dist/webHub.cjs +1 -0
- package/dist/webHub.d.cts +2 -0
- package/dist/webHub.d.mts +2 -0
- package/dist/webHub.mjs +1 -0
- package/models/README.md +8 -6
- package/package.json +37 -10
- package/src/types/clientCaptureActivity.ts +120 -0
- package/src/types/clientMedia.ts +181 -0
- package/web/VoiceActivitySection.tsx +16 -2
- package/web/VoiceComposerAction.tsx +86 -0
- package/web/VoiceMediaRuntime.tsx +22 -0
- package/web/browserCaptureWorklet.js +13 -0
- package/web/browserMediaDevice.ts +501 -0
- package/web/browserMediaIdentity.ts +16 -0
- package/web/browserSpeechPresenceDetector.ts +111 -0
- package/web/clientMediaTransport.ts +248 -0
- package/web/index.ts +18 -5
- package/web/sileroVadFrames.ts +54 -0
- package/web/sileroVadWorker.ts +60 -0
- package/web/tsconfig.json +1 -1
- package/web/voiceMediaClient.ts +309 -0
- package/web/voiceMediaWakeStore.ts +73 -0
package/README.md
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
# @agimon-ai/doompi-voice
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
macOS.
|
|
3
|
+
Capture speech on the client, transcribe it on the host, and play responses through DoomPi Voice mode.
|
|
5
4
|
|
|
6
5
|
Part of the [DoomPi distribution](https://www.npmjs.com/package/@agimon-ai/doompi).
|
|
7
6
|
|
|
@@ -14,11 +13,11 @@ the primary agent a bounded `narrate` tool and accepts narration requests from o
|
|
|
14
13
|
|
|
15
14
|
- Node.js 22.19.0 or newer
|
|
16
15
|
- Pi 0.84.3
|
|
17
|
-
-
|
|
18
|
-
- FFmpeg
|
|
16
|
+
- A browser with microphone capture and speech synthesis when using `doompi-web`
|
|
17
|
+
- For standalone terminal use on macOS, FFmpeg capture and `say` playback
|
|
19
18
|
- One supported local transcription engine: `whisper-cli`, `whisper`, or `mlx_whisper` (Apple
|
|
20
19
|
silicon only)
|
|
21
|
-
-
|
|
20
|
+
- Microphone permission on the client device
|
|
22
21
|
|
|
23
22
|
## Install
|
|
24
23
|
|
|
@@ -69,6 +68,21 @@ transcription is required. Use the `whisper-cpp` engine for `whisper-cli`, `open
|
|
|
69
68
|
`whisper`, or `mlx-whisper` for `mlx_whisper`. `utteranceIdleMs` accepts 1,500 to 10,000 ms and
|
|
70
69
|
defaults to 3,000.
|
|
71
70
|
|
|
71
|
+
When the agent is launched by `doompi-server`, capture and narration use the connected media client.
|
|
72
|
+
The protocol is capability-driven rather than browser-specific. A client can own microphone capture,
|
|
73
|
+
adaptive activity detection, endpoint decisions, autonomous capture phases, and playback while streaming
|
|
74
|
+
mono 16 kHz PCM16 through the authenticated session media API. The host supplies capabilities the client
|
|
75
|
+
does not advertise and remains responsible for durable spooling, configured transcription, and Pi or
|
|
76
|
+
model actions. This boundary supports terminal, web, React Native, and future watch adapters without
|
|
77
|
+
putting platform APIs in the shared client runtime.
|
|
78
|
+
|
|
79
|
+
A browser using the sealed remote-control channel takes the session media lease from a local client, so
|
|
80
|
+
narration and capture follow the user to the remote device. Local clients cannot take that lease back
|
|
81
|
+
while the remote client remains connected. Standalone terminal launches retain the macOS FFmpeg and
|
|
82
|
+
`say` adapters as a host-owned fallback. In the browser, `tts.voice` selects an exact
|
|
83
|
+
SpeechSynthesis voice name or URI. If it does not match, the browser uses its default voice. Portable
|
|
84
|
+
clients implement the declared ports through `@agimon-ai/doompi-voice/client-media`.
|
|
85
|
+
|
|
72
86
|
## Commands and tools
|
|
73
87
|
|
|
74
88
|
- `SPC v v` records and transcribes once; it does not enable autonomous Voice tools.
|
|
@@ -99,13 +113,17 @@ These optional model calls consume provider quota.
|
|
|
99
113
|
|
|
100
114
|
## Data flow and recovery
|
|
101
115
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
116
|
+
The selected client captures audio. When it advertises client orchestration, its portable PCM state
|
|
117
|
+
machine performs activity detection and endpointing, then sends phase metadata with the streamed audio.
|
|
118
|
+
Clients without those capabilities use host adaptive and neural VAD as a fallback. PCM validation,
|
|
119
|
+
spooling, WAV creation, normalization, and configured local Whisper execution run on the host in a
|
|
120
|
+
private supervised worker. Private spool directories use mode `0700` and files use `0600`.
|
|
121
|
+
Unacknowledged turns can be rediscovered after a worker restart.
|
|
105
122
|
|
|
106
123
|
This is not a blanket “nothing leaves the machine” guarantee:
|
|
107
124
|
|
|
108
|
-
- PCM
|
|
125
|
+
- Client PCM crosses the authenticated cockpit transport, is queued transiently in memory, and is
|
|
126
|
+
persisted only in the host worker's private spool.
|
|
109
127
|
- Transcript candidates and bounded state strings cross the worker/process boundary.
|
|
110
128
|
- Pi receives transcript text as user input.
|
|
111
129
|
- Command correction and long-final fallback text can be sent to the configured model provider.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./src/types/clientMedia.cjs"),t=require("./src/types/clientCaptureActivity.cjs");exports.ClientCaptureActivityLifecycle=t.ClientCaptureActivityLifecycle,exports.VOICE_MEDIA_ACTIVITY_ELAPSED_HEADER=e.VOICE_MEDIA_ACTIVITY_ELAPSED_HEADER,exports.VOICE_MEDIA_ACTIVITY_EPOCH_HEADER=e.VOICE_MEDIA_ACTIVITY_EPOCH_HEADER,exports.VOICE_MEDIA_ACTIVITY_LEVEL_HEADER=e.VOICE_MEDIA_ACTIVITY_LEVEL_HEADER,exports.VOICE_MEDIA_ACTIVITY_SPEECH_MS_HEADER=e.VOICE_MEDIA_ACTIVITY_SPEECH_MS_HEADER,exports.VOICE_MEDIA_ACTIVITY_STATE_HEADER=e.VOICE_MEDIA_ACTIVITY_STATE_HEADER,exports.VOICE_MEDIA_API_BASE_PATH=e.VOICE_MEDIA_API_BASE_PATH,exports.VOICE_MEDIA_BITS_PER_SAMPLE=e.VOICE_MEDIA_BITS_PER_SAMPLE,exports.VOICE_MEDIA_CHANNELS=e.VOICE_MEDIA_CHANNELS,exports.VOICE_MEDIA_CONTENT_TYPE=e.VOICE_MEDIA_CONTENT_TYPE,exports.VOICE_MEDIA_EVENT_WAIT_NONE=e.VOICE_MEDIA_EVENT_WAIT_NONE,exports.VOICE_MEDIA_HEARTBEAT_MS=e.VOICE_MEDIA_HEARTBEAT_MS,exports.VOICE_MEDIA_PLAYBACK_STATE_HEADER=e.VOICE_MEDIA_PLAYBACK_STATE_HEADER,exports.VOICE_MEDIA_PROTOCOL_VERSION=e.VOICE_MEDIA_PROTOCOL_VERSION,exports.VOICE_MEDIA_ROUTES=e.VOICE_MEDIA_ROUTES,exports.VOICE_MEDIA_SAMPLE_RATE=e.VOICE_MEDIA_SAMPLE_RATE,exports.VOICE_MEDIA_WAKE_TYPE=e.VOICE_MEDIA_WAKE_TYPE,exports.calculateClientPcmDbfs=t.calculateClientPcmDbfs,exports.voiceMediaClientUrl=e.voiceMediaClientUrl;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { ClientCaptureActivityLifecycle, SpeechPresenceDetector, SpeechPresenceWindow, calculateClientPcmDbfs } from "./src/types/clientCaptureActivity.cjs";
|
|
2
|
+
import { VOICE_MEDIA_ACTIVITY_ELAPSED_HEADER, VOICE_MEDIA_ACTIVITY_EPOCH_HEADER, VOICE_MEDIA_ACTIVITY_LEVEL_HEADER, VOICE_MEDIA_ACTIVITY_SPEECH_MS_HEADER, VOICE_MEDIA_ACTIVITY_STATE_HEADER, VOICE_MEDIA_API_BASE_PATH, VOICE_MEDIA_BITS_PER_SAMPLE, VOICE_MEDIA_CHANNELS, VOICE_MEDIA_CONTENT_TYPE, VOICE_MEDIA_EVENT_WAIT_NONE, VOICE_MEDIA_HEARTBEAT_MS, VOICE_MEDIA_PLAYBACK_STATE_HEADER, VOICE_MEDIA_PROTOCOL_VERSION, VOICE_MEDIA_ROUTES, VOICE_MEDIA_SAMPLE_RATE, VOICE_MEDIA_WAKE_TYPE, VoiceClientKind, VoiceMediaCapabilities, VoiceMediaCapture, VoiceMediaCaptureActivity, VoiceMediaCaptureActivityState, VoiceMediaCaptureConfiguration, VoiceMediaCaptureMode, VoiceMediaClientEvent, VoiceMediaConnectRequest, VoiceMediaConnectResult, VoiceMediaControlLocation, VoiceMediaDevice, VoiceMediaHeartbeatResult, VoiceMediaPlayback, VoiceMediaPlaybackDelivery, VoiceMediaPlaybackOutcome, VoiceMediaPlaybackResult, VoiceMediaTransport, VoiceMediaWake, voiceMediaClientUrl } from "./src/types/clientMedia.cjs";
|
|
3
|
+
export { ClientCaptureActivityLifecycle, SpeechPresenceDetector, SpeechPresenceWindow, VOICE_MEDIA_ACTIVITY_ELAPSED_HEADER, VOICE_MEDIA_ACTIVITY_EPOCH_HEADER, VOICE_MEDIA_ACTIVITY_LEVEL_HEADER, VOICE_MEDIA_ACTIVITY_SPEECH_MS_HEADER, VOICE_MEDIA_ACTIVITY_STATE_HEADER, VOICE_MEDIA_API_BASE_PATH, VOICE_MEDIA_BITS_PER_SAMPLE, VOICE_MEDIA_CHANNELS, VOICE_MEDIA_CONTENT_TYPE, VOICE_MEDIA_EVENT_WAIT_NONE, VOICE_MEDIA_HEARTBEAT_MS, VOICE_MEDIA_PLAYBACK_STATE_HEADER, VOICE_MEDIA_PROTOCOL_VERSION, VOICE_MEDIA_ROUTES, VOICE_MEDIA_SAMPLE_RATE, VOICE_MEDIA_WAKE_TYPE, VoiceClientKind, VoiceMediaCapabilities, VoiceMediaCapture, VoiceMediaCaptureActivity, VoiceMediaCaptureActivityState, VoiceMediaCaptureConfiguration, VoiceMediaCaptureMode, VoiceMediaClientEvent, VoiceMediaConnectRequest, VoiceMediaConnectResult, VoiceMediaControlLocation, VoiceMediaDevice, VoiceMediaHeartbeatResult, VoiceMediaPlayback, VoiceMediaPlaybackDelivery, VoiceMediaPlaybackOutcome, VoiceMediaPlaybackResult, VoiceMediaTransport, VoiceMediaWake, calculateClientPcmDbfs, voiceMediaClientUrl };
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { ClientCaptureActivityLifecycle, SpeechPresenceDetector, SpeechPresenceWindow, calculateClientPcmDbfs } from "./src/types/clientCaptureActivity.mjs";
|
|
2
|
+
import { VOICE_MEDIA_ACTIVITY_ELAPSED_HEADER, VOICE_MEDIA_ACTIVITY_EPOCH_HEADER, VOICE_MEDIA_ACTIVITY_LEVEL_HEADER, VOICE_MEDIA_ACTIVITY_SPEECH_MS_HEADER, VOICE_MEDIA_ACTIVITY_STATE_HEADER, VOICE_MEDIA_API_BASE_PATH, VOICE_MEDIA_BITS_PER_SAMPLE, VOICE_MEDIA_CHANNELS, VOICE_MEDIA_CONTENT_TYPE, VOICE_MEDIA_EVENT_WAIT_NONE, VOICE_MEDIA_HEARTBEAT_MS, VOICE_MEDIA_PLAYBACK_STATE_HEADER, VOICE_MEDIA_PROTOCOL_VERSION, VOICE_MEDIA_ROUTES, VOICE_MEDIA_SAMPLE_RATE, VOICE_MEDIA_WAKE_TYPE, VoiceClientKind, VoiceMediaCapabilities, VoiceMediaCapture, VoiceMediaCaptureActivity, VoiceMediaCaptureActivityState, VoiceMediaCaptureConfiguration, VoiceMediaCaptureMode, VoiceMediaClientEvent, VoiceMediaConnectRequest, VoiceMediaConnectResult, VoiceMediaControlLocation, VoiceMediaDevice, VoiceMediaHeartbeatResult, VoiceMediaPlayback, VoiceMediaPlaybackDelivery, VoiceMediaPlaybackOutcome, VoiceMediaPlaybackResult, VoiceMediaTransport, VoiceMediaWake, voiceMediaClientUrl } from "./src/types/clientMedia.mjs";
|
|
3
|
+
export { ClientCaptureActivityLifecycle, SpeechPresenceDetector, SpeechPresenceWindow, VOICE_MEDIA_ACTIVITY_ELAPSED_HEADER, VOICE_MEDIA_ACTIVITY_EPOCH_HEADER, VOICE_MEDIA_ACTIVITY_LEVEL_HEADER, VOICE_MEDIA_ACTIVITY_SPEECH_MS_HEADER, VOICE_MEDIA_ACTIVITY_STATE_HEADER, VOICE_MEDIA_API_BASE_PATH, VOICE_MEDIA_BITS_PER_SAMPLE, VOICE_MEDIA_CHANNELS, VOICE_MEDIA_CONTENT_TYPE, VOICE_MEDIA_EVENT_WAIT_NONE, VOICE_MEDIA_HEARTBEAT_MS, VOICE_MEDIA_PLAYBACK_STATE_HEADER, VOICE_MEDIA_PROTOCOL_VERSION, VOICE_MEDIA_ROUTES, VOICE_MEDIA_SAMPLE_RATE, VOICE_MEDIA_WAKE_TYPE, VoiceClientKind, VoiceMediaCapabilities, VoiceMediaCapture, VoiceMediaCaptureActivity, VoiceMediaCaptureActivityState, VoiceMediaCaptureConfiguration, VoiceMediaCaptureMode, VoiceMediaClientEvent, VoiceMediaConnectRequest, VoiceMediaConnectResult, VoiceMediaControlLocation, VoiceMediaDevice, VoiceMediaHeartbeatResult, VoiceMediaPlayback, VoiceMediaPlaybackDelivery, VoiceMediaPlaybackOutcome, VoiceMediaPlaybackResult, VoiceMediaTransport, VoiceMediaWake, calculateClientPcmDbfs, voiceMediaClientUrl };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{VOICE_MEDIA_ACTIVITY_ELAPSED_HEADER as e,VOICE_MEDIA_ACTIVITY_EPOCH_HEADER as t,VOICE_MEDIA_ACTIVITY_LEVEL_HEADER as n,VOICE_MEDIA_ACTIVITY_SPEECH_MS_HEADER as r,VOICE_MEDIA_ACTIVITY_STATE_HEADER as i,VOICE_MEDIA_API_BASE_PATH as a,VOICE_MEDIA_BITS_PER_SAMPLE as o,VOICE_MEDIA_CHANNELS as s,VOICE_MEDIA_CONTENT_TYPE as c,VOICE_MEDIA_EVENT_WAIT_NONE as l,VOICE_MEDIA_HEARTBEAT_MS as u,VOICE_MEDIA_PLAYBACK_STATE_HEADER as d,VOICE_MEDIA_PROTOCOL_VERSION as f,VOICE_MEDIA_ROUTES as p,VOICE_MEDIA_SAMPLE_RATE as m,VOICE_MEDIA_WAKE_TYPE as h,voiceMediaClientUrl as g}from"./src/types/clientMedia.mjs";import{ClientCaptureActivityLifecycle as _,calculateClientPcmDbfs as v}from"./src/types/clientCaptureActivity.mjs";export{_ as ClientCaptureActivityLifecycle,e as VOICE_MEDIA_ACTIVITY_ELAPSED_HEADER,t as VOICE_MEDIA_ACTIVITY_EPOCH_HEADER,n as VOICE_MEDIA_ACTIVITY_LEVEL_HEADER,r as VOICE_MEDIA_ACTIVITY_SPEECH_MS_HEADER,i as VOICE_MEDIA_ACTIVITY_STATE_HEADER,a as VOICE_MEDIA_API_BASE_PATH,o as VOICE_MEDIA_BITS_PER_SAMPLE,s as VOICE_MEDIA_CHANNELS,c as VOICE_MEDIA_CONTENT_TYPE,l as VOICE_MEDIA_EVENT_WAIT_NONE,u as VOICE_MEDIA_HEARTBEAT_MS,d as VOICE_MEDIA_PLAYBACK_STATE_HEADER,f as VOICE_MEDIA_PROTOCOL_VERSION,p as VOICE_MEDIA_ROUTES,m as VOICE_MEDIA_SAMPLE_RATE,h as VOICE_MEDIA_WAKE_TYPE,v as calculateClientPcmDbfs,g as voiceMediaClientUrl};
|
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./src/services/pcm.cjs"),
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./src/types/clientMedia.cjs"),t=require("./src/services/pcm.cjs"),n=require("./src/adapters/audio/infrastructure.cjs"),r=require("./src/adapters/audio/clientMedia.cjs"),i=require("./src/services/commandCorrection.cjs"),a=require("./src/services/fallbackNarration.cjs"),o=require("./src/services/semanticEcho.cjs"),s=require("./src/services/vad.cjs"),c=require("./src/services/narration.cjs"),l=require("./src/services/narrationPlayback.cjs"),u=require("./src/adapters/transcription/whisper.cjs"),d=require("./src/adapters/pi/voice.cjs"),f=require("./src/services/utterance.cjs");exports.AdaptiveVoiceActivityDetector=s.AdaptiveVoiceActivityDetector,exports.BoundedTranscriptionQueue=f.BoundedTranscriptionQueue,exports.ClientPcmAudioRecorder=r.ClientPcmAudioRecorder,exports.ClientTtsAdapter=r.ClientTtsAdapter,exports.DEFAULT_UTTERANCE_LIMITS=f.DEFAULT_UTTERANCE_LIMITS,exports.DEFAULT_VAD_CONFIGURATION=s.DEFAULT_VAD_CONFIGURATION,exports.DETERMINISTIC_FALLBACK_THRESHOLD_CHARACTERS=a.DETERMINISTIC_FALLBACK_THRESHOLD_CHARACTERS,exports.EchoTailTimeline=o.EchoTailTimeline,exports.ExecutableResolver=n.ExecutableResolver,exports.FfmpegAudioRecorder=n.FfmpegAudioRecorder,exports.FfmpegPcmAudioRecorder=n.FfmpegPcmAudioRecorder,exports.MAX_VOICE_COMMAND_CONTEXT_BYTES=i.MAX_VOICE_COMMAND_CONTEXT_BYTES,exports.MacOsSayPcmSynthesizer=n.MacOsSayPcmSynthesizer,exports.MacOsSayTtsAdapter=n.MacOsSayTtsAdapter,exports.MlxWhisperAdapter=u.MlxWhisperAdapter,exports.NarrationPlaybackCoordinator=c.NarrationPlaybackCoordinator,exports.NodeBinaryProcessSpawner=n.NodeBinaryProcessSpawner,exports.NodeProcessSpawner=n.NodeProcessSpawner,exports.OpenAiWhisperAdapter=u.OpenAiWhisperAdapter,exports.PCM_BITS_PER_SAMPLE=t.PCM_BITS_PER_SAMPLE,exports.PCM_BYTES_PER_SAMPLE=t.PCM_BYTES_PER_SAMPLE,exports.PCM_CHANNELS=t.PCM_CHANNELS,exports.PCM_FRAME_BYTES=t.PCM_FRAME_BYTES,exports.PCM_FRAME_MS=t.PCM_FRAME_MS,exports.PCM_SAMPLE_RATE=t.PCM_SAMPLE_RATE,exports.PcmFrameAssembler=t.PcmFrameAssembler,exports.PcmWavAnalyzer=n.PcmWavAnalyzer,exports.PiVoiceConfigService=d.PiVoiceConfigService,exports.RollingEchoProbeCoordinator=o.RollingEchoProbeCoordinator,exports.SemanticEchoAdjudicator=o.SemanticEchoAdjudicator,exports.SystemClock=n.SystemClock,exports.TemporaryWorkspace=n.TemporaryWorkspace,exports.TranscriberRegistry=u.TranscriberRegistry,exports.UnixVoiceMediaHostConnection=r.UnixVoiceMediaHostConnection,exports.UtteranceAssembler=f.UtteranceAssembler,exports.VOICE_MEDIA_ACTIVITY_ELAPSED_HEADER=e.VOICE_MEDIA_ACTIVITY_ELAPSED_HEADER,exports.VOICE_MEDIA_ACTIVITY_EPOCH_HEADER=e.VOICE_MEDIA_ACTIVITY_EPOCH_HEADER,exports.VOICE_MEDIA_ACTIVITY_LEVEL_HEADER=e.VOICE_MEDIA_ACTIVITY_LEVEL_HEADER,exports.VOICE_MEDIA_ACTIVITY_SPEECH_MS_HEADER=e.VOICE_MEDIA_ACTIVITY_SPEECH_MS_HEADER,exports.VOICE_MEDIA_ACTIVITY_STATE_HEADER=e.VOICE_MEDIA_ACTIVITY_STATE_HEADER,exports.VOICE_MEDIA_API_BASE_PATH=e.VOICE_MEDIA_API_BASE_PATH,exports.VOICE_MEDIA_BITS_PER_SAMPLE=e.VOICE_MEDIA_BITS_PER_SAMPLE,exports.VOICE_MEDIA_CHANNELS=e.VOICE_MEDIA_CHANNELS,exports.VOICE_MEDIA_CONTENT_TYPE=e.VOICE_MEDIA_CONTENT_TYPE,exports.VOICE_MEDIA_EVENT_WAIT_NONE=e.VOICE_MEDIA_EVENT_WAIT_NONE,exports.VOICE_MEDIA_HEARTBEAT_MS=e.VOICE_MEDIA_HEARTBEAT_MS,exports.VOICE_MEDIA_PLAYBACK_STATE_HEADER=e.VOICE_MEDIA_PLAYBACK_STATE_HEADER,exports.VOICE_MEDIA_PROTOCOL_VERSION=e.VOICE_MEDIA_PROTOCOL_VERSION,exports.VOICE_MEDIA_ROUTES=e.VOICE_MEDIA_ROUTES,exports.VOICE_MEDIA_SAMPLE_RATE=e.VOICE_MEDIA_SAMPLE_RATE,exports.VOICE_MEDIA_WAKE_TYPE=e.VOICE_MEDIA_WAKE_TYPE,exports.VoiceCommandCorrector=i.VoiceCommandCorrector,exports.VoiceNarrationPlayback=l.VoiceNarrationPlayback,exports.VoiceSessionController=d.VoiceSessionController,exports.VoiceTurnFallbackNarrator=a.VoiceTurnFallbackNarrator,exports.WhisperCppAdapter=u.WhisperCppAdapter,exports.alignNarrationSpan=o.alignNarrationSpan,exports.analyzePcmWav=n.analyzePcmWav,exports.calculatePcmFrameDbfs=s.calculatePcmFrameDbfs,exports.canRunVoice=d.canRunVoice,exports.compactVoiceCommandContext=i.compactVoiceCommandContext,exports.createVoiceContainer=d.createVoiceContainer,exports.createVoiceNarrationService=d.createVoiceNarrationService,exports.deliverAutoCaptureInput=d.deliverAutoCaptureInput,exports.editDistance=i.editDistance,exports.encodePcm16Wav=t.encodePcm16Wav,exports.extractNovelNarrationResidual=o.extractNovelNarrationResidual,exports.extractTerminalAssistantText=d.extractTerminalAssistantText,exports.formatAutoCaptureActivity=d.formatAutoCaptureActivity,exports.formatVoiceActivity=d.formatVoiceActivity,exports.installVoiceRuntime=d.installVoiceRuntime,exports.matchPlaybackStopPhrase=o.matchPlaybackStopPhrase,exports.matchStartPhrase=o.matchStartPhrase,exports.matchStopPhrase=o.matchStopPhrase,exports.normalizeEchoText=o.normalizeEchoText,exports.phoneticKey=i.phoneticKey,exports.reconcileVoiceModeTools=d.reconcileVoiceModeTools,exports.registerAutoCaptureCordisEventHandlers=d.registerAutoCaptureCordisEventHandlers,exports.registerVoiceTurnFallback=d.registerVoiceTurnFallback,exports.resolveVoiceCommandCorrector=d.resolveVoiceCommandCorrector,exports.resolveVoiceFallbackNarrator=d.resolveVoiceFallbackNarrator,exports.resolveVoiceTranscriptAdjudicator=d.resolveVoiceTranscriptAdjudicator,exports.voiceLeaderBindings=d.voiceLeaderBindings,exports.voiceMediaClientUrl=e.voiceMediaClientUrl,exports.voiceMediaHostConnection=r.voiceMediaHostConnection,exports.voiceModeState=d.voiceModeState,exports.writePrivatePcm16Wav=n.writePrivatePcm16Wav;
|
package/dist/index.d.cts
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { AdaptiveVoiceActivityDetector, AudioActivityBucket, AudioActivityHistogram, DEFAULT_VAD_CONFIGURATION, VadConfiguration, VadFrameMetadata, VadNoiseProfile, VadPushResult, VadSegment, calculatePcmFrameDbfs } from "./src/services/vad.cjs";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { VOICE_MEDIA_ACTIVITY_ELAPSED_HEADER, VOICE_MEDIA_ACTIVITY_EPOCH_HEADER, VOICE_MEDIA_ACTIVITY_LEVEL_HEADER, VOICE_MEDIA_ACTIVITY_SPEECH_MS_HEADER, VOICE_MEDIA_ACTIVITY_STATE_HEADER, VOICE_MEDIA_API_BASE_PATH, VOICE_MEDIA_BITS_PER_SAMPLE, VOICE_MEDIA_CHANNELS, VOICE_MEDIA_CONTENT_TYPE, VOICE_MEDIA_EVENT_WAIT_NONE, VOICE_MEDIA_HEARTBEAT_MS, VOICE_MEDIA_PLAYBACK_STATE_HEADER, VOICE_MEDIA_PROTOCOL_VERSION, VOICE_MEDIA_ROUTES, VOICE_MEDIA_SAMPLE_RATE, VOICE_MEDIA_WAKE_TYPE, VoiceClientKind, VoiceMediaCapabilities, VoiceMediaCapture, VoiceMediaCaptureActivity, VoiceMediaCaptureActivityState, VoiceMediaCaptureConfiguration, VoiceMediaCaptureMode, VoiceMediaClientEvent, VoiceMediaConnectRequest, VoiceMediaConnectResult, VoiceMediaControlLocation, VoiceMediaDevice, VoiceMediaHeartbeatResult, VoiceMediaPlayback, VoiceMediaPlaybackDelivery, VoiceMediaPlaybackOutcome, VoiceMediaPlaybackResult, VoiceMediaTransport, VoiceMediaWake, voiceMediaClientUrl } from "./src/types/clientMedia.cjs";
|
|
3
|
+
import { AudioAnalysis, AutoCaptureActivationState, AutoCaptureIndicatorState, AutoCaptureUi, BinaryProcessStartOptions, BinaryRunningProcess, IAudioAnalyzer, IAudioRecorder, IBinaryProcessSpawner, IClock, IExecutableResolver, IPcmAudioRecorder, IProcessSpawner, ISpeechPresenceDetector, ITemporaryWorkspace, ITranscriberAdapter, ITranscriberRegistry, ITtsAdapter, IVoiceMediaHostConnection, IVoiceSessionController, LiveRecordingHandle, NarrationKind, PcmAudioRecorderStartOptions, ProcessResult, ProcessStartOptions, RecordingHandle, RunningProcess, SelectedTranscriber, TimerHandle, TranscriptionRequest, TtsPlayback, TtsPlaybackOutcome, TtsPlaybackReference, TtsPlaybackResult, TtsSpeakRequest, VoiceActivityUpdate, VoiceDependencies, VoiceMediaAudioPoll, VoiceState, VoiceUi } from "./src/types/index.cjs";
|
|
4
4
|
import { IVoiceCommandCorrectionModelClient, IVoiceCommandCorrector, MAX_VOICE_COMMAND_CONTEXT_BYTES, VoiceCommandContext, VoiceCommandCorrectionInput, VoiceCommandCorrectionModelRequest, VoiceCommandCorrector, compactVoiceCommandContext, editDistance, phoneticKey } from "./src/services/commandCorrection.cjs";
|
|
5
|
+
import { ClientNarrationSynthesizer, ClientPcmAudioRecorder, ClientTtsAdapter, UnixVoiceMediaHostConnection, UnixVoiceMediaHostOptions, voiceMediaHostConnection } from "./src/adapters/audio/clientMedia.cjs";
|
|
6
|
+
import { ExecutableResolver, FfmpegAudioRecorder, FfmpegPcmAudioRecorder, MacOsSayPcmSynthesizer, MacOsSayTtsAdapter, NodeBinaryProcessSpawner, NodeProcessSpawner, PcmWavAnalyzer, SystemClock, TemporaryWorkspace, analyzePcmWav, writePrivatePcm16Wav } from "./src/adapters/audio/infrastructure.cjs";
|
|
5
7
|
import { DETERMINISTIC_FALLBACK_THRESHOLD_CHARACTERS, FallbackNarration, FallbackNarrationModelRequest, FallbackNarrationSource, IFallbackNarrationModelClient, IVoiceTurnFallbackNarrator, VoiceTurnFallbackNarrator, VoiceTurnFallbackNarratorOptions } from "./src/services/fallbackNarration.cjs";
|
|
6
8
|
import { NarrationPlaybackCoordinator, NarrationPlaybackLifecycleErrorObserver, NarrationPlaybackLifecycleEvent, NarrationPlaybackLifecycleObserver, NarrationPlaybackOutcome, NarrationPlaybackRequest, NarrationPlaybackSettlement } from "./src/services/narration.cjs";
|
|
7
9
|
import { VoiceNarrationPlayback, VoiceNarrationPlaybackDependencies, VoiceNarrationPlaybackLogger } from "./src/services/narrationPlayback.cjs";
|
|
8
10
|
import { MlxWhisperAdapter, OpenAiWhisperAdapter, TranscriberRegistry, WhisperCppAdapter } from "./src/adapters/transcription/whisper.cjs";
|
|
9
|
-
import { AutoCaptureActivityPresentation, AutoCaptureDeliveryIntent, AutoCapturePiEventController, PiVoiceConfigService, VoiceActivityPresentation, VoiceExtensionOptions, VoiceFooterContributionHandle, VoiceFooterContributionValue, VoiceLeaderContributionHandle, VoiceSessionController, VoiceTurnFallbackRuntime, canRunVoice, createVoiceContainer, createVoiceNarrationService, deliverAutoCaptureInput, extractTerminalAssistantText, formatAutoCaptureActivity, formatVoiceActivity, installVoiceRuntime, reconcileVoiceModeTools, registerAutoCaptureCordisEventHandlers, registerVoiceTurnFallback, resolveVoiceCommandCorrector, resolveVoiceFallbackNarrator, voiceLeaderBindings, voiceModeState } from "./src/adapters/pi/voice.cjs";
|
|
11
|
+
import { AutoCaptureActivityPresentation, AutoCaptureDeliveryIntent, AutoCapturePiEventController, PiVoiceConfigService, VoiceActivityPresentation, VoiceExtensionOptions, VoiceFooterContributionHandle, VoiceFooterContributionValue, VoiceLeaderContributionHandle, VoiceSessionController, VoiceTurnFallbackRuntime, canRunVoice, createVoiceContainer, createVoiceNarrationService, deliverAutoCaptureInput, extractTerminalAssistantText, formatAutoCaptureActivity, formatVoiceActivity, installVoiceRuntime, reconcileVoiceModeTools, registerAutoCaptureCordisEventHandlers, registerVoiceTurnFallback, resolveVoiceCommandCorrector, resolveVoiceFallbackNarrator, resolveVoiceTranscriptAdjudicator, voiceLeaderBindings, voiceModeState } from "./src/adapters/pi/voice.cjs";
|
|
10
12
|
import { PCM_BITS_PER_SAMPLE, PCM_BYTES_PER_SAMPLE, PCM_CHANNELS, PCM_FRAME_BYTES, PCM_FRAME_MS, PCM_SAMPLE_RATE, PcmFrameAssembler, encodePcm16Wav } from "./src/services/pcm.cjs";
|
|
11
13
|
import { ControlPhraseMatch, EchoProbeAction, EchoProbeClassification, EchoProbeInput, EchoProbeResult, EchoReference, EchoTailTimeline, IEchoProbeClassifier, NarrationAlignment, NarrationResidualAnalysis, RollingEchoProbeCoordinator, RollingEchoProbeState, SemanticEchoAdjudicator, alignNarrationSpan, extractNovelNarrationResidual, matchPlaybackStopPhrase, matchStartPhrase, matchStopPhrase, normalizeEchoText } from "./src/services/semanticEcho.cjs";
|
|
12
14
|
import { BoundedTranscriptionQueue, DEFAULT_UTTERANCE_LIMITS, PendingUtterance, UtteranceAssembler, UtteranceFinalizationReason, UtteranceLimits } from "./src/services/utterance.cjs";
|
|
13
|
-
export { AdaptiveVoiceActivityDetector, AudioActivityBucket, AudioActivityHistogram, AudioAnalysis, AutoCaptureActivationState, AutoCaptureActivityPresentation, AutoCaptureDeliveryIntent, AutoCaptureIndicatorState, AutoCapturePiEventController, AutoCaptureUi, BinaryProcessStartOptions, BinaryRunningProcess, BoundedTranscriptionQueue, ControlPhraseMatch, DEFAULT_UTTERANCE_LIMITS, DEFAULT_VAD_CONFIGURATION, DETERMINISTIC_FALLBACK_THRESHOLD_CHARACTERS, EchoProbeAction, EchoProbeClassification, EchoProbeInput, EchoProbeResult, EchoReference, EchoTailTimeline, ExecutableResolver, FallbackNarration, FallbackNarrationModelRequest, FallbackNarrationSource, FfmpegAudioRecorder, FfmpegPcmAudioRecorder, IAudioAnalyzer, IAudioRecorder, IBinaryProcessSpawner, IClock, IEchoProbeClassifier, IExecutableResolver, IFallbackNarrationModelClient, IPcmAudioRecorder, IProcessSpawner, ISpeechPresenceDetector, ITemporaryWorkspace, ITranscriberAdapter, ITranscriberRegistry, ITtsAdapter, IVoiceCommandCorrectionModelClient, IVoiceCommandCorrector, IVoiceSessionController, IVoiceTurnFallbackNarrator, LiveRecordingHandle, MAX_VOICE_COMMAND_CONTEXT_BYTES, MacOsSayTtsAdapter, MlxWhisperAdapter, NarrationAlignment, NarrationKind, NarrationPlaybackCoordinator, NarrationPlaybackLifecycleErrorObserver, NarrationPlaybackLifecycleEvent, NarrationPlaybackLifecycleObserver, NarrationPlaybackOutcome, NarrationPlaybackRequest, NarrationPlaybackSettlement, NarrationResidualAnalysis, NodeBinaryProcessSpawner, NodeProcessSpawner, OpenAiWhisperAdapter, PCM_BITS_PER_SAMPLE, PCM_BYTES_PER_SAMPLE, PCM_CHANNELS, PCM_FRAME_BYTES, PCM_FRAME_MS, PCM_SAMPLE_RATE, PcmFrameAssembler, PcmWavAnalyzer, PendingUtterance, PiVoiceConfigService, ProcessResult, ProcessStartOptions, RecordingHandle, RollingEchoProbeCoordinator, RollingEchoProbeState, RunningProcess, SelectedTranscriber, SemanticEchoAdjudicator, SystemClock, TemporaryWorkspace, TimerHandle, TranscriberRegistry, TranscriptionRequest, TtsPlayback, TtsPlaybackOutcome, TtsPlaybackReference, TtsPlaybackResult, TtsSpeakRequest, UtteranceAssembler, UtteranceFinalizationReason, UtteranceLimits, VadConfiguration, VadFrameMetadata, VadNoiseProfile, VadPushResult, VadSegment, VoiceActivityPresentation, VoiceActivityUpdate, VoiceCommandContext, VoiceCommandCorrectionInput, VoiceCommandCorrectionModelRequest, VoiceCommandCorrector, VoiceDependencies, VoiceExtensionOptions, VoiceFooterContributionHandle, VoiceFooterContributionValue, VoiceLeaderContributionHandle, VoiceNarrationPlayback, VoiceNarrationPlaybackDependencies, VoiceNarrationPlaybackLogger, VoiceSessionController, VoiceState, VoiceTurnFallbackNarrator, VoiceTurnFallbackNarratorOptions, VoiceTurnFallbackRuntime, VoiceUi, WhisperCppAdapter, alignNarrationSpan, analyzePcmWav, calculatePcmFrameDbfs, canRunVoice, compactVoiceCommandContext, createVoiceContainer, createVoiceNarrationService, deliverAutoCaptureInput, editDistance, encodePcm16Wav, extractNovelNarrationResidual, extractTerminalAssistantText, formatAutoCaptureActivity, formatVoiceActivity, installVoiceRuntime, matchPlaybackStopPhrase, matchStartPhrase, matchStopPhrase, normalizeEchoText, phoneticKey, reconcileVoiceModeTools, registerAutoCaptureCordisEventHandlers, registerVoiceTurnFallback, resolveVoiceCommandCorrector, resolveVoiceFallbackNarrator, voiceLeaderBindings, voiceModeState, writePrivatePcm16Wav };
|
|
15
|
+
export { AdaptiveVoiceActivityDetector, AudioActivityBucket, AudioActivityHistogram, AudioAnalysis, AutoCaptureActivationState, AutoCaptureActivityPresentation, AutoCaptureDeliveryIntent, AutoCaptureIndicatorState, AutoCapturePiEventController, AutoCaptureUi, BinaryProcessStartOptions, BinaryRunningProcess, BoundedTranscriptionQueue, ClientNarrationSynthesizer, ClientPcmAudioRecorder, ClientTtsAdapter, ControlPhraseMatch, DEFAULT_UTTERANCE_LIMITS, DEFAULT_VAD_CONFIGURATION, DETERMINISTIC_FALLBACK_THRESHOLD_CHARACTERS, EchoProbeAction, EchoProbeClassification, EchoProbeInput, EchoProbeResult, EchoReference, EchoTailTimeline, ExecutableResolver, FallbackNarration, FallbackNarrationModelRequest, FallbackNarrationSource, FfmpegAudioRecorder, FfmpegPcmAudioRecorder, IAudioAnalyzer, IAudioRecorder, IBinaryProcessSpawner, IClock, IEchoProbeClassifier, IExecutableResolver, IFallbackNarrationModelClient, IPcmAudioRecorder, IProcessSpawner, ISpeechPresenceDetector, ITemporaryWorkspace, ITranscriberAdapter, ITranscriberRegistry, ITtsAdapter, IVoiceCommandCorrectionModelClient, IVoiceCommandCorrector, IVoiceMediaHostConnection, IVoiceSessionController, IVoiceTurnFallbackNarrator, LiveRecordingHandle, MAX_VOICE_COMMAND_CONTEXT_BYTES, MacOsSayPcmSynthesizer, MacOsSayTtsAdapter, MlxWhisperAdapter, NarrationAlignment, NarrationKind, NarrationPlaybackCoordinator, NarrationPlaybackLifecycleErrorObserver, NarrationPlaybackLifecycleEvent, NarrationPlaybackLifecycleObserver, NarrationPlaybackOutcome, NarrationPlaybackRequest, NarrationPlaybackSettlement, NarrationResidualAnalysis, NodeBinaryProcessSpawner, NodeProcessSpawner, OpenAiWhisperAdapter, PCM_BITS_PER_SAMPLE, PCM_BYTES_PER_SAMPLE, PCM_CHANNELS, PCM_FRAME_BYTES, PCM_FRAME_MS, PCM_SAMPLE_RATE, PcmAudioRecorderStartOptions, PcmFrameAssembler, PcmWavAnalyzer, PendingUtterance, PiVoiceConfigService, ProcessResult, ProcessStartOptions, RecordingHandle, RollingEchoProbeCoordinator, RollingEchoProbeState, RunningProcess, SelectedTranscriber, SemanticEchoAdjudicator, SystemClock, TemporaryWorkspace, TimerHandle, TranscriberRegistry, TranscriptionRequest, TtsPlayback, TtsPlaybackOutcome, TtsPlaybackReference, TtsPlaybackResult, TtsSpeakRequest, UnixVoiceMediaHostConnection, UnixVoiceMediaHostOptions, UtteranceAssembler, UtteranceFinalizationReason, UtteranceLimits, VOICE_MEDIA_ACTIVITY_ELAPSED_HEADER, VOICE_MEDIA_ACTIVITY_EPOCH_HEADER, VOICE_MEDIA_ACTIVITY_LEVEL_HEADER, VOICE_MEDIA_ACTIVITY_SPEECH_MS_HEADER, VOICE_MEDIA_ACTIVITY_STATE_HEADER, VOICE_MEDIA_API_BASE_PATH, VOICE_MEDIA_BITS_PER_SAMPLE, VOICE_MEDIA_CHANNELS, VOICE_MEDIA_CONTENT_TYPE, VOICE_MEDIA_EVENT_WAIT_NONE, VOICE_MEDIA_HEARTBEAT_MS, VOICE_MEDIA_PLAYBACK_STATE_HEADER, VOICE_MEDIA_PROTOCOL_VERSION, VOICE_MEDIA_ROUTES, VOICE_MEDIA_SAMPLE_RATE, VOICE_MEDIA_WAKE_TYPE, VadConfiguration, VadFrameMetadata, VadNoiseProfile, VadPushResult, VadSegment, VoiceActivityPresentation, VoiceActivityUpdate, VoiceClientKind, VoiceCommandContext, VoiceCommandCorrectionInput, VoiceCommandCorrectionModelRequest, VoiceCommandCorrector, VoiceDependencies, VoiceExtensionOptions, VoiceFooterContributionHandle, VoiceFooterContributionValue, VoiceLeaderContributionHandle, VoiceMediaAudioPoll, VoiceMediaCapabilities, VoiceMediaCapture, VoiceMediaCaptureActivity, VoiceMediaCaptureActivityState, VoiceMediaCaptureConfiguration, VoiceMediaCaptureMode, VoiceMediaClientEvent, VoiceMediaConnectRequest, VoiceMediaConnectResult, VoiceMediaControlLocation, VoiceMediaDevice, VoiceMediaHeartbeatResult, VoiceMediaPlayback, VoiceMediaPlaybackDelivery, VoiceMediaPlaybackOutcome, VoiceMediaPlaybackResult, VoiceMediaTransport, VoiceMediaWake, VoiceNarrationPlayback, VoiceNarrationPlaybackDependencies, VoiceNarrationPlaybackLogger, VoiceSessionController, VoiceState, VoiceTurnFallbackNarrator, VoiceTurnFallbackNarratorOptions, VoiceTurnFallbackRuntime, VoiceUi, WhisperCppAdapter, alignNarrationSpan, analyzePcmWav, calculatePcmFrameDbfs, canRunVoice, compactVoiceCommandContext, createVoiceContainer, createVoiceNarrationService, deliverAutoCaptureInput, editDistance, encodePcm16Wav, extractNovelNarrationResidual, extractTerminalAssistantText, formatAutoCaptureActivity, formatVoiceActivity, installVoiceRuntime, matchPlaybackStopPhrase, matchStartPhrase, matchStopPhrase, normalizeEchoText, phoneticKey, reconcileVoiceModeTools, registerAutoCaptureCordisEventHandlers, registerVoiceTurnFallback, resolveVoiceCommandCorrector, resolveVoiceFallbackNarrator, resolveVoiceTranscriptAdjudicator, voiceLeaderBindings, voiceMediaClientUrl, voiceMediaHostConnection, voiceModeState, writePrivatePcm16Wav };
|
package/dist/index.d.mts
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { AdaptiveVoiceActivityDetector, AudioActivityBucket, AudioActivityHistogram, DEFAULT_VAD_CONFIGURATION, VadConfiguration, VadFrameMetadata, VadNoiseProfile, VadPushResult, VadSegment, calculatePcmFrameDbfs } from "./src/services/vad.mjs";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { VOICE_MEDIA_ACTIVITY_ELAPSED_HEADER, VOICE_MEDIA_ACTIVITY_EPOCH_HEADER, VOICE_MEDIA_ACTIVITY_LEVEL_HEADER, VOICE_MEDIA_ACTIVITY_SPEECH_MS_HEADER, VOICE_MEDIA_ACTIVITY_STATE_HEADER, VOICE_MEDIA_API_BASE_PATH, VOICE_MEDIA_BITS_PER_SAMPLE, VOICE_MEDIA_CHANNELS, VOICE_MEDIA_CONTENT_TYPE, VOICE_MEDIA_EVENT_WAIT_NONE, VOICE_MEDIA_HEARTBEAT_MS, VOICE_MEDIA_PLAYBACK_STATE_HEADER, VOICE_MEDIA_PROTOCOL_VERSION, VOICE_MEDIA_ROUTES, VOICE_MEDIA_SAMPLE_RATE, VOICE_MEDIA_WAKE_TYPE, VoiceClientKind, VoiceMediaCapabilities, VoiceMediaCapture, VoiceMediaCaptureActivity, VoiceMediaCaptureActivityState, VoiceMediaCaptureConfiguration, VoiceMediaCaptureMode, VoiceMediaClientEvent, VoiceMediaConnectRequest, VoiceMediaConnectResult, VoiceMediaControlLocation, VoiceMediaDevice, VoiceMediaHeartbeatResult, VoiceMediaPlayback, VoiceMediaPlaybackDelivery, VoiceMediaPlaybackOutcome, VoiceMediaPlaybackResult, VoiceMediaTransport, VoiceMediaWake, voiceMediaClientUrl } from "./src/types/clientMedia.mjs";
|
|
3
|
+
import { AudioAnalysis, AutoCaptureActivationState, AutoCaptureIndicatorState, AutoCaptureUi, BinaryProcessStartOptions, BinaryRunningProcess, IAudioAnalyzer, IAudioRecorder, IBinaryProcessSpawner, IClock, IExecutableResolver, IPcmAudioRecorder, IProcessSpawner, ISpeechPresenceDetector, ITemporaryWorkspace, ITranscriberAdapter, ITranscriberRegistry, ITtsAdapter, IVoiceMediaHostConnection, IVoiceSessionController, LiveRecordingHandle, NarrationKind, PcmAudioRecorderStartOptions, ProcessResult, ProcessStartOptions, RecordingHandle, RunningProcess, SelectedTranscriber, TimerHandle, TranscriptionRequest, TtsPlayback, TtsPlaybackOutcome, TtsPlaybackReference, TtsPlaybackResult, TtsSpeakRequest, VoiceActivityUpdate, VoiceDependencies, VoiceMediaAudioPoll, VoiceState, VoiceUi } from "./src/types/index.mjs";
|
|
4
4
|
import { IVoiceCommandCorrectionModelClient, IVoiceCommandCorrector, MAX_VOICE_COMMAND_CONTEXT_BYTES, VoiceCommandContext, VoiceCommandCorrectionInput, VoiceCommandCorrectionModelRequest, VoiceCommandCorrector, compactVoiceCommandContext, editDistance, phoneticKey } from "./src/services/commandCorrection.mjs";
|
|
5
|
+
import { ClientNarrationSynthesizer, ClientPcmAudioRecorder, ClientTtsAdapter, UnixVoiceMediaHostConnection, UnixVoiceMediaHostOptions, voiceMediaHostConnection } from "./src/adapters/audio/clientMedia.mjs";
|
|
6
|
+
import { ExecutableResolver, FfmpegAudioRecorder, FfmpegPcmAudioRecorder, MacOsSayPcmSynthesizer, MacOsSayTtsAdapter, NodeBinaryProcessSpawner, NodeProcessSpawner, PcmWavAnalyzer, SystemClock, TemporaryWorkspace, analyzePcmWav, writePrivatePcm16Wav } from "./src/adapters/audio/infrastructure.mjs";
|
|
5
7
|
import { DETERMINISTIC_FALLBACK_THRESHOLD_CHARACTERS, FallbackNarration, FallbackNarrationModelRequest, FallbackNarrationSource, IFallbackNarrationModelClient, IVoiceTurnFallbackNarrator, VoiceTurnFallbackNarrator, VoiceTurnFallbackNarratorOptions } from "./src/services/fallbackNarration.mjs";
|
|
6
8
|
import { NarrationPlaybackCoordinator, NarrationPlaybackLifecycleErrorObserver, NarrationPlaybackLifecycleEvent, NarrationPlaybackLifecycleObserver, NarrationPlaybackOutcome, NarrationPlaybackRequest, NarrationPlaybackSettlement } from "./src/services/narration.mjs";
|
|
7
9
|
import { VoiceNarrationPlayback, VoiceNarrationPlaybackDependencies, VoiceNarrationPlaybackLogger } from "./src/services/narrationPlayback.mjs";
|
|
8
10
|
import { MlxWhisperAdapter, OpenAiWhisperAdapter, TranscriberRegistry, WhisperCppAdapter } from "./src/adapters/transcription/whisper.mjs";
|
|
9
|
-
import { AutoCaptureActivityPresentation, AutoCaptureDeliveryIntent, AutoCapturePiEventController, PiVoiceConfigService, VoiceActivityPresentation, VoiceExtensionOptions, VoiceFooterContributionHandle, VoiceFooterContributionValue, VoiceLeaderContributionHandle, VoiceSessionController, VoiceTurnFallbackRuntime, canRunVoice, createVoiceContainer, createVoiceNarrationService, deliverAutoCaptureInput, extractTerminalAssistantText, formatAutoCaptureActivity, formatVoiceActivity, installVoiceRuntime, reconcileVoiceModeTools, registerAutoCaptureCordisEventHandlers, registerVoiceTurnFallback, resolveVoiceCommandCorrector, resolveVoiceFallbackNarrator, voiceLeaderBindings, voiceModeState } from "./src/adapters/pi/voice.mjs";
|
|
11
|
+
import { AutoCaptureActivityPresentation, AutoCaptureDeliveryIntent, AutoCapturePiEventController, PiVoiceConfigService, VoiceActivityPresentation, VoiceExtensionOptions, VoiceFooterContributionHandle, VoiceFooterContributionValue, VoiceLeaderContributionHandle, VoiceSessionController, VoiceTurnFallbackRuntime, canRunVoice, createVoiceContainer, createVoiceNarrationService, deliverAutoCaptureInput, extractTerminalAssistantText, formatAutoCaptureActivity, formatVoiceActivity, installVoiceRuntime, reconcileVoiceModeTools, registerAutoCaptureCordisEventHandlers, registerVoiceTurnFallback, resolveVoiceCommandCorrector, resolveVoiceFallbackNarrator, resolveVoiceTranscriptAdjudicator, voiceLeaderBindings, voiceModeState } from "./src/adapters/pi/voice.mjs";
|
|
10
12
|
import { PCM_BITS_PER_SAMPLE, PCM_BYTES_PER_SAMPLE, PCM_CHANNELS, PCM_FRAME_BYTES, PCM_FRAME_MS, PCM_SAMPLE_RATE, PcmFrameAssembler, encodePcm16Wav } from "./src/services/pcm.mjs";
|
|
11
13
|
import { ControlPhraseMatch, EchoProbeAction, EchoProbeClassification, EchoProbeInput, EchoProbeResult, EchoReference, EchoTailTimeline, IEchoProbeClassifier, NarrationAlignment, NarrationResidualAnalysis, RollingEchoProbeCoordinator, RollingEchoProbeState, SemanticEchoAdjudicator, alignNarrationSpan, extractNovelNarrationResidual, matchPlaybackStopPhrase, matchStartPhrase, matchStopPhrase, normalizeEchoText } from "./src/services/semanticEcho.mjs";
|
|
12
14
|
import { BoundedTranscriptionQueue, DEFAULT_UTTERANCE_LIMITS, PendingUtterance, UtteranceAssembler, UtteranceFinalizationReason, UtteranceLimits } from "./src/services/utterance.mjs";
|
|
13
|
-
export { AdaptiveVoiceActivityDetector, AudioActivityBucket, AudioActivityHistogram, AudioAnalysis, AutoCaptureActivationState, AutoCaptureActivityPresentation, AutoCaptureDeliveryIntent, AutoCaptureIndicatorState, AutoCapturePiEventController, AutoCaptureUi, BinaryProcessStartOptions, BinaryRunningProcess, BoundedTranscriptionQueue, ControlPhraseMatch, DEFAULT_UTTERANCE_LIMITS, DEFAULT_VAD_CONFIGURATION, DETERMINISTIC_FALLBACK_THRESHOLD_CHARACTERS, EchoProbeAction, EchoProbeClassification, EchoProbeInput, EchoProbeResult, EchoReference, EchoTailTimeline, ExecutableResolver, FallbackNarration, FallbackNarrationModelRequest, FallbackNarrationSource, FfmpegAudioRecorder, FfmpegPcmAudioRecorder, IAudioAnalyzer, IAudioRecorder, IBinaryProcessSpawner, IClock, IEchoProbeClassifier, IExecutableResolver, IFallbackNarrationModelClient, IPcmAudioRecorder, IProcessSpawner, ISpeechPresenceDetector, ITemporaryWorkspace, ITranscriberAdapter, ITranscriberRegistry, ITtsAdapter, IVoiceCommandCorrectionModelClient, IVoiceCommandCorrector, IVoiceSessionController, IVoiceTurnFallbackNarrator, LiveRecordingHandle, MAX_VOICE_COMMAND_CONTEXT_BYTES, MacOsSayTtsAdapter, MlxWhisperAdapter, NarrationAlignment, NarrationKind, NarrationPlaybackCoordinator, NarrationPlaybackLifecycleErrorObserver, NarrationPlaybackLifecycleEvent, NarrationPlaybackLifecycleObserver, NarrationPlaybackOutcome, NarrationPlaybackRequest, NarrationPlaybackSettlement, NarrationResidualAnalysis, NodeBinaryProcessSpawner, NodeProcessSpawner, OpenAiWhisperAdapter, PCM_BITS_PER_SAMPLE, PCM_BYTES_PER_SAMPLE, PCM_CHANNELS, PCM_FRAME_BYTES, PCM_FRAME_MS, PCM_SAMPLE_RATE, PcmFrameAssembler, PcmWavAnalyzer, PendingUtterance, PiVoiceConfigService, ProcessResult, ProcessStartOptions, RecordingHandle, RollingEchoProbeCoordinator, RollingEchoProbeState, RunningProcess, SelectedTranscriber, SemanticEchoAdjudicator, SystemClock, TemporaryWorkspace, TimerHandle, TranscriberRegistry, TranscriptionRequest, TtsPlayback, TtsPlaybackOutcome, TtsPlaybackReference, TtsPlaybackResult, TtsSpeakRequest, UtteranceAssembler, UtteranceFinalizationReason, UtteranceLimits, VadConfiguration, VadFrameMetadata, VadNoiseProfile, VadPushResult, VadSegment, VoiceActivityPresentation, VoiceActivityUpdate, VoiceCommandContext, VoiceCommandCorrectionInput, VoiceCommandCorrectionModelRequest, VoiceCommandCorrector, VoiceDependencies, VoiceExtensionOptions, VoiceFooterContributionHandle, VoiceFooterContributionValue, VoiceLeaderContributionHandle, VoiceNarrationPlayback, VoiceNarrationPlaybackDependencies, VoiceNarrationPlaybackLogger, VoiceSessionController, VoiceState, VoiceTurnFallbackNarrator, VoiceTurnFallbackNarratorOptions, VoiceTurnFallbackRuntime, VoiceUi, WhisperCppAdapter, alignNarrationSpan, analyzePcmWav, calculatePcmFrameDbfs, canRunVoice, compactVoiceCommandContext, createVoiceContainer, createVoiceNarrationService, deliverAutoCaptureInput, editDistance, encodePcm16Wav, extractNovelNarrationResidual, extractTerminalAssistantText, formatAutoCaptureActivity, formatVoiceActivity, installVoiceRuntime, matchPlaybackStopPhrase, matchStartPhrase, matchStopPhrase, normalizeEchoText, phoneticKey, reconcileVoiceModeTools, registerAutoCaptureCordisEventHandlers, registerVoiceTurnFallback, resolveVoiceCommandCorrector, resolveVoiceFallbackNarrator, voiceLeaderBindings, voiceModeState, writePrivatePcm16Wav };
|
|
15
|
+
export { AdaptiveVoiceActivityDetector, AudioActivityBucket, AudioActivityHistogram, AudioAnalysis, AutoCaptureActivationState, AutoCaptureActivityPresentation, AutoCaptureDeliveryIntent, AutoCaptureIndicatorState, AutoCapturePiEventController, AutoCaptureUi, BinaryProcessStartOptions, BinaryRunningProcess, BoundedTranscriptionQueue, ClientNarrationSynthesizer, ClientPcmAudioRecorder, ClientTtsAdapter, ControlPhraseMatch, DEFAULT_UTTERANCE_LIMITS, DEFAULT_VAD_CONFIGURATION, DETERMINISTIC_FALLBACK_THRESHOLD_CHARACTERS, EchoProbeAction, EchoProbeClassification, EchoProbeInput, EchoProbeResult, EchoReference, EchoTailTimeline, ExecutableResolver, FallbackNarration, FallbackNarrationModelRequest, FallbackNarrationSource, FfmpegAudioRecorder, FfmpegPcmAudioRecorder, IAudioAnalyzer, IAudioRecorder, IBinaryProcessSpawner, IClock, IEchoProbeClassifier, IExecutableResolver, IFallbackNarrationModelClient, IPcmAudioRecorder, IProcessSpawner, ISpeechPresenceDetector, ITemporaryWorkspace, ITranscriberAdapter, ITranscriberRegistry, ITtsAdapter, IVoiceCommandCorrectionModelClient, IVoiceCommandCorrector, IVoiceMediaHostConnection, IVoiceSessionController, IVoiceTurnFallbackNarrator, LiveRecordingHandle, MAX_VOICE_COMMAND_CONTEXT_BYTES, MacOsSayPcmSynthesizer, MacOsSayTtsAdapter, MlxWhisperAdapter, NarrationAlignment, NarrationKind, NarrationPlaybackCoordinator, NarrationPlaybackLifecycleErrorObserver, NarrationPlaybackLifecycleEvent, NarrationPlaybackLifecycleObserver, NarrationPlaybackOutcome, NarrationPlaybackRequest, NarrationPlaybackSettlement, NarrationResidualAnalysis, NodeBinaryProcessSpawner, NodeProcessSpawner, OpenAiWhisperAdapter, PCM_BITS_PER_SAMPLE, PCM_BYTES_PER_SAMPLE, PCM_CHANNELS, PCM_FRAME_BYTES, PCM_FRAME_MS, PCM_SAMPLE_RATE, PcmAudioRecorderStartOptions, PcmFrameAssembler, PcmWavAnalyzer, PendingUtterance, PiVoiceConfigService, ProcessResult, ProcessStartOptions, RecordingHandle, RollingEchoProbeCoordinator, RollingEchoProbeState, RunningProcess, SelectedTranscriber, SemanticEchoAdjudicator, SystemClock, TemporaryWorkspace, TimerHandle, TranscriberRegistry, TranscriptionRequest, TtsPlayback, TtsPlaybackOutcome, TtsPlaybackReference, TtsPlaybackResult, TtsSpeakRequest, UnixVoiceMediaHostConnection, UnixVoiceMediaHostOptions, UtteranceAssembler, UtteranceFinalizationReason, UtteranceLimits, VOICE_MEDIA_ACTIVITY_ELAPSED_HEADER, VOICE_MEDIA_ACTIVITY_EPOCH_HEADER, VOICE_MEDIA_ACTIVITY_LEVEL_HEADER, VOICE_MEDIA_ACTIVITY_SPEECH_MS_HEADER, VOICE_MEDIA_ACTIVITY_STATE_HEADER, VOICE_MEDIA_API_BASE_PATH, VOICE_MEDIA_BITS_PER_SAMPLE, VOICE_MEDIA_CHANNELS, VOICE_MEDIA_CONTENT_TYPE, VOICE_MEDIA_EVENT_WAIT_NONE, VOICE_MEDIA_HEARTBEAT_MS, VOICE_MEDIA_PLAYBACK_STATE_HEADER, VOICE_MEDIA_PROTOCOL_VERSION, VOICE_MEDIA_ROUTES, VOICE_MEDIA_SAMPLE_RATE, VOICE_MEDIA_WAKE_TYPE, VadConfiguration, VadFrameMetadata, VadNoiseProfile, VadPushResult, VadSegment, VoiceActivityPresentation, VoiceActivityUpdate, VoiceClientKind, VoiceCommandContext, VoiceCommandCorrectionInput, VoiceCommandCorrectionModelRequest, VoiceCommandCorrector, VoiceDependencies, VoiceExtensionOptions, VoiceFooterContributionHandle, VoiceFooterContributionValue, VoiceLeaderContributionHandle, VoiceMediaAudioPoll, VoiceMediaCapabilities, VoiceMediaCapture, VoiceMediaCaptureActivity, VoiceMediaCaptureActivityState, VoiceMediaCaptureConfiguration, VoiceMediaCaptureMode, VoiceMediaClientEvent, VoiceMediaConnectRequest, VoiceMediaConnectResult, VoiceMediaControlLocation, VoiceMediaDevice, VoiceMediaHeartbeatResult, VoiceMediaPlayback, VoiceMediaPlaybackDelivery, VoiceMediaPlaybackOutcome, VoiceMediaPlaybackResult, VoiceMediaTransport, VoiceMediaWake, VoiceNarrationPlayback, VoiceNarrationPlaybackDependencies, VoiceNarrationPlaybackLogger, VoiceSessionController, VoiceState, VoiceTurnFallbackNarrator, VoiceTurnFallbackNarratorOptions, VoiceTurnFallbackRuntime, VoiceUi, WhisperCppAdapter, alignNarrationSpan, analyzePcmWav, calculatePcmFrameDbfs, canRunVoice, compactVoiceCommandContext, createVoiceContainer, createVoiceNarrationService, deliverAutoCaptureInput, editDistance, encodePcm16Wav, extractNovelNarrationResidual, extractTerminalAssistantText, formatAutoCaptureActivity, formatVoiceActivity, installVoiceRuntime, matchPlaybackStopPhrase, matchStartPhrase, matchStopPhrase, normalizeEchoText, phoneticKey, reconcileVoiceModeTools, registerAutoCaptureCordisEventHandlers, registerVoiceTurnFallback, resolveVoiceCommandCorrector, resolveVoiceFallbackNarrator, resolveVoiceTranscriptAdjudicator, voiceLeaderBindings, voiceMediaClientUrl, voiceMediaHostConnection, voiceModeState, writePrivatePcm16Wav };
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{VOICE_MEDIA_ACTIVITY_ELAPSED_HEADER as e,VOICE_MEDIA_ACTIVITY_EPOCH_HEADER as t,VOICE_MEDIA_ACTIVITY_LEVEL_HEADER as n,VOICE_MEDIA_ACTIVITY_SPEECH_MS_HEADER as r,VOICE_MEDIA_ACTIVITY_STATE_HEADER as i,VOICE_MEDIA_API_BASE_PATH as a,VOICE_MEDIA_BITS_PER_SAMPLE as o,VOICE_MEDIA_CHANNELS as s,VOICE_MEDIA_CONTENT_TYPE as c,VOICE_MEDIA_EVENT_WAIT_NONE as l,VOICE_MEDIA_HEARTBEAT_MS as u,VOICE_MEDIA_PLAYBACK_STATE_HEADER as d,VOICE_MEDIA_PROTOCOL_VERSION as f,VOICE_MEDIA_ROUTES as p,VOICE_MEDIA_SAMPLE_RATE as m,VOICE_MEDIA_WAKE_TYPE as h,voiceMediaClientUrl as g}from"./src/types/clientMedia.mjs";import{PCM_BITS_PER_SAMPLE as _,PCM_BYTES_PER_SAMPLE as v,PCM_CHANNELS as y,PCM_FRAME_BYTES as b,PCM_FRAME_MS as x,PCM_SAMPLE_RATE as S,PcmFrameAssembler as C,encodePcm16Wav as w}from"./src/services/pcm.mjs";import{ExecutableResolver as T,FfmpegAudioRecorder as E,FfmpegPcmAudioRecorder as D,MacOsSayPcmSynthesizer as O,MacOsSayTtsAdapter as k,NodeBinaryProcessSpawner as A,NodeProcessSpawner as j,PcmWavAnalyzer as M,SystemClock as N,TemporaryWorkspace as P,analyzePcmWav as F,writePrivatePcm16Wav as I}from"./src/adapters/audio/infrastructure.mjs";import{ClientPcmAudioRecorder as L,ClientTtsAdapter as R,UnixVoiceMediaHostConnection as z,voiceMediaHostConnection as B}from"./src/adapters/audio/clientMedia.mjs";import{MAX_VOICE_COMMAND_CONTEXT_BYTES as V,VoiceCommandCorrector as H,compactVoiceCommandContext as U,editDistance as W,phoneticKey as G}from"./src/services/commandCorrection.mjs";import{DETERMINISTIC_FALLBACK_THRESHOLD_CHARACTERS as K,VoiceTurnFallbackNarrator as q}from"./src/services/fallbackNarration.mjs";import{EchoTailTimeline as J,RollingEchoProbeCoordinator as Y,SemanticEchoAdjudicator as X,alignNarrationSpan as Z,extractNovelNarrationResidual as Q,matchPlaybackStopPhrase as $,matchStartPhrase as ee,matchStopPhrase as te,normalizeEchoText as ne}from"./src/services/semanticEcho.mjs";import{AdaptiveVoiceActivityDetector as re,DEFAULT_VAD_CONFIGURATION as ie,calculatePcmFrameDbfs as ae}from"./src/services/vad.mjs";import{NarrationPlaybackCoordinator as oe}from"./src/services/narration.mjs";import{VoiceNarrationPlayback as se}from"./src/services/narrationPlayback.mjs";import{MlxWhisperAdapter as ce,OpenAiWhisperAdapter as le,TranscriberRegistry as ue,WhisperCppAdapter as de}from"./src/adapters/transcription/whisper.mjs";import{PiVoiceConfigService as fe,VoiceSessionController as pe,canRunVoice as me,createVoiceContainer as he,createVoiceNarrationService as ge,deliverAutoCaptureInput as _e,extractTerminalAssistantText as ve,formatAutoCaptureActivity as ye,formatVoiceActivity as be,installVoiceRuntime as xe,reconcileVoiceModeTools as Se,registerAutoCaptureCordisEventHandlers as Ce,registerVoiceTurnFallback as we,resolveVoiceCommandCorrector as Te,resolveVoiceFallbackNarrator as Ee,resolveVoiceTranscriptAdjudicator as De,voiceLeaderBindings as Oe,voiceModeState as ke}from"./src/adapters/pi/voice.mjs";import{BoundedTranscriptionQueue as Ae,DEFAULT_UTTERANCE_LIMITS as je,UtteranceAssembler as Me}from"./src/services/utterance.mjs";export{re as AdaptiveVoiceActivityDetector,Ae as BoundedTranscriptionQueue,L as ClientPcmAudioRecorder,R as ClientTtsAdapter,je as DEFAULT_UTTERANCE_LIMITS,ie as DEFAULT_VAD_CONFIGURATION,K as DETERMINISTIC_FALLBACK_THRESHOLD_CHARACTERS,J as EchoTailTimeline,T as ExecutableResolver,E as FfmpegAudioRecorder,D as FfmpegPcmAudioRecorder,V as MAX_VOICE_COMMAND_CONTEXT_BYTES,O as MacOsSayPcmSynthesizer,k as MacOsSayTtsAdapter,ce as MlxWhisperAdapter,oe as NarrationPlaybackCoordinator,A as NodeBinaryProcessSpawner,j as NodeProcessSpawner,le as OpenAiWhisperAdapter,_ as PCM_BITS_PER_SAMPLE,v as PCM_BYTES_PER_SAMPLE,y as PCM_CHANNELS,b as PCM_FRAME_BYTES,x as PCM_FRAME_MS,S as PCM_SAMPLE_RATE,C as PcmFrameAssembler,M as PcmWavAnalyzer,fe as PiVoiceConfigService,Y as RollingEchoProbeCoordinator,X as SemanticEchoAdjudicator,N as SystemClock,P as TemporaryWorkspace,ue as TranscriberRegistry,z as UnixVoiceMediaHostConnection,Me as UtteranceAssembler,e as VOICE_MEDIA_ACTIVITY_ELAPSED_HEADER,t as VOICE_MEDIA_ACTIVITY_EPOCH_HEADER,n as VOICE_MEDIA_ACTIVITY_LEVEL_HEADER,r as VOICE_MEDIA_ACTIVITY_SPEECH_MS_HEADER,i as VOICE_MEDIA_ACTIVITY_STATE_HEADER,a as VOICE_MEDIA_API_BASE_PATH,o as VOICE_MEDIA_BITS_PER_SAMPLE,s as VOICE_MEDIA_CHANNELS,c as VOICE_MEDIA_CONTENT_TYPE,l as VOICE_MEDIA_EVENT_WAIT_NONE,u as VOICE_MEDIA_HEARTBEAT_MS,d as VOICE_MEDIA_PLAYBACK_STATE_HEADER,f as VOICE_MEDIA_PROTOCOL_VERSION,p as VOICE_MEDIA_ROUTES,m as VOICE_MEDIA_SAMPLE_RATE,h as VOICE_MEDIA_WAKE_TYPE,H as VoiceCommandCorrector,se as VoiceNarrationPlayback,pe as VoiceSessionController,q as VoiceTurnFallbackNarrator,de as WhisperCppAdapter,Z as alignNarrationSpan,F as analyzePcmWav,ae as calculatePcmFrameDbfs,me as canRunVoice,U as compactVoiceCommandContext,he as createVoiceContainer,ge as createVoiceNarrationService,_e as deliverAutoCaptureInput,W as editDistance,w as encodePcm16Wav,Q as extractNovelNarrationResidual,ve as extractTerminalAssistantText,ye as formatAutoCaptureActivity,be as formatVoiceActivity,xe as installVoiceRuntime,$ as matchPlaybackStopPhrase,ee as matchStartPhrase,te as matchStopPhrase,ne as normalizeEchoText,G as phoneticKey,Se as reconcileVoiceModeTools,Ce as registerAutoCaptureCordisEventHandlers,we as registerVoiceTurnFallback,Te as resolveVoiceCommandCorrector,Ee as resolveVoiceFallbackNarrator,De as resolveVoiceTranscriptAdjudicator,Oe as voiceLeaderBindings,g as voiceMediaClientUrl,B as voiceMediaHostConnection,ke as voiceModeState,I as writePrivatePcm16Wav};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./src/adapters/clientMediaApi.cjs");exports.api=e.api,exports.createVoiceMediaApi=e.createVoiceMediaApi;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{api as e,createVoiceMediaApi as t}from"./src/adapters/clientMediaApi.mjs";export{e as api,t as createVoiceMediaApi};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("../../../_virtual/_rolldown/runtime.cjs"),t=require("../../types/clientMedia.cjs"),n=require("../../services/pcm.cjs");let r=require("node:http");r=e.__toESM(r,1);let i=require("node:crypto"),a=require("@agimon-ai/doompi-extension-contracts/package-api");const o=65536;function s(e){return e instanceof Error?e.message:String(e)}function c(e){return{code:1,stdout:``,stderr:s(e)}}var l=class{options;constructor(e){this.options=e}async startCapture(e,n){await this.expect(this.request(`POST`,t.VOICE_MEDIA_ROUTES.hostCaptureStart,{captureId:e,configuration:n}),201)}async readCapture(e){let n=await this.request(`GET`,`${t.VOICE_MEDIA_ROUTES.hostCaptureAudio}?captureId=${encodeURIComponent(e)}`);if(n.status===200&&n.headers[`content-type`]?.startsWith(`application/vnd.doompi.pcm-s16le`)){let e=this.captureActivity(n.headers);return{pcm:n.body,state:`active`,...e===void 0?{}:{activity:e}}}if(n.status===204){let e=n.headers[`x-doompi-capture-state`],t=e===`stopping`||e===`stopped`?e:`active`;return{pcm:Buffer.alloc(0),state:t}}throw this.responseError(n)}async stopCapture(e){await this.expect(this.request(`POST`,t.VOICE_MEDIA_ROUTES.hostCaptureStop,{captureId:e}),204)}async abortCapture(e){await this.expect(this.request(`POST`,t.VOICE_MEDIA_ROUTES.hostCaptureAbort,{captureId:e}),204)}async startPlayback(e){let n=await this.request(`POST`,t.VOICE_MEDIA_ROUTES.hostPlaybackStart,e);if(n.status!==201)throw this.responseError(n);let r=JSON.parse(n.body.toString(`utf8`));if(typeof r!=`object`||!r||!(`delivery`in r)||r.delivery!==`client`&&r.delivery!==`streamed`)throw Error(`Voice media host returned an invalid playback delivery.`);return r.delivery}async sendPlaybackAudio(e,n){await this.expect(this.requestBinary(`POST`,`${t.VOICE_MEDIA_ROUTES.hostPlaybackAudio}?playbackId=${encodeURIComponent(e)}`,n),204)}async sealPlaybackAudio(e,n){await this.expect(this.request(`POST`,t.VOICE_MEDIA_ROUTES.hostPlaybackAudioEnd,{playbackId:e,...n===void 0?{}:{error:n}}),204)}async readPlayback(e){let n=await this.request(`GET`,`${t.VOICE_MEDIA_ROUTES.hostPlaybackResult}?playbackId=${encodeURIComponent(e)}`);if(n.status===204)return;if(n.status!==200)throw this.responseError(n);let r=JSON.parse(n.body.toString(`utf8`));if(typeof r!=`object`||!r||!(`outcome`in r))throw Error(`Voice media client returned an invalid playback result.`);return r}async stopPlayback(e){await this.expect(this.request(`POST`,t.VOICE_MEDIA_ROUTES.hostPlaybackStop,{playbackId:e}),204)}async abortPlayback(e){await this.expect(this.request(`POST`,t.VOICE_MEDIA_ROUTES.hostPlaybackAbort,{playbackId:e}),204)}request(e,n,i){let o=i===void 0?void 0:Buffer.from(JSON.stringify(i),`utf8`);return new Promise((i,s)=>{let c=r.default.request({socketPath:this.options.socketPath,path:`${a.DOOM_API_ROUTE_PREFIX}/${t.VOICE_MEDIA_API_BASE_PATH}${n}`,method:e,headers:{authorization:`Bearer ${this.options.internalToken}`,...o===void 0?{}:{"content-type":`application/json`,"content-length":String(o.byteLength)}}},e=>{let t=[];e.on(`data`,e=>t.push(e)),e.once(`end`,()=>i({status:e.statusCode??500,headers:e.headers,body:Buffer.concat(t)}))});c.once(`error`,s),o!==void 0&&c.write(o),c.end()})}requestBinary(e,n,i){return new Promise((o,s)=>{let c=r.default.request({socketPath:this.options.socketPath,path:`${a.DOOM_API_ROUTE_PREFIX}/${t.VOICE_MEDIA_API_BASE_PATH}${n}`,method:e,headers:{authorization:`Bearer ${this.options.internalToken}`,"content-type":t.VOICE_MEDIA_CONTENT_TYPE,"content-length":String(i.byteLength)}},e=>{let t=[];e.on(`data`,e=>t.push(e)),e.once(`end`,()=>o({status:e.statusCode??500,headers:e.headers,body:Buffer.concat(t)}))});c.once(`error`,s),c.write(i),c.end()})}captureActivity(e){let n=e[t.VOICE_MEDIA_ACTIVITY_STATE_HEADER];if(n===void 0)return;let r=Number(e[t.VOICE_MEDIA_ACTIVITY_LEVEL_HEADER]),i=Number(e[t.VOICE_MEDIA_ACTIVITY_ELAPSED_HEADER]),a=e[t.VOICE_MEDIA_ACTIVITY_EPOCH_HEADER],o=e[t.VOICE_MEDIA_ACTIVITY_SPEECH_MS_HEADER],s=a===void 0?void 0:Number(a),c=o===void 0?void 0:Number(o);if(n!==`listening`&&n!==`speech`&&n!==`endpoint`||!Number.isFinite(r)||!Number.isSafeInteger(i)||s!==void 0&&(!Number.isSafeInteger(s)||s<0)||c!==void 0&&(!Number.isSafeInteger(c)||c<0))throw Error(`Voice media client returned invalid capture activity.`);return{state:n,levelDbfs:r,elapsedMs:i,...s===void 0?{}:{epoch:s},...c===void 0?{}:{classifiedSpeechMs:c}}}async expect(e,t){let n=await e;if(n.status!==t)throw this.responseError(n)}responseError(e){let t=e.body.toString(`utf8`);try{let e=JSON.parse(t);typeof e==`object`&&e&&`error`in e&&typeof e.error==`string`&&(t=e.error)}catch{}return Error(t||`Voice media request failed with status ${String(e.status)}.`)}};function u(e=process.env){let t=e[a.DOOM_API_SOCKET_ENV],n=e[a.DOOM_API_INTERNAL_TOKEN_ENV];return t&&n?new l({socketPath:t,internalToken:n}):void 0}var d=class{connection;options;completion;captureId=`client-capture-${(0,i.randomUUID)()}`;assembler=new n.PcmFrameAssembler;started;aborting=!1;stopOperation;abortOperation;constructor(e,t,n){this.connection=e,this.options=n,this.started=e.startCapture(this.captureId,n.capture),this.completion=this.consume(t).catch(c)}stop(){return this.stopOperation??=this.stopCapture(),this.stopOperation}abort(){return this.abortOperation??=this.abortCapture(),this.abortOperation}async consume(e){for(await this.started;!this.aborting;){let t=await this.connection.readCapture(this.captureId);t.activity!==void 0&&this.options.onClientActivity?.(t.activity);for(let n of this.assembler.push(t.pcm))e(n);if(t.state===`stopped`)return{code:0,stdout:``,stderr:``}}return{code:0,stdout:``,stderr:``}}async stopCapture(){await this.started,await this.connection.stopCapture(this.captureId);let e=await this.completion;if(e.code!==0)throw Error(e.stderr||`Voice media client stopped unexpectedly.`);return this.assembler.flush()}async abortCapture(){return this.aborting=!0,await this.started.then(()=>this.connection.abortCapture(this.captureId),()=>void 0),await this.completion.catch(()=>void 0),this.assembler.flush()}},f=class{connection;constructor(e){this.connection=e}preflight(e){}start(e,t,n={capture:{mode:`manual`,activityControl:`host`}}){return new d(this.connection,t,n)}},p=class{request;playbackId;connection;clock;synthesizer;reference;completion;started;synthesisController=new AbortController;stopOperation;abortOperation;constructor(e,t,n,r,i){this.request=e,this.playbackId=t,this.connection=n,this.clock=r,this.synthesizer=i,this.reference={id:e.id,kind:e.kind,text:e.text,startedAt:r.now()},this.started=n.startPlayback({playbackId:t,text:e.text,...e.config.voice?{voice:e.config.voice}:{},...e.config.rate===void 0?{}:{rate:e.config.rate}}),this.completion=this.settle()}stop(){return this.stopOperation??=this.stopPlayback(!1),this.stopOperation}abort(){return this.abortOperation??=this.stopPlayback(!0),this.abortOperation}async settle(){try{await this.started===`streamed`&&await this.uploadNarration();let e;for(;e===void 0;)e=await this.connection.readPlayback(this.playbackId);return{outcome:e.outcome,reference:{...this.reference,endedAt:this.clock.now()},process:{code:+(e.outcome===`failed`),stdout:``,stderr:e.error??``}}}catch(e){return{outcome:`failed`,reference:{...this.reference,endedAt:this.clock.now()},process:c(e)}}}async uploadNarration(){if(this.synthesizer===void 0||this.connection.sendPlaybackAudio===void 0||this.connection.sealPlaybackAudio===void 0){await this.connection.sealPlaybackAudio?.(this.playbackId,`Backend narration synthesis is unavailable.`);return}try{let e=await this.synthesizer.synthesize(this.request,this.synthesisController.signal);for(let t=0;t<e.byteLength;t+=o)await this.connection.sendPlaybackAudio(this.playbackId,e.subarray(t,t+o));await this.connection.sealPlaybackAudio(this.playbackId)}catch(e){await this.connection.sealPlaybackAudio?.(this.playbackId,s(e)).catch(()=>void 0)}}async stopPlayback(e){this.synthesisController.abort(),await this.started,e?await this.connection.abortPlayback(this.playbackId):await this.connection.stopPlayback(this.playbackId),await this.completion}},m=class{connection;clock;synthesizer;constructor(e,t,n){this.connection=e,this.clock=t,this.synthesizer=n}preflight(e){}speak(e){let t=e.text.trim();if(!t)throw Error(`Voice narration text must not be empty`);return new p({...e,text:t},`client-playback-${String(e.id)}-${(0,i.randomUUID)()}`,this.connection,this.clock,this.synthesizer)}};exports.ClientPcmAudioRecorder=f,exports.ClientTtsAdapter=m,exports.UnixVoiceMediaHostConnection=l,exports.voiceMediaHostConnection=u;
|
|
2
|
+
//# sourceMappingURL=clientMedia.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clientMedia.cjs","names":["VOICE_MEDIA_ROUTES","http","DOOM_API_ROUTE_PREFIX","VOICE_MEDIA_API_BASE_PATH","VOICE_MEDIA_CONTENT_TYPE","VOICE_MEDIA_ACTIVITY_STATE_HEADER","VOICE_MEDIA_ACTIVITY_LEVEL_HEADER","VOICE_MEDIA_ACTIVITY_ELAPSED_HEADER","VOICE_MEDIA_ACTIVITY_EPOCH_HEADER","VOICE_MEDIA_ACTIVITY_SPEECH_MS_HEADER","DOOM_API_SOCKET_ENV","DOOM_API_INTERNAL_TOKEN_ENV","randomUUID","PcmFrameAssembler"],"sources":["../../../../src/adapters/audio/clientMedia.ts"],"sourcesContent":["import http from 'node:http';\nimport { randomUUID } from 'node:crypto';\nimport {\n DOOM_API_INTERNAL_TOKEN_ENV,\n DOOM_API_ROUTE_PREFIX,\n DOOM_API_SOCKET_ENV,\n} from '@agimon-ai/doompi-extension-contracts/package-api';\nimport { PcmFrameAssembler } from '../../services/pcm.ts';\nimport type {\n IClock,\n IPcmAudioRecorder,\n ITtsAdapter,\n IVoiceMediaHostConnection,\n LiveRecordingHandle,\n PcmAudioRecorderStartOptions,\n ProcessResult,\n TtsPlayback,\n TtsPlaybackReference,\n TtsPlaybackResult,\n TtsSpeakRequest,\n VoiceMediaAudioPoll,\n} from '../../types/index.ts';\nimport {\n VOICE_MEDIA_ACTIVITY_ELAPSED_HEADER,\n VOICE_MEDIA_ACTIVITY_EPOCH_HEADER,\n VOICE_MEDIA_ACTIVITY_LEVEL_HEADER,\n VOICE_MEDIA_ACTIVITY_SPEECH_MS_HEADER,\n VOICE_MEDIA_ACTIVITY_STATE_HEADER,\n VOICE_MEDIA_API_BASE_PATH,\n type VoiceMediaCaptureActivity,\n type VoiceMediaCaptureConfiguration,\n VOICE_MEDIA_CONTENT_TYPE,\n type VoiceMediaPlaybackDelivery,\n type VoiceMediaPlaybackResult,\n VOICE_MEDIA_ROUTES,\n} from '../../types/clientMedia.ts';\nimport type { ResolvedVoiceConfig, VoiceTtsConfig } from '@agimon-ai/doompi-config';\n\nconst JSON_CONTENT_TYPE = 'application/json';\nconst CAPTURE_ID_PREFIX = 'client-capture';\nconst PLAYBACK_ID_PREFIX = 'client-playback';\nconst PLAYBACK_AUDIO_CHUNK_BYTES = 64 * 1024;\n\nexport interface ClientNarrationSynthesizer {\n synthesize(request: TtsSpeakRequest, signal: AbortSignal): Promise<Buffer>;\n}\n\ninterface UnixResponse {\n status: number;\n headers: http.IncomingHttpHeaders;\n body: Buffer;\n}\n\nfunction describeError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction failedProcess(error: unknown): ProcessResult {\n return { code: 1, stdout: '', stderr: describeError(error) };\n}\n\nexport interface UnixVoiceMediaHostOptions {\n socketPath: string;\n internalToken: string;\n}\n\nexport class UnixVoiceMediaHostConnection implements IVoiceMediaHostConnection {\n public constructor(private readonly options: UnixVoiceMediaHostOptions) {}\n\n public async startCapture(captureId: string, configuration: VoiceMediaCaptureConfiguration): Promise<void> {\n await this.expect(this.request('POST', VOICE_MEDIA_ROUTES.hostCaptureStart, { captureId, configuration }), 201);\n }\n\n public async readCapture(captureId: string): Promise<VoiceMediaAudioPoll> {\n const response = await this.request(\n 'GET',\n `${VOICE_MEDIA_ROUTES.hostCaptureAudio}?captureId=${encodeURIComponent(captureId)}`,\n );\n if (response.status === 200 && response.headers['content-type']?.startsWith(VOICE_MEDIA_CONTENT_TYPE)) {\n const activity = this.captureActivity(response.headers);\n return { pcm: response.body, state: 'active' as const, ...(activity === undefined ? {} : { activity }) };\n }\n if (response.status === 204) {\n const rawState = response.headers['x-doompi-capture-state'];\n const state: VoiceMediaAudioPoll['state'] =\n rawState === 'stopping' || rawState === 'stopped' ? rawState : 'active';\n return { pcm: Buffer.alloc(0), state };\n }\n throw this.responseError(response);\n }\n\n public async stopCapture(captureId: string): Promise<void> {\n await this.expect(this.request('POST', VOICE_MEDIA_ROUTES.hostCaptureStop, { captureId }), 204);\n }\n\n public async abortCapture(captureId: string): Promise<void> {\n await this.expect(this.request('POST', VOICE_MEDIA_ROUTES.hostCaptureAbort, { captureId }), 204);\n }\n\n public async startPlayback(request: {\n playbackId: string;\n text: string;\n voice?: string;\n rate?: number;\n }): Promise<VoiceMediaPlaybackDelivery> {\n const response = await this.request('POST', VOICE_MEDIA_ROUTES.hostPlaybackStart, request);\n if (response.status !== 201) throw this.responseError(response);\n const parsed: unknown = JSON.parse(response.body.toString('utf8'));\n if (\n typeof parsed !== 'object' ||\n parsed === null ||\n !('delivery' in parsed) ||\n (parsed.delivery !== 'client' && parsed.delivery !== 'streamed')\n )\n throw new Error('Voice media host returned an invalid playback delivery.');\n return parsed.delivery;\n }\n\n public async sendPlaybackAudio(playbackId: string, pcm: Buffer): Promise<void> {\n await this.expect(\n this.requestBinary(\n 'POST',\n `${VOICE_MEDIA_ROUTES.hostPlaybackAudio}?playbackId=${encodeURIComponent(playbackId)}`,\n pcm,\n ),\n 204,\n );\n }\n\n public async sealPlaybackAudio(playbackId: string, error?: string): Promise<void> {\n await this.expect(\n this.request('POST', VOICE_MEDIA_ROUTES.hostPlaybackAudioEnd, {\n playbackId,\n ...(error === undefined ? {} : { error }),\n }),\n 204,\n );\n }\n\n public async readPlayback(playbackId: string): Promise<VoiceMediaPlaybackResult | undefined> {\n const response = await this.request(\n 'GET',\n `${VOICE_MEDIA_ROUTES.hostPlaybackResult}?playbackId=${encodeURIComponent(playbackId)}`,\n );\n if (response.status === 204) return undefined;\n if (response.status !== 200) throw this.responseError(response);\n const parsed: unknown = JSON.parse(response.body.toString('utf8'));\n if (typeof parsed !== 'object' || parsed === null || !('outcome' in parsed))\n throw new Error('Voice media client returned an invalid playback result.');\n return parsed as VoiceMediaPlaybackResult;\n }\n\n public async stopPlayback(playbackId: string): Promise<void> {\n await this.expect(this.request('POST', VOICE_MEDIA_ROUTES.hostPlaybackStop, { playbackId }), 204);\n }\n\n public async abortPlayback(playbackId: string): Promise<void> {\n await this.expect(this.request('POST', VOICE_MEDIA_ROUTES.hostPlaybackAbort, { playbackId }), 204);\n }\n\n private request(method: string, route: string, json?: object): Promise<UnixResponse> {\n const body = json === undefined ? undefined : Buffer.from(JSON.stringify(json), 'utf8');\n return new Promise((resolve, reject) => {\n const request = http.request(\n {\n socketPath: this.options.socketPath,\n path: `${DOOM_API_ROUTE_PREFIX}/${VOICE_MEDIA_API_BASE_PATH}${route}`,\n method,\n headers: {\n authorization: `Bearer ${this.options.internalToken}`,\n ...(body === undefined\n ? {}\n : { 'content-type': JSON_CONTENT_TYPE, 'content-length': String(body.byteLength) }),\n },\n },\n (response) => {\n const chunks: Buffer[] = [];\n response.on('data', (chunk: Buffer) => chunks.push(chunk));\n response.once('end', () =>\n resolve({ status: response.statusCode ?? 500, headers: response.headers, body: Buffer.concat(chunks) }),\n );\n },\n );\n request.once('error', reject);\n if (body !== undefined) request.write(body);\n request.end();\n });\n }\n\n private requestBinary(method: string, route: string, body: Buffer): Promise<UnixResponse> {\n return new Promise((resolve, reject) => {\n const request = http.request(\n {\n socketPath: this.options.socketPath,\n path: `${DOOM_API_ROUTE_PREFIX}/${VOICE_MEDIA_API_BASE_PATH}${route}`,\n method,\n headers: {\n authorization: `Bearer ${this.options.internalToken}`,\n 'content-type': VOICE_MEDIA_CONTENT_TYPE,\n 'content-length': String(body.byteLength),\n },\n },\n (response) => {\n const chunks: Buffer[] = [];\n response.on('data', (chunk: Buffer) => chunks.push(chunk));\n response.once('end', () =>\n resolve({ status: response.statusCode ?? 500, headers: response.headers, body: Buffer.concat(chunks) }),\n );\n },\n );\n request.once('error', reject);\n request.write(body);\n request.end();\n });\n }\n\n private captureActivity(headers: http.IncomingHttpHeaders): VoiceMediaCaptureActivity | undefined {\n const state = headers[VOICE_MEDIA_ACTIVITY_STATE_HEADER];\n if (state === undefined) return undefined;\n const levelDbfs = Number(headers[VOICE_MEDIA_ACTIVITY_LEVEL_HEADER]);\n const elapsedMs = Number(headers[VOICE_MEDIA_ACTIVITY_ELAPSED_HEADER]);\n const epochHeader = headers[VOICE_MEDIA_ACTIVITY_EPOCH_HEADER];\n const speechMsHeader = headers[VOICE_MEDIA_ACTIVITY_SPEECH_MS_HEADER];\n const epoch = epochHeader === undefined ? undefined : Number(epochHeader);\n const classifiedSpeechMs = speechMsHeader === undefined ? undefined : Number(speechMsHeader);\n if (\n (state !== 'listening' && state !== 'speech' && state !== 'endpoint') ||\n !Number.isFinite(levelDbfs) ||\n !Number.isSafeInteger(elapsedMs) ||\n (epoch !== undefined && (!Number.isSafeInteger(epoch) || epoch < 0)) ||\n (classifiedSpeechMs !== undefined && (!Number.isSafeInteger(classifiedSpeechMs) || classifiedSpeechMs < 0))\n )\n throw new Error('Voice media client returned invalid capture activity.');\n return {\n state,\n levelDbfs,\n elapsedMs,\n ...(epoch === undefined ? {} : { epoch }),\n ...(classifiedSpeechMs === undefined ? {} : { classifiedSpeechMs }),\n };\n }\n private async expect(pending: Promise<UnixResponse>, status: number): Promise<void> {\n const response = await pending;\n if (response.status !== status) throw this.responseError(response);\n }\n\n private responseError(response: UnixResponse): Error {\n let message = response.body.toString('utf8');\n try {\n const parsed: unknown = JSON.parse(message);\n if (typeof parsed === 'object' && parsed !== null && 'error' in parsed && typeof parsed.error === 'string')\n message = parsed.error;\n } catch {\n // A non-JSON response body is already the best available diagnostic.\n }\n return new Error(message || `Voice media request failed with status ${String(response.status)}.`);\n }\n}\n\nexport function voiceMediaHostConnection(\n environment: NodeJS.ProcessEnv = process.env,\n): UnixVoiceMediaHostConnection | undefined {\n const socketPath = environment[DOOM_API_SOCKET_ENV];\n const internalToken = environment[DOOM_API_INTERNAL_TOKEN_ENV];\n return socketPath && internalToken ? new UnixVoiceMediaHostConnection({ socketPath, internalToken }) : undefined;\n}\n\nclass ClientPcmRecording implements LiveRecordingHandle {\n public readonly completion: Promise<ProcessResult>;\n private readonly captureId = `${CAPTURE_ID_PREFIX}-${randomUUID()}`;\n private readonly assembler = new PcmFrameAssembler();\n private readonly started: Promise<void>;\n private aborting = false;\n private stopOperation: Promise<Buffer> | undefined;\n private abortOperation: Promise<Buffer> | undefined;\n\n public constructor(\n private readonly connection: IVoiceMediaHostConnection,\n onFrame: (frame: Buffer) => void,\n private readonly options: PcmAudioRecorderStartOptions,\n ) {\n this.started = connection.startCapture(this.captureId, options.capture);\n this.completion = this.consume(onFrame).catch(failedProcess);\n }\n\n public stop(): Promise<Buffer> {\n this.stopOperation ??= this.stopCapture();\n return this.stopOperation;\n }\n\n public abort(): Promise<Buffer> {\n this.abortOperation ??= this.abortCapture();\n return this.abortOperation;\n }\n\n private async consume(onFrame: (frame: Buffer) => void): Promise<ProcessResult> {\n await this.started;\n while (!this.aborting) {\n const batch = await this.connection.readCapture(this.captureId);\n if (batch.activity !== undefined) this.options.onClientActivity?.(batch.activity);\n for (const frame of this.assembler.push(batch.pcm)) onFrame(frame);\n if (batch.state === 'stopped') return { code: 0, stdout: '', stderr: '' };\n }\n return { code: 0, stdout: '', stderr: '' };\n }\n\n private async stopCapture(): Promise<Buffer> {\n await this.started;\n await this.connection.stopCapture(this.captureId);\n const result = await this.completion;\n if (result.code !== 0) throw new Error(result.stderr || 'Voice media client stopped unexpectedly.');\n return this.assembler.flush();\n }\n\n private async abortCapture(): Promise<Buffer> {\n this.aborting = true;\n await this.started.then(\n () => this.connection.abortCapture(this.captureId),\n () => undefined,\n );\n await this.completion.catch(() => undefined);\n return this.assembler.flush();\n }\n}\n\nexport class ClientPcmAudioRecorder implements IPcmAudioRecorder {\n public constructor(private readonly connection: IVoiceMediaHostConnection) {}\n\n public preflight(_config: ResolvedVoiceConfig): void {}\n\n public start(\n _config: ResolvedVoiceConfig,\n onFrame: (frame: Buffer) => void,\n options: PcmAudioRecorderStartOptions = {\n capture: { mode: 'manual', activityControl: 'host' },\n },\n ): LiveRecordingHandle {\n return new ClientPcmRecording(this.connection, onFrame, options);\n }\n}\n\nclass ClientTtsPlayback implements TtsPlayback {\n public readonly reference: TtsPlaybackReference;\n public readonly completion: Promise<TtsPlaybackResult>;\n private readonly started: Promise<VoiceMediaPlaybackDelivery | void>;\n private readonly synthesisController = new AbortController();\n private stopOperation: Promise<void> | undefined;\n private abortOperation: Promise<void> | undefined;\n\n public constructor(\n private readonly request: TtsSpeakRequest,\n private readonly playbackId: string,\n private readonly connection: IVoiceMediaHostConnection,\n private readonly clock: IClock,\n private readonly synthesizer?: ClientNarrationSynthesizer,\n ) {\n this.reference = {\n id: request.id,\n kind: request.kind,\n text: request.text,\n startedAt: clock.now(),\n };\n this.started = connection.startPlayback({\n playbackId,\n text: request.text,\n ...(request.config.voice ? { voice: request.config.voice } : {}),\n ...(request.config.rate === undefined ? {} : { rate: request.config.rate }),\n });\n this.completion = this.settle();\n }\n\n public stop(): Promise<void> {\n this.stopOperation ??= this.stopPlayback(false);\n return this.stopOperation;\n }\n\n public abort(): Promise<void> {\n this.abortOperation ??= this.stopPlayback(true);\n return this.abortOperation;\n }\n\n private async settle(): Promise<TtsPlaybackResult> {\n try {\n const delivery = await this.started;\n if (delivery === 'streamed') await this.uploadNarration();\n let result: VoiceMediaPlaybackResult | undefined;\n while (result === undefined) result = await this.connection.readPlayback(this.playbackId);\n return {\n outcome: result.outcome,\n reference: { ...this.reference, endedAt: this.clock.now() },\n process: { code: result.outcome === 'failed' ? 1 : 0, stdout: '', stderr: result.error ?? '' },\n };\n } catch (error) {\n return {\n outcome: 'failed',\n reference: { ...this.reference, endedAt: this.clock.now() },\n process: failedProcess(error),\n };\n }\n }\n\n private async uploadNarration(): Promise<void> {\n if (\n this.synthesizer === undefined ||\n this.connection.sendPlaybackAudio === undefined ||\n this.connection.sealPlaybackAudio === undefined\n ) {\n await this.connection.sealPlaybackAudio?.(this.playbackId, 'Backend narration synthesis is unavailable.');\n return;\n }\n try {\n const pcm = await this.synthesizer.synthesize(this.request, this.synthesisController.signal);\n for (let offset = 0; offset < pcm.byteLength; offset += PLAYBACK_AUDIO_CHUNK_BYTES) {\n await this.connection.sendPlaybackAudio(\n this.playbackId,\n pcm.subarray(offset, offset + PLAYBACK_AUDIO_CHUNK_BYTES),\n );\n }\n await this.connection.sealPlaybackAudio(this.playbackId);\n } catch (error) {\n await this.connection.sealPlaybackAudio?.(this.playbackId, describeError(error)).catch(() => undefined);\n }\n }\n\n private async stopPlayback(abort: boolean): Promise<void> {\n this.synthesisController.abort();\n await this.started;\n if (abort) await this.connection.abortPlayback(this.playbackId);\n else await this.connection.stopPlayback(this.playbackId);\n await this.completion;\n }\n}\n\nexport class ClientTtsAdapter implements ITtsAdapter {\n public constructor(\n private readonly connection: IVoiceMediaHostConnection,\n private readonly clock: IClock,\n private readonly synthesizer?: ClientNarrationSynthesizer,\n ) {}\n\n public preflight(_config: VoiceTtsConfig): void {}\n\n public speak(request: TtsSpeakRequest): TtsPlayback {\n const text = request.text.trim();\n if (!text) throw new Error('Voice narration text must not be empty');\n return new ClientTtsPlayback(\n { ...request, text },\n `${PLAYBACK_ID_PREFIX}-${String(request.id)}-${randomUUID()}`,\n this.connection,\n this.clock,\n this.synthesizer,\n );\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { VoiceMediaCaptureConfiguration, VoiceMediaPlaybackDelivery, VoiceMediaPlaybackResult } from "../../types/clientMedia.cjs";
|
|
2
|
+
import { IClock, IPcmAudioRecorder, ITtsAdapter, IVoiceMediaHostConnection, LiveRecordingHandle, PcmAudioRecorderStartOptions, TtsPlayback, TtsSpeakRequest, VoiceMediaAudioPoll } from "../../types/index.cjs";
|
|
3
|
+
import { ResolvedVoiceConfig, VoiceTtsConfig } from "@agimon-ai/doompi-config";
|
|
4
|
+
//#region src/adapters/audio/clientMedia.d.ts
|
|
5
|
+
interface ClientNarrationSynthesizer {
|
|
6
|
+
synthesize(request: TtsSpeakRequest, signal: AbortSignal): Promise<Buffer>;
|
|
7
|
+
}
|
|
8
|
+
interface UnixVoiceMediaHostOptions {
|
|
9
|
+
socketPath: string;
|
|
10
|
+
internalToken: string;
|
|
11
|
+
}
|
|
12
|
+
declare class UnixVoiceMediaHostConnection implements IVoiceMediaHostConnection {
|
|
13
|
+
private readonly options;
|
|
14
|
+
constructor(options: UnixVoiceMediaHostOptions);
|
|
15
|
+
startCapture(captureId: string, configuration: VoiceMediaCaptureConfiguration): Promise<void>;
|
|
16
|
+
readCapture(captureId: string): Promise<VoiceMediaAudioPoll>;
|
|
17
|
+
stopCapture(captureId: string): Promise<void>;
|
|
18
|
+
abortCapture(captureId: string): Promise<void>;
|
|
19
|
+
startPlayback(request: {
|
|
20
|
+
playbackId: string;
|
|
21
|
+
text: string;
|
|
22
|
+
voice?: string;
|
|
23
|
+
rate?: number;
|
|
24
|
+
}): Promise<VoiceMediaPlaybackDelivery>;
|
|
25
|
+
sendPlaybackAudio(playbackId: string, pcm: Buffer): Promise<void>;
|
|
26
|
+
sealPlaybackAudio(playbackId: string, error?: string): Promise<void>;
|
|
27
|
+
readPlayback(playbackId: string): Promise<VoiceMediaPlaybackResult | undefined>;
|
|
28
|
+
stopPlayback(playbackId: string): Promise<void>;
|
|
29
|
+
abortPlayback(playbackId: string): Promise<void>;
|
|
30
|
+
private request;
|
|
31
|
+
private requestBinary;
|
|
32
|
+
private captureActivity;
|
|
33
|
+
private expect;
|
|
34
|
+
private responseError;
|
|
35
|
+
}
|
|
36
|
+
declare function voiceMediaHostConnection(environment?: NodeJS.ProcessEnv): UnixVoiceMediaHostConnection | undefined;
|
|
37
|
+
declare class ClientPcmAudioRecorder implements IPcmAudioRecorder {
|
|
38
|
+
private readonly connection;
|
|
39
|
+
constructor(connection: IVoiceMediaHostConnection);
|
|
40
|
+
preflight(_config: ResolvedVoiceConfig): void;
|
|
41
|
+
start(_config: ResolvedVoiceConfig, onFrame: (frame: Buffer) => void, options?: PcmAudioRecorderStartOptions): LiveRecordingHandle;
|
|
42
|
+
}
|
|
43
|
+
declare class ClientTtsAdapter implements ITtsAdapter {
|
|
44
|
+
private readonly connection;
|
|
45
|
+
private readonly clock;
|
|
46
|
+
private readonly synthesizer?;
|
|
47
|
+
constructor(connection: IVoiceMediaHostConnection, clock: IClock, synthesizer?: ClientNarrationSynthesizer | undefined);
|
|
48
|
+
preflight(_config: VoiceTtsConfig): void;
|
|
49
|
+
speak(request: TtsSpeakRequest): TtsPlayback;
|
|
50
|
+
}
|
|
51
|
+
//#endregion
|
|
52
|
+
export { ClientNarrationSynthesizer, ClientPcmAudioRecorder, ClientTtsAdapter, UnixVoiceMediaHostConnection, UnixVoiceMediaHostOptions, voiceMediaHostConnection };
|
|
53
|
+
//# sourceMappingURL=clientMedia.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clientMedia.d.cts","names":[],"sources":["../../../../src/adapters/audio/clientMedia.ts"],"mappings":";;;;UA2CiB;EACf,WAAW,SAAS,iBAAiB,QAAQ,cAAc,QAAQ;;UAiBpD;EACf;EACA;;cAGW,wCAAwC;mBACf;EAApC,YAAoC,SAAS;EAEhC,aAAa,mBAAmB,eAAe,iCAAiC;EAIhF,YAAY,oBAAoB,QAAQ;EAkBxC,YAAY,oBAAoB;EAIhC,aAAa,oBAAoB;EAIjC,cAAc;IACzB;IACA;IACA;IACA;MACE,QAAQ;EAcC,kBAAkB,oBAAoB,KAAK,SAAS;EAWpD,kBAAkB,oBAAoB,iBAAiB;EAUvD,aAAa,qBAAqB,QAAQ;EAa1C,aAAa,qBAAqB;EAIlC,cAAc,qBAAqB;UAIxC;UA6BA;UA2BA;UAyBM;UAKN;;iBAaM,yBACd,cAAa,OAAO,aACnB;cAgEU,kCAAkC;mBACT;EAApC,YAAoC,YAAY;EAEzC,UAAU,SAAS;EAEnB,MACL,SAAS,qBACT,UAAU,OAAO,iBACjB,UAAS,+BAGR;;cAiGQ,4BAA4B;mBAEpB;mBACA;mBACA;EAHnB,YACmB,YAAY,2BACZ,OAAO,QACP,cAAc;EAG1B,UAAU,SAAS;EAEnB,MAAM,SAAS,kBAAkB"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { VoiceMediaCaptureConfiguration, VoiceMediaPlaybackDelivery, VoiceMediaPlaybackResult } from "../../types/clientMedia.mjs";
|
|
2
|
+
import { IClock, IPcmAudioRecorder, ITtsAdapter, IVoiceMediaHostConnection, LiveRecordingHandle, PcmAudioRecorderStartOptions, TtsPlayback, TtsSpeakRequest, VoiceMediaAudioPoll } from "../../types/index.mjs";
|
|
3
|
+
import { ResolvedVoiceConfig, VoiceTtsConfig } from "@agimon-ai/doompi-config";
|
|
4
|
+
//#region src/adapters/audio/clientMedia.d.ts
|
|
5
|
+
interface ClientNarrationSynthesizer {
|
|
6
|
+
synthesize(request: TtsSpeakRequest, signal: AbortSignal): Promise<Buffer>;
|
|
7
|
+
}
|
|
8
|
+
interface UnixVoiceMediaHostOptions {
|
|
9
|
+
socketPath: string;
|
|
10
|
+
internalToken: string;
|
|
11
|
+
}
|
|
12
|
+
declare class UnixVoiceMediaHostConnection implements IVoiceMediaHostConnection {
|
|
13
|
+
private readonly options;
|
|
14
|
+
constructor(options: UnixVoiceMediaHostOptions);
|
|
15
|
+
startCapture(captureId: string, configuration: VoiceMediaCaptureConfiguration): Promise<void>;
|
|
16
|
+
readCapture(captureId: string): Promise<VoiceMediaAudioPoll>;
|
|
17
|
+
stopCapture(captureId: string): Promise<void>;
|
|
18
|
+
abortCapture(captureId: string): Promise<void>;
|
|
19
|
+
startPlayback(request: {
|
|
20
|
+
playbackId: string;
|
|
21
|
+
text: string;
|
|
22
|
+
voice?: string;
|
|
23
|
+
rate?: number;
|
|
24
|
+
}): Promise<VoiceMediaPlaybackDelivery>;
|
|
25
|
+
sendPlaybackAudio(playbackId: string, pcm: Buffer): Promise<void>;
|
|
26
|
+
sealPlaybackAudio(playbackId: string, error?: string): Promise<void>;
|
|
27
|
+
readPlayback(playbackId: string): Promise<VoiceMediaPlaybackResult | undefined>;
|
|
28
|
+
stopPlayback(playbackId: string): Promise<void>;
|
|
29
|
+
abortPlayback(playbackId: string): Promise<void>;
|
|
30
|
+
private request;
|
|
31
|
+
private requestBinary;
|
|
32
|
+
private captureActivity;
|
|
33
|
+
private expect;
|
|
34
|
+
private responseError;
|
|
35
|
+
}
|
|
36
|
+
declare function voiceMediaHostConnection(environment?: NodeJS.ProcessEnv): UnixVoiceMediaHostConnection | undefined;
|
|
37
|
+
declare class ClientPcmAudioRecorder implements IPcmAudioRecorder {
|
|
38
|
+
private readonly connection;
|
|
39
|
+
constructor(connection: IVoiceMediaHostConnection);
|
|
40
|
+
preflight(_config: ResolvedVoiceConfig): void;
|
|
41
|
+
start(_config: ResolvedVoiceConfig, onFrame: (frame: Buffer) => void, options?: PcmAudioRecorderStartOptions): LiveRecordingHandle;
|
|
42
|
+
}
|
|
43
|
+
declare class ClientTtsAdapter implements ITtsAdapter {
|
|
44
|
+
private readonly connection;
|
|
45
|
+
private readonly clock;
|
|
46
|
+
private readonly synthesizer?;
|
|
47
|
+
constructor(connection: IVoiceMediaHostConnection, clock: IClock, synthesizer?: ClientNarrationSynthesizer | undefined);
|
|
48
|
+
preflight(_config: VoiceTtsConfig): void;
|
|
49
|
+
speak(request: TtsSpeakRequest): TtsPlayback;
|
|
50
|
+
}
|
|
51
|
+
//#endregion
|
|
52
|
+
export { ClientNarrationSynthesizer, ClientPcmAudioRecorder, ClientTtsAdapter, UnixVoiceMediaHostConnection, UnixVoiceMediaHostOptions, voiceMediaHostConnection };
|
|
53
|
+
//# sourceMappingURL=clientMedia.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clientMedia.d.mts","names":[],"sources":["../../../../src/adapters/audio/clientMedia.ts"],"mappings":";;;;UA2CiB;EACf,WAAW,SAAS,iBAAiB,QAAQ,cAAc,QAAQ;;UAiBpD;EACf;EACA;;cAGW,wCAAwC;mBACf;EAApC,YAAoC,SAAS;EAEhC,aAAa,mBAAmB,eAAe,iCAAiC;EAIhF,YAAY,oBAAoB,QAAQ;EAkBxC,YAAY,oBAAoB;EAIhC,aAAa,oBAAoB;EAIjC,cAAc;IACzB;IACA;IACA;IACA;MACE,QAAQ;EAcC,kBAAkB,oBAAoB,KAAK,SAAS;EAWpD,kBAAkB,oBAAoB,iBAAiB;EAUvD,aAAa,qBAAqB,QAAQ;EAa1C,aAAa,qBAAqB;EAIlC,cAAc,qBAAqB;UAIxC;UA6BA;UA2BA;UAyBM;UAKN;;iBAaM,yBACd,cAAa,OAAO,aACnB;cAgEU,kCAAkC;mBACT;EAApC,YAAoC,YAAY;EAEzC,UAAU,SAAS;EAEnB,MACL,SAAS,qBACT,UAAU,OAAO,iBACjB,UAAS,+BAGR;;cAiGQ,4BAA4B;mBAEpB;mBACA;mBACA;EAHnB,YACmB,YAAY,2BACZ,OAAO,QACP,cAAc;EAG1B,UAAU,SAAS;EAEnB,MAAM,SAAS,kBAAkB"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{VOICE_MEDIA_ACTIVITY_ELAPSED_HEADER as e,VOICE_MEDIA_ACTIVITY_EPOCH_HEADER as t,VOICE_MEDIA_ACTIVITY_LEVEL_HEADER as n,VOICE_MEDIA_ACTIVITY_SPEECH_MS_HEADER as r,VOICE_MEDIA_ACTIVITY_STATE_HEADER as i,VOICE_MEDIA_API_BASE_PATH as a,VOICE_MEDIA_CONTENT_TYPE as o,VOICE_MEDIA_ROUTES as s}from"../../types/clientMedia.mjs";import{PcmFrameAssembler as c}from"../../services/pcm.mjs";import l from"node:http";import{randomUUID as u}from"node:crypto";import{DOOM_API_INTERNAL_TOKEN_ENV as d,DOOM_API_ROUTE_PREFIX as f,DOOM_API_SOCKET_ENV as p}from"@agimon-ai/doompi-extension-contracts/package-api";const m=65536;function h(e){return e instanceof Error?e.message:String(e)}function g(e){return{code:1,stdout:``,stderr:h(e)}}var _=class{options;constructor(e){this.options=e}async startCapture(e,t){await this.expect(this.request(`POST`,s.hostCaptureStart,{captureId:e,configuration:t}),201)}async readCapture(e){let t=await this.request(`GET`,`${s.hostCaptureAudio}?captureId=${encodeURIComponent(e)}`);if(t.status===200&&t.headers[`content-type`]?.startsWith(`application/vnd.doompi.pcm-s16le`)){let e=this.captureActivity(t.headers);return{pcm:t.body,state:`active`,...e===void 0?{}:{activity:e}}}if(t.status===204){let e=t.headers[`x-doompi-capture-state`],n=e===`stopping`||e===`stopped`?e:`active`;return{pcm:Buffer.alloc(0),state:n}}throw this.responseError(t)}async stopCapture(e){await this.expect(this.request(`POST`,s.hostCaptureStop,{captureId:e}),204)}async abortCapture(e){await this.expect(this.request(`POST`,s.hostCaptureAbort,{captureId:e}),204)}async startPlayback(e){let t=await this.request(`POST`,s.hostPlaybackStart,e);if(t.status!==201)throw this.responseError(t);let n=JSON.parse(t.body.toString(`utf8`));if(typeof n!=`object`||!n||!(`delivery`in n)||n.delivery!==`client`&&n.delivery!==`streamed`)throw Error(`Voice media host returned an invalid playback delivery.`);return n.delivery}async sendPlaybackAudio(e,t){await this.expect(this.requestBinary(`POST`,`${s.hostPlaybackAudio}?playbackId=${encodeURIComponent(e)}`,t),204)}async sealPlaybackAudio(e,t){await this.expect(this.request(`POST`,s.hostPlaybackAudioEnd,{playbackId:e,...t===void 0?{}:{error:t}}),204)}async readPlayback(e){let t=await this.request(`GET`,`${s.hostPlaybackResult}?playbackId=${encodeURIComponent(e)}`);if(t.status===204)return;if(t.status!==200)throw this.responseError(t);let n=JSON.parse(t.body.toString(`utf8`));if(typeof n!=`object`||!n||!(`outcome`in n))throw Error(`Voice media client returned an invalid playback result.`);return n}async stopPlayback(e){await this.expect(this.request(`POST`,s.hostPlaybackStop,{playbackId:e}),204)}async abortPlayback(e){await this.expect(this.request(`POST`,s.hostPlaybackAbort,{playbackId:e}),204)}request(e,t,n){let r=n===void 0?void 0:Buffer.from(JSON.stringify(n),`utf8`);return new Promise((n,i)=>{let o=l.request({socketPath:this.options.socketPath,path:`${f}/${a}${t}`,method:e,headers:{authorization:`Bearer ${this.options.internalToken}`,...r===void 0?{}:{"content-type":`application/json`,"content-length":String(r.byteLength)}}},e=>{let t=[];e.on(`data`,e=>t.push(e)),e.once(`end`,()=>n({status:e.statusCode??500,headers:e.headers,body:Buffer.concat(t)}))});o.once(`error`,i),r!==void 0&&o.write(r),o.end()})}requestBinary(e,t,n){return new Promise((r,i)=>{let s=l.request({socketPath:this.options.socketPath,path:`${f}/${a}${t}`,method:e,headers:{authorization:`Bearer ${this.options.internalToken}`,"content-type":o,"content-length":String(n.byteLength)}},e=>{let t=[];e.on(`data`,e=>t.push(e)),e.once(`end`,()=>r({status:e.statusCode??500,headers:e.headers,body:Buffer.concat(t)}))});s.once(`error`,i),s.write(n),s.end()})}captureActivity(a){let o=a[i];if(o===void 0)return;let s=Number(a[n]),c=Number(a[e]),l=a[t],u=a[r],d=l===void 0?void 0:Number(l),f=u===void 0?void 0:Number(u);if(o!==`listening`&&o!==`speech`&&o!==`endpoint`||!Number.isFinite(s)||!Number.isSafeInteger(c)||d!==void 0&&(!Number.isSafeInteger(d)||d<0)||f!==void 0&&(!Number.isSafeInteger(f)||f<0))throw Error(`Voice media client returned invalid capture activity.`);return{state:o,levelDbfs:s,elapsedMs:c,...d===void 0?{}:{epoch:d},...f===void 0?{}:{classifiedSpeechMs:f}}}async expect(e,t){let n=await e;if(n.status!==t)throw this.responseError(n)}responseError(e){let t=e.body.toString(`utf8`);try{let e=JSON.parse(t);typeof e==`object`&&e&&`error`in e&&typeof e.error==`string`&&(t=e.error)}catch{}return Error(t||`Voice media request failed with status ${String(e.status)}.`)}};function v(e=process.env){let t=e[p],n=e[d];return t&&n?new _({socketPath:t,internalToken:n}):void 0}var y=class{connection;options;completion;captureId=`client-capture-${u()}`;assembler=new c;started;aborting=!1;stopOperation;abortOperation;constructor(e,t,n){this.connection=e,this.options=n,this.started=e.startCapture(this.captureId,n.capture),this.completion=this.consume(t).catch(g)}stop(){return this.stopOperation??=this.stopCapture(),this.stopOperation}abort(){return this.abortOperation??=this.abortCapture(),this.abortOperation}async consume(e){for(await this.started;!this.aborting;){let t=await this.connection.readCapture(this.captureId);t.activity!==void 0&&this.options.onClientActivity?.(t.activity);for(let n of this.assembler.push(t.pcm))e(n);if(t.state===`stopped`)return{code:0,stdout:``,stderr:``}}return{code:0,stdout:``,stderr:``}}async stopCapture(){await this.started,await this.connection.stopCapture(this.captureId);let e=await this.completion;if(e.code!==0)throw Error(e.stderr||`Voice media client stopped unexpectedly.`);return this.assembler.flush()}async abortCapture(){return this.aborting=!0,await this.started.then(()=>this.connection.abortCapture(this.captureId),()=>void 0),await this.completion.catch(()=>void 0),this.assembler.flush()}},b=class{connection;constructor(e){this.connection=e}preflight(e){}start(e,t,n={capture:{mode:`manual`,activityControl:`host`}}){return new y(this.connection,t,n)}},x=class{request;playbackId;connection;clock;synthesizer;reference;completion;started;synthesisController=new AbortController;stopOperation;abortOperation;constructor(e,t,n,r,i){this.request=e,this.playbackId=t,this.connection=n,this.clock=r,this.synthesizer=i,this.reference={id:e.id,kind:e.kind,text:e.text,startedAt:r.now()},this.started=n.startPlayback({playbackId:t,text:e.text,...e.config.voice?{voice:e.config.voice}:{},...e.config.rate===void 0?{}:{rate:e.config.rate}}),this.completion=this.settle()}stop(){return this.stopOperation??=this.stopPlayback(!1),this.stopOperation}abort(){return this.abortOperation??=this.stopPlayback(!0),this.abortOperation}async settle(){try{await this.started===`streamed`&&await this.uploadNarration();let e;for(;e===void 0;)e=await this.connection.readPlayback(this.playbackId);return{outcome:e.outcome,reference:{...this.reference,endedAt:this.clock.now()},process:{code:+(e.outcome===`failed`),stdout:``,stderr:e.error??``}}}catch(e){return{outcome:`failed`,reference:{...this.reference,endedAt:this.clock.now()},process:g(e)}}}async uploadNarration(){if(this.synthesizer===void 0||this.connection.sendPlaybackAudio===void 0||this.connection.sealPlaybackAudio===void 0){await this.connection.sealPlaybackAudio?.(this.playbackId,`Backend narration synthesis is unavailable.`);return}try{let e=await this.synthesizer.synthesize(this.request,this.synthesisController.signal);for(let t=0;t<e.byteLength;t+=m)await this.connection.sendPlaybackAudio(this.playbackId,e.subarray(t,t+m));await this.connection.sealPlaybackAudio(this.playbackId)}catch(e){await this.connection.sealPlaybackAudio?.(this.playbackId,h(e)).catch(()=>void 0)}}async stopPlayback(e){this.synthesisController.abort(),await this.started,e?await this.connection.abortPlayback(this.playbackId):await this.connection.stopPlayback(this.playbackId),await this.completion}},S=class{connection;clock;synthesizer;constructor(e,t,n){this.connection=e,this.clock=t,this.synthesizer=n}preflight(e){}speak(e){let t=e.text.trim();if(!t)throw Error(`Voice narration text must not be empty`);return new x({...e,text:t},`client-playback-${String(e.id)}-${u()}`,this.connection,this.clock,this.synthesizer)}};export{b as ClientPcmAudioRecorder,S as ClientTtsAdapter,_ as UnixVoiceMediaHostConnection,v as voiceMediaHostConnection};
|
|
2
|
+
//# sourceMappingURL=clientMedia.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clientMedia.mjs","names":[],"sources":["../../../../src/adapters/audio/clientMedia.ts"],"sourcesContent":["import http from 'node:http';\nimport { randomUUID } from 'node:crypto';\nimport {\n DOOM_API_INTERNAL_TOKEN_ENV,\n DOOM_API_ROUTE_PREFIX,\n DOOM_API_SOCKET_ENV,\n} from '@agimon-ai/doompi-extension-contracts/package-api';\nimport { PcmFrameAssembler } from '../../services/pcm.ts';\nimport type {\n IClock,\n IPcmAudioRecorder,\n ITtsAdapter,\n IVoiceMediaHostConnection,\n LiveRecordingHandle,\n PcmAudioRecorderStartOptions,\n ProcessResult,\n TtsPlayback,\n TtsPlaybackReference,\n TtsPlaybackResult,\n TtsSpeakRequest,\n VoiceMediaAudioPoll,\n} from '../../types/index.ts';\nimport {\n VOICE_MEDIA_ACTIVITY_ELAPSED_HEADER,\n VOICE_MEDIA_ACTIVITY_EPOCH_HEADER,\n VOICE_MEDIA_ACTIVITY_LEVEL_HEADER,\n VOICE_MEDIA_ACTIVITY_SPEECH_MS_HEADER,\n VOICE_MEDIA_ACTIVITY_STATE_HEADER,\n VOICE_MEDIA_API_BASE_PATH,\n type VoiceMediaCaptureActivity,\n type VoiceMediaCaptureConfiguration,\n VOICE_MEDIA_CONTENT_TYPE,\n type VoiceMediaPlaybackDelivery,\n type VoiceMediaPlaybackResult,\n VOICE_MEDIA_ROUTES,\n} from '../../types/clientMedia.ts';\nimport type { ResolvedVoiceConfig, VoiceTtsConfig } from '@agimon-ai/doompi-config';\n\nconst JSON_CONTENT_TYPE = 'application/json';\nconst CAPTURE_ID_PREFIX = 'client-capture';\nconst PLAYBACK_ID_PREFIX = 'client-playback';\nconst PLAYBACK_AUDIO_CHUNK_BYTES = 64 * 1024;\n\nexport interface ClientNarrationSynthesizer {\n synthesize(request: TtsSpeakRequest, signal: AbortSignal): Promise<Buffer>;\n}\n\ninterface UnixResponse {\n status: number;\n headers: http.IncomingHttpHeaders;\n body: Buffer;\n}\n\nfunction describeError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction failedProcess(error: unknown): ProcessResult {\n return { code: 1, stdout: '', stderr: describeError(error) };\n}\n\nexport interface UnixVoiceMediaHostOptions {\n socketPath: string;\n internalToken: string;\n}\n\nexport class UnixVoiceMediaHostConnection implements IVoiceMediaHostConnection {\n public constructor(private readonly options: UnixVoiceMediaHostOptions) {}\n\n public async startCapture(captureId: string, configuration: VoiceMediaCaptureConfiguration): Promise<void> {\n await this.expect(this.request('POST', VOICE_MEDIA_ROUTES.hostCaptureStart, { captureId, configuration }), 201);\n }\n\n public async readCapture(captureId: string): Promise<VoiceMediaAudioPoll> {\n const response = await this.request(\n 'GET',\n `${VOICE_MEDIA_ROUTES.hostCaptureAudio}?captureId=${encodeURIComponent(captureId)}`,\n );\n if (response.status === 200 && response.headers['content-type']?.startsWith(VOICE_MEDIA_CONTENT_TYPE)) {\n const activity = this.captureActivity(response.headers);\n return { pcm: response.body, state: 'active' as const, ...(activity === undefined ? {} : { activity }) };\n }\n if (response.status === 204) {\n const rawState = response.headers['x-doompi-capture-state'];\n const state: VoiceMediaAudioPoll['state'] =\n rawState === 'stopping' || rawState === 'stopped' ? rawState : 'active';\n return { pcm: Buffer.alloc(0), state };\n }\n throw this.responseError(response);\n }\n\n public async stopCapture(captureId: string): Promise<void> {\n await this.expect(this.request('POST', VOICE_MEDIA_ROUTES.hostCaptureStop, { captureId }), 204);\n }\n\n public async abortCapture(captureId: string): Promise<void> {\n await this.expect(this.request('POST', VOICE_MEDIA_ROUTES.hostCaptureAbort, { captureId }), 204);\n }\n\n public async startPlayback(request: {\n playbackId: string;\n text: string;\n voice?: string;\n rate?: number;\n }): Promise<VoiceMediaPlaybackDelivery> {\n const response = await this.request('POST', VOICE_MEDIA_ROUTES.hostPlaybackStart, request);\n if (response.status !== 201) throw this.responseError(response);\n const parsed: unknown = JSON.parse(response.body.toString('utf8'));\n if (\n typeof parsed !== 'object' ||\n parsed === null ||\n !('delivery' in parsed) ||\n (parsed.delivery !== 'client' && parsed.delivery !== 'streamed')\n )\n throw new Error('Voice media host returned an invalid playback delivery.');\n return parsed.delivery;\n }\n\n public async sendPlaybackAudio(playbackId: string, pcm: Buffer): Promise<void> {\n await this.expect(\n this.requestBinary(\n 'POST',\n `${VOICE_MEDIA_ROUTES.hostPlaybackAudio}?playbackId=${encodeURIComponent(playbackId)}`,\n pcm,\n ),\n 204,\n );\n }\n\n public async sealPlaybackAudio(playbackId: string, error?: string): Promise<void> {\n await this.expect(\n this.request('POST', VOICE_MEDIA_ROUTES.hostPlaybackAudioEnd, {\n playbackId,\n ...(error === undefined ? {} : { error }),\n }),\n 204,\n );\n }\n\n public async readPlayback(playbackId: string): Promise<VoiceMediaPlaybackResult | undefined> {\n const response = await this.request(\n 'GET',\n `${VOICE_MEDIA_ROUTES.hostPlaybackResult}?playbackId=${encodeURIComponent(playbackId)}`,\n );\n if (response.status === 204) return undefined;\n if (response.status !== 200) throw this.responseError(response);\n const parsed: unknown = JSON.parse(response.body.toString('utf8'));\n if (typeof parsed !== 'object' || parsed === null || !('outcome' in parsed))\n throw new Error('Voice media client returned an invalid playback result.');\n return parsed as VoiceMediaPlaybackResult;\n }\n\n public async stopPlayback(playbackId: string): Promise<void> {\n await this.expect(this.request('POST', VOICE_MEDIA_ROUTES.hostPlaybackStop, { playbackId }), 204);\n }\n\n public async abortPlayback(playbackId: string): Promise<void> {\n await this.expect(this.request('POST', VOICE_MEDIA_ROUTES.hostPlaybackAbort, { playbackId }), 204);\n }\n\n private request(method: string, route: string, json?: object): Promise<UnixResponse> {\n const body = json === undefined ? undefined : Buffer.from(JSON.stringify(json), 'utf8');\n return new Promise((resolve, reject) => {\n const request = http.request(\n {\n socketPath: this.options.socketPath,\n path: `${DOOM_API_ROUTE_PREFIX}/${VOICE_MEDIA_API_BASE_PATH}${route}`,\n method,\n headers: {\n authorization: `Bearer ${this.options.internalToken}`,\n ...(body === undefined\n ? {}\n : { 'content-type': JSON_CONTENT_TYPE, 'content-length': String(body.byteLength) }),\n },\n },\n (response) => {\n const chunks: Buffer[] = [];\n response.on('data', (chunk: Buffer) => chunks.push(chunk));\n response.once('end', () =>\n resolve({ status: response.statusCode ?? 500, headers: response.headers, body: Buffer.concat(chunks) }),\n );\n },\n );\n request.once('error', reject);\n if (body !== undefined) request.write(body);\n request.end();\n });\n }\n\n private requestBinary(method: string, route: string, body: Buffer): Promise<UnixResponse> {\n return new Promise((resolve, reject) => {\n const request = http.request(\n {\n socketPath: this.options.socketPath,\n path: `${DOOM_API_ROUTE_PREFIX}/${VOICE_MEDIA_API_BASE_PATH}${route}`,\n method,\n headers: {\n authorization: `Bearer ${this.options.internalToken}`,\n 'content-type': VOICE_MEDIA_CONTENT_TYPE,\n 'content-length': String(body.byteLength),\n },\n },\n (response) => {\n const chunks: Buffer[] = [];\n response.on('data', (chunk: Buffer) => chunks.push(chunk));\n response.once('end', () =>\n resolve({ status: response.statusCode ?? 500, headers: response.headers, body: Buffer.concat(chunks) }),\n );\n },\n );\n request.once('error', reject);\n request.write(body);\n request.end();\n });\n }\n\n private captureActivity(headers: http.IncomingHttpHeaders): VoiceMediaCaptureActivity | undefined {\n const state = headers[VOICE_MEDIA_ACTIVITY_STATE_HEADER];\n if (state === undefined) return undefined;\n const levelDbfs = Number(headers[VOICE_MEDIA_ACTIVITY_LEVEL_HEADER]);\n const elapsedMs = Number(headers[VOICE_MEDIA_ACTIVITY_ELAPSED_HEADER]);\n const epochHeader = headers[VOICE_MEDIA_ACTIVITY_EPOCH_HEADER];\n const speechMsHeader = headers[VOICE_MEDIA_ACTIVITY_SPEECH_MS_HEADER];\n const epoch = epochHeader === undefined ? undefined : Number(epochHeader);\n const classifiedSpeechMs = speechMsHeader === undefined ? undefined : Number(speechMsHeader);\n if (\n (state !== 'listening' && state !== 'speech' && state !== 'endpoint') ||\n !Number.isFinite(levelDbfs) ||\n !Number.isSafeInteger(elapsedMs) ||\n (epoch !== undefined && (!Number.isSafeInteger(epoch) || epoch < 0)) ||\n (classifiedSpeechMs !== undefined && (!Number.isSafeInteger(classifiedSpeechMs) || classifiedSpeechMs < 0))\n )\n throw new Error('Voice media client returned invalid capture activity.');\n return {\n state,\n levelDbfs,\n elapsedMs,\n ...(epoch === undefined ? {} : { epoch }),\n ...(classifiedSpeechMs === undefined ? {} : { classifiedSpeechMs }),\n };\n }\n private async expect(pending: Promise<UnixResponse>, status: number): Promise<void> {\n const response = await pending;\n if (response.status !== status) throw this.responseError(response);\n }\n\n private responseError(response: UnixResponse): Error {\n let message = response.body.toString('utf8');\n try {\n const parsed: unknown = JSON.parse(message);\n if (typeof parsed === 'object' && parsed !== null && 'error' in parsed && typeof parsed.error === 'string')\n message = parsed.error;\n } catch {\n // A non-JSON response body is already the best available diagnostic.\n }\n return new Error(message || `Voice media request failed with status ${String(response.status)}.`);\n }\n}\n\nexport function voiceMediaHostConnection(\n environment: NodeJS.ProcessEnv = process.env,\n): UnixVoiceMediaHostConnection | undefined {\n const socketPath = environment[DOOM_API_SOCKET_ENV];\n const internalToken = environment[DOOM_API_INTERNAL_TOKEN_ENV];\n return socketPath && internalToken ? new UnixVoiceMediaHostConnection({ socketPath, internalToken }) : undefined;\n}\n\nclass ClientPcmRecording implements LiveRecordingHandle {\n public readonly completion: Promise<ProcessResult>;\n private readonly captureId = `${CAPTURE_ID_PREFIX}-${randomUUID()}`;\n private readonly assembler = new PcmFrameAssembler();\n private readonly started: Promise<void>;\n private aborting = false;\n private stopOperation: Promise<Buffer> | undefined;\n private abortOperation: Promise<Buffer> | undefined;\n\n public constructor(\n private readonly connection: IVoiceMediaHostConnection,\n onFrame: (frame: Buffer) => void,\n private readonly options: PcmAudioRecorderStartOptions,\n ) {\n this.started = connection.startCapture(this.captureId, options.capture);\n this.completion = this.consume(onFrame).catch(failedProcess);\n }\n\n public stop(): Promise<Buffer> {\n this.stopOperation ??= this.stopCapture();\n return this.stopOperation;\n }\n\n public abort(): Promise<Buffer> {\n this.abortOperation ??= this.abortCapture();\n return this.abortOperation;\n }\n\n private async consume(onFrame: (frame: Buffer) => void): Promise<ProcessResult> {\n await this.started;\n while (!this.aborting) {\n const batch = await this.connection.readCapture(this.captureId);\n if (batch.activity !== undefined) this.options.onClientActivity?.(batch.activity);\n for (const frame of this.assembler.push(batch.pcm)) onFrame(frame);\n if (batch.state === 'stopped') return { code: 0, stdout: '', stderr: '' };\n }\n return { code: 0, stdout: '', stderr: '' };\n }\n\n private async stopCapture(): Promise<Buffer> {\n await this.started;\n await this.connection.stopCapture(this.captureId);\n const result = await this.completion;\n if (result.code !== 0) throw new Error(result.stderr || 'Voice media client stopped unexpectedly.');\n return this.assembler.flush();\n }\n\n private async abortCapture(): Promise<Buffer> {\n this.aborting = true;\n await this.started.then(\n () => this.connection.abortCapture(this.captureId),\n () => undefined,\n );\n await this.completion.catch(() => undefined);\n return this.assembler.flush();\n }\n}\n\nexport class ClientPcmAudioRecorder implements IPcmAudioRecorder {\n public constructor(private readonly connection: IVoiceMediaHostConnection) {}\n\n public preflight(_config: ResolvedVoiceConfig): void {}\n\n public start(\n _config: ResolvedVoiceConfig,\n onFrame: (frame: Buffer) => void,\n options: PcmAudioRecorderStartOptions = {\n capture: { mode: 'manual', activityControl: 'host' },\n },\n ): LiveRecordingHandle {\n return new ClientPcmRecording(this.connection, onFrame, options);\n }\n}\n\nclass ClientTtsPlayback implements TtsPlayback {\n public readonly reference: TtsPlaybackReference;\n public readonly completion: Promise<TtsPlaybackResult>;\n private readonly started: Promise<VoiceMediaPlaybackDelivery | void>;\n private readonly synthesisController = new AbortController();\n private stopOperation: Promise<void> | undefined;\n private abortOperation: Promise<void> | undefined;\n\n public constructor(\n private readonly request: TtsSpeakRequest,\n private readonly playbackId: string,\n private readonly connection: IVoiceMediaHostConnection,\n private readonly clock: IClock,\n private readonly synthesizer?: ClientNarrationSynthesizer,\n ) {\n this.reference = {\n id: request.id,\n kind: request.kind,\n text: request.text,\n startedAt: clock.now(),\n };\n this.started = connection.startPlayback({\n playbackId,\n text: request.text,\n ...(request.config.voice ? { voice: request.config.voice } : {}),\n ...(request.config.rate === undefined ? {} : { rate: request.config.rate }),\n });\n this.completion = this.settle();\n }\n\n public stop(): Promise<void> {\n this.stopOperation ??= this.stopPlayback(false);\n return this.stopOperation;\n }\n\n public abort(): Promise<void> {\n this.abortOperation ??= this.stopPlayback(true);\n return this.abortOperation;\n }\n\n private async settle(): Promise<TtsPlaybackResult> {\n try {\n const delivery = await this.started;\n if (delivery === 'streamed') await this.uploadNarration();\n let result: VoiceMediaPlaybackResult | undefined;\n while (result === undefined) result = await this.connection.readPlayback(this.playbackId);\n return {\n outcome: result.outcome,\n reference: { ...this.reference, endedAt: this.clock.now() },\n process: { code: result.outcome === 'failed' ? 1 : 0, stdout: '', stderr: result.error ?? '' },\n };\n } catch (error) {\n return {\n outcome: 'failed',\n reference: { ...this.reference, endedAt: this.clock.now() },\n process: failedProcess(error),\n };\n }\n }\n\n private async uploadNarration(): Promise<void> {\n if (\n this.synthesizer === undefined ||\n this.connection.sendPlaybackAudio === undefined ||\n this.connection.sealPlaybackAudio === undefined\n ) {\n await this.connection.sealPlaybackAudio?.(this.playbackId, 'Backend narration synthesis is unavailable.');\n return;\n }\n try {\n const pcm = await this.synthesizer.synthesize(this.request, this.synthesisController.signal);\n for (let offset = 0; offset < pcm.byteLength; offset += PLAYBACK_AUDIO_CHUNK_BYTES) {\n await this.connection.sendPlaybackAudio(\n this.playbackId,\n pcm.subarray(offset, offset + PLAYBACK_AUDIO_CHUNK_BYTES),\n );\n }\n await this.connection.sealPlaybackAudio(this.playbackId);\n } catch (error) {\n await this.connection.sealPlaybackAudio?.(this.playbackId, describeError(error)).catch(() => undefined);\n }\n }\n\n private async stopPlayback(abort: boolean): Promise<void> {\n this.synthesisController.abort();\n await this.started;\n if (abort) await this.connection.abortPlayback(this.playbackId);\n else await this.connection.stopPlayback(this.playbackId);\n await this.completion;\n }\n}\n\nexport class ClientTtsAdapter implements ITtsAdapter {\n public constructor(\n private readonly connection: IVoiceMediaHostConnection,\n private readonly clock: IClock,\n private readonly synthesizer?: ClientNarrationSynthesizer,\n ) {}\n\n public preflight(_config: VoiceTtsConfig): void {}\n\n public speak(request: TtsSpeakRequest): TtsPlayback {\n const text = request.text.trim();\n if (!text) throw new Error('Voice narration text must not be empty');\n return new ClientTtsPlayback(\n { ...request, text },\n `${PLAYBACK_ID_PREFIX}-${String(request.id)}-${randomUUID()}`,\n this.connection,\n this.clock,\n this.synthesizer,\n );\n }\n}\n"],"mappings":"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"}
|