@framers/agentos 0.1.46 → 0.1.47
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 +7 -7
- package/dist/cognitive_substrate/IGMI.d.ts +2 -0
- package/dist/cognitive_substrate/IGMI.d.ts.map +1 -1
- package/dist/cognitive_substrate/IGMI.js.map +1 -1
- package/dist/cognitive_substrate/personas/IPersonaDefinition.d.ts +2 -0
- package/dist/cognitive_substrate/personas/IPersonaDefinition.d.ts.map +1 -1
- package/dist/core/audio/AdaptiveVAD.d.ts +147 -0
- package/dist/core/audio/AdaptiveVAD.d.ts.map +1 -0
- package/dist/core/audio/AdaptiveVAD.js +239 -0
- package/dist/core/audio/AdaptiveVAD.js.map +1 -0
- package/dist/core/audio/AudioProcessor.d.ts +121 -0
- package/dist/core/audio/AudioProcessor.d.ts.map +1 -0
- package/dist/core/audio/AudioProcessor.js +299 -0
- package/dist/core/audio/AudioProcessor.js.map +1 -0
- package/dist/core/audio/EnvironmentalCalibrator.d.ts +187 -0
- package/dist/core/audio/EnvironmentalCalibrator.d.ts.map +1 -0
- package/dist/core/audio/EnvironmentalCalibrator.js +360 -0
- package/dist/core/audio/EnvironmentalCalibrator.js.map +1 -0
- package/dist/core/audio/SilenceDetector.d.ts +111 -0
- package/dist/core/audio/SilenceDetector.d.ts.map +1 -0
- package/dist/core/audio/SilenceDetector.js +178 -0
- package/dist/core/audio/SilenceDetector.js.map +1 -0
- package/dist/core/llm/IPromptEngine.d.ts +2 -0
- package/dist/core/llm/IPromptEngine.d.ts.map +1 -1
- package/dist/core/llm/IPromptEngine.js.map +1 -1
- package/dist/core/llm/providers/implementations/OpenAIProvider.d.ts.map +1 -1
- package/dist/core/llm/providers/implementations/OpenAIProvider.js +8 -1
- package/dist/core/llm/providers/implementations/OpenAIProvider.js.map +1 -1
- package/dist/extensions/ExtensionManager.d.ts.map +1 -1
- package/dist/extensions/ExtensionManager.js +9 -1
- package/dist/extensions/ExtensionManager.js.map +1 -1
- package/dist/extensions/types.d.ts +20 -2
- package/dist/extensions/types.d.ts.map +1 -1
- package/dist/extensions/types.js +4 -0
- package/dist/extensions/types.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/memory/CognitiveMemoryManager.d.ts +133 -0
- package/dist/memory/CognitiveMemoryManager.d.ts.map +1 -0
- package/dist/memory/CognitiveMemoryManager.js +519 -0
- package/dist/memory/CognitiveMemoryManager.js.map +1 -0
- package/dist/memory/config.d.ts +135 -0
- package/dist/memory/config.d.ts.map +1 -0
- package/dist/memory/config.js +28 -0
- package/dist/memory/config.js.map +1 -0
- package/dist/memory/consolidation/ConsolidationPipeline.d.ts +70 -0
- package/dist/memory/consolidation/ConsolidationPipeline.d.ts.map +1 -0
- package/dist/memory/consolidation/ConsolidationPipeline.js +301 -0
- package/dist/memory/consolidation/ConsolidationPipeline.js.map +1 -0
- package/dist/memory/context/CompactionEngine.d.ts +21 -0
- package/dist/memory/context/CompactionEngine.d.ts.map +1 -0
- package/dist/memory/context/CompactionEngine.js +35 -0
- package/dist/memory/context/CompactionEngine.js.map +1 -0
- package/dist/memory/context/CompactionLog.d.ts +50 -0
- package/dist/memory/context/CompactionLog.d.ts.map +1 -0
- package/dist/memory/context/CompactionLog.js +139 -0
- package/dist/memory/context/CompactionLog.js.map +1 -0
- package/dist/memory/context/ContextWindowManager.d.ts +114 -0
- package/dist/memory/context/ContextWindowManager.d.ts.map +1 -0
- package/dist/memory/context/ContextWindowManager.js +225 -0
- package/dist/memory/context/ContextWindowManager.js.map +1 -0
- package/dist/memory/context/RollingSummaryChain.d.ts +53 -0
- package/dist/memory/context/RollingSummaryChain.d.ts.map +1 -0
- package/dist/memory/context/RollingSummaryChain.js +193 -0
- package/dist/memory/context/RollingSummaryChain.js.map +1 -0
- package/dist/memory/context/index.d.ts +15 -0
- package/dist/memory/context/index.d.ts.map +1 -0
- package/dist/memory/context/index.js +14 -0
- package/dist/memory/context/index.js.map +1 -0
- package/dist/memory/context/strategies/HierarchicalStrategy.d.ts +25 -0
- package/dist/memory/context/strategies/HierarchicalStrategy.d.ts.map +1 -0
- package/dist/memory/context/strategies/HierarchicalStrategy.js +240 -0
- package/dist/memory/context/strategies/HierarchicalStrategy.js.map +1 -0
- package/dist/memory/context/strategies/HybridStrategy.d.ts +26 -0
- package/dist/memory/context/strategies/HybridStrategy.d.ts.map +1 -0
- package/dist/memory/context/strategies/HybridStrategy.js +245 -0
- package/dist/memory/context/strategies/HybridStrategy.js.map +1 -0
- package/dist/memory/context/strategies/SlidingSummaryStrategy.d.ts +22 -0
- package/dist/memory/context/strategies/SlidingSummaryStrategy.d.ts.map +1 -0
- package/dist/memory/context/strategies/SlidingSummaryStrategy.js +203 -0
- package/dist/memory/context/strategies/SlidingSummaryStrategy.js.map +1 -0
- package/dist/memory/context/types.d.ts +120 -0
- package/dist/memory/context/types.d.ts.map +1 -0
- package/dist/memory/context/types.js +17 -0
- package/dist/memory/context/types.js.map +1 -0
- package/dist/memory/decay/DecayModel.d.ts +87 -0
- package/dist/memory/decay/DecayModel.d.ts.map +1 -0
- package/dist/memory/decay/DecayModel.js +117 -0
- package/dist/memory/decay/DecayModel.js.map +1 -0
- package/dist/memory/decay/RetrievalPriorityScorer.d.ts +63 -0
- package/dist/memory/decay/RetrievalPriorityScorer.d.ts.map +1 -0
- package/dist/memory/decay/RetrievalPriorityScorer.js +110 -0
- package/dist/memory/decay/RetrievalPriorityScorer.js.map +1 -0
- package/dist/memory/encoding/ContentFeatureDetector.d.ts +37 -0
- package/dist/memory/encoding/ContentFeatureDetector.d.ts.map +1 -0
- package/dist/memory/encoding/ContentFeatureDetector.js +176 -0
- package/dist/memory/encoding/ContentFeatureDetector.js.map +1 -0
- package/dist/memory/encoding/EncodingModel.d.ts +67 -0
- package/dist/memory/encoding/EncodingModel.d.ts.map +1 -0
- package/dist/memory/encoding/EncodingModel.js +171 -0
- package/dist/memory/encoding/EncodingModel.js.map +1 -0
- package/dist/memory/extension/CognitiveMemoryExtension.d.ts +18 -0
- package/dist/memory/extension/CognitiveMemoryExtension.d.ts.map +1 -0
- package/dist/memory/extension/CognitiveMemoryExtension.js +131 -0
- package/dist/memory/extension/CognitiveMemoryExtension.js.map +1 -0
- package/dist/memory/graph/GraphologyMemoryGraph.d.ts +29 -0
- package/dist/memory/graph/GraphologyMemoryGraph.d.ts.map +1 -0
- package/dist/memory/graph/GraphologyMemoryGraph.js +224 -0
- package/dist/memory/graph/GraphologyMemoryGraph.js.map +1 -0
- package/dist/memory/graph/IMemoryGraph.d.ts +70 -0
- package/dist/memory/graph/IMemoryGraph.d.ts.map +1 -0
- package/dist/memory/graph/IMemoryGraph.js +15 -0
- package/dist/memory/graph/IMemoryGraph.js.map +1 -0
- package/dist/memory/graph/KnowledgeGraphMemoryGraph.d.ts +38 -0
- package/dist/memory/graph/KnowledgeGraphMemoryGraph.d.ts.map +1 -0
- package/dist/memory/graph/KnowledgeGraphMemoryGraph.js +264 -0
- package/dist/memory/graph/KnowledgeGraphMemoryGraph.js.map +1 -0
- package/dist/memory/graph/SpreadingActivation.d.ts +36 -0
- package/dist/memory/graph/SpreadingActivation.d.ts.map +1 -0
- package/dist/memory/graph/SpreadingActivation.js +100 -0
- package/dist/memory/graph/SpreadingActivation.js.map +1 -0
- package/dist/memory/index.d.ts +52 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +43 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/observation/MemoryObserver.d.ts +59 -0
- package/dist/memory/observation/MemoryObserver.d.ts.map +1 -0
- package/dist/memory/observation/MemoryObserver.js +136 -0
- package/dist/memory/observation/MemoryObserver.js.map +1 -0
- package/dist/memory/observation/MemoryReflector.d.ts +51 -0
- package/dist/memory/observation/MemoryReflector.d.ts.map +1 -0
- package/dist/memory/observation/MemoryReflector.js +184 -0
- package/dist/memory/observation/MemoryReflector.js.map +1 -0
- package/dist/memory/observation/ObservationBuffer.d.ts +51 -0
- package/dist/memory/observation/ObservationBuffer.d.ts.map +1 -0
- package/dist/memory/observation/ObservationBuffer.js +81 -0
- package/dist/memory/observation/ObservationBuffer.js.map +1 -0
- package/dist/memory/prompt/MemoryFormatters.d.ts +22 -0
- package/dist/memory/prompt/MemoryFormatters.d.ts.map +1 -0
- package/dist/memory/prompt/MemoryFormatters.js +113 -0
- package/dist/memory/prompt/MemoryFormatters.js.map +1 -0
- package/dist/memory/prompt/MemoryPromptAssembler.d.ts +40 -0
- package/dist/memory/prompt/MemoryPromptAssembler.d.ts.map +1 -0
- package/dist/memory/prompt/MemoryPromptAssembler.js +180 -0
- package/dist/memory/prompt/MemoryPromptAssembler.js.map +1 -0
- package/dist/memory/prospective/ProspectiveMemoryManager.d.ts +83 -0
- package/dist/memory/prospective/ProspectiveMemoryManager.d.ts.map +1 -0
- package/dist/memory/prospective/ProspectiveMemoryManager.js +128 -0
- package/dist/memory/prospective/ProspectiveMemoryManager.js.map +1 -0
- package/dist/memory/store/MemoryStore.d.ts +76 -0
- package/dist/memory/store/MemoryStore.d.ts.map +1 -0
- package/dist/memory/store/MemoryStore.js +320 -0
- package/dist/memory/store/MemoryStore.js.map +1 -0
- package/dist/memory/types.d.ts +184 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +14 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/memory/working/CognitiveWorkingMemory.d.ts +87 -0
- package/dist/memory/working/CognitiveWorkingMemory.d.ts.map +1 -0
- package/dist/memory/working/CognitiveWorkingMemory.js +230 -0
- package/dist/memory/working/CognitiveWorkingMemory.js.map +1 -0
- package/dist/rag/EmbeddingManager.d.ts.map +1 -1
- package/dist/rag/EmbeddingManager.js +8 -1
- package/dist/rag/EmbeddingManager.js.map +1 -1
- package/dist/speech/SpeechProviderRegistry.d.ts +17 -0
- package/dist/speech/SpeechProviderRegistry.d.ts.map +1 -0
- package/dist/speech/SpeechProviderRegistry.js +47 -0
- package/dist/speech/SpeechProviderRegistry.js.map +1 -0
- package/dist/speech/SpeechRuntime.d.ts +28 -0
- package/dist/speech/SpeechRuntime.d.ts.map +1 -0
- package/dist/speech/SpeechRuntime.js +138 -0
- package/dist/speech/SpeechRuntime.js.map +1 -0
- package/dist/speech/SpeechSession.d.ts +37 -0
- package/dist/speech/SpeechSession.d.ts.map +1 -0
- package/dist/speech/SpeechSession.js +285 -0
- package/dist/speech/SpeechSession.js.map +1 -0
- package/dist/speech/audio.d.ts +3 -0
- package/dist/speech/audio.d.ts.map +1 -0
- package/dist/speech/audio.js +39 -0
- package/dist/speech/audio.js.map +1 -0
- package/dist/speech/index.d.ts +11 -0
- package/dist/speech/index.d.ts.map +1 -0
- package/dist/speech/index.js +11 -0
- package/dist/speech/index.js.map +1 -0
- package/dist/speech/providerCatalog.d.ts +7 -0
- package/dist/speech/providerCatalog.d.ts.map +1 -0
- package/dist/speech/providerCatalog.js +243 -0
- package/dist/speech/providerCatalog.js.map +1 -0
- package/dist/speech/providers/BuiltInAdaptiveVadProvider.d.ts +20 -0
- package/dist/speech/providers/BuiltInAdaptiveVadProvider.d.ts.map +1 -0
- package/dist/speech/providers/BuiltInAdaptiveVadProvider.js +29 -0
- package/dist/speech/providers/BuiltInAdaptiveVadProvider.js.map +1 -0
- package/dist/speech/providers/ElevenLabsTextToSpeechProvider.d.ts +20 -0
- package/dist/speech/providers/ElevenLabsTextToSpeechProvider.d.ts.map +1 -0
- package/dist/speech/providers/ElevenLabsTextToSpeechProvider.js +95 -0
- package/dist/speech/providers/ElevenLabsTextToSpeechProvider.js.map +1 -0
- package/dist/speech/providers/OpenAITextToSpeechProvider.d.ts +20 -0
- package/dist/speech/providers/OpenAITextToSpeechProvider.d.ts.map +1 -0
- package/dist/speech/providers/OpenAITextToSpeechProvider.js +75 -0
- package/dist/speech/providers/OpenAITextToSpeechProvider.js.map +1 -0
- package/dist/speech/providers/OpenAIWhisperSpeechToTextProvider.d.ts +18 -0
- package/dist/speech/providers/OpenAIWhisperSpeechToTextProvider.d.ts.map +1 -0
- package/dist/speech/providers/OpenAIWhisperSpeechToTextProvider.js +109 -0
- package/dist/speech/providers/OpenAIWhisperSpeechToTextProvider.js.map +1 -0
- package/dist/speech/types.d.ts +270 -0
- package/dist/speech/types.d.ts.map +1 -0
- package/dist/speech/types.js +2 -0
- package/dist/speech/types.js.map +1 -0
- package/package.json +22 -2
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Main audio processing pipeline with environmental adaptation using Web Audio APIs.
|
|
3
|
+
* This component is intended for client-side execution in a web browser.
|
|
4
|
+
* @module agentos/core/audio/AudioProcessor
|
|
5
|
+
*/
|
|
6
|
+
import { EventEmitter } from 'events';
|
|
7
|
+
import { NoiseProfile, CalibrationConfig } from './EnvironmentalCalibrator';
|
|
8
|
+
import { VADResult, AdaptiveVADConfig as LogicVADConfig, VADEmitterEvents } from './AdaptiveVAD';
|
|
9
|
+
/**
|
|
10
|
+
* Configuration for the Web Audio API based AudioProcessor.
|
|
11
|
+
* Note: `frameSize` here refers to the ScriptProcessorNode's buffer size.
|
|
12
|
+
* The actual processing frame for VAD/Calibrator might be this size or smaller if sub-chunked.
|
|
13
|
+
*/
|
|
14
|
+
export interface WebAudioProcessorConfig {
|
|
15
|
+
/** Sample rate for processing. AudioContext will try to match this. */
|
|
16
|
+
sampleRate?: number;
|
|
17
|
+
/**
|
|
18
|
+
* Buffer size for the ScriptProcessorNode in samples. This determines the frequency of `onaudioprocess`.
|
|
19
|
+
* Common values: 256, 512, 1024, 2048, 4096.
|
|
20
|
+
* This also dictates the size of `audioFrame` given to VAD/Calibrator unless further chunking is done.
|
|
21
|
+
*/
|
|
22
|
+
bufferSize?: number;
|
|
23
|
+
/** Enable Automatic Gain Control (AGC) via a GainNode (conceptual placeholder for now). */
|
|
24
|
+
enableAGC?: boolean;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Represents the internal processing state of the AudioProcessor.
|
|
28
|
+
*/
|
|
29
|
+
export interface AudioProcessorState {
|
|
30
|
+
isCalibratorCalibrated: boolean;
|
|
31
|
+
isProcessing: boolean;
|
|
32
|
+
currentEnvironmentType: NoiseProfile['environmentType'] | 'unknown';
|
|
33
|
+
lastNoiseProfileUpdateMs: number;
|
|
34
|
+
vadIsSpeaking: boolean;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Represents a complete speech audio chunk captured by the processor.
|
|
38
|
+
*/
|
|
39
|
+
export interface SpeechAudioChunk {
|
|
40
|
+
id: string;
|
|
41
|
+
audioData: Float32Array;
|
|
42
|
+
sampleRate: number;
|
|
43
|
+
durationMs: number;
|
|
44
|
+
startTimeMs: number;
|
|
45
|
+
vadResultAtEnd: VADResult;
|
|
46
|
+
noiseProfileContext?: NoiseProfile | null;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Events emitted by the WebAudioProcessor.
|
|
50
|
+
*/
|
|
51
|
+
export interface WebAudioProcessorEvents extends VADEmitterEvents {
|
|
52
|
+
'processor:initialized': () => void;
|
|
53
|
+
'processor:started': () => void;
|
|
54
|
+
'processor:stopped': () => void;
|
|
55
|
+
'processor:error': (error: Error) => void;
|
|
56
|
+
'processor:disposed': () => void;
|
|
57
|
+
'calibration:started': () => void;
|
|
58
|
+
'calibration:complete': (profile: NoiseProfile) => void;
|
|
59
|
+
'profile:updated': (profile: NoiseProfile) => void;
|
|
60
|
+
'anomaly:detected': (type: string, details: any, profile: NoiseProfile) => void;
|
|
61
|
+
/** Emitted when a complete speech audio chunk is ready. */
|
|
62
|
+
'speech_chunk_ready': (chunk: SpeechAudioChunk) => void;
|
|
63
|
+
/** Raw audio frame from onaudioprocess, for debugging or other consumers. */
|
|
64
|
+
'raw_audio_frame': (frame: Float32Array, sampleRate: number) => void;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* AudioProcessor - Central client-side audio processing pipeline using Web Audio APIs.
|
|
68
|
+
* Orchestrates EnvironmentalCalibrator (web-version) and AdaptiveVAD (logic-version).
|
|
69
|
+
*/
|
|
70
|
+
export declare class AudioProcessor extends EventEmitter {
|
|
71
|
+
private config;
|
|
72
|
+
private calibrator;
|
|
73
|
+
private vad;
|
|
74
|
+
private audioContext;
|
|
75
|
+
private mediaStream;
|
|
76
|
+
private sourceNode;
|
|
77
|
+
private processorNode;
|
|
78
|
+
private gainNode;
|
|
79
|
+
private isInitialized;
|
|
80
|
+
private _isProcessing;
|
|
81
|
+
private frameDurationMs;
|
|
82
|
+
private speechDataBuffer;
|
|
83
|
+
private currentSpeechStartTimeMs;
|
|
84
|
+
private internalState;
|
|
85
|
+
on<U extends keyof WebAudioProcessorEvents>(event: U, listener: WebAudioProcessorEvents[U]): this;
|
|
86
|
+
emit<U extends keyof WebAudioProcessorEvents>(event: U, ...args: Parameters<WebAudioProcessorEvents[U]>): boolean;
|
|
87
|
+
constructor(config?: WebAudioProcessorConfig, calibrationConfig?: CalibrationConfig, // For web-based EnvironmentalCalibrator
|
|
88
|
+
vadConfig?: LogicVADConfig);
|
|
89
|
+
private setupEventForwarding;
|
|
90
|
+
/**
|
|
91
|
+
* Initialize the audio processing pipeline with a given MediaStream.
|
|
92
|
+
* @param {MediaStream} stream - The user's audio MediaStream.
|
|
93
|
+
* @returns {Promise<void>}
|
|
94
|
+
*/
|
|
95
|
+
initialize(stream: MediaStream): Promise<void>;
|
|
96
|
+
/**
|
|
97
|
+
* Start processing audio. Must be called after initialize.
|
|
98
|
+
* Often requires user interaction to start AudioContext.
|
|
99
|
+
*/
|
|
100
|
+
start(): Promise<void>;
|
|
101
|
+
/** Stop processing audio. */
|
|
102
|
+
stop(): void;
|
|
103
|
+
private processAudioEvent;
|
|
104
|
+
private isCurrentlySpeakingOrRecentlyEnded;
|
|
105
|
+
private concatenateFloat32Arrays;
|
|
106
|
+
/**
|
|
107
|
+
* Get current processing state.
|
|
108
|
+
* @returns {AudioProcessorState}
|
|
109
|
+
*/
|
|
110
|
+
getInternalState(): AudioProcessorState;
|
|
111
|
+
/**
|
|
112
|
+
* Returns true if the audio processor is currently capturing and processing audio.
|
|
113
|
+
*/
|
|
114
|
+
get isProcessing(): boolean;
|
|
115
|
+
/**
|
|
116
|
+
* Cleanly dispose of all Web Audio API resources.
|
|
117
|
+
* @returns {Promise<void>}
|
|
118
|
+
*/
|
|
119
|
+
dispose(): Promise<void>;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=AudioProcessor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AudioProcessor.d.ts","sourceRoot":"","sources":["../../../src/core/audio/AudioProcessor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
// backend/agentos/core/audio/AudioProcessor.ts
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Main audio processing pipeline with environmental adaptation using Web Audio APIs.
|
|
4
|
+
* This component is intended for client-side execution in a web browser.
|
|
5
|
+
* @module agentos/core/audio/AudioProcessor
|
|
6
|
+
*/
|
|
7
|
+
import { EventEmitter } from 'events';
|
|
8
|
+
// EnvironmentalCalibrator will be your web-based version
|
|
9
|
+
import { EnvironmentalCalibrator } from './EnvironmentalCalibrator.js';
|
|
10
|
+
// AdaptiveVAD is the logic-based one we created
|
|
11
|
+
import { AdaptiveVAD } from './AdaptiveVAD.js';
|
|
12
|
+
/**
|
|
13
|
+
* AudioProcessor - Central client-side audio processing pipeline using Web Audio APIs.
|
|
14
|
+
* Orchestrates EnvironmentalCalibrator (web-version) and AdaptiveVAD (logic-version).
|
|
15
|
+
*/
|
|
16
|
+
export class AudioProcessor extends EventEmitter {
|
|
17
|
+
on(event, listener) {
|
|
18
|
+
return super.on(event, listener);
|
|
19
|
+
}
|
|
20
|
+
emit(event, ...args) {
|
|
21
|
+
return super.emit(event, ...args);
|
|
22
|
+
}
|
|
23
|
+
constructor(config = {}, calibrationConfig = {}, // For web-based EnvironmentalCalibrator
|
|
24
|
+
vadConfig = {} // For logic-based AdaptiveVAD
|
|
25
|
+
) {
|
|
26
|
+
super();
|
|
27
|
+
this.audioContext = null;
|
|
28
|
+
this.mediaStream = null;
|
|
29
|
+
this.sourceNode = null;
|
|
30
|
+
this.processorNode = null;
|
|
31
|
+
this.gainNode = null; // For potential AGC
|
|
32
|
+
this.isInitialized = false;
|
|
33
|
+
this._isProcessing = false;
|
|
34
|
+
this.speechDataBuffer = []; // To accumulate speech frames
|
|
35
|
+
this.currentSpeechStartTimeMs = null;
|
|
36
|
+
this.config = {
|
|
37
|
+
sampleRate: config.sampleRate || 16000,
|
|
38
|
+
bufferSize: config.bufferSize || 4096, // ScriptProcessorNode buffer size
|
|
39
|
+
enableAGC: config.enableAGC ?? false,
|
|
40
|
+
};
|
|
41
|
+
// Calculate frame duration based on ScriptProcessorNode's output
|
|
42
|
+
this.frameDurationMs = (this.config.bufferSize / this.config.sampleRate) * 1000;
|
|
43
|
+
if (this.frameDurationMs <= 0 || !isFinite(this.frameDurationMs)) {
|
|
44
|
+
throw new Error(`AudioProcessor: Invalid frame duration (${this.frameDurationMs}ms). Check bufferSize (${this.config.bufferSize}) and sampleRate (${this.config.sampleRate}).`);
|
|
45
|
+
}
|
|
46
|
+
// Instantiate the WEB-BASED EnvironmentalCalibrator
|
|
47
|
+
// It will use Web Audio APIs for its 'calibrate(stream)' method.
|
|
48
|
+
this.calibrator = new EnvironmentalCalibrator({
|
|
49
|
+
...calibrationConfig,
|
|
50
|
+
sampleRate: this.config.sampleRate, // It needs sampleRate
|
|
51
|
+
// If its 'calibrate' uses its own AnalyserNode, it might need bufferSize too.
|
|
52
|
+
});
|
|
53
|
+
// Instantiate the LOGIC-BASED AdaptiveVAD
|
|
54
|
+
this.vad = new AdaptiveVAD(vadConfig, this.calibrator, // VAD uses the calibrator instance
|
|
55
|
+
this.frameDurationMs // VAD needs to know the duration of frames it will receive
|
|
56
|
+
);
|
|
57
|
+
this.internalState = {
|
|
58
|
+
isCalibratorCalibrated: false,
|
|
59
|
+
isProcessing: false,
|
|
60
|
+
currentEnvironmentType: 'unknown',
|
|
61
|
+
lastNoiseProfileUpdateMs: 0,
|
|
62
|
+
vadIsSpeaking: false,
|
|
63
|
+
};
|
|
64
|
+
this.setupEventForwarding();
|
|
65
|
+
}
|
|
66
|
+
setupEventForwarding() {
|
|
67
|
+
this.calibrator.on('calibration:started', () => this.emit('calibration:started'));
|
|
68
|
+
this.calibrator.on('calibration:complete', (profile) => {
|
|
69
|
+
this.internalState.isCalibratorCalibrated = true;
|
|
70
|
+
this.internalState.currentEnvironmentType = profile.environmentType;
|
|
71
|
+
this.internalState.lastNoiseProfileUpdateMs = profile.timestamp;
|
|
72
|
+
this.emit('calibration:complete', profile);
|
|
73
|
+
});
|
|
74
|
+
this.calibrator.on('profile:updated', (profile) => {
|
|
75
|
+
this.internalState.currentEnvironmentType = profile.environmentType;
|
|
76
|
+
this.internalState.lastNoiseProfileUpdateMs = profile.timestamp;
|
|
77
|
+
this.emit('profile:updated', profile);
|
|
78
|
+
});
|
|
79
|
+
this.calibrator.on('anomaly:detected', (type, details, profile) => {
|
|
80
|
+
// The web-based calibrator might not pass 'profile' here, adjust if needed based on its signature.
|
|
81
|
+
// Assuming it does based on previous refactor of Node.js version.
|
|
82
|
+
this.emit('anomaly:detected', type, details, profile);
|
|
83
|
+
});
|
|
84
|
+
// VAD Event Handling
|
|
85
|
+
this.vad.on('speech_start', (vadResult) => {
|
|
86
|
+
this.speechDataBuffer = []; // Clear buffer for new speech segment
|
|
87
|
+
this.currentSpeechStartTimeMs = Date.now() - this.frameDurationMs; // Approximate start to previous frame
|
|
88
|
+
this.internalState.vadIsSpeaking = true;
|
|
89
|
+
this.emit('speech_start', vadResult);
|
|
90
|
+
});
|
|
91
|
+
this.vad.on('voice_activity', (vadResult) => {
|
|
92
|
+
// The frame causing this is handled in `processAudioEvent` to be added to buffer
|
|
93
|
+
this.emit('voice_activity', vadResult);
|
|
94
|
+
});
|
|
95
|
+
this.vad.on('speech_end', (vadResult, speechDurationMs) => {
|
|
96
|
+
this.internalState.vadIsSpeaking = false;
|
|
97
|
+
this.emit('speech_end', vadResult, speechDurationMs);
|
|
98
|
+
if (this.speechDataBuffer.length > 0 && this.currentSpeechStartTimeMs !== null) {
|
|
99
|
+
const concatenatedAudio = this.concatenateFloat32Arrays(this.speechDataBuffer);
|
|
100
|
+
const chunk = {
|
|
101
|
+
id: `spch_${Date.now()}`,
|
|
102
|
+
audioData: concatenatedAudio,
|
|
103
|
+
sampleRate: this.config.sampleRate,
|
|
104
|
+
durationMs: speechDurationMs, // Use VAD's calculated duration
|
|
105
|
+
startTimeMs: this.currentSpeechStartTimeMs,
|
|
106
|
+
vadResultAtEnd: vadResult,
|
|
107
|
+
noiseProfileContext: this.calibrator.getCurrentProfile()
|
|
108
|
+
};
|
|
109
|
+
this.emit('speech_chunk_ready', chunk);
|
|
110
|
+
}
|
|
111
|
+
this.speechDataBuffer = []; // Clear buffer
|
|
112
|
+
this.currentSpeechStartTimeMs = null;
|
|
113
|
+
});
|
|
114
|
+
this.vad.on('thresholds_updated', (speech, silence, profile) => {
|
|
115
|
+
this.emit('thresholds_updated', speech, silence, profile);
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Initialize the audio processing pipeline with a given MediaStream.
|
|
120
|
+
* @param {MediaStream} stream - The user's audio MediaStream.
|
|
121
|
+
* @returns {Promise<void>}
|
|
122
|
+
*/
|
|
123
|
+
async initialize(stream) {
|
|
124
|
+
if (this.isInitialized) {
|
|
125
|
+
console.warn('AudioProcessor already initialized.');
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
console.log('🎙️ Initializing Web AudioProcessor...');
|
|
129
|
+
this.mediaStream = stream;
|
|
130
|
+
try {
|
|
131
|
+
this.audioContext = new (window.AudioContext || window.webkitAudioContext)({
|
|
132
|
+
sampleRate: this.config.sampleRate,
|
|
133
|
+
});
|
|
134
|
+
// Forcing sample rate can be tricky; browser might use its own.
|
|
135
|
+
// It's better to adapt to audioContext.sampleRate if they differ significantly.
|
|
136
|
+
if (Math.abs(this.audioContext.sampleRate - this.config.sampleRate) > 100) {
|
|
137
|
+
console.warn(`AudioContext sample rate (${this.audioContext.sampleRate}Hz) differs significantly from configured (${this.config.sampleRate}Hz). Using AudioContext's rate.`);
|
|
138
|
+
// Re-calculate frameDurationMs if sampleRate changed
|
|
139
|
+
// this.config.sampleRate = this.audioContext.sampleRate; // Update config if we decide to follow context's rate
|
|
140
|
+
// this.frameDurationMs = (this.config.bufferSize / this.config.sampleRate) * 1000;
|
|
141
|
+
// TODO: Decide if VAD needs re-initialization or if its config can adapt.
|
|
142
|
+
}
|
|
143
|
+
this.sourceNode = this.audioContext.createMediaStreamSource(stream);
|
|
144
|
+
this.gainNode = this.audioContext.createGain(); // For potential AGC
|
|
145
|
+
this.processorNode = this.audioContext.createScriptProcessor(this.config.bufferSize, 1, // input channels
|
|
146
|
+
1 // output channels
|
|
147
|
+
);
|
|
148
|
+
this.sourceNode.connect(this.gainNode);
|
|
149
|
+
this.gainNode.connect(this.processorNode);
|
|
150
|
+
this.processorNode.connect(this.audioContext.destination); // Necessary to keep processing alive
|
|
151
|
+
this.processorNode.onaudioprocess = (event) => {
|
|
152
|
+
if (this._isProcessing) {
|
|
153
|
+
this.processAudioEvent(event);
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
// Start environmental calibration using the web-based calibrator
|
|
157
|
+
// This version of 'calibrate' is from the user-provided EnvironmentalCalibrator,
|
|
158
|
+
// which expects a MediaStream. We'll need to ensure it works correctly.
|
|
159
|
+
console.log('🎤 Starting environmental calibration (web)...');
|
|
160
|
+
this.emit('calibration:started'); // Emit our own event
|
|
161
|
+
await this.calibrator.calibrate(stream); // This should internally use the stream
|
|
162
|
+
// and emit 'calibration:complete' itself.
|
|
163
|
+
this.isInitialized = true;
|
|
164
|
+
this.emit('processor:initialized');
|
|
165
|
+
console.log('✅ Web AudioProcessor initialized.');
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
console.error('❌ Failed to initialize Web AudioProcessor:', error);
|
|
169
|
+
this.emit('processor:error', error);
|
|
170
|
+
await this.dispose();
|
|
171
|
+
throw error;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Start processing audio. Must be called after initialize.
|
|
176
|
+
* Often requires user interaction to start AudioContext.
|
|
177
|
+
*/
|
|
178
|
+
async start() {
|
|
179
|
+
if (!this.isInitialized) {
|
|
180
|
+
throw new Error('AudioProcessor not initialized. Call initialize() first.');
|
|
181
|
+
}
|
|
182
|
+
if (this._isProcessing) {
|
|
183
|
+
console.warn('AudioProcessor is already processing.');
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
if (this.audioContext && this.audioContext.state === 'suspended') {
|
|
187
|
+
try {
|
|
188
|
+
await this.audioContext.resume();
|
|
189
|
+
console.log('AudioContext resumed successfully.');
|
|
190
|
+
}
|
|
191
|
+
catch (err) {
|
|
192
|
+
console.error('Error resuming AudioContext:', err);
|
|
193
|
+
this.emit('processor:error', new Error('Failed to resume AudioContext. User interaction might be required.'));
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
this._isProcessing = true;
|
|
198
|
+
this.internalState.isProcessing = true;
|
|
199
|
+
this.vad.resetState(); // Reset VAD state when starting
|
|
200
|
+
console.log('▶️ Web Audio processing started.');
|
|
201
|
+
this.emit('processor:started');
|
|
202
|
+
}
|
|
203
|
+
/** Stop processing audio. */
|
|
204
|
+
stop() {
|
|
205
|
+
if (!this._isProcessing)
|
|
206
|
+
return;
|
|
207
|
+
this._isProcessing = false;
|
|
208
|
+
this.internalState.isProcessing = false;
|
|
209
|
+
console.log('⏹️ Web Audio processing stopped.');
|
|
210
|
+
this.emit('processor:stopped');
|
|
211
|
+
}
|
|
212
|
+
processAudioEvent(event) {
|
|
213
|
+
const audioFrame = new Float32Array(event.inputBuffer.getChannelData(0)); // Get a copy
|
|
214
|
+
this.emit('raw_audio_frame', audioFrame, this.audioContext?.sampleRate ?? this.config.sampleRate);
|
|
215
|
+
// 1. Pass frame to EnvironmentalCalibrator for continuous adaptation
|
|
216
|
+
// The web-based calibrator's `continuousAdaptation` takes a Float32Array.
|
|
217
|
+
if (this.internalState.isCalibratorCalibrated) { // Only adapt after initial calibration
|
|
218
|
+
this.calibrator.continuousAdaptation(audioFrame);
|
|
219
|
+
}
|
|
220
|
+
// 2. Pass frame to AdaptiveVAD
|
|
221
|
+
const vadResult = this.vad.processFrame(audioFrame);
|
|
222
|
+
this.internalState.vadIsSpeaking = this.vad.getCurrentState().isSpeaking; // Update internal state
|
|
223
|
+
// 3. Buffer audio if VAD indicates speech
|
|
224
|
+
if (this.internalState.vadIsSpeaking || this.speechDataBuffer.length > 0) {
|
|
225
|
+
// Add to buffer if VAD says it's speech, OR if we were accumulating and it might be the tail end.
|
|
226
|
+
// The VAD's speech_end logic will determine if the buffer forms a valid chunk.
|
|
227
|
+
const vadConfig = this.vad.getConfig();
|
|
228
|
+
if (vadResult.isSpeech || (this.isCurrentlySpeakingOrRecentlyEnded() && this.speechDataBuffer.length < ((this.vad.getCurrentState().consecutiveSilenceFrames * this.frameDurationMs) < vadConfig.maxSilenceDurationMsInSpeech ? 100 : 0))) { // Heuristic to grab trailing audio frames
|
|
229
|
+
this.speechDataBuffer.push(audioFrame.slice()); // Store a copy
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
// Helper to check if VAD is speaking or was speaking very recently (within one frame)
|
|
234
|
+
isCurrentlySpeakingOrRecentlyEnded() {
|
|
235
|
+
const vadState = this.vad.getCurrentState();
|
|
236
|
+
return vadState.isSpeaking || (vadState.consecutiveSilenceFrames * this.frameDurationMs < this.frameDurationMs * 2);
|
|
237
|
+
}
|
|
238
|
+
concatenateFloat32Arrays(arrays) {
|
|
239
|
+
let totalLength = 0;
|
|
240
|
+
for (const arr of arrays) {
|
|
241
|
+
totalLength += arr.length;
|
|
242
|
+
}
|
|
243
|
+
const result = new Float32Array(totalLength);
|
|
244
|
+
let offset = 0;
|
|
245
|
+
for (const arr of arrays) {
|
|
246
|
+
result.set(arr, offset);
|
|
247
|
+
offset += arr.length;
|
|
248
|
+
}
|
|
249
|
+
return result;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Get current processing state.
|
|
253
|
+
* @returns {AudioProcessorState}
|
|
254
|
+
*/
|
|
255
|
+
getInternalState() {
|
|
256
|
+
return { ...this.internalState, vadIsSpeaking: this.vad.getCurrentState().isSpeaking };
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Returns true if the audio processor is currently capturing and processing audio.
|
|
260
|
+
*/
|
|
261
|
+
get isProcessing() {
|
|
262
|
+
return this._isProcessing;
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Cleanly dispose of all Web Audio API resources.
|
|
266
|
+
* @returns {Promise<void>}
|
|
267
|
+
*/
|
|
268
|
+
async dispose() {
|
|
269
|
+
console.log('🗑️ Disposing Web AudioProcessor...');
|
|
270
|
+
this.stop();
|
|
271
|
+
if (this.processorNode) {
|
|
272
|
+
this.processorNode.disconnect();
|
|
273
|
+
this.processorNode.onaudioprocess = null;
|
|
274
|
+
}
|
|
275
|
+
if (this.gainNode)
|
|
276
|
+
this.gainNode.disconnect();
|
|
277
|
+
if (this.sourceNode)
|
|
278
|
+
this.sourceNode.disconnect();
|
|
279
|
+
this.mediaStream?.getTracks().forEach(track => track.stop());
|
|
280
|
+
if (this.audioContext && this.audioContext.state !== 'closed') {
|
|
281
|
+
try {
|
|
282
|
+
await this.audioContext.close();
|
|
283
|
+
}
|
|
284
|
+
catch (e) {
|
|
285
|
+
console.warn("Error closing AudioContext:", e);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
this.audioContext = null;
|
|
289
|
+
this.sourceNode = null;
|
|
290
|
+
this.processorNode = null;
|
|
291
|
+
this.gainNode = null;
|
|
292
|
+
this.mediaStream = null;
|
|
293
|
+
this.isInitialized = false;
|
|
294
|
+
this.speechDataBuffer = [];
|
|
295
|
+
console.log('🚮 Web AudioProcessor disposed.');
|
|
296
|
+
this.emit('processor:disposed');
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
//# sourceMappingURL=AudioProcessor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AudioProcessor.js","sourceRoot":"","sources":["../../../src/core/audio/AudioProcessor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Environmental noise calibration and adaptation system for Web Browsers.
|
|
4
|
+
* This module uses Web Audio APIs to understand the acoustic properties of the
|
|
5
|
+
* environment by analyzing an input MediaStream for initial calibration, and then
|
|
6
|
+
* processing raw audio frames (Float32Array) for continuous adaptation.
|
|
7
|
+
* @module agentos/core/audio/EnvironmentalCalibrator
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Represents the acoustic profile of the environment.
|
|
11
|
+
* This profile is used by other audio components (like VAD) to adjust their sensitivity.
|
|
12
|
+
*/
|
|
13
|
+
export interface NoiseProfile {
|
|
14
|
+
/** Root Mean Square of the baseline ambient noise, calculated using a percentile. */
|
|
15
|
+
baselineRMS: number;
|
|
16
|
+
/** Peak Root Mean Square detected during an observation window. */
|
|
17
|
+
peakRMS: number;
|
|
18
|
+
/** Standard deviation of RMS values, indicating noise floor stability. */
|
|
19
|
+
noiseStdDev: number;
|
|
20
|
+
/**
|
|
21
|
+
* Optional frequency spectrum analysis (e.g., 32 bands).
|
|
22
|
+
* Populated if `enableFrequencyAnalysis` is true.
|
|
23
|
+
*/
|
|
24
|
+
frequencyProfile?: Float32Array;
|
|
25
|
+
/** Classified type of the acoustic environment. */
|
|
26
|
+
environmentType: 'quiet' | 'normal' | 'noisy' | 'very_noisy';
|
|
27
|
+
/** Confidence in the profile (0-1), based on data quantity and stability. */
|
|
28
|
+
confidenceScore: number;
|
|
29
|
+
/** Timestamp (Unix epoch ms) of when this profile was last calculated. */
|
|
30
|
+
timestamp: number;
|
|
31
|
+
/** Suggested speech detection threshold (RMS value) based on this profile. */
|
|
32
|
+
suggestedSpeechThreshold: number;
|
|
33
|
+
/** Suggested silence detection threshold (RMS value) based on this profile. */
|
|
34
|
+
suggestedSilenceThreshold: number;
|
|
35
|
+
/** Number of audio frames/buffers analyzed to generate or update this profile. */
|
|
36
|
+
framesAnalyzedCount: number;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Configuration for environmental calibration using Web Audio APIs.
|
|
40
|
+
*/
|
|
41
|
+
export interface CalibrationConfig {
|
|
42
|
+
/**
|
|
43
|
+
* Duration in milliseconds for the initial calibration phase via MediaStream.
|
|
44
|
+
* @default 3000
|
|
45
|
+
*/
|
|
46
|
+
initialCalibrationMs?: number;
|
|
47
|
+
/**
|
|
48
|
+
* Buffer size for the ScriptProcessorNode used during initial calibration.
|
|
49
|
+
* Affects how often audio data is analyzed during calibration.
|
|
50
|
+
* @default 4096
|
|
51
|
+
*/
|
|
52
|
+
calibrationBufferSize?: number;
|
|
53
|
+
/**
|
|
54
|
+
* Minimum number of RMS samples (from processed frames) required for a meaningful profile update
|
|
55
|
+
* during continuous adaptation (when `processAudioFrame` is called).
|
|
56
|
+
* @default 50
|
|
57
|
+
*/
|
|
58
|
+
minRmsSamplesForContinuousUpdate?: number;
|
|
59
|
+
/**
|
|
60
|
+
* Initial interval in milliseconds for continuous adaptation checks if no voice activity.
|
|
61
|
+
* This applies when `processAudioFrame` is used for continuous updates.
|
|
62
|
+
* @default 1000
|
|
63
|
+
*/
|
|
64
|
+
initialUpdateIntervalMs?: number;
|
|
65
|
+
/**
|
|
66
|
+
* Multiplier for the exponential backoff strategy during continuous adaptation.
|
|
67
|
+
* @default 1.5
|
|
68
|
+
*/
|
|
69
|
+
backoffMultiplier?: number;
|
|
70
|
+
/**
|
|
71
|
+
* Maximum interval in milliseconds for continuous adaptation checks.
|
|
72
|
+
* @default 30000
|
|
73
|
+
*/
|
|
74
|
+
maxBackoffIntervalMs?: number;
|
|
75
|
+
/**
|
|
76
|
+
* Minimum interval in milliseconds for continuous adaptation checks after activity or change.
|
|
77
|
+
* @default 500
|
|
78
|
+
*/
|
|
79
|
+
minBackoffIntervalMs?: number;
|
|
80
|
+
/**
|
|
81
|
+
* Number of recent RMS values (from processed frames) to store in a buffer for continuous adaptation.
|
|
82
|
+
* @default 50
|
|
83
|
+
*/
|
|
84
|
+
rmsHistoryBufferSize?: number;
|
|
85
|
+
/**
|
|
86
|
+
* Sensitivity adjustment factor for calculating speech/silence thresholds.
|
|
87
|
+
* @default 1.0
|
|
88
|
+
*/
|
|
89
|
+
thresholdSensitivityFactor?: number;
|
|
90
|
+
/**
|
|
91
|
+
* Enable frequency analysis using AnalyserNode during initial calibration.
|
|
92
|
+
* @default true
|
|
93
|
+
*/
|
|
94
|
+
enableFrequencyAnalysis?: boolean;
|
|
95
|
+
/**
|
|
96
|
+
* FFT size for the AnalyserNode. Must be a power of 2.
|
|
97
|
+
* `frequencyBinCount` will be `fftSize / 2`.
|
|
98
|
+
* @default 256 (yields 128 frequency bins)
|
|
99
|
+
*/
|
|
100
|
+
fftSize?: number;
|
|
101
|
+
/**
|
|
102
|
+
* Sample rate of the audio. The calibrator will try to use this for its internal AudioContext.
|
|
103
|
+
* If the input MediaStream has a different rate, resampling might occur or the stream's rate is used.
|
|
104
|
+
* @default 16000
|
|
105
|
+
*/
|
|
106
|
+
sampleRate?: number;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Events emitted by the EnvironmentalCalibrator.
|
|
110
|
+
*/
|
|
111
|
+
export interface CalibrationEvents {
|
|
112
|
+
'profile:updated': (profile: NoiseProfile) => void;
|
|
113
|
+
'environment:changed': (newEnvironment: NoiseProfile['environmentType'], oldEnvironment: NoiseProfile['environmentType'], profile: NoiseProfile) => void;
|
|
114
|
+
'calibration:progress': (progress: number, currentRms: number) => void;
|
|
115
|
+
'calibration:complete': (profile: NoiseProfile) => void;
|
|
116
|
+
'calibration:started': () => void;
|
|
117
|
+
'calibration:error': (error: Error) => void;
|
|
118
|
+
'anomaly:detected': (type: string, details: any, profile: NoiseProfile | null) => void;
|
|
119
|
+
}
|
|
120
|
+
export declare interface EnvironmentalCalibrator {
|
|
121
|
+
on<U extends keyof CalibrationEvents>(event: U, listener: CalibrationEvents[U]): this;
|
|
122
|
+
emit<U extends keyof CalibrationEvents>(event: U, ...args: Parameters<CalibrationEvents[U]>): boolean;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* EnvironmentalCalibrator (Web Version) - Adapts to acoustic environment in real-time
|
|
126
|
+
* using Web Audio APIs for initial calibration and processing raw frames for continuous updates.
|
|
127
|
+
*/
|
|
128
|
+
export declare class EnvironmentalCalibrator extends EventEmitter {
|
|
129
|
+
private config;
|
|
130
|
+
private currentProfile;
|
|
131
|
+
private profileHistory;
|
|
132
|
+
private rmsValuesForContinuousAdapt;
|
|
133
|
+
private currentBackoffIntervalMs;
|
|
134
|
+
private lastProfileUpdateTimeMs;
|
|
135
|
+
private lastVoiceActivityTimeMs;
|
|
136
|
+
private isDuringInitialCalibration;
|
|
137
|
+
private anomalyDetector;
|
|
138
|
+
private calibrationAudioContext;
|
|
139
|
+
private calibrationSourceNode;
|
|
140
|
+
private calibrationProcessorNode;
|
|
141
|
+
private calibrationAnalyserNode;
|
|
142
|
+
/**
|
|
143
|
+
* Creates a new EnvironmentalCalibrator instance.
|
|
144
|
+
* @param {CalibrationConfig} config - Configuration options.
|
|
145
|
+
*/
|
|
146
|
+
constructor(config?: CalibrationConfig);
|
|
147
|
+
/**
|
|
148
|
+
* Performs initial environment calibration using a MediaStream.
|
|
149
|
+
* Sets up a temporary Web Audio pipeline to analyze the stream.
|
|
150
|
+
* @param {MediaStream} audioStream - The live audio input stream for calibration.
|
|
151
|
+
* @returns {Promise<NoiseProfile>} A promise that resolves with the initial noise profile,
|
|
152
|
+
* or rejects if calibration fails.
|
|
153
|
+
*/
|
|
154
|
+
calibrate(audioStream: MediaStream): Promise<NoiseProfile>;
|
|
155
|
+
/** Cleans up Web Audio nodes used specifically for initial calibration. */
|
|
156
|
+
private cleanupCalibrationAudioNodes;
|
|
157
|
+
/**
|
|
158
|
+
* Analyzes collected RMS and frequency samples to generate a NoiseProfile.
|
|
159
|
+
* @param rmsSamples - Array of RMS values from calibration.
|
|
160
|
+
* @param frequencySamples - Array of frequency data arrays from calibration.
|
|
161
|
+
* @returns {NoiseProfile} The calculated noise profile.
|
|
162
|
+
*/
|
|
163
|
+
private analyzeCalibrationSamples;
|
|
164
|
+
/**
|
|
165
|
+
* Processes a single audio frame for continuous adaptation after initial calibration.
|
|
166
|
+
* @param {Float32Array} audioFrame - A chunk of raw audio data (PCM).
|
|
167
|
+
*/
|
|
168
|
+
continuousAdaptation(audioFrame: Float32Array): void;
|
|
169
|
+
/**
|
|
170
|
+
* Helper to update profile based on current RMS history (primarily for continuous adaptation).
|
|
171
|
+
*/
|
|
172
|
+
private updateProfileFromRmsHistory;
|
|
173
|
+
/** Classifies the environment based on noise characteristics. */
|
|
174
|
+
private classifyEnvironment;
|
|
175
|
+
/** Calculates adaptive speech and silence thresholds. */
|
|
176
|
+
private calculateAdaptiveThresholds;
|
|
177
|
+
private detectAnomalies;
|
|
178
|
+
/** Records voice activity detection to reset backoff. */
|
|
179
|
+
onVoiceActivityDetected(): void;
|
|
180
|
+
getCurrentProfile(): NoiseProfile | null;
|
|
181
|
+
private addToRmsHistory;
|
|
182
|
+
private calculateRMS;
|
|
183
|
+
private calculatePercentile;
|
|
184
|
+
private calculateStdDev;
|
|
185
|
+
private calculateConfidence;
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=EnvironmentalCalibrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EnvironmentalCalibrator.d.ts","sourceRoot":"","sources":["../../../src/core/audio/EnvironmentalCalibrator.ts"],"names":[],"mappings":"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"}
|