@prabhjeet.me/wakeywakey 2.2.0 → 2.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prabhjeet.me-wakeywakey.mjs","sources":["../../../projects/wakeywakey/src/lib/services/audio/microphone-service/microphone-service.constant.ts","../../../projects/wakeywakey/src/lib/services/audio/audio-service.util.ts","../../../projects/wakeywakey/src/lib/components/orb-component/orb-component-service.ts","../../../projects/wakeywakey/src/lib/wakeywakey-component.const.ts","../../../projects/wakeywakey/src/lib/services/config/config-service.type.ts","../../../projects/wakeywakey/src/lib/services/config/config-service.ts","../../../projects/wakeywakey/src/lib/services/event/event-service.ts","../../../projects/wakeywakey/src/lib/services/model/model-service.const.ts","../../../projects/wakeywakey/src/lib/services/model/model-service.type.ts","../../../projects/wakeywakey/src/lib/services/model/model-service.ts","../../../projects/wakeywakey/src/lib/services/pipeline/pipeline-service.ts","../../../projects/wakeywakey/src/lib/services/audio/audio-service.const.ts","../../../projects/wakeywakey/src/lib/services/audio/microphone-service/microphone-service.ts","../../../projects/wakeywakey/src/lib/services/platform/platform-service.ts","../../../projects/wakeywakey/src/lib/services/audio/speech-recognition/speech-recognition-service.ts","../../../projects/wakeywakey/src/lib/services/audio/vad-service/vad-service.ts","../../../projects/wakeywakey/src/lib/services/audio/vad-service/vad-service.const.ts","../../../projects/wakeywakey/src/lib/services/audio/audio-service.ts","../../../projects/wakeywakey/src/lib/services/audio/speaker-service/speaker-service.ts","../../../projects/wakeywakey/src/lib/services/bridge/bridge-service.ts","../../../projects/wakeywakey/src/lib/components/orb-component/orb-component.ts","../../../projects/wakeywakey/src/lib/wakeywakey-component.ts","../../../projects/wakeywakey/src/provider.ts","../../../projects/wakeywakey/src/public-api.ts","../../../projects/wakeywakey/src/prabhjeet.me-wakeywakey.ts"],"sourcesContent":["/**\n * Audio sample rate\n */\nexport const SAMPLE_RATE = 16000;\n\n/**\n * Audio worklet name\n */\nexport const MICROPHONE_PROCESSOR_NAME = 'microphone-buffer-processor';\n\n/**\n * Audio worklet processor\n */\nexport const MICROPHONE_PROCESSOR = `\n class MicrophoneBufferProcessor extends AudioWorkletProcessor {\n // collect 1280 samples before sending them to the main thread\n // Web Audio processes 128 frames per call\n // batching 10 small chunks into 1 bigger chunk\n frameBlockSize = 128 * 10; // total samples per emitted chunk\n\n // for storing small chunks\n accumulatedSamples = new Float32Array(this.frameBlockSize);\n\n // cursor\n writeIndex = 0;\n\n constructor() {\n super();\n }\n\n dbNormalized(db) {\n const minDb = -60;\n const maxDb = 0;\n\n const clamped = Math.max(minDb, Math.min(db, maxDb));\n return (clamped - minDb) / (maxDb - minDb);\n }\n\n // runs every 128 frames. ~ every 2.67 ms (at 48kHz), ~ 8ms (at 16KHz)\n process(inputList) {\n const firstInput = inputList[0];\n\n // no input connected\n if (!firstInput || firstInput.length === 0) {\n return true;\n }\n\n // raw waveform values\n const firstChannelSamples = firstInput[0]; // Float32Array(128)\n\n let sum = 0;\n\n // 0 -> 128\n for (let i = 0; i < firstChannelSamples.length; i++) {\n // dump each sample in accumulated sample array\n this.accumulatedSamples[this.writeIndex++] = firstChannelSamples[i];\n sum += firstChannelSamples[i] * firstChannelSamples[i];\n }\n\n // once buffer is full, break\n if (this.writeIndex === this.frameBlockSize) {\n const rms = Math.sqrt(sum / firstChannelSamples.length);\n const db = 20 * Math.log10(rms ?? 0.00001);\n this.writeIndex = 0;\n\n // send to main thread\n this.port.postMessage({\n sample: this.accumulatedSamples.slice(),\n rms,\n db,\n dbNormalized: this.dbNormalized(db),\n });\n }\n\n return true;\n }\n}\n\nregisterProcessor(\"${MICROPHONE_PROCESSOR_NAME}\", MicrophoneBufferProcessor);\n `;\n","import { SAMPLE_RATE } from './microphone-service/microphone-service.constant';\n\n/**\n * Audio utility\n */\nexport class AudioUtil {\n /**\n * Create wav blob url from audio chunk\n *\n * @param chunks Audio chunk\n * @param sampleRate Sample rate\n * @returns\n */\n static createWavBlob(chunks: Float32Array[], sampleRate = SAMPLE_RATE) {\n const totalLength = chunks.reduce((len, chunk) => len + chunk.length, 0);\n if (!totalLength) return null;\n\n // Merge chunks\n const combined = new Float32Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n\n // Convert to 16-bit PCM\n const pcmData = new Int16Array(totalLength);\n for (let i = 0; i < totalLength; i++) {\n const s = Math.max(-1, Math.min(1, combined[i]));\n pcmData[i] = s < 0 ? s * 0x8000 : s * 0x7fff;\n }\n\n const wavHeader = new ArrayBuffer(44);\n const view = new DataView(wavHeader);\n\n const channels = 1;\n const bitsPerSample = 16;\n const byteRate = sampleRate * channels * (bitsPerSample / 8);\n const blockAlign = channels * (bitsPerSample / 8);\n\n const writeString = (offset: number, str: string) => {\n for (let i = 0; i < str.length; i++) {\n view.setUint8(offset + i, str.charCodeAt(i));\n }\n };\n\n writeString(0, 'RIFF');\n view.setUint32(4, 36 + pcmData.byteLength, true);\n writeString(8, 'WAVE');\n writeString(12, 'fmt ');\n view.setUint32(16, 16, true);\n view.setUint16(20, 1, true); // PCM\n view.setUint16(22, channels, true);\n view.setUint32(24, sampleRate, true);\n view.setUint32(28, byteRate, true);\n view.setUint16(32, blockAlign, true);\n view.setUint16(34, bitsPerSample, true);\n writeString(36, 'data');\n view.setUint32(40, pcmData.byteLength, true);\n\n const wavBlob = new Blob([wavHeader, pcmData], { type: 'audio/wav' });\n return URL.createObjectURL(wavBlob);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { AgentState } from './orb-component.type';\n\n@Injectable()\nexport class OrbComponentService {\n readonly state = new Subject<AgentState>();\n\n /**\n * Set state of orb\n */\n setState(state: AgentState) {\n this.state.next(state);\n }\n}\n","export const DEFAULT_THROTTLE_TIME = 1000;\n","import { InjectionToken } from '@angular/core';\nimport { OrbConfig } from '../../components/orb-component/orb-component.type';\nimport { AudioConfig } from '../audio/audio-service.type';\nimport { OnnxConfig } from '../model/model-service.type';\n\n/**\n * Wakey wakey configuration\n */\nexport interface Config {\n /**\n * Audio config\n */\n audio: AudioConfig;\n\n /**\n * Onnx config\n */\n onnx: OnnxConfig;\n\n /**\n * Orb config\n */\n orb?: OrbConfig;\n\n /**\n * In sliding window, there is a possibility of detecting wakeword mode than once.\n * This allows a cool down time before processing subsequent detections\n *\n * Default: 1000 (1 seconds)\n */\n throttleTime?: number;\n\n /**\n * DEFAULT | PTT: [WAKEWORD] -> Start Recording -> Silence (Spoken chunk & transcript) -> Done -> [WAKEWORD] .....\n * CHAT: [WAKEWORD] -> Start Recording -> Silence -> [Speaking] -> Start Recording -> Silence .....\n */\n mode?: 'DEFAULT' | 'VOICE_CHAT' | 'PTT';\n\n /**\n * Base asset path. This path will be used to access required resources\n *\n * Default: /wakeywakey\n */\n basePath?: string;\n\n /**\n * Key to use to activate listening (instead of wakeword)\n *\n * 'code' property of KeyboardEvent\n */\n hotkey?: string;\n}\n\n/**\n * Wakey wakey config token\n */\nexport const CONFIG = new InjectionToken<Config>('WAKEYWAKEY_CONFIG');\n","import { inject, Injectable } from '@angular/core';\nimport { DEFAULT_THROTTLE_TIME } from '../../wakeywakey-component.const';\nimport { Config, CONFIG } from './config-service.type';\n\n@Injectable()\nexport class ConfigService {\n private readonly _config = inject<Config>(CONFIG);\n\n /**\n * Audio config\n */\n get audio() {\n return this._config.audio;\n }\n\n /**\n * Onnx config\n */\n get onnx() {\n return this._config.onnx;\n }\n\n /**\n * Orb config\n */\n get orb() {\n return this._config.orb;\n }\n\n /**\n * Throttle time\n */\n get throttleTime() {\n return this._config.throttleTime ?? DEFAULT_THROTTLE_TIME;\n }\n\n /**\n * Mode\n */\n get mode() {\n return this._config.mode;\n }\n\n /**\n * Base path of assets\n */\n get basePath() {\n return this._config.basePath ?? '/wakeywakey';\n }\n\n /**\n * Hotkey\n */\n get hotkey() {\n return this._config.hotkey ?? 'Space';\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { RecordingEvent, SilenceEvent, SpeechEvent, WakeWordEvent } from './event-service.type';\n\n@Injectable()\nexport class EventService {\n /**\n * Fires when library loaded\n */\n readonly ready = new Subject<void>();\n\n /**\n * Fires when there is a message to log\n */\n readonly log = new Subject<string>();\n\n /**\n * Fires when there is an error\n */\n readonly exception = new Subject<Error>();\n\n /**\n * Fires when speech is detected\n */\n readonly speech = new Subject<SpeechEvent>();\n\n /**\n * Fires when wake word is detected\n */\n readonly wakeword = new Subject<WakeWordEvent>();\n\n /**\n * Fires when recording starts (after wake word detection)\n */\n readonly recording = new Subject<RecordingEvent>();\n\n /**\n * Fires silence is detected\n */\n readonly silence = new Subject<SilenceEvent>();\n}\n","export const DEFAULT_INFERENCE_SCORE = 0.5;\n","export const VAD_HANGOVER_FRAMES = 12;\n\nexport interface OnnxConfig {\n model: {\n /**\n * Mel Spectrogram model (.onnx)\n *\n * Default: [basePath]/models/melspectrogram.onnx\n */\n melspectrogram?: string;\n\n /**\n * Embedding model (.onnx)\n *\n * Default: [basePath]/models/embedding_model.onnx\n */\n embedding_model?: string;\n\n /**\n * Silero VAD (.onnx)\n *\n * Default: [basePath]/models/silero_vad_v4.onnx\n */\n silero_vad?: string;\n\n /**\n * Wake word model (.onnx)\n */\n wakeword: string;\n };\n\n /**\n * String representation of wakeword\n *\n * Ex 1: ['hey', 'jarvis']\n * Ex 2: ['alexa']\n */\n wakeword?: string[];\n\n /**\n * Path that contains onnx wasm runtime files\n *\n * Default: [basePath]/wasm\n */\n runtimePath?: string;\n\n /**\n * Wake word inference threshold\n *\n * Default: 0.5\n */\n wakewordInferenceThreshold?: number;\n}\n\nexport type InferenceModels = keyof OnnxConfig['model'];\n\nexport interface VadState {\n buffer: Float32Array[];\n hangoverCounter: number;\n isActive: boolean;\n emitFinal?: Float32Array[]; // Used to pass the completed chunk forward\n}\n","import { Injectable } from '@angular/core';\nimport { InferenceSession } from 'onnxruntime-web';\nimport { InferenceModels } from './model-service.type';\n\n@Injectable()\nexport class ModelService {\n /**\n * Inference session\n */\n private _inferenceSession: Record<InferenceModels, InferenceSession | undefined> = {\n melspectrogram: undefined,\n embedding_model: undefined,\n silero_vad: undefined,\n wakeword: undefined,\n };\n\n /**\n * Get melspectrogram inference session\n */\n get melSpectrogram() {\n return this._inferenceSession['melspectrogram']!;\n }\n\n /**\n * Get embedding inference session\n */\n get embedding() {\n return this._inferenceSession['embedding_model']!;\n }\n\n /**\n * Get Silero VAD inference session\n */\n get sileroVAD() {\n return this._inferenceSession['silero_vad']!;\n }\n\n /**\n * Get wakeword inference session\n */\n get wakeword() {\n return this._inferenceSession['wakeword']!;\n }\n\n /**\n * Set session instance\n */\n set session(sessions: Record<InferenceModels, InferenceSession | undefined>) {\n this._inferenceSession = sessions;\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { Tensor } from 'onnxruntime-web';\nimport { SpeechEvent } from '../event/event-service.type';\nimport { ModelService } from '../model/model-service';\n\n@Injectable()\nexport class PipelineService {\n /**\n * Dependencies\n */\n private readonly _model = inject(ModelService);\n\n // Configuration Constants\n private readonly MEL_WINDOW_SIZE = 76; // Number of mel frames needed for one embedding\n private readonly MEL_HOP_SIZE = 8; // How many frames to skip (the slide) after inference\n private readonly EMBEDDING_COUNT = 16; // Number of embeddings kept in memory (temporal context)\n private readonly FEATURE_DIM = 96; // Size of each embedding vector\n private readonly MEL_BINS = 32; // Number of frequency bins per mel frame\n\n /**\n * Historical buffer of embeddings representing the last ~1-2 seconds of audio context.\n * Initialized with empty (zero) vectors.\n */\n private readonly _embeddingQueue = Array.from({ length: this.EMBEDDING_COUNT }, () =>\n new Float32Array(this.FEATURE_DIM).fill(0),\n );\n\n /**\n * Buffer of calculated Mel Spectrogram frames waiting to be processed.\n */\n private readonly _melFrameQueue: Float32Array[] = [];\n\n /**\n * Main entry point: Processes a new chunk of audio and returns a detection score.\n */\n async run(speech: SpeechEvent): Promise<number> {\n // 1. Convert raw PCM audio into Mel Spectrogram frames and add to queue\n await this._generateMelSpectrogram(speech.sample);\n\n let latestScore = 0;\n\n // 2. Process the queue using a sliding window approach\n // While we have enough frames to form a full input window (76 frames)...\n while (this._melFrameQueue.length >= this.MEL_WINDOW_SIZE) {\n // Extract a single feature vector (embedding) from the current window\n const combinedEmbeddings = await this._processWindowToEmbeddings();\n\n // Classify the sequence of embeddings to see if the wake-word is present\n latestScore = await this._getWakeWordScore(combinedEmbeddings);\n\n // Slide the window: Remove the oldest 8 frames to make room for new audio\n this._melFrameQueue.splice(0, this.MEL_HOP_SIZE);\n }\n\n return latestScore;\n }\n\n /**\n * STAGE 1: Converts raw audio samples into Mel Frequency bins.\n */\n private async _generateMelSpectrogram(samples: Float32Array) {\n const session = this._model.melSpectrogram;\n\n // Wrap raw audio in an ONNX Tensor [Batch: 1, Samples: N]\n const inputTensor = new Tensor('float32', samples, [1, samples.length]);\n\n // Run the Mel-Spectrogram model\n const output = await session.run({ [session.inputNames[0]]: inputTensor });\n const rawMelData = output[session.outputNames[0]].data as Float32Array;\n\n /**\n * Post-processing & Normalization:\n * The model output is scaled to fit the expected input range of the embedding model.\n * Logic: (value / 10) + 2.0\n */\n const normalizedMel = rawMelData.map((val) => val / 10.0 + 2.0);\n\n // Slice the flat output array into individual frames of 32 bins and queue them\n // Each inference usually produces 5 frames for the given 1280 audio samples\n for (let i = 0; i < 5; i++) {\n const start = i * this.MEL_BINS;\n const end = start + this.MEL_BINS;\n this._melFrameQueue.push(normalizedMel.subarray(start, end));\n }\n }\n\n /**\n * STAGE 2: Extracts features (embeddings) from a window of Mel frames.\n */\n private async _processWindowToEmbeddings(): Promise<Float32Array> {\n const session = this._model.embedding!;\n\n // Take the first 76 frames from our queue\n const windowFrames = this._melFrameQueue.slice(0, this.MEL_WINDOW_SIZE);\n\n // Flatten the frames into a single continuous array for the Tensor\n const flattenedInput = new Float32Array(this.MEL_WINDOW_SIZE * this.MEL_BINS);\n windowFrames.forEach((frame, i) => {\n flattenedInput.set(frame, i * this.MEL_BINS);\n });\n\n // Run the Embedding model [1, 76, 32, 1]\n const inputTensor = new Tensor('float32', flattenedInput, [1, 76, 32, 1]);\n const output = await session.run({ [session.inputNames[0]]: inputTensor });\n const newEmbedding = output[session.outputNames[0]].data as Float32Array;\n\n // Update the rolling embedding queue (First-In, First-Out)\n this._embeddingQueue.shift();\n this._embeddingQueue.push(new Float32Array(newEmbedding));\n\n // Flatten the last 16 embeddings into one large vector for the final classifier\n const combinedBuffer = new Float32Array(this.EMBEDDING_COUNT * this.FEATURE_DIM);\n this._embeddingQueue.forEach((emb, i) => {\n combinedBuffer.set(emb, i * this.FEATURE_DIM);\n });\n\n return combinedBuffer;\n }\n\n /**\n * STAGE 3: Final classification score based on temporal embedding sequence.\n */\n private async _getWakeWordScore(embeddings: Float32Array): Promise<number> {\n const session = this._model.wakeword;\n\n // Shape: [Batch: 1, Sequence: 16, Features: 96]\n const inputTensor = new Tensor('float32', embeddings, [\n 1,\n this.EMBEDDING_COUNT,\n this.FEATURE_DIM,\n ]);\n\n const results = await session.run({ [session.inputNames[0]]: inputTensor });\n\n // Extract the scalar probability score from the output tensor\n return results[session.outputNames[0]].data[0] as number;\n }\n}\n","export const DEFAULT_SILENCE_DURATION = 1000;\nexport const DEFAULT_SPEECH_THRESHOLD_TIME = 300;\n","import { inject, Injectable, OnDestroy } from '@angular/core';\nimport { loadRnnoise, RnnoiseWorkletNode } from '@sapphi-red/web-noise-suppressor';\nimport { Subject } from 'rxjs';\nimport { ConfigService } from '../../config/config-service';\nimport { EventService } from '../../event/event-service';\nimport {\n MICROPHONE_PROCESSOR,\n MICROPHONE_PROCESSOR_NAME,\n SAMPLE_RATE,\n} from './microphone-service.constant';\nimport { MicrophoneProcessorData } from './microphone-service.type';\n\n@Injectable()\nexport class MicrophoneService implements OnDestroy {\n /**\n * Dependencies\n */\n private readonly _event = inject(EventService);\n private readonly _config = inject(ConfigService);\n\n /**\n * Audio data subject\n */\n private readonly _data = new Subject<MicrophoneProcessorData>();\n\n /**\n * List of available microphones\n */\n private _microphones: MediaDeviceInfo[] = [];\n\n /**\n * Media steam\n */\n private _stream!: MediaStream;\n\n /**\n * Media steam source\n */\n private _source?: MediaStreamAudioSourceNode;\n\n /**\n * Audio context\n */\n private _audioContext?: AudioContext;\n\n /**\n * Is muted\n */\n private _isMuted = false;\n\n /**\n * Gain node\n */\n private _gainNode?: GainNode | undefined;\n\n private _analyser?: AnalyserNode;\n\n /**\n * List of available microphones\n */\n get microphones() {\n return this._microphones;\n }\n\n /**\n * Microphone data\n */\n get data() {\n return this._data;\n }\n\n /**\n * Audio context\n */\n get audioContext() {\n return this._audioContext;\n }\n\n /**\n * Analyzer node\n */\n get analyzer() {\n return this._analyser;\n }\n\n /**\n * Media steam source node\n */\n get sourceNode() {\n return this._source;\n }\n\n /**\n * Muted state\n */\n get isMuted() {\n return this._isMuted;\n }\n\n /**\n * Set gain\n */\n set gain(value: number) {\n if (this._gainNode) this._gainNode.gain.value = value;\n }\n\n /**\n * Set muted state\n */\n set isMuted(set: boolean) {\n this._isMuted = set;\n }\n\n /**\n * Set input source\n */\n set source(deviceId: string) {\n this.init(deviceId);\n }\n\n ngOnDestroy(): void {\n // close audio context\n this._audioContext?.close();\n this._source?.disconnect();\n this._analyser?.disconnect();\n this._stream?.getTracks().forEach((track) => {\n track.stop();\n });\n }\n\n /**\n * Initialize\n *\n * @param deviceId Input device id (from microphone list)\n */\n async init(deviceId = 'default') {\n try {\n // cleanup\n this.ngOnDestroy();\n\n // request permission\n this._stream = await navigator.mediaDevices.getUserMedia({\n audio: {\n deviceId: { exact: deviceId },\n noiseSuppression: this._config.audio.noiseSuppression?.nativeNoiseSuppression || false,\n echoCancellation: this._config.audio.noiseSuppression?.nativeEchoCancellation || false,\n autoGainControl: this._config.audio.noiseSuppression?.autoGainControl || false,\n },\n });\n\n this._event.log.next(\n `${MicrophoneService.name}: Microphone permission granted (deviceid: '${deviceId ?? 'default'}')!`,\n );\n\n // save list of microphones\n this._microphones = await this._microphoneList();\n\n // monitor audio\n await this._monitor();\n\n return true;\n } catch (error) {\n this._event.exception.next(error as Error);\n }\n\n return false;\n }\n\n /**\n * Monitor audio\n *\n * @returns chunk subject\n */\n private async _monitor() {\n const worklet = await this._workletNode();\n\n // on message\n worklet.port.onmessage = async (event) => {\n const data = (event.data as MicrophoneProcessorData) ?? null;\n if (!data) return;\n\n // emit chunk\n this._data.next(data);\n };\n\n return this._data;\n }\n\n /**\n * Microphones\n */\n private async _microphoneList() {\n const devices = await navigator.mediaDevices.enumerateDevices();\n return devices.filter((device) => device.kind === 'audioinput');\n }\n\n /**\n * Prepare worklet node\n */\n private async _workletNode() {\n // Create audio context\n this._audioContext = new AudioContext({ sampleRate: SAMPLE_RATE });\n\n this._analyser = this._audioContext.createAnalyser();\n this._analyser.fftSize = 256;\n\n if (this._config.audio.noiseSuppression) {\n await this._audioContext.audioWorklet.addModule(\n this._config.audio.noiseSuppression.worklet ??\n `${this._config.basePath}/worklets/workletProcessor.js`,\n );\n }\n\n // Load custom worklet\n const blob = new Blob([MICROPHONE_PROCESSOR], { type: 'application/javascript' });\n const workletURL = URL.createObjectURL(blob);\n await this._audioContext.audioWorklet.addModule(workletURL);\n URL.revokeObjectURL(workletURL);\n\n // Create Nodes\n this._source = this._audioContext.createMediaStreamSource(this._stream);\n\n // Gain Node\n const gainNode = this._audioContext.createGain();\n gainNode.gain.value = this._config.audio.gain;\n\n if (this._config.audio.noiseSuppression) {\n // Load RNNoise dependencies\n const rnnoiseWasmBinary = await loadRnnoise({\n url:\n this._config.audio.noiseSuppression.rnnoise ??\n `${this._config.basePath}/wasm/rnnoise.wasm`,\n simdUrl:\n this._config.audio.noiseSuppression.rnnoise_simd ??\n `${this._config.basePath}/wasm/rnnoise_simd.wasm`,\n });\n\n // RNNoise Node\n const rnnoiseNode = new RnnoiseWorkletNode(this._audioContext, {\n wasmBinary: rnnoiseWasmBinary,\n maxChannels: 1, // Standard for mono microphone input\n });\n\n this._source.connect(rnnoiseNode);\n rnnoiseNode.connect(gainNode);\n } else {\n this._source.connect(gainNode);\n }\n\n this._source.connect(this._analyser);\n\n // loop back mic sound\n if (this._config.audio.loopBackToSpeakers)\n this._analyser.connect(this.audioContext!.destination);\n\n // Custom Worklet Node\n const workletNode = new AudioWorkletNode(this._audioContext, MICROPHONE_PROCESSOR_NAME);\n\n // Connect the Graph: Source -> RNNoise (if noise suppression) -> Gain -> Custom Worklet\n gainNode.connect(workletNode);\n\n return workletNode;\n }\n}\n","import { isPlatformBrowser, isPlatformServer } from '@angular/common';\nimport { Injectable, PLATFORM_ID, inject } from '@angular/core';\n\n@Injectable()\nexport class PlatformService {\n private readonly _platform = inject(PLATFORM_ID);\n\n /**\n * Is browser\n */\n get isBrowser(): boolean {\n return isPlatformBrowser(this._platform);\n }\n\n /**\n * Is server\n */\n get isServer(): boolean {\n return isPlatformServer(this._platform);\n }\n}\n","import { inject, Injectable, OnDestroy } from '@angular/core';\nimport { EventService } from '../../event/event-service';\nimport { PlatformService } from '../../platform/platform-service';\nimport { MicrophoneService } from '../microphone-service/microphone-service';\n\n@Injectable()\nexport class SpeechRecognitionService implements OnDestroy {\n /**\n * Dependencies\n */\n private readonly _event = inject(EventService);\n private readonly _platform = inject(PlatformService);\n private readonly _mic = inject(MicrophoneService);\n\n private _recognitionClass!: {\n new (): SpeechRecognition;\n prototype: SpeechRecognition;\n };\n\n /**\n * Instance\n */\n private _recognition!: SpeechRecognition;\n\n /**\n * Transcript\n */\n private _transcript = '';\n\n /**\n * Get transcript\n */\n get transcript() {\n return this._transcript;\n }\n\n ngOnDestroy(): void {\n this.reset(); // clear transcript\n\n if (this._platform.isBrowser) this._recognition.stop();\n }\n\n /**\n * Clear transcript\n */\n reset() {\n this._transcript = '';\n }\n\n init() {\n this._recognitionClass = window.SpeechRecognition || window.webkitSpeechRecognition;\n\n if (!SpeechRecognition) {\n this._event.exception.next(new Error('Speech recognition is not supported'));\n return;\n }\n\n this._recognition = new this._recognitionClass(); // initialize\n\n // 2. Configuration\n this._recognition.lang = 'en-US'; // Set language\n this._recognition.continuous = true; // Keep listening even if the user pauses\n this._recognition.interimResults = true; // Show results while the user is still speaking\n\n this._recognition.onend = () => {\n this.reset();\n this.init(); // start\n };\n\n // 3. Handle Results\n this._recognition.onresult = (event) => {\n this._transcript = '';\n\n // Don't capture if muted\n if (this._mic.isMuted) return;\n\n for (let i = event.resultIndex; i < event.results.length; i++)\n this._transcript += event.results[i][0].transcript;\n };\n\n this._recognition.start(); // start\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { Tensor, TypedTensor } from 'onnxruntime-web';\nimport { EventService } from '../../event/event-service';\nimport { ModelService } from '../../model/model-service';\nimport { SAMPLE_RATE } from '../microphone-service/microphone-service.constant';\nimport { InputMetadata, VADState } from './vad-service.type';\n\n@Injectable()\nexport class VadService {\n /**\n * Dependencies\n */\n private readonly _event = inject(EventService);\n private readonly _model = inject(ModelService);\n\n /**\n * VAD Shape\n */\n private _shape: number[] = [];\n\n /**\n * VAD LSTM hidden & cell state\n */\n private _state: VADState | null = null;\n\n /**\n * Get session\n */\n private get _session() {\n return this._model.sileroVAD;\n }\n\n /**\n * Initialize\n */\n init() {\n this._shape = this._getShape();\n\n this._state = {\n hidden: new Tensor('float32', new Float32Array(128).fill(0), this._shape),\n cell: new Tensor('float32', new Float32Array(128).fill(0), this._shape),\n };\n }\n\n /**\n * Get VAD score\n *\n * @param chunk\n * @returns\n */\n async score(sample: Float32Array): Promise<number> {\n if (!this._state) throw new Error(`${VadService.name}: Undefined LSTM state.`);\n\n try {\n const tensor = new Tensor('float32', sample, [1, sample.length]);\n const sampleRate = new Tensor('int64', [BigInt(SAMPLE_RATE)], []);\n\n // run inference\n const response = await this._session.run({\n input: tensor,\n sr: sampleRate,\n h: this._state.hidden,\n c: this._state.cell,\n });\n\n // Update memory\n this._state.hidden = response['hn'] as TypedTensor<'float32'>;\n this._state.cell = response['cn'] as TypedTensor<'float32'>;\n\n return response['output'].data[0] as number;\n } catch (error) {\n this._event.exception.next(error as Error);\n return 0;\n }\n }\n\n /**\n * Get shape of vad session\n *\n * Ex: [2, 1, 64]\n */\n private _getShape() {\n const { shape } = (this._session.inputMetadata.find((e) => e.name === 'h') ??\n {}) as InputMetadata;\n\n const vadState = [];\n\n if (shape) {\n for (const sh of shape) {\n if (typeof sh === 'string') vadState.push(1);\n else vadState.push(sh);\n }\n\n return vadState;\n }\n\n throw new Error(`${VadService.name}: Unable to identify shape of the session.`);\n }\n}\n","/**\n * DefaulT VAD threshold\n */\nexport const DEFAULT_VAD_THRESHOLD = 0.5;\n","import { inject, Injectable, OnDestroy } from '@angular/core';\nimport {\n concatMap,\n distinctUntilChanged,\n EMPTY,\n filter,\n ignoreElements,\n map,\n merge,\n scan,\n share,\n switchMap,\n take,\n takeUntil,\n tap,\n throttleTime,\n timer,\n withLatestFrom,\n} from 'rxjs';\nimport { SubSink } from 'subsink';\nimport { ConfigService } from '../config/config-service';\nimport { EventService } from '../event/event-service';\nimport { SpeechEvent } from '../event/event-service.type';\nimport { DEFAULT_INFERENCE_SCORE } from '../model/model-service.const';\nimport { VAD_HANGOVER_FRAMES, VadState } from '../model/model-service.type';\nimport { PipelineService } from '../pipeline/pipeline-service';\nimport { DEFAULT_SILENCE_DURATION, DEFAULT_SPEECH_THRESHOLD_TIME } from './audio-service.const';\nimport { MicrophoneService } from './microphone-service/microphone-service';\nimport { SpeechRecognitionService } from './speech-recognition/speech-recognition-service';\nimport { VadService } from './vad-service/vad-service';\nimport { DEFAULT_VAD_THRESHOLD } from './vad-service/vad-service.const';\n\n@Injectable()\nexport class AudioService implements OnDestroy {\n /**\n * Dependencies\n */\n private readonly _config = inject(ConfigService);\n private readonly _event = inject(EventService);\n private readonly _mic = inject(MicrophoneService);\n private readonly _vad = inject(VadService);\n private readonly _pipeline = inject(PipelineService);\n private readonly _speechRecognition = inject(SpeechRecognitionService);\n\n private readonly _subs = new SubSink();\n\n private _endCurrentRecording = false;\n\n /**\n * Recording state\n */\n private _isRecording = false;\n\n /**\n * Is process is initialized (detected wakeword)\n */\n private _isInitialized = false;\n\n get isRecording() {\n return this._isRecording;\n }\n\n ngOnDestroy(): void {\n this._subs.unsubscribe();\n }\n\n /**\n * Initialize audio\n */\n async init() {\n if (!this._mic.microphones.length) {\n this._event.exception.next(new Error('Microphone permission required!'));\n return;\n }\n\n const data = await this._mic.data;\n\n // Init VAD\n this._vad.init();\n\n this._speechRecognition.init();\n\n // Fire ready event\n this._event.ready.next();\n\n data.subscribe(async (data) => {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const that = this;\n\n // Fire a speech event\n this._event.speech.next({\n ...data,\n sample: this._mic.isMuted ? new Float32Array(1280).fill(0) : data.sample, // no speech data if muted\n vadScore: await this._vad.score(data.sample), // emit vad score even if muted\n get hasVoiceActivity() {\n return this.vadScore > (that._config.audio.vadThreshold ?? DEFAULT_VAD_THRESHOLD);\n },\n });\n });\n\n this._listenForWakeword();\n this._captureCommandAfterWakeword();\n }\n\n /**\n * Force start recording (without wakeword)\n */\n forceStartRecording() {\n this._isInitialized = true;\n this._endCurrentRecording = false;\n\n // this._speechRecognition.reset(); // reset transcript\n this._event.wakeword.next({\n inferenceScore: 0,\n chunk: [],\n vadScore: 0,\n hasVoiceActivity: false,\n sample: new Float32Array(),\n rms: 0,\n db: 0,\n dbNormalized: 0,\n });\n }\n\n /**\n * Force end recording\n */\n forceEndRecording() {\n this._endCurrentRecording = true;\n this._isInitialized = false;\n\n this._event.silence.next({\n chunk: new Float32Array(),\n transcript: '',\n interimResponse: false, // final response\n });\n }\n\n /**\n * Toggle recording\n */\n toggleRecording() {\n if (this._isInitialized) {\n this._isInitialized = false;\n this.forceEndRecording();\n } else this.forceStartRecording();\n }\n\n /**\n * Identifies the wakeword and emits the event\n */\n private _listenForWakeword() {\n const vad$ = this._getWakeWordStream();\n\n this._subs.sink = this._event.speech\n .pipe(\n filter(() => !this._isInitialized && !this._mic.isMuted),\n withLatestFrom(vad$),\n concatMap(async ([speech, vadState]) => {\n const score = await this._pipeline.run(speech);\n return { speech, score, chunk: vadState.buffer };\n }),\n filter(({ score }) => {\n if (this._config.onnx.wakeword) {\n const transcriptArray = this._speechRecognition.transcript\n .toLowerCase()\n .trim()\n .split(' ');\n\n // use speech recognition for wake word identification\n if (transcriptArray.length === this._config.onnx.wakeword.length)\n for (const idx in this._config.onnx.wakeword)\n if (\n +idx < transcriptArray.length &&\n transcriptArray[idx].includes(this._config.onnx.wakeword[idx].toLowerCase())\n )\n return true;\n }\n\n return score > (this._config.onnx.wakewordInferenceThreshold ?? DEFAULT_INFERENCE_SCORE);\n }),\n )\n .subscribe(({ speech, score, chunk }) => {\n this._event.wakeword.next({ ...speech, inferenceScore: score, chunk });\n });\n }\n\n /**\n * New logic: Captures the full command audio after a wakeword\n */\n private _captureCommandAfterWakeword() {\n const SILENCE_DURATION = this._config.audio.silenceDuration ?? DEFAULT_SILENCE_DURATION;\n const VAD_THRESHOLD = this._config.audio.vadThreshold ?? DEFAULT_VAD_THRESHOLD;\n const PRE_ROLL_MS = this._config.audio.speechThresholdTime ?? DEFAULT_SPEECH_THRESHOLD_TIME;\n const CHUNK_DURATION_MS = 80; // Each speech event is fired (by audio processor) at 80 ms\n const MAX_SLIDING_WINDOW_CHUNKS = Math.ceil(PRE_ROLL_MS / CHUNK_DURATION_MS);\n\n // speech sliding window state\n const speechSlidingWindow: Float32Array[] = [];\n\n // trigger 1: wakeword\n const wakewordTrigger$ = this._event.wakeword.pipe(\n filter(() => !this._isRecording), // Ignore wakeword if already recording\n map(() => [] as Float32Array[]),\n );\n\n // trigger 2: Continuous VAD > THRESHOLD\n const continuousVadTrigger$ = this._event.speech.pipe(\n filter(() => !this._mic.isMuted),\n // intercept the raw stream to constantly update the threshold window\n tap((s) => {\n // Only buffer if we aren't already formally recording\n if (!this._isRecording && this._isInitialized) {\n speechSlidingWindow.push(s.sample);\n // Keep the array length strictly to our configured window size\n if (speechSlidingWindow.length > MAX_SLIDING_WINDOW_CHUNKS) speechSlidingWindow.shift();\n }\n }),\n\n // check VAD score\n map((s) => s.vadScore > VAD_THRESHOLD),\n filter(() => !this._isRecording && this._isInitialized),\n distinctUntilChanged(),\n\n switchMap((isVoiceActive) => {\n if (!isVoiceActive) return EMPTY; // Cancel if voice stops before threshold\n\n this._speechRecognition.reset();\n\n // PRE-FILL the actual recording buffer with our duration (ex: 300ms) look back window!\n // clone so future sliding window updates don't mutate the captured audio.\n const bufferedChunks: Float32Array[] = [...speechSlidingWindow];\n\n // continue accumulating new chunks silently while we wait for the timer\n const buffer$ = this._event.speech.pipe(\n filter(() => !this._mic.isMuted),\n tap((s) => bufferedChunks.push(s.sample)),\n ignoreElements(),\n );\n\n // timer that emits the fully accumulated chunks (pre-roll)\n const timer$ = timer(PRE_ROLL_MS).pipe(map(() => bufferedChunks));\n\n return merge(buffer$, timer$).pipe(take(1));\n }),\n );\n\n // combine triggers\n const startRecordingTrigger$ = merge(\n wakewordTrigger$.pipe(\n tap(() => {\n if (!this._isInitialized) this._isInitialized = true; // initialized\n }),\n ),\n continuousVadTrigger$,\n ).pipe(\n filter(() => !this._mic.isMuted),\n throttleTime(this._config.throttleTime), // Prevent double-firing if wakeword and voice overlap\n );\n\n // recording pipeline\n this._subs.sink = startRecordingTrigger$\n .pipe(\n tap(() => {\n this._isRecording = true;\n this._speechRecognition.reset();\n }),\n\n switchMap((bufferedChunks) => {\n // Initialize our command chunks with anything captured during the 1s VAD wait\n const commandChunks: Float32Array[] = [...bufferedChunks];\n\n const speech$ = this._event.speech.pipe(\n filter(() => !this._mic.isMuted),\n tap((speech) => {\n commandChunks.push(speech.sample);\n\n if (this._isRecording)\n // emit recording events\n this._event.recording.next({\n chunk: this._flatten(commandChunks),\n transcript: this._speechRecognition.transcript,\n });\n }),\n share(),\n );\n\n const silence$ = speech$.pipe(\n map((s) => s.vadScore < VAD_THRESHOLD),\n distinctUntilChanged(), // only emit when silence state changes\n );\n\n // silence timeout logic\n const normalSilenceTimeout$ = silence$.pipe(\n switchMap((isSilent) => {\n if (!isSilent) {\n return EMPTY; // if voice cancel the timer\n }\n\n // silence started, start timer\n return timer(SILENCE_DURATION).pipe(\n takeUntil(\n silence$.pipe(filter((silent) => !silent)), // cancel if voice resumes\n ),\n );\n }),\n );\n\n // force end recording\n const forceComplete$ = speech$.pipe(filter(() => this._endCurrentRecording));\n\n return merge(normalSilenceTimeout$, forceComplete$).pipe(\n take(1),\n map(() => this._flatten(commandChunks)),\n );\n }),\n )\n .subscribe({\n next: (chunk) => {\n const interimResponse =\n this._config.mode === 'DEFAULT' || this._config.mode === 'PTT' ? false : true;\n\n this._event.silence.next({\n chunk,\n transcript: this._speechRecognition.transcript,\n interimResponse,\n }); // emit silence event\n\n // Default case\n if (this._config.mode === 'DEFAULT' || this._config.mode === 'PTT') {\n this._isInitialized = false;\n }\n\n this._endCurrentRecording = false; // reset flag after recording ends\n\n this._isRecording = false;\n },\n error: (err) => {\n this._event.exception.next(err);\n },\n });\n }\n\n /**\n * Helper to flatten array of buffers into a single Float32Array\n */\n private _flatten(chunks: Float32Array[]): Float32Array {\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Float32Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return result;\n }\n\n /**\n * Wakeword stream\n * @returns\n */\n private _getWakeWordStream() {\n return this._event.speech.pipe(\n filter(() => !this._mic.isMuted),\n scan(\n (state: VadState, speech: SpeechEvent): VadState => {\n const { hasVoiceActivity, sample } = speech;\n let { isActive, hangoverCounter, buffer } = state;\n\n if (hasVoiceActivity) {\n // If we were idle, start a fresh buffer\n if (!isActive) {\n buffer = [];\n isActive = true;\n }\n // Reset silence tracker to 0 because we hear a voice\n hangoverCounter = 0;\n } else if (isActive) {\n // Increment silence tracker\n hangoverCounter++;\n\n // If we've reached the limit of allowed silent frames\n if (hangoverCounter >= VAD_HANGOVER_FRAMES) {\n isActive = false;\n }\n }\n\n // Add sample if we are in an active speech window\n if (isActive) {\n buffer = [...buffer, sample];\n }\n\n return { buffer, hangoverCounter, isActive };\n },\n { buffer: [], hangoverCounter: -1, isActive: false },\n ),\n\n // Only share the state when it is actively collecting\n share(),\n );\n }\n}\n","import { inject, Injectable, OnDestroy } from '@angular/core';\nimport { throttleTime } from 'rxjs';\nimport { SubSink } from 'subsink';\nimport { OrbComponentService } from '../../../components/orb-component/orb-component-service';\nimport { ConfigService } from '../../config/config-service';\nimport { EventService } from '../../event/event-service';\nimport { PlatformService } from '../../platform/platform-service';\nimport { AudioService } from '../audio-service';\nimport { MicrophoneService } from '../microphone-service/microphone-service';\n\n@Injectable()\nexport class SpeakerService implements OnDestroy {\n /**\n * Dependencies\n */\n private readonly _config = inject(ConfigService);\n private readonly _platform = inject(PlatformService);\n private readonly _event = inject(EventService);\n private readonly _mic = inject(MicrophoneService);\n private readonly _orb = inject(OrbComponentService);\n private readonly _audio = inject(AudioService);\n\n private readonly _subs = new SubSink();\n\n private _upSound!: HTMLAudioElement;\n private _downSound!: HTMLAudioElement;\n private _pingSound!: HTMLAudioElement;\n\n private _nextPlayTime = 0;\n private _sources: AudioBufferSourceNode[] = [];\n\n /**\n * List of available microphones\n */\n private _speakers: MediaDeviceInfo[] = [];\n\n constructor() {\n if (this._config.audio.sound?.enable === false) return;\n\n // Audio is only available in browser context\n if (this._platform.isBrowser) {\n // up\n this._upSound = new Audio(\n this._config.audio.sound?.up ?? `${this._config.basePath}/sounds/up.mp3`,\n );\n\n this._upSound.volume =\n this._config.audio.sound?.upVolume ?? this._config.audio.sound?.masterVolume ?? 0.5;\n\n // down\n this._downSound = new Audio(\n this._config.audio.sound?.down ?? `${this._config.basePath}/sounds/down.mp3`,\n );\n\n this._downSound.volume =\n this._config.audio.sound?.downVolume ?? this._config.audio.sound?.masterVolume ?? 0.5;\n\n // ping\n this._pingSound = new Audio(\n this._config.audio.sound?.ping ?? `${this._config.basePath}/sounds/ping.mp3`,\n );\n\n this._pingSound.volume =\n this._config.audio.sound?.pingVolume ?? this._config.audio.sound?.masterVolume ?? 0.1;\n\n // Preload\n this._upSound.preload = this._downSound.preload = this._pingSound.preload = 'auto';\n\n this._loadSubscriptions();\n\n // Get speaker list\n this._speakerList().then((e) => {\n this._speakers = e;\n });\n }\n }\n\n /**\n * List of speakers\n */\n get speakers() {\n return this._speakers;\n }\n\n /**\n * Set output source\n */\n set source(deviceId: string) {\n this._setSource(deviceId);\n }\n\n ngOnDestroy(): void {\n this._subs.unsubscribe();\n }\n\n /**\n * Play audio chunk\n *\n * @param buffer audio buffer\n * @param sampleRate sample rate to play in\n */\n playChunk(buffer: ArrayBuffer, sampleRate: number) {\n // Calculate how many full 32-bit floats fit in this buffer\n const float32Count = Math.floor(buffer.byteLength / 4);\n\n // Convert raw bytes back to 32-bit floats\n const float32Array = new Float32Array(buffer, 0, float32Count);\n\n // Create an empty audio buffer mapping\n const audioBuffer = this._mic.audioContext!.createBuffer(1, float32Array.length, sampleRate);\n audioBuffer.copyToChannel(float32Array, 0);\n\n this.playAudioBuffer(audioBuffer);\n }\n\n /**\n * Play audio buffer\n *\n * @param audioBuffer\n */\n playAudioBuffer(audioBuffer: AudioBuffer) {\n // if recording, clear the queue\n if (this._audio.isRecording) {\n this._clearQueue();\n return;\n }\n\n // Create a source node to play the buffer\n const source = this._mic.audioContext!.createBufferSource();\n source.buffer = audioBuffer;\n\n source.connect(this._mic.analyzer!);\n source.connect(this._mic.audioContext!.destination);\n\n // Schedule the chunk to play exactly when the previous chunk finishes\n const currentTime = this._mic.audioContext!.currentTime;\n if (this._nextPlayTime < currentTime) {\n this._nextPlayTime = currentTime; // Reset if the queue has emptied\n }\n\n source.start(this._nextPlayTime);\n\n this._sources.push(source); // keep instance of source to stop later\n\n this._nextPlayTime += audioBuffer.duration;\n\n source.onended = () => {\n this._sources.shift();\n\n if (!this._sources.length)\n if (!this._config.orb?.mode || this._config.orb?.mode === 'auto')\n this._orb.setState('initialized'); // reset\n };\n\n if (!this._config.orb?.mode || this._config.orb?.mode === 'auto')\n this._orb.setState('speaking'); // speaking\n }\n\n /**\n * Play on sound\n */\n playUp() {\n if (this._config.audio.sound?.enable === false) return;\n\n this._upSound.play();\n }\n\n /**\n * Play off sound\n */\n playDown() {\n if (this._config.audio.sound?.enable === false) return;\n\n this._downSound.play();\n }\n\n /**\n * Play ping\n */\n playPing() {\n if (this._config.audio.sound?.enable === false) return;\n\n this._pingSound.play();\n }\n\n /**\n * Set source\n *\n * @param deviceId\n */\n private async _setSource(deviceId: string) {\n if (typeof this._mic.audioContext!.setSinkId === 'function') {\n await this._mic.audioContext!.setSinkId(deviceId);\n } else\n this._event.exception.next(\n new Error('AudioContext.setSinkId is not supported. Playing on default'),\n );\n }\n\n /**\n * Clear playback queue\n */\n private _clearQueue() {\n this._sources.forEach((s) => s.stop());\n this._sources = [];\n this._nextPlayTime = 0;\n }\n\n /**\n * Load subscriptions\n */\n private _loadSubscriptions() {\n this._subs.sink = this._event.wakeword\n .pipe(throttleTime(this._config.throttleTime))\n .subscribe(() => {\n this.playUp();\n });\n\n // If default, on silence, play down\n this._subs.sink = this._event.silence.subscribe((ev) => {\n if (!ev.interimResponse) this.playDown();\n else this.playPing();\n });\n\n // If recording event\n this._subs.sink = this._event.recording.subscribe(() => {\n this._clearQueue();\n });\n }\n\n /**\n * Speakers\n */\n private async _speakerList() {\n const devices = await navigator.mediaDevices.enumerateDevices();\n return devices.filter((device) => device.kind === 'audiooutput');\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { OrbComponentService } from '../../components/orb-component/orb-component-service';\nimport { AudioService } from '../audio/audio-service';\nimport { MicrophoneService } from '../audio/microphone-service/microphone-service';\nimport { SpeakerService } from '../audio/speaker-service/speaker-service';\nimport { SpeechRecognitionService } from '../audio/speech-recognition/speech-recognition-service';\nimport { VadService } from '../audio/vad-service/vad-service';\nimport { ConfigService } from '../config/config-service';\nimport { EventService } from '../event/event-service';\nimport { ModelService } from '../model/model-service';\nimport { PipelineService } from '../pipeline/pipeline-service';\nimport { PlatformService } from '../platform/platform-service';\n\n@Injectable()\nexport class BridgeService {\n readonly mic = inject(MicrophoneService);\n readonly speaker = inject(SpeakerService);\n readonly speechRecognition = inject(SpeechRecognitionService);\n readonly vad = inject(VadService);\n readonly audio = inject(AudioService);\n readonly config = inject(ConfigService);\n readonly event = inject(EventService);\n readonly model = inject(ModelService);\n readonly pipeline = inject(PipelineService);\n readonly platform = inject(PlatformService);\n readonly orbComponentService = inject(OrbComponentService);\n}\n","import { NgClass } from '@angular/common';\nimport {\n AfterViewInit,\n Component,\n ElementRef,\n HostListener,\n inject,\n NgZone,\n OnDestroy,\n ViewChild,\n} from '@angular/core';\nimport { SubSink } from 'subsink';\nimport * as THREE from 'three';\nimport { AudioService } from '../../services/audio/audio-service';\nimport { MicrophoneService } from '../../services/audio/microphone-service/microphone-service';\nimport { ConfigService } from '../../services/config/config-service';\nimport { EventService } from '../../services/event/event-service';\nimport { PlatformService } from '../../services/platform/platform-service';\nimport { OrbComponentService } from './orb-component-service';\nimport { AgentState } from './orb-component.type';\n\n@Component({\n selector: 'app-orb-component',\n imports: [NgClass],\n template: `\n <div\n #rendererContainer\n role=\"button\"\n tabindex=\"0\"\n class=\"orb-container\"\n [style.width.px]=\"orbSize\"\n [style.height.px]=\"orbSize\"\n (click)=\"toggleRecording()\"\n (keypress)=\"toggleRecording()\"\n [ngClass]=\"{ muted: isMuted }\"\n ></div>\n `,\n styles: [\n `\n .orb-container {\n display: flex;\n justify-content: center;\n align-items: center;\n overflow: hidden;\n cursor: pointer;\n }\n .muted {\n cursor: not-allowed;\n }\n canvas {\n display: block;\n outline: none;\n }\n `,\n ],\n})\nexport class OrbComponent implements AfterViewInit, OnDestroy {\n @ViewChild('rendererContainer', { static: true })\n private _rendererContainer!: ElementRef<HTMLDivElement>;\n\n private readonly _config = inject(ConfigService);\n private readonly _platform = inject(PlatformService);\n private readonly _audio = inject(AudioService);\n private readonly _mic = inject(MicrophoneService);\n private readonly _event = inject(EventService);\n private readonly _ngZone = inject(NgZone);\n private readonly _service = inject(OrbComponentService);\n private readonly _subs = new SubSink();\n\n // Three.js Core\n private _scene!: THREE.Scene;\n private _camera!: THREE.PerspectiveCamera;\n private _renderer!: THREE.WebGLRenderer;\n private _sphere!: THREE.Points;\n private _material!: THREE.ShaderMaterial;\n private _animationFrameId!: number;\n private _timer = new THREE.Timer();\n private _geometry!: THREE.BufferGeometry;\n\n // Audio Processing\n private dataArray!: Uint8Array<ArrayBuffer>;\n private micVolume = 0;\n\n // State Management\n private currentState: AgentState = 'idle';\n private agentProfiles = {\n idle: {\n spike: 0.05,\n noiseScale: 1.0,\n speed: 0.2,\n twist: 0.0,\n pulse: 0.0,\n base: '#001133',\n peak: '#ff4000',\n },\n initialized: {\n spike: 0.05,\n noiseScale: 1.0,\n speed: 0.2,\n twist: 0.0,\n pulse: 0.0,\n base: '#001133',\n peak: '#00aaff',\n },\n listening: {\n spike: 0.2,\n noiseScale: 2.5,\n speed: 1.0,\n twist: 0.0,\n pulse: 0.0,\n base: '#002211',\n peak: '#00ff88',\n },\n thinking: {\n spike: 0.2,\n noiseScale: 1.5,\n speed: 1.5,\n twist: 1.5,\n pulse: 0.0,\n base: '#220033',\n peak: '#ff00ff',\n },\n speaking: {\n spike: 0.1,\n noiseScale: 1.0,\n speed: 0.5,\n twist: 0.0,\n pulse: 0.1,\n base: '#331100',\n peak: '#ff8800',\n },\n };\n\n private targets = { ...this.agentProfiles.idle };\n private targetColorBase = new THREE.Color(this.targets.base);\n private targetColorPeak = new THREE.Color(this.targets.peak);\n\n get orbSize(): number {\n return this._config.orb?.size ?? 400;\n }\n\n get isMuted() {\n return this._mic.isMuted;\n }\n\n ngAfterViewInit(): void {\n if (this._platform.isServer) return;\n\n this.dataArray = new Uint8Array(this._mic.analyzer!.frequencyBinCount);\n this._loadSubscribers();\n\n // MUST run outside Angular to prevent CD loops\n this._ngZone.runOutsideAngular(() => {\n this._initThreeJs();\n this._timer.connect(document);\n this._animate();\n });\n }\n\n ngOnDestroy(): void {\n if (this._platform.isServer) return;\n\n cancelAnimationFrame(this._animationFrameId);\n\n this._subs.unsubscribe();\n\n if (this._renderer) {\n this._renderer.dispose();\n this._renderer.forceContextLoss();\n // Remove canvas from DOM to ensure cleanup\n const domElement = this._renderer.domElement;\n if (domElement && domElement.parentNode) {\n domElement.parentNode.removeChild(domElement);\n }\n }\n\n if (this._geometry) this._geometry.dispose();\n if (this._material) this._material.dispose();\n }\n\n /**\n * Space bar press\n */\n @HostListener('window:keydown', ['$event'])\n handleSpacebarPress(event: KeyboardEvent): void {\n if (event.code !== this._config.hotkey) return;\n\n event.preventDefault();\n this.toggleRecording();\n }\n\n /**\n * Toggle recording\n */\n toggleRecording() {\n if (this.isMuted) return;\n\n this._audio.toggleRecording();\n }\n\n /**\n * Set state of orb\n *\n * @param state orb state\n */\n setState(state: AgentState): void {\n const profile = this.agentProfiles[state];\n\n this.currentState = state;\n this.targets = { ...profile };\n this.targetColorBase.set(profile.base);\n this.targetColorPeak.set(profile.peak);\n }\n\n /**\n * Subscriptions\n */\n private _loadSubscribers(): void {\n this._subs.sink = this._event.speech.subscribe((data) => {\n this.micVolume = this.isMuted ? 0 : data.dbNormalized;\n });\n\n // only update orb state if mode is auto\n if (!this._config.orb?.mode || this._config.orb?.mode === 'auto') {\n // after wakeword, set to listening\n this._subs.sink = this._event.wakeword.subscribe(() => {\n this.setState('listening');\n });\n\n // after silence, set thinking or idle\n this._subs.sink = this._event.silence.subscribe((ev) => {\n if (ev.interimResponse) this.setState('thinking');\n else this.setState('idle');\n });\n\n // if recording started\n this._subs.sink = this._event.recording.subscribe(() => {\n this.setState('listening');\n });\n\n // state change using service\n this._subs.sink = this._service.state.subscribe((state) => {\n this.setState(state);\n });\n }\n }\n\n /**\n * Speech volume for animation\n */\n private _getTTSVolume(): number {\n this._mic.analyzer!.getByteFrequencyData(this.dataArray);\n const sum = this.dataArray.reduce((a, b) => a + b, 0);\n return sum / this.dataArray.length / 255.0;\n }\n\n /**\n * Init\n */\n private _initThreeJs(): void {\n const size = this.orbSize;\n\n this._scene = new THREE.Scene();\n this._camera = new THREE.PerspectiveCamera(50, 1, 0.1, 1000);\n this._camera.position.z = 6;\n\n this._renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });\n this._renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));\n this._renderer.setSize(size, size);\n\n this._rendererContainer.nativeElement.appendChild(this._renderer.domElement);\n\n const particlesCount = this._config.orb?.particlesCount ?? 30000;\n this._geometry = new THREE.BufferGeometry();\n const posArray = new Float32Array(particlesCount * 3);\n const randomArray = new Float32Array(particlesCount);\n const radius = this._config.orb?.radius ?? 1.8;\n\n for (let i = 0; i < particlesCount; i++) {\n const phi = Math.acos(-1 + (2 * i) / particlesCount);\n const theta = Math.sqrt(particlesCount * Math.PI) * phi;\n\n posArray[i * 3] = radius * Math.cos(theta) * Math.sin(phi);\n posArray[i * 3 + 1] = radius * Math.sin(theta) * Math.sin(phi);\n posArray[i * 3 + 2] = radius * Math.cos(phi);\n randomArray[i] = Math.random();\n }\n\n this._geometry.setAttribute('position', new THREE.BufferAttribute(posArray, 3));\n this._geometry.setAttribute('aRandom', new THREE.BufferAttribute(randomArray, 1));\n\n this._material = new THREE.ShaderMaterial({\n uniforms: {\n uTime: { value: 0 },\n uSpike: { value: 0.05 },\n uNoiseScale: { value: 1.0 },\n uSpeed: { value: 0.2 },\n uTwist: { value: 0.0 },\n uPulse: { value: 0.0 },\n uColorBase: { value: new THREE.Color('#002244') },\n uColorPeak: { value: new THREE.Color('#00ffff') },\n },\n vertexShader: this._getVertexShader(),\n fragmentShader: this._getFragmentShader(),\n transparent: true,\n blending: THREE.AdditiveBlending,\n depthWrite: false,\n });\n\n this._sphere = new THREE.Points(this._geometry, this._material);\n this._scene.add(this._sphere);\n }\n\n /**\n * Animator\n */\n private _animate = (): void => {\n this._animationFrameId = requestAnimationFrame(this._animate);\n this._timer.update();\n const elapsedTime = this._timer.getElapsed();\n\n this._material.uniforms['uTime'].value = elapsedTime;\n\n let dynamicSpike = this.targets.spike;\n let dynamicPulse = this.targets.pulse;\n\n if (this.currentState === 'listening') {\n dynamicSpike += this.micVolume * 1.0;\n } else if (this.currentState === 'speaking') {\n const ttsVolume = this._getTTSVolume();\n dynamicPulse += ttsVolume * 0.5;\n }\n\n const lerpFactor = 0.08;\n this._material.uniforms['uSpike'].value +=\n (dynamicSpike - this._material.uniforms['uSpike'].value) * lerpFactor;\n this._material.uniforms['uPulse'].value +=\n (dynamicPulse - this._material.uniforms['uPulse'].value) * lerpFactor;\n\n this._material.uniforms['uNoiseScale'].value +=\n (this.targets.noiseScale - this._material.uniforms['uNoiseScale'].value) * lerpFactor;\n this._material.uniforms['uSpeed'].value +=\n (this.targets.speed - this._material.uniforms['uSpeed'].value) * lerpFactor;\n this._material.uniforms['uTwist'].value +=\n (this.targets.twist - this._material.uniforms['uTwist'].value) * lerpFactor;\n\n this._material.uniforms['uColorBase'].value.lerp(this.targetColorBase, lerpFactor);\n this._material.uniforms['uColorPeak'].value.lerp(this.targetColorPeak, lerpFactor);\n\n this._sphere.rotation.y = elapsedTime * 0.1;\n this._sphere.rotation.z = elapsedTime * 0.01;\n\n this._renderer.render(this._scene, this._camera);\n };\n\n /**\n * Vertex shader\n */\n private _getVertexShader(): string {\n return `\n uniform float uTime;\n uniform float uSpike; \n uniform float uNoiseScale; \n uniform float uSpeed; \n uniform float uTwist; \n uniform float uPulse; \n \n varying vec3 vColor;\n varying float vDisplacement;\n\n attribute float aRandom;\n\n // Simplex 3D Noise\n vec4 permute(vec4 x){return mod(((x*34.0)+1.0)*x, 289.0);}\n vec4 taylorInvSqrt(vec4 r){return 1.79284291400159 - 0.85373472095314 * r;}\n float snoise(vec3 v){ \n const vec2 C = vec2(1.0/6.0, 1.0/3.0);\n const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);\n vec3 i = floor(v + dot(v, C.yyy) );\n vec3 x0 = v - i + dot(i, C.xxx) ;\n vec3 g = step(x0.yzx, x0.xyz);\n vec3 l = 1.0 - g;\n vec3 i1 = min( g.xyz, l.zxy );\n vec3 i2 = max( g.xyz, l.zxy );\n vec3 x1 = x0 - i1 + 1.0 * C.xxx;\n vec3 x2 = x0 - i2 + 2.0 * C.xxx;\n vec3 x3 = x0 - 1.0 + 3.0 * C.xxx;\n i = mod(i, 289.0 ); \n vec4 p = permute( permute( permute( i.z + vec4(0.0, i1.z, i2.z, 1.0 )) + i.y + vec4(0.0, i1.y, i2.y, 1.0 )) + i.x + vec4(0.0, i1.x, i2.x, 1.0 ));\n float n_ = 1.0/7.0;\n vec3 ns = n_ * D.wyz - D.xzx;\n vec4 j = p - 49.0 * floor(p * ns.z *ns.z);\n vec4 x_ = floor(j * ns.z);\n vec4 y_ = floor(j - 7.0 * x_ );\n vec4 x = x_ *ns.x + ns.yyyy;\n vec4 y = y_ *ns.x + ns.yyyy;\n vec4 h = 1.0 - abs(x) - abs(y);\n vec4 b0 = vec4( x.xy, y.xy );\n vec4 b1 = vec4( x.zw, y.zw );\n vec4 s0 = floor(b0)*2.0 + 1.0;\n vec4 s1 = floor(b1)*2.0 + 1.0;\n vec4 sh = -step(h, vec4(0.0));\n vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ;\n vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ;\n vec3 p0 = vec3(a0.xy,h.x);\n vec3 p1 = vec3(a0.zw,h.y);\n vec3 p2 = vec3(a1.xy,h.z);\n vec3 p3 = vec3(a1.zw,h.w);\n vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));\n p0 *= norm.x; p1 *= norm.y; p2 *= norm.z; p3 *= norm.w;\n vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0);\n m = m * m;\n return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1), dot(p2,x2), dot(p3,x3) ) );\n }\n\n void main() {\n vec3 pos = position;\n float time = uTime * uSpeed;\n \n float angle = pos.y * uTwist;\n mat2 rot = mat2(cos(angle), -sin(angle), sin(angle), cos(angle));\n pos.xz *= rot;\n\n vec3 normal = normalize(pos);\n float noise = snoise(pos * uNoiseScale + time);\n \n float totalDisplacement = (noise * uSpike) + uPulse;\n pos += normal * totalDisplacement;\n \n vDisplacement = totalDisplacement;\n\n vec4 mvPosition = modelViewMatrix * vec4(pos, 1.0);\n \n gl_PointSize = (15.0 + totalDisplacement * 20.0) * (1.0 / -mvPosition.z);\n gl_PointSize *= (1.0 + sin(uTime * 5.0 + aRandom * 50.0) * 0.2);\n\n gl_Position = projectionMatrix * mvPosition;\n }\n `;\n }\n\n /**\n * Fragment shader\n */\n private _getFragmentShader(): string {\n return `\n varying float vDisplacement;\n uniform vec3 uColorBase; \n uniform vec3 uColorPeak;\n\n void main() {\n float dist = distance(gl_PointCoord, vec2(0.5));\n if (dist > 0.5) discard;\n float alpha = 1.0 - pow(dist * 2.0, 2.0);\n \n float mixValue = smoothstep(-0.2, 0.5, vDisplacement);\n vec3 finalColor = mix(uColorBase, uColorPeak, mixValue);\n\n gl_FragColor = vec4(finalColor, alpha * 0.9);\n }\n `;\n }\n}\n","import { Component, EventEmitter, inject, OnDestroy, OnInit, Output } from '@angular/core';\nimport { throttleTime } from 'rxjs';\nimport { SubSink } from 'subsink';\nimport { OrbComponent } from './components/orb-component/orb-component';\nimport { AudioService } from './services/audio/audio-service';\nimport { BridgeService } from './services/bridge/bridge-service';\nimport { ConfigService } from './services/config/config-service';\nimport { EventService } from './services/event/event-service';\nimport {\n RecordingEvent,\n SilenceEvent,\n SpeechEvent,\n WakeWordEvent,\n} from './services/event/event-service.type';\nimport { PlatformService } from './services/platform/platform-service';\n\n@Component({\n selector: 'wakeywakey',\n imports: [OrbComponent],\n template: '<app-orb-component (orbClick)=\"fireWakeWord()\" />',\n providers: [],\n})\nexport class WakeyWakeyComponent implements OnInit, OnDestroy {\n /**\n * Fires when library loaded. Emits bridge service event\n */\n @Output() ready = new EventEmitter<BridgeService>();\n\n /**\n * Fires when there is an error\n */\n @Output() exception = new EventEmitter<Error>();\n\n /**\n * Fires when speech is detected\n */\n @Output() speech = new EventEmitter<SpeechEvent>();\n\n /**\n * Fires when wake word is detected\n */\n @Output() wakeword = new EventEmitter<WakeWordEvent>();\n\n /**\n * Fires when recording starts (after wake word detection)\n */\n @Output() recording = new EventEmitter<RecordingEvent>();\n\n /**\n * Fires silence is detected\n */\n @Output() silence = new EventEmitter<SilenceEvent>();\n\n /**\n * Dependencies\n */\n private readonly _config = inject(ConfigService);\n\n /**\n * Dependencies\n */\n private readonly _platform = inject(PlatformService);\n private readonly _event = inject(EventService);\n private readonly _audio = inject(AudioService);\n private readonly _bridge = inject(BridgeService);\n\n /**\n * Subscriptions\n */\n private readonly _subs = new SubSink();\n\n ngOnInit(): void {\n // Execute pipeline\n this._execute();\n }\n\n /**\n * Fire face wakeword event\n */\n fireWakeWord() {\n this._event.wakeword.next({\n inferenceScore: 1,\n chunk: [],\n vadScore: 1,\n hasVoiceActivity: false,\n sample: new Float32Array(),\n rms: 0,\n db: 0,\n dbNormalized: 0,\n });\n }\n\n ngOnDestroy(): void {\n this._subs.unsubscribe();\n }\n\n /**\n * Execute\n */\n private async _execute() {\n // Check if browser\n if (this._platform.isServer) return;\n\n // Listen events\n this._listenEvents();\n\n // Init audio\n await this._audio.init();\n }\n\n /**\n * Listen events\n */\n private _listenEvents() {\n // Ready event\n this._subs.sink = this._event.ready.subscribe(() => {\n this.ready.emit(this._bridge);\n });\n\n // Exception event\n this._subs.sink = this._event.exception.subscribe((e) => {\n this.exception.emit(e);\n });\n\n // Speech event\n this._subs.sink = this._event.speech.subscribe((e) => {\n this.speech.emit(e);\n });\n\n // Wake word event\n this._subs.sink = this._event.wakeword\n .pipe(throttleTime(this._config.throttleTime))\n .subscribe((e) => {\n this.wakeword.emit(e);\n });\n\n // Recording event\n this._subs.sink = this._event.recording.subscribe((e) => {\n this.recording.emit(e);\n });\n\n // Silence event\n this._subs.sink = this._event.silence.subscribe((e) => {\n this.silence.emit(e);\n });\n }\n}\n","import { inject, provideAppInitializer } from '@angular/core';\nimport { env, InferenceSession } from 'onnxruntime-web';\nimport { OrbComponentService } from './lib/components/orb-component/orb-component-service';\nimport { AudioService } from './lib/services/audio/audio-service';\nimport { MicrophoneService } from './lib/services/audio/microphone-service/microphone-service';\nimport { SpeakerService } from './lib/services/audio/speaker-service/speaker-service';\nimport { SpeechRecognitionService } from './lib/services/audio/speech-recognition/speech-recognition-service';\nimport { VadService } from './lib/services/audio/vad-service/vad-service';\nimport { BridgeService } from './lib/services/bridge/bridge-service';\nimport { ConfigService } from './lib/services/config/config-service';\nimport { CONFIG, Config } from './lib/services/config/config-service.type';\nimport { EventService } from './lib/services/event/event-service';\nimport { ModelService } from './lib/services/model/model-service';\nimport { PipelineService } from './lib/services/pipeline/pipeline-service';\nimport { PlatformService } from './lib/services/platform/platform-service';\n\n/**\n * Provide wakey wakey configuration\n *\n * @param config Wakey Wakey configuration\n * @returns\n */\nexport function provideWakeyWakey(config: Config) {\n return [\n {\n provide: CONFIG,\n useValue: config,\n },\n ConfigService,\n MicrophoneService,\n SpeakerService,\n VadService,\n AudioService,\n PlatformService,\n EventService,\n PipelineService,\n SpeechRecognitionService,\n ModelService,\n BridgeService,\n OrbComponentService,\n provideAppInitializer(async () => {\n const _config = inject(ConfigService);\n const _model = inject(ModelService);\n const _platform = inject(PlatformService);\n const _mic = inject(MicrophoneService);\n\n if (_platform.isServer) return;\n\n // Set wasm path\n env.wasm.wasmPaths = _config.onnx.runtimePath ?? `${_config.basePath}/wasm/`;\n\n const modelPath: string[] = [\n _config.onnx.model.melspectrogram ?? `${_config.basePath}/models/melspectrogram.onnx`,\n _config.onnx.model.embedding_model ?? `${_config.basePath}/models/embedding_model.onnx`,\n _config.onnx.model.silero_vad ?? `${_config.basePath}/models/silero_vad_v4.onnx`,\n _config.onnx.model.wakeword,\n ];\n\n // Create sessions\n const sessions = await Promise.all([\n ...Object.values(modelPath).map((path) =>\n InferenceSession.create(path, { executionProviders: ['wasm'] }),\n ),\n _mic.init(),\n ]);\n\n if (!sessions[4]) throw new Error('Failed to initialize mic!');\n\n // set sessions\n _model.session = {\n melspectrogram: sessions[0] as InferenceSession,\n embedding_model: sessions[1] as InferenceSession,\n silero_vad: sessions[2] as InferenceSession,\n wakeword: sessions[3] as InferenceSession,\n };\n }),\n ];\n}\n","/// <reference path=\"./index.d.ts\" />\n\n/*\n * Public API Surface of wakeywakey\n */\nexport * from './lib/services';\nexport * from './lib/wakeywakey-component';\nexport * from './provider';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"prabhjeet.me-wakeywakey.mjs","sources":["../../../projects/wakeywakey/src/lib/services/audio/microphone-service/microphone-service.constant.ts","../../../projects/wakeywakey/src/lib/services/audio/audio-service.util.ts","../../../projects/wakeywakey/src/lib/components/orb-component/orb-component-service.ts","../../../projects/wakeywakey/src/lib/wakeywakey-component.const.ts","../../../projects/wakeywakey/src/lib/services/config/config-service.type.ts","../../../projects/wakeywakey/src/lib/services/config/config-service.ts","../../../projects/wakeywakey/src/lib/services/event/event-service.ts","../../../projects/wakeywakey/src/lib/services/model/model-service.const.ts","../../../projects/wakeywakey/src/lib/services/model/model-service.type.ts","../../../projects/wakeywakey/src/lib/services/model/model-service.ts","../../../projects/wakeywakey/src/lib/services/pipeline/pipeline-service.ts","../../../projects/wakeywakey/src/lib/services/audio/audio-service.const.ts","../../../projects/wakeywakey/src/lib/services/audio/microphone-service/microphone-service.ts","../../../projects/wakeywakey/src/lib/services/platform/platform-service.ts","../../../projects/wakeywakey/src/lib/services/audio/speech-recognition/speech-recognition-service.ts","../../../projects/wakeywakey/src/lib/services/audio/vad-service/vad-service.ts","../../../projects/wakeywakey/src/lib/services/audio/vad-service/vad-service.const.ts","../../../projects/wakeywakey/src/lib/services/audio/audio-service.ts","../../../projects/wakeywakey/src/lib/services/audio/speaker-service/speaker-service.ts","../../../projects/wakeywakey/src/lib/services/bridge/bridge-service.ts","../../../projects/wakeywakey/src/lib/components/orb-component/orb-component.ts","../../../projects/wakeywakey/src/lib/wakeywakey-component.ts","../../../projects/wakeywakey/src/provider.ts","../../../projects/wakeywakey/src/public-api.ts","../../../projects/wakeywakey/src/prabhjeet.me-wakeywakey.ts"],"sourcesContent":["/**\n * Audio sample rate\n */\nexport const SAMPLE_RATE = 16000;\n\n/**\n * Audio worklet name\n */\nexport const MICROPHONE_PROCESSOR_NAME = 'microphone-buffer-processor';\n\n/**\n * Audio worklet processor\n */\nexport const MICROPHONE_PROCESSOR = `\n class MicrophoneBufferProcessor extends AudioWorkletProcessor {\n // collect 1280 samples before sending them to the main thread\n // Web Audio processes 128 frames per call\n // batching 10 small chunks into 1 bigger chunk\n frameBlockSize = 128 * 10; // total samples per emitted chunk\n\n // for storing small chunks\n accumulatedSamples = new Float32Array(this.frameBlockSize);\n\n // cursor\n writeIndex = 0;\n\n constructor() {\n super();\n }\n\n dbNormalized(db) {\n const minDb = -60;\n const maxDb = 0;\n\n const clamped = Math.max(minDb, Math.min(db, maxDb));\n return (clamped - minDb) / (maxDb - minDb);\n }\n\n // runs every 128 frames. ~ every 2.67 ms (at 48kHz), ~ 8ms (at 16KHz)\n process(inputList) {\n const firstInput = inputList[0];\n\n // no input connected\n if (!firstInput || firstInput.length === 0) {\n return true;\n }\n\n // raw waveform values\n const firstChannelSamples = firstInput[0]; // Float32Array(128)\n\n let sum = 0;\n\n // 0 -> 128\n for (let i = 0; i < firstChannelSamples.length; i++) {\n // dump each sample in accumulated sample array\n this.accumulatedSamples[this.writeIndex++] = firstChannelSamples[i];\n sum += firstChannelSamples[i] * firstChannelSamples[i];\n }\n\n // once buffer is full, break\n if (this.writeIndex === this.frameBlockSize) {\n const rms = Math.sqrt(sum / firstChannelSamples.length);\n const db = 20 * Math.log10(rms ?? 0.00001);\n this.writeIndex = 0;\n\n // send to main thread\n this.port.postMessage({\n sample: this.accumulatedSamples.slice(),\n rms,\n db,\n dbNormalized: this.dbNormalized(db),\n });\n }\n\n return true;\n }\n}\n\nregisterProcessor(\"${MICROPHONE_PROCESSOR_NAME}\", MicrophoneBufferProcessor);\n `;\n","import { SAMPLE_RATE } from './microphone-service/microphone-service.constant';\n\n/**\n * Audio utility\n */\nexport class AudioUtil {\n /**\n * Create wav blob url from audio chunk\n *\n * @param chunks Audio chunk\n * @param sampleRate Sample rate\n * @returns\n */\n static createWavBlob(chunks: Float32Array[], sampleRate = SAMPLE_RATE) {\n const totalLength = chunks.reduce((len, chunk) => len + chunk.length, 0);\n if (!totalLength) return null;\n\n // Merge chunks\n const combined = new Float32Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n\n // Convert to 16-bit PCM\n const pcmData = new Int16Array(totalLength);\n for (let i = 0; i < totalLength; i++) {\n const s = Math.max(-1, Math.min(1, combined[i]));\n pcmData[i] = s < 0 ? s * 0x8000 : s * 0x7fff;\n }\n\n const wavHeader = new ArrayBuffer(44);\n const view = new DataView(wavHeader);\n\n const channels = 1;\n const bitsPerSample = 16;\n const byteRate = sampleRate * channels * (bitsPerSample / 8);\n const blockAlign = channels * (bitsPerSample / 8);\n\n const writeString = (offset: number, str: string) => {\n for (let i = 0; i < str.length; i++) {\n view.setUint8(offset + i, str.charCodeAt(i));\n }\n };\n\n writeString(0, 'RIFF');\n view.setUint32(4, 36 + pcmData.byteLength, true);\n writeString(8, 'WAVE');\n writeString(12, 'fmt ');\n view.setUint32(16, 16, true);\n view.setUint16(20, 1, true); // PCM\n view.setUint16(22, channels, true);\n view.setUint32(24, sampleRate, true);\n view.setUint32(28, byteRate, true);\n view.setUint16(32, blockAlign, true);\n view.setUint16(34, bitsPerSample, true);\n writeString(36, 'data');\n view.setUint32(40, pcmData.byteLength, true);\n\n const wavBlob = new Blob([wavHeader, pcmData], { type: 'audio/wav' });\n return URL.createObjectURL(wavBlob);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { AgentState } from './orb-component.type';\n\n@Injectable()\nexport class OrbComponentService {\n readonly state = new Subject<AgentState>();\n\n /**\n * Set state of orb\n */\n setState(state: AgentState) {\n this.state.next(state);\n }\n}\n","export const DEFAULT_THROTTLE_TIME = 1000;\n","import { InjectionToken } from '@angular/core';\nimport { OrbConfig } from '../../components/orb-component/orb-component.type';\nimport { AudioConfig } from '../audio/audio-service.type';\nimport { OnnxConfig } from '../model/model-service.type';\n\n/**\n * Wakey wakey configuration\n */\nexport interface Config {\n /**\n * Audio config\n */\n audio: AudioConfig;\n\n /**\n * Onnx config\n */\n onnx: OnnxConfig;\n\n /**\n * Orb config\n */\n orb?: OrbConfig;\n\n /**\n * In sliding window, there is a possibility of detecting wakeword mode than once.\n * This allows a cool down time before processing subsequent detections\n *\n * Default: 1000 (1 seconds)\n */\n throttleTime?: number;\n\n /**\n * DEFAULT | PTT: [WAKEWORD] -> Start Recording -> Silence (Spoken chunk & transcript) -> Done -> [WAKEWORD] .....\n * CHAT: [WAKEWORD] -> Start Recording -> Silence -> [Speaking] -> Start Recording -> Silence .....\n */\n mode?: 'DEFAULT' | 'VOICE_CHAT' | 'PTT';\n\n /**\n * Base asset path. This path will be used to access required resources\n *\n * Default: /wakeywakey\n */\n basePath?: string;\n\n /**\n * Key to use to activate listening (instead of wakeword)\n *\n * 'code' property of KeyboardEvent\n */\n hotkey?: string;\n}\n\n/**\n * Wakey wakey config token\n */\nexport const CONFIG = new InjectionToken<Config>('WAKEYWAKEY_CONFIG');\n","import { inject, Injectable } from '@angular/core';\nimport { DEFAULT_THROTTLE_TIME } from '../../wakeywakey-component.const';\nimport { Config, CONFIG } from './config-service.type';\n\n@Injectable()\nexport class ConfigService {\n private readonly _config = inject<Config>(CONFIG);\n\n /**\n * Audio config\n */\n get audio() {\n return this._config.audio;\n }\n\n /**\n * Onnx config\n */\n get onnx() {\n return this._config.onnx;\n }\n\n /**\n * Orb config\n */\n get orb() {\n return this._config.orb;\n }\n\n /**\n * Throttle time\n */\n get throttleTime() {\n return this._config.throttleTime ?? DEFAULT_THROTTLE_TIME;\n }\n\n /**\n * Mode\n */\n get mode() {\n return this._config.mode;\n }\n\n /**\n * Base path of assets\n */\n get basePath() {\n return this._config.basePath ?? '/wakeywakey';\n }\n\n /**\n * Hotkey\n */\n get hotkey() {\n return this._config.hotkey ?? 'Space';\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { RecordingEvent, SilenceEvent, SpeechEvent, WakeWordEvent } from './event-service.type';\n\n@Injectable()\nexport class EventService {\n /**\n * Fires when library loaded\n */\n readonly ready = new Subject<void>();\n\n /**\n * Fires when there is a message to log\n */\n readonly log = new Subject<string>();\n\n /**\n * Fires when there is an error\n */\n readonly exception = new Subject<Error>();\n\n /**\n * Fires when speech is detected\n */\n readonly speech = new Subject<SpeechEvent>();\n\n /**\n * Fires when wake word is detected\n */\n readonly wakeword = new Subject<WakeWordEvent>();\n\n /**\n * Fires when recording starts (after wake word detection)\n */\n readonly recording = new Subject<RecordingEvent>();\n\n /**\n * Fires silence is detected\n */\n readonly silence = new Subject<SilenceEvent>();\n}\n","export const DEFAULT_INFERENCE_SCORE = 0.5;\n","export const VAD_HANGOVER_FRAMES = 12;\n\nexport interface OnnxConfig {\n model: {\n /**\n * Mel Spectrogram model (.onnx)\n *\n * Default: [basePath]/models/melspectrogram.onnx\n */\n melspectrogram?: string;\n\n /**\n * Embedding model (.onnx)\n *\n * Default: [basePath]/models/embedding_model.onnx\n */\n embedding_model?: string;\n\n /**\n * Silero VAD (.onnx)\n *\n * Default: [basePath]/models/silero_vad_v4.onnx\n */\n silero_vad?: string;\n\n /**\n * Wake word model (.onnx)\n */\n wakeword: string;\n };\n\n /**\n * String representation of wakeword\n *\n * Ex 1: ['hey', 'jarvis']\n * Ex 2: ['alexa']\n */\n wakeword?: string[];\n\n /**\n * Path that contains onnx wasm runtime files\n *\n * Default: [basePath]/wasm\n */\n runtimePath?: string;\n\n /**\n * Wake word inference threshold\n *\n * Default: 0.5\n */\n wakewordInferenceThreshold?: number;\n}\n\nexport type InferenceModels = keyof OnnxConfig['model'];\n\nexport interface VadState {\n buffer: Float32Array[];\n hangoverCounter: number;\n isActive: boolean;\n emitFinal?: Float32Array[]; // Used to pass the completed chunk forward\n}\n","import { Injectable } from '@angular/core';\nimport { InferenceSession } from 'onnxruntime-web';\nimport { InferenceModels } from './model-service.type';\n\n@Injectable()\nexport class ModelService {\n /**\n * Inference session\n */\n private _inferenceSession: Record<InferenceModels, InferenceSession | undefined> = {\n melspectrogram: undefined,\n embedding_model: undefined,\n silero_vad: undefined,\n wakeword: undefined,\n };\n\n /**\n * Get melspectrogram inference session\n */\n get melSpectrogram() {\n return this._inferenceSession['melspectrogram']!;\n }\n\n /**\n * Get embedding inference session\n */\n get embedding() {\n return this._inferenceSession['embedding_model']!;\n }\n\n /**\n * Get Silero VAD inference session\n */\n get sileroVAD() {\n return this._inferenceSession['silero_vad']!;\n }\n\n /**\n * Get wakeword inference session\n */\n get wakeword() {\n return this._inferenceSession['wakeword']!;\n }\n\n /**\n * Set session instance\n */\n set session(sessions: Record<InferenceModels, InferenceSession | undefined>) {\n this._inferenceSession = sessions;\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { Tensor } from 'onnxruntime-web';\nimport { SpeechEvent } from '../event/event-service.type';\nimport { ModelService } from '../model/model-service';\n\n@Injectable()\nexport class PipelineService {\n /**\n * Dependencies\n */\n private readonly _model = inject(ModelService);\n\n // Configuration Constants\n private readonly MEL_WINDOW_SIZE = 76; // Number of mel frames needed for one embedding\n private readonly MEL_HOP_SIZE = 8; // How many frames to skip (the slide) after inference\n private readonly EMBEDDING_COUNT = 16; // Number of embeddings kept in memory (temporal context)\n private readonly FEATURE_DIM = 96; // Size of each embedding vector\n private readonly MEL_BINS = 32; // Number of frequency bins per mel frame\n\n /**\n * Historical buffer of embeddings representing the last ~1-2 seconds of audio context.\n * Initialized with empty (zero) vectors.\n */\n private readonly _embeddingQueue = Array.from({ length: this.EMBEDDING_COUNT }, () =>\n new Float32Array(this.FEATURE_DIM).fill(0),\n );\n\n /**\n * Buffer of calculated Mel Spectrogram frames waiting to be processed.\n */\n private readonly _melFrameQueue: Float32Array[] = [];\n\n /**\n * Main entry point: Processes a new chunk of audio and returns a detection score.\n */\n async run(speech: SpeechEvent): Promise<number> {\n // 1. Convert raw PCM audio into Mel Spectrogram frames and add to queue\n await this._generateMelSpectrogram(speech.sample);\n\n let latestScore = 0;\n\n // 2. Process the queue using a sliding window approach\n // While we have enough frames to form a full input window (76 frames)...\n while (this._melFrameQueue.length >= this.MEL_WINDOW_SIZE) {\n // Extract a single feature vector (embedding) from the current window\n const combinedEmbeddings = await this._processWindowToEmbeddings();\n\n // Classify the sequence of embeddings to see if the wake-word is present\n latestScore = await this._getWakeWordScore(combinedEmbeddings);\n\n // Slide the window: Remove the oldest 8 frames to make room for new audio\n this._melFrameQueue.splice(0, this.MEL_HOP_SIZE);\n }\n\n return latestScore;\n }\n\n /**\n * STAGE 1: Converts raw audio samples into Mel Frequency bins.\n */\n private async _generateMelSpectrogram(samples: Float32Array) {\n const session = this._model.melSpectrogram;\n\n // Wrap raw audio in an ONNX Tensor [Batch: 1, Samples: N]\n const inputTensor = new Tensor('float32', samples, [1, samples.length]);\n\n // Run the Mel-Spectrogram model\n const output = await session.run({ [session.inputNames[0]]: inputTensor });\n const rawMelData = output[session.outputNames[0]].data as Float32Array;\n\n /**\n * Post-processing & Normalization:\n * The model output is scaled to fit the expected input range of the embedding model.\n * Logic: (value / 10) + 2.0\n */\n const normalizedMel = rawMelData.map((val) => val / 10.0 + 2.0);\n\n // Slice the flat output array into individual frames of 32 bins and queue them\n // Each inference usually produces 5 frames for the given 1280 audio samples\n for (let i = 0; i < 5; i++) {\n const start = i * this.MEL_BINS;\n const end = start + this.MEL_BINS;\n this._melFrameQueue.push(normalizedMel.subarray(start, end));\n }\n }\n\n /**\n * STAGE 2: Extracts features (embeddings) from a window of Mel frames.\n */\n private async _processWindowToEmbeddings(): Promise<Float32Array> {\n const session = this._model.embedding!;\n\n // Take the first 76 frames from our queue\n const windowFrames = this._melFrameQueue.slice(0, this.MEL_WINDOW_SIZE);\n\n // Flatten the frames into a single continuous array for the Tensor\n const flattenedInput = new Float32Array(this.MEL_WINDOW_SIZE * this.MEL_BINS);\n windowFrames.forEach((frame, i) => {\n flattenedInput.set(frame, i * this.MEL_BINS);\n });\n\n // Run the Embedding model [1, 76, 32, 1]\n const inputTensor = new Tensor('float32', flattenedInput, [1, 76, 32, 1]);\n const output = await session.run({ [session.inputNames[0]]: inputTensor });\n const newEmbedding = output[session.outputNames[0]].data as Float32Array;\n\n // Update the rolling embedding queue (First-In, First-Out)\n this._embeddingQueue.shift();\n this._embeddingQueue.push(new Float32Array(newEmbedding));\n\n // Flatten the last 16 embeddings into one large vector for the final classifier\n const combinedBuffer = new Float32Array(this.EMBEDDING_COUNT * this.FEATURE_DIM);\n this._embeddingQueue.forEach((emb, i) => {\n combinedBuffer.set(emb, i * this.FEATURE_DIM);\n });\n\n return combinedBuffer;\n }\n\n /**\n * STAGE 3: Final classification score based on temporal embedding sequence.\n */\n private async _getWakeWordScore(embeddings: Float32Array): Promise<number> {\n const session = this._model.wakeword;\n\n // Shape: [Batch: 1, Sequence: 16, Features: 96]\n const inputTensor = new Tensor('float32', embeddings, [\n 1,\n this.EMBEDDING_COUNT,\n this.FEATURE_DIM,\n ]);\n\n const results = await session.run({ [session.inputNames[0]]: inputTensor });\n\n // Extract the scalar probability score from the output tensor\n return results[session.outputNames[0]].data[0] as number;\n }\n}\n","export const DEFAULT_SILENCE_DURATION = 1000;\nexport const DEFAULT_SPEECH_THRESHOLD_TIME = 300;\n","import { inject, Injectable, OnDestroy } from '@angular/core';\nimport { loadRnnoise, RnnoiseWorkletNode } from '@sapphi-red/web-noise-suppressor';\nimport { Subject } from 'rxjs';\nimport { ConfigService } from '../../config/config-service';\nimport { EventService } from '../../event/event-service';\nimport {\n MICROPHONE_PROCESSOR,\n MICROPHONE_PROCESSOR_NAME,\n SAMPLE_RATE,\n} from './microphone-service.constant';\nimport { MicrophoneProcessorData } from './microphone-service.type';\n\n@Injectable()\nexport class MicrophoneService implements OnDestroy {\n /**\n * Dependencies\n */\n private readonly _event = inject(EventService);\n private readonly _config = inject(ConfigService);\n\n /**\n * Audio data subject\n */\n private readonly _data = new Subject<MicrophoneProcessorData>();\n\n /**\n * List of available microphones\n */\n private _microphones: MediaDeviceInfo[] = [];\n\n /**\n * Media steam\n */\n private _stream!: MediaStream;\n\n /**\n * Media steam source\n */\n private _source?: MediaStreamAudioSourceNode;\n\n /**\n * Audio context\n */\n private _audioContext?: AudioContext;\n\n /**\n * Is muted\n */\n private _isMuted = false;\n\n /**\n * Gain node\n */\n private _gainNode?: GainNode | undefined;\n\n private _analyser?: AnalyserNode;\n\n /**\n * List of available microphones\n */\n get microphones() {\n return this._microphones;\n }\n\n /**\n * Microphone data\n */\n get data() {\n return this._data;\n }\n\n /**\n * Audio context\n */\n get audioContext() {\n return this._audioContext;\n }\n\n /**\n * Analyzer node\n */\n get analyzer() {\n return this._analyser;\n }\n\n /**\n * Media steam source node\n */\n get sourceNode() {\n return this._source;\n }\n\n /**\n * Muted state\n */\n get isMuted() {\n return this._isMuted;\n }\n\n /**\n * Set gain\n */\n set gain(value: number) {\n if (this._gainNode) this._gainNode.gain.value = value;\n }\n\n /**\n * Set muted state\n */\n set isMuted(set: boolean) {\n this._isMuted = set;\n }\n\n /**\n * Set input source\n */\n set source(deviceId: string) {\n this.init(deviceId);\n }\n\n ngOnDestroy(): void {\n // close audio context\n this._audioContext?.close();\n this._source?.disconnect();\n this._analyser?.disconnect();\n this._stream?.getTracks().forEach((track) => {\n track.stop();\n });\n }\n\n /**\n * Initialize\n *\n * @param deviceId Input device id (from microphone list)\n */\n async init(deviceId = 'default') {\n try {\n // cleanup\n this.ngOnDestroy();\n\n // request permission\n this._stream = await navigator.mediaDevices.getUserMedia({\n audio: {\n deviceId: { exact: deviceId },\n noiseSuppression: this._config.audio.noiseSuppression?.nativeNoiseSuppression || false,\n echoCancellation: this._config.audio.noiseSuppression?.nativeEchoCancellation || false,\n autoGainControl: this._config.audio.noiseSuppression?.autoGainControl || false,\n },\n });\n\n this._event.log.next(\n `${MicrophoneService.name}: Microphone permission granted (deviceid: '${deviceId ?? 'default'}')!`,\n );\n\n // save list of microphones\n this._microphones = await this._microphoneList();\n\n // monitor audio\n await this._monitor();\n\n return true;\n } catch (error) {\n this._event.exception.next(error as Error);\n }\n\n return false;\n }\n\n /**\n * Monitor audio\n *\n * @returns chunk subject\n */\n private async _monitor() {\n const worklet = await this._workletNode();\n\n // on message\n worklet.port.onmessage = async (event) => {\n const data = (event.data as MicrophoneProcessorData) ?? null;\n if (!data) return;\n\n // emit chunk\n this._data.next(data);\n };\n\n return this._data;\n }\n\n /**\n * Microphones\n */\n private async _microphoneList() {\n const devices = await navigator.mediaDevices.enumerateDevices();\n return devices.filter((device) => device.kind === 'audioinput');\n }\n\n /**\n * Prepare worklet node\n */\n private async _workletNode() {\n // Create audio context\n this._audioContext = new AudioContext({ sampleRate: SAMPLE_RATE });\n\n this._analyser = this._audioContext.createAnalyser();\n this._analyser.fftSize = 256;\n\n if (this._config.audio.noiseSuppression) {\n await this._audioContext.audioWorklet.addModule(\n this._config.audio.noiseSuppression.worklet ??\n `${this._config.basePath}/worklets/workletProcessor.js`,\n );\n }\n\n // Load custom worklet\n const blob = new Blob([MICROPHONE_PROCESSOR], { type: 'application/javascript' });\n const workletURL = URL.createObjectURL(blob);\n await this._audioContext.audioWorklet.addModule(workletURL);\n URL.revokeObjectURL(workletURL);\n\n // Create Nodes\n this._source = this._audioContext.createMediaStreamSource(this._stream);\n\n // Gain Node\n const gainNode = this._audioContext.createGain();\n gainNode.gain.value = this._config.audio.gain;\n\n if (this._config.audio.noiseSuppression) {\n // Load RNNoise dependencies\n const rnnoiseWasmBinary = await loadRnnoise({\n url:\n this._config.audio.noiseSuppression.rnnoise ??\n `${this._config.basePath}/wasm/rnnoise.wasm`,\n simdUrl:\n this._config.audio.noiseSuppression.rnnoise_simd ??\n `${this._config.basePath}/wasm/rnnoise_simd.wasm`,\n });\n\n // RNNoise Node\n const rnnoiseNode = new RnnoiseWorkletNode(this._audioContext, {\n wasmBinary: rnnoiseWasmBinary,\n maxChannels: 1, // Standard for mono microphone input\n });\n\n this._source.connect(rnnoiseNode);\n rnnoiseNode.connect(gainNode);\n } else {\n this._source.connect(gainNode);\n }\n\n this._source.connect(this._analyser);\n\n // loop back mic sound\n if (this._config.audio.loopBackToSpeakers)\n this._analyser.connect(this.audioContext!.destination);\n\n // Custom Worklet Node\n const workletNode = new AudioWorkletNode(this._audioContext, MICROPHONE_PROCESSOR_NAME);\n\n // Connect the Graph: Source -> RNNoise (if noise suppression) -> Gain -> Custom Worklet\n gainNode.connect(workletNode);\n\n return workletNode;\n }\n}\n","import { isPlatformBrowser, isPlatformServer } from '@angular/common';\nimport { Injectable, PLATFORM_ID, inject } from '@angular/core';\n\n@Injectable()\nexport class PlatformService {\n private readonly _platform = inject(PLATFORM_ID);\n\n /**\n * Is browser\n */\n get isBrowser(): boolean {\n return isPlatformBrowser(this._platform);\n }\n\n /**\n * Is server\n */\n get isServer(): boolean {\n return isPlatformServer(this._platform);\n }\n}\n","import { inject, Injectable, OnDestroy } from '@angular/core';\nimport { EventService } from '../../event/event-service';\nimport { PlatformService } from '../../platform/platform-service';\nimport { MicrophoneService } from '../microphone-service/microphone-service';\n\n@Injectable()\nexport class SpeechRecognitionService implements OnDestroy {\n /**\n * Dependencies\n */\n private readonly _event = inject(EventService);\n private readonly _platform = inject(PlatformService);\n private readonly _mic = inject(MicrophoneService);\n\n private _recognitionClass!: {\n new (): SpeechRecognition;\n prototype: SpeechRecognition;\n };\n\n /**\n * Instance\n */\n private _recognition!: SpeechRecognition;\n\n /**\n * Transcript\n */\n private _transcript = '';\n\n /**\n * Get transcript\n */\n get transcript() {\n return this._transcript;\n }\n\n ngOnDestroy(): void {\n this.reset(); // clear transcript\n\n if (this._platform.isBrowser) this._recognition.stop();\n }\n\n /**\n * Clear transcript\n */\n reset() {\n this._transcript = '';\n }\n\n init() {\n this._recognitionClass = window.SpeechRecognition || window.webkitSpeechRecognition;\n\n if (!SpeechRecognition) {\n this._event.exception.next(new Error('Speech recognition is not supported'));\n return;\n }\n\n this._recognition = new this._recognitionClass(); // initialize\n\n // 2. Configuration\n this._recognition.lang = 'en-US'; // Set language\n this._recognition.continuous = true; // Keep listening even if the user pauses\n this._recognition.interimResults = true; // Show results while the user is still speaking\n\n this._recognition.onend = () => {\n this.reset();\n this.init(); // start\n };\n\n // 3. Handle Results\n this._recognition.onresult = (event) => {\n this._transcript = '';\n\n // Don't capture if muted\n if (this._mic.isMuted) return;\n\n for (let i = event.resultIndex; i < event.results.length; i++)\n this._transcript += event.results[i][0].transcript;\n };\n\n this._recognition.start(); // start\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { Tensor, TypedTensor } from 'onnxruntime-web';\nimport { EventService } from '../../event/event-service';\nimport { ModelService } from '../../model/model-service';\nimport { SAMPLE_RATE } from '../microphone-service/microphone-service.constant';\nimport { InputMetadata, VADState } from './vad-service.type';\n\n@Injectable()\nexport class VadService {\n /**\n * Dependencies\n */\n private readonly _event = inject(EventService);\n private readonly _model = inject(ModelService);\n\n /**\n * VAD Shape\n */\n private _shape: number[] = [];\n\n /**\n * VAD LSTM hidden & cell state\n */\n private _state: VADState | null = null;\n\n /**\n * Get session\n */\n private get _session() {\n return this._model.sileroVAD;\n }\n\n /**\n * Initialize\n */\n init() {\n this._shape = this._getShape();\n\n this._state = {\n hidden: new Tensor('float32', new Float32Array(128).fill(0), this._shape),\n cell: new Tensor('float32', new Float32Array(128).fill(0), this._shape),\n };\n }\n\n /**\n * Get VAD score\n *\n * @param chunk\n * @returns\n */\n async score(sample: Float32Array): Promise<number> {\n if (!this._state) throw new Error(`${VadService.name}: Undefined LSTM state.`);\n\n try {\n const tensor = new Tensor('float32', sample, [1, sample.length]);\n const sampleRate = new Tensor('int64', [BigInt(SAMPLE_RATE)], []);\n\n // run inference\n const response = await this._session.run({\n input: tensor,\n sr: sampleRate,\n h: this._state.hidden,\n c: this._state.cell,\n });\n\n // Update memory\n this._state.hidden = response['hn'] as TypedTensor<'float32'>;\n this._state.cell = response['cn'] as TypedTensor<'float32'>;\n\n return response['output'].data[0] as number;\n } catch (error) {\n this._event.exception.next(error as Error);\n return 0;\n }\n }\n\n /**\n * Get shape of vad session\n *\n * Ex: [2, 1, 64]\n */\n private _getShape() {\n const { shape } = (this._session.inputMetadata.find((e) => e.name === 'h') ??\n {}) as InputMetadata;\n\n const vadState = [];\n\n if (shape) {\n for (const sh of shape) {\n if (typeof sh === 'string') vadState.push(1);\n else vadState.push(sh);\n }\n\n return vadState;\n }\n\n throw new Error(`${VadService.name}: Unable to identify shape of the session.`);\n }\n}\n","/**\n * DefaulT VAD threshold\n */\nexport const DEFAULT_VAD_THRESHOLD = 0.5;\n","import { inject, Injectable, OnDestroy } from '@angular/core';\nimport {\n concatMap,\n distinctUntilChanged,\n EMPTY,\n filter,\n ignoreElements,\n map,\n merge,\n scan,\n share,\n switchMap,\n take,\n takeUntil,\n tap,\n throttleTime,\n timer,\n withLatestFrom,\n} from 'rxjs';\nimport { SubSink } from 'subsink';\nimport { ConfigService } from '../config/config-service';\nimport { EventService } from '../event/event-service';\nimport { SpeechEvent } from '../event/event-service.type';\nimport { DEFAULT_INFERENCE_SCORE } from '../model/model-service.const';\nimport { VAD_HANGOVER_FRAMES, VadState } from '../model/model-service.type';\nimport { PipelineService } from '../pipeline/pipeline-service';\nimport { DEFAULT_SILENCE_DURATION, DEFAULT_SPEECH_THRESHOLD_TIME } from './audio-service.const';\nimport { MicrophoneService } from './microphone-service/microphone-service';\nimport { SpeechRecognitionService } from './speech-recognition/speech-recognition-service';\nimport { VadService } from './vad-service/vad-service';\nimport { DEFAULT_VAD_THRESHOLD } from './vad-service/vad-service.const';\n\n@Injectable()\nexport class AudioService implements OnDestroy {\n /**\n * Dependencies\n */\n private readonly _config = inject(ConfigService);\n private readonly _event = inject(EventService);\n private readonly _mic = inject(MicrophoneService);\n private readonly _vad = inject(VadService);\n private readonly _pipeline = inject(PipelineService);\n private readonly _speechRecognition = inject(SpeechRecognitionService);\n\n private readonly _subs = new SubSink();\n\n private _endCurrentRecording = false;\n\n /**\n * Recording state\n */\n private _isRecording = false;\n\n /**\n * Is process is initialized (detected wakeword)\n */\n private _isInitialized = false;\n\n get isRecording() {\n return this._isRecording;\n }\n\n ngOnDestroy(): void {\n this._subs.unsubscribe();\n }\n\n /**\n * Initialize audio\n */\n async init() {\n if (!this._mic.microphones.length) {\n this._event.exception.next(new Error('Microphone permission required!'));\n return;\n }\n\n const data = await this._mic.data;\n\n // Init VAD\n this._vad.init();\n\n this._speechRecognition.init();\n\n // Fire ready event\n this._event.ready.next();\n\n data.subscribe(async (data) => {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const that = this;\n\n // Fire a speech event\n this._event.speech.next({\n ...data,\n sample: this._mic.isMuted ? new Float32Array(1280).fill(0) : data.sample, // no speech data if muted\n vadScore: await this._vad.score(data.sample), // emit vad score even if muted\n get hasVoiceActivity() {\n return this.vadScore > (that._config.audio.vadThreshold ?? DEFAULT_VAD_THRESHOLD);\n },\n });\n });\n\n this._listenForWakeword();\n this._captureCommandAfterWakeword();\n }\n\n /**\n * Force start recording (without wakeword)\n */\n forceStartRecording() {\n this._isInitialized = true;\n this._endCurrentRecording = false;\n\n // this._speechRecognition.reset(); // reset transcript\n this._event.wakeword.next({\n inferenceScore: 0,\n chunk: [],\n vadScore: 0,\n hasVoiceActivity: false,\n sample: new Float32Array(),\n rms: 0,\n db: 0,\n dbNormalized: 0,\n });\n }\n\n /**\n * Force end recording\n */\n forceEndRecording() {\n this._endCurrentRecording = true;\n this._isInitialized = false;\n\n this._event.silence.next({\n chunk: new Float32Array(),\n transcript: '',\n interimResponse: false, // final response\n });\n }\n\n /**\n * Toggle recording\n */\n toggleRecording() {\n if (this._isInitialized) {\n this._isInitialized = false;\n this.forceEndRecording();\n } else this.forceStartRecording();\n }\n\n /**\n * Identifies the wakeword and emits the event\n */\n private _listenForWakeword() {\n const vad$ = this._getWakeWordStream();\n\n this._subs.sink = this._event.speech\n .pipe(\n filter(() => !this._isInitialized && !this._mic.isMuted),\n withLatestFrom(vad$),\n concatMap(async ([speech, vadState]) => {\n const score = await this._pipeline.run(speech);\n return { speech, score, chunk: vadState.buffer };\n }),\n filter(({ score }) => {\n if (this._config.onnx.wakeword) {\n const transcriptArray = this._speechRecognition.transcript\n .toLowerCase()\n .trim()\n .split(' ');\n\n // use speech recognition for wake word identification\n if (transcriptArray.length === this._config.onnx.wakeword.length)\n for (const idx in this._config.onnx.wakeword)\n if (\n +idx < transcriptArray.length &&\n transcriptArray[idx].includes(this._config.onnx.wakeword[idx].toLowerCase())\n )\n return true;\n }\n\n return score > (this._config.onnx.wakewordInferenceThreshold ?? DEFAULT_INFERENCE_SCORE);\n }),\n )\n .subscribe(({ speech, score, chunk }) => {\n this._event.wakeword.next({ ...speech, inferenceScore: score, chunk });\n });\n }\n\n /**\n * New logic: Captures the full command audio after a wakeword\n */\n private _captureCommandAfterWakeword() {\n const SILENCE_DURATION = this._config.audio.silenceDuration ?? DEFAULT_SILENCE_DURATION;\n const VAD_THRESHOLD = this._config.audio.vadThreshold ?? DEFAULT_VAD_THRESHOLD;\n const PRE_ROLL_MS = this._config.audio.speechThresholdTime ?? DEFAULT_SPEECH_THRESHOLD_TIME;\n const CHUNK_DURATION_MS = 80; // Each speech event is fired (by audio processor) at 80 ms\n const MAX_SLIDING_WINDOW_CHUNKS = Math.ceil(PRE_ROLL_MS / CHUNK_DURATION_MS);\n\n // speech sliding window state\n const speechSlidingWindow: Float32Array[] = [];\n\n // trigger 1: wakeword\n const wakewordTrigger$ = this._event.wakeword.pipe(\n filter(() => !this._isRecording), // Ignore wakeword if already recording\n map(() => [] as Float32Array[]),\n );\n\n // trigger 2: Continuous VAD > THRESHOLD\n const continuousVadTrigger$ = this._event.speech.pipe(\n filter(() => !this._mic.isMuted),\n // intercept the raw stream to constantly update the threshold window\n tap((s) => {\n // Only buffer if we aren't already formally recording\n if (!this._isRecording && this._isInitialized) {\n speechSlidingWindow.push(s.sample);\n // Keep the array length strictly to our configured window size\n if (speechSlidingWindow.length > MAX_SLIDING_WINDOW_CHUNKS) speechSlidingWindow.shift();\n }\n }),\n\n // check VAD score\n map((s) => s.vadScore > VAD_THRESHOLD),\n filter(() => !this._isRecording && this._isInitialized),\n distinctUntilChanged(),\n\n switchMap((isVoiceActive) => {\n if (!isVoiceActive) return EMPTY; // Cancel if voice stops before threshold\n\n this._speechRecognition.reset();\n\n // PRE-FILL the actual recording buffer with our duration (ex: 300ms) look back window!\n // clone so future sliding window updates don't mutate the captured audio.\n const bufferedChunks: Float32Array[] = [...speechSlidingWindow];\n\n // continue accumulating new chunks silently while we wait for the timer\n const buffer$ = this._event.speech.pipe(\n filter(() => !this._mic.isMuted),\n tap((s) => bufferedChunks.push(s.sample)),\n ignoreElements(),\n );\n\n // timer that emits the fully accumulated chunks (pre-roll)\n const timer$ = timer(PRE_ROLL_MS).pipe(map(() => bufferedChunks));\n\n return merge(buffer$, timer$).pipe(take(1));\n }),\n );\n\n // combine triggers\n const startRecordingTrigger$ = merge(\n wakewordTrigger$.pipe(\n tap(() => {\n if (!this._isInitialized) this._isInitialized = true; // initialized\n }),\n ),\n continuousVadTrigger$,\n ).pipe(\n filter(() => !this._mic.isMuted),\n throttleTime(this._config.throttleTime), // Prevent double-firing if wakeword and voice overlap\n );\n\n // recording pipeline\n this._subs.sink = startRecordingTrigger$\n .pipe(\n tap(() => {\n this._isRecording = true;\n this._speechRecognition.reset();\n }),\n\n switchMap((bufferedChunks) => {\n // Initialize our command chunks with anything captured during the 1s VAD wait\n const commandChunks: Float32Array[] = [...bufferedChunks];\n\n const speech$ = this._event.speech.pipe(\n filter(() => !this._mic.isMuted),\n tap((speech) => {\n commandChunks.push(speech.sample);\n\n if (this._isRecording)\n // emit recording events\n this._event.recording.next({\n chunk: this._flatten(commandChunks),\n transcript: this._speechRecognition.transcript,\n });\n }),\n share(),\n );\n\n const silence$ = speech$.pipe(\n map((s) => s.vadScore < VAD_THRESHOLD),\n distinctUntilChanged(), // only emit when silence state changes\n );\n\n // silence timeout logic\n const normalSilenceTimeout$ = silence$.pipe(\n switchMap((isSilent) => {\n if (!isSilent) {\n return EMPTY; // if voice cancel the timer\n }\n\n // silence started, start timer\n return timer(SILENCE_DURATION).pipe(\n takeUntil(\n silence$.pipe(filter((silent) => !silent)), // cancel if voice resumes\n ),\n );\n }),\n );\n\n // force end recording\n const forceComplete$ = speech$.pipe(filter(() => this._endCurrentRecording));\n\n return merge(normalSilenceTimeout$, forceComplete$).pipe(\n take(1),\n map(() => this._flatten(commandChunks)),\n );\n }),\n )\n .subscribe({\n next: (chunk) => {\n const interimResponse =\n this._config.mode === 'DEFAULT' || this._config.mode === 'PTT' ? false : true;\n\n this._event.silence.next({\n chunk,\n transcript: this._speechRecognition.transcript,\n interimResponse,\n }); // emit silence event\n\n // Default case\n if (this._config.mode === 'DEFAULT' || this._config.mode === 'PTT') {\n this._isInitialized = false;\n }\n\n this._endCurrentRecording = false; // reset flag after recording ends\n\n this._isRecording = false;\n },\n error: (err) => {\n this._event.exception.next(err);\n },\n });\n }\n\n /**\n * Helper to flatten array of buffers into a single Float32Array\n */\n private _flatten(chunks: Float32Array[]): Float32Array {\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Float32Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return result;\n }\n\n /**\n * Wakeword stream\n * @returns\n */\n private _getWakeWordStream() {\n return this._event.speech.pipe(\n filter(() => !this._mic.isMuted),\n scan(\n (state: VadState, speech: SpeechEvent): VadState => {\n const { hasVoiceActivity, sample } = speech;\n let { isActive, hangoverCounter, buffer } = state;\n\n if (hasVoiceActivity) {\n // If we were idle, start a fresh buffer\n if (!isActive) {\n buffer = [];\n isActive = true;\n }\n // Reset silence tracker to 0 because we hear a voice\n hangoverCounter = 0;\n } else if (isActive) {\n // Increment silence tracker\n hangoverCounter++;\n\n // If we've reached the limit of allowed silent frames\n if (hangoverCounter >= VAD_HANGOVER_FRAMES) {\n isActive = false;\n }\n }\n\n // Add sample if we are in an active speech window\n if (isActive) {\n buffer = [...buffer, sample];\n }\n\n return { buffer, hangoverCounter, isActive };\n },\n { buffer: [], hangoverCounter: -1, isActive: false },\n ),\n\n // Only share the state when it is actively collecting\n share(),\n );\n }\n}\n","import { inject, Injectable, OnDestroy } from '@angular/core';\nimport { throttleTime } from 'rxjs';\nimport { SubSink } from 'subsink';\nimport { OrbComponentService } from '../../../components/orb-component/orb-component-service';\nimport { ConfigService } from '../../config/config-service';\nimport { EventService } from '../../event/event-service';\nimport { PlatformService } from '../../platform/platform-service';\nimport { AudioService } from '../audio-service';\nimport { MicrophoneService } from '../microphone-service/microphone-service';\n\n@Injectable()\nexport class SpeakerService implements OnDestroy {\n /**\n * Dependencies\n */\n private readonly _config = inject(ConfigService);\n private readonly _platform = inject(PlatformService);\n private readonly _event = inject(EventService);\n private readonly _mic = inject(MicrophoneService);\n private readonly _orb = inject(OrbComponentService);\n private readonly _audio = inject(AudioService);\n\n private readonly _subs = new SubSink();\n\n private _upSound!: HTMLAudioElement;\n private _downSound!: HTMLAudioElement;\n private _pingSound!: HTMLAudioElement;\n\n private _nextPlayTime = 0;\n private _sources: AudioBufferSourceNode[] = [];\n\n /**\n * List of available microphones\n */\n private _speakers: MediaDeviceInfo[] = [];\n\n constructor() {\n if (this._config.audio.sound?.enable === false) return;\n\n // Audio is only available in browser context\n if (this._platform.isBrowser) {\n // up\n this._upSound = new Audio(\n this._config.audio.sound?.up ?? `${this._config.basePath}/sounds/up.mp3`,\n );\n\n this._upSound.volume =\n this._config.audio.sound?.upVolume ?? this._config.audio.sound?.masterVolume ?? 0.5;\n\n // down\n this._downSound = new Audio(\n this._config.audio.sound?.down ?? `${this._config.basePath}/sounds/down.mp3`,\n );\n\n this._downSound.volume =\n this._config.audio.sound?.downVolume ?? this._config.audio.sound?.masterVolume ?? 0.5;\n\n // ping\n this._pingSound = new Audio(\n this._config.audio.sound?.ping ?? `${this._config.basePath}/sounds/ping.mp3`,\n );\n\n this._pingSound.volume =\n this._config.audio.sound?.pingVolume ?? this._config.audio.sound?.masterVolume ?? 0.1;\n\n // Preload\n this._upSound.preload = this._downSound.preload = this._pingSound.preload = 'auto';\n\n this._loadSubscriptions();\n\n // Get speaker list\n this._speakerList().then((e) => {\n this._speakers = e;\n });\n }\n }\n\n /**\n * List of speakers\n */\n get speakers() {\n return this._speakers;\n }\n\n /**\n * Set output source\n */\n set source(deviceId: string) {\n this._setSource(deviceId);\n }\n\n ngOnDestroy(): void {\n this._subs.unsubscribe();\n }\n\n /**\n * Play audio chunk\n *\n * @param buffer audio buffer\n * @param sampleRate sample rate to play in\n */\n playChunk(buffer: ArrayBuffer, sampleRate: number) {\n // Calculate how many full 32-bit floats fit in this buffer\n const float32Count = Math.floor(buffer.byteLength / 4);\n\n // Convert raw bytes back to 32-bit floats\n const float32Array = new Float32Array(buffer, 0, float32Count);\n\n // Create an empty audio buffer mapping\n const audioBuffer = this._mic.audioContext!.createBuffer(1, float32Array.length, sampleRate);\n audioBuffer.copyToChannel(float32Array, 0);\n\n this.playAudioBuffer(audioBuffer);\n }\n\n /**\n * Play audio buffer\n *\n * @param audioBuffer\n */\n playAudioBuffer(audioBuffer: AudioBuffer) {\n // if recording, clear the queue\n if (this._audio.isRecording) {\n this._clearQueue();\n return;\n }\n\n // Create a source node to play the buffer\n const source = this._mic.audioContext!.createBufferSource();\n source.buffer = audioBuffer;\n\n source.connect(this._mic.analyzer!);\n source.connect(this._mic.audioContext!.destination);\n\n // Schedule the chunk to play exactly when the previous chunk finishes\n const currentTime = this._mic.audioContext!.currentTime;\n if (this._nextPlayTime < currentTime) {\n this._nextPlayTime = currentTime; // Reset if the queue has emptied\n }\n\n source.start(this._nextPlayTime);\n\n this._sources.push(source); // keep instance of source to stop later\n\n this._nextPlayTime += audioBuffer.duration;\n\n source.onended = () => {\n this._sources.shift();\n\n if (!this._sources.length)\n if (!this._config.orb?.mode || this._config.orb?.mode === 'auto')\n this._orb.setState('initialized'); // reset\n };\n\n if (!this._config.orb?.mode || this._config.orb?.mode === 'auto')\n this._orb.setState('speaking'); // speaking\n }\n\n /**\n * Play on sound\n */\n playUp() {\n if (this._config.audio.sound?.enable === false) return;\n\n this._upSound.play();\n }\n\n /**\n * Play off sound\n */\n playDown() {\n if (this._config.audio.sound?.enable === false) return;\n\n this._downSound.play();\n }\n\n /**\n * Play ping\n */\n playPing() {\n if (this._config.audio.sound?.enable === false) return;\n\n this._pingSound.play();\n }\n\n /**\n * Set source\n *\n * @param deviceId\n */\n private async _setSource(deviceId: string) {\n if (typeof this._mic.audioContext!.setSinkId === 'function') {\n await this._mic.audioContext!.setSinkId(deviceId);\n } else\n this._event.exception.next(\n new Error('AudioContext.setSinkId is not supported. Playing on default'),\n );\n }\n\n /**\n * Clear playback queue\n */\n private _clearQueue() {\n this._sources.forEach((s) => s.stop());\n this._sources = [];\n this._nextPlayTime = 0;\n }\n\n /**\n * Load subscriptions\n */\n private _loadSubscriptions() {\n this._subs.sink = this._event.wakeword\n .pipe(throttleTime(this._config.throttleTime))\n .subscribe(() => {\n this.playUp();\n });\n\n // If default, on silence, play down\n this._subs.sink = this._event.silence.subscribe((ev) => {\n if (!ev.interimResponse) this.playDown();\n else this.playPing();\n });\n\n // If recording event\n this._subs.sink = this._event.recording.subscribe(() => {\n this._clearQueue();\n });\n }\n\n /**\n * Speakers\n */\n private async _speakerList() {\n const devices = await navigator.mediaDevices.enumerateDevices();\n return devices.filter((device) => device.kind === 'audiooutput');\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { OrbComponentService } from '../../components/orb-component/orb-component-service';\nimport { AudioService } from '../audio/audio-service';\nimport { MicrophoneService } from '../audio/microphone-service/microphone-service';\nimport { SpeakerService } from '../audio/speaker-service/speaker-service';\nimport { SpeechRecognitionService } from '../audio/speech-recognition/speech-recognition-service';\nimport { VadService } from '../audio/vad-service/vad-service';\nimport { ConfigService } from '../config/config-service';\nimport { EventService } from '../event/event-service';\nimport { ModelService } from '../model/model-service';\nimport { PipelineService } from '../pipeline/pipeline-service';\nimport { PlatformService } from '../platform/platform-service';\n\n@Injectable()\nexport class BridgeService {\n readonly mic = inject(MicrophoneService);\n readonly speaker = inject(SpeakerService);\n readonly speechRecognition = inject(SpeechRecognitionService);\n readonly vad = inject(VadService);\n readonly audio = inject(AudioService);\n readonly config = inject(ConfigService);\n readonly event = inject(EventService);\n readonly model = inject(ModelService);\n readonly pipeline = inject(PipelineService);\n readonly platform = inject(PlatformService);\n readonly orbComponentService = inject(OrbComponentService);\n}\n","import { NgClass } from '@angular/common';\nimport {\n AfterViewInit,\n Component,\n ElementRef,\n HostListener,\n inject,\n NgZone,\n OnDestroy,\n ViewChild,\n} from '@angular/core';\nimport { SubSink } from 'subsink';\nimport * as THREE from 'three';\nimport { AudioService } from '../../services/audio/audio-service';\nimport { MicrophoneService } from '../../services/audio/microphone-service/microphone-service';\nimport { ConfigService } from '../../services/config/config-service';\nimport { EventService } from '../../services/event/event-service';\nimport { PlatformService } from '../../services/platform/platform-service';\nimport { OrbComponentService } from './orb-component-service';\nimport { AgentState } from './orb-component.type';\n\n@Component({\n selector: 'app-orb-component',\n imports: [NgClass],\n template: `\n <div\n #rendererContainer\n role=\"button\"\n tabindex=\"0\"\n class=\"orb-container\"\n [style.width.px]=\"orbSize\"\n [style.height.px]=\"orbSize\"\n (click)=\"toggleRecording()\"\n (keypress)=\"toggleRecording()\"\n [ngClass]=\"{ muted: isMuted }\"\n ></div>\n `,\n styles: [\n `\n .orb-container {\n display: flex;\n justify-content: center;\n align-items: center;\n overflow: hidden;\n cursor: pointer;\n }\n .muted {\n cursor: not-allowed;\n }\n canvas {\n display: block;\n outline: none;\n }\n `,\n ],\n})\nexport class OrbComponent implements AfterViewInit, OnDestroy {\n @ViewChild('rendererContainer', { static: true })\n private _rendererContainer!: ElementRef<HTMLDivElement>;\n\n private readonly _config = inject(ConfigService);\n private readonly _platform = inject(PlatformService);\n private readonly _audio = inject(AudioService);\n private readonly _mic = inject(MicrophoneService);\n private readonly _event = inject(EventService);\n private readonly _ngZone = inject(NgZone);\n private readonly _service = inject(OrbComponentService);\n private readonly _subs = new SubSink();\n\n // Three.js Core\n private _scene!: THREE.Scene;\n private _camera!: THREE.PerspectiveCamera;\n private _renderer!: THREE.WebGLRenderer;\n private _sphere!: THREE.Points;\n private _material!: THREE.ShaderMaterial;\n private _animationFrameId!: number;\n private _timer = new THREE.Timer();\n private _geometry!: THREE.BufferGeometry;\n\n // Audio Processing\n private dataArray!: Uint8Array<ArrayBuffer>;\n private micVolume = 0;\n\n // State Management\n private currentState: AgentState = 'idle';\n private agentProfiles = {\n idle: {\n spike: 0.05,\n noiseScale: 1.0,\n speed: 0.2,\n twist: 0.0,\n pulse: 0.0,\n base: '#001133',\n peak: '#ff4000',\n },\n initialized: {\n spike: 0.05,\n noiseScale: 1.0,\n speed: 0.2,\n twist: 0.0,\n pulse: 0.0,\n base: '#001133',\n peak: '#00aaff',\n },\n listening: {\n spike: 0.2,\n noiseScale: 2.5,\n speed: 1.0,\n twist: 0.0,\n pulse: 0.0,\n base: '#002211',\n peak: '#00ff88',\n },\n thinking: {\n spike: 0.2,\n noiseScale: 1.5,\n speed: 1.5,\n twist: 1.5,\n pulse: 0.0,\n base: '#220033',\n peak: '#ff00ff',\n },\n speaking: {\n spike: 0.1,\n noiseScale: 1.0,\n speed: 0.5,\n twist: 0.0,\n pulse: 0.1,\n base: '#331100',\n peak: '#ff8800',\n },\n };\n\n private targets = { ...this.agentProfiles.idle };\n private targetColorBase = new THREE.Color(this.targets.base);\n private targetColorPeak = new THREE.Color(this.targets.peak);\n\n get orbSize(): number {\n return this._config.orb?.size ?? 400;\n }\n\n get isMuted() {\n return this._mic.isMuted;\n }\n\n ngAfterViewInit(): void {\n if (this._platform.isServer) return;\n\n this.dataArray = new Uint8Array(this._mic.analyzer!.frequencyBinCount);\n this._loadSubscribers();\n\n // MUST run outside Angular to prevent CD loops\n this._ngZone.runOutsideAngular(() => {\n this._initThreeJs();\n this._timer.connect(document);\n this._animate();\n });\n }\n\n ngOnDestroy(): void {\n if (this._platform.isServer) return;\n\n cancelAnimationFrame(this._animationFrameId);\n\n this._subs.unsubscribe();\n\n if (this._renderer) {\n this._renderer.dispose();\n this._renderer.forceContextLoss();\n // Remove canvas from DOM to ensure cleanup\n const domElement = this._renderer.domElement;\n if (domElement && domElement.parentNode) {\n domElement.parentNode.removeChild(domElement);\n }\n }\n\n if (this._geometry) this._geometry.dispose();\n if (this._material) this._material.dispose();\n }\n\n /**\n * Space bar press\n */\n @HostListener('window:keydown', ['$event'])\n handleSpacebarPress(event: KeyboardEvent): void {\n if (event.code !== this._config.hotkey) return;\n\n event.preventDefault();\n this.toggleRecording();\n }\n\n /**\n * Toggle recording\n */\n toggleRecording() {\n if (this.isMuted) return;\n\n this._audio.toggleRecording();\n }\n\n /**\n * Set state of orb\n *\n * @param state orb state\n */\n setState(state: AgentState): void {\n const profile = this.agentProfiles[state];\n\n this.currentState = state;\n this.targets = { ...profile };\n this.targetColorBase.set(profile.base);\n this.targetColorPeak.set(profile.peak);\n }\n\n /**\n * Subscriptions\n */\n private _loadSubscribers(): void {\n this._subs.sink = this._event.speech.subscribe((data) => {\n this.micVolume = this.isMuted ? 0 : data.dbNormalized;\n });\n\n // only update orb state if mode is auto\n if (!this._config.orb?.mode || this._config.orb?.mode === 'auto') {\n // after wakeword, set to listening\n this._subs.sink = this._event.wakeword.subscribe(() => {\n this.setState('listening');\n });\n\n // after silence, set thinking or idle\n this._subs.sink = this._event.silence.subscribe((ev) => {\n if (ev.interimResponse) this.setState('thinking');\n else this.setState('idle');\n });\n\n // if recording started\n this._subs.sink = this._event.recording.subscribe(() => {\n this.setState('listening');\n });\n\n // state change using service\n this._subs.sink = this._service.state.subscribe((state) => {\n this.setState(state);\n });\n }\n }\n\n /**\n * Speech volume for animation\n */\n private _getTTSVolume(): number {\n this._mic.analyzer!.getByteFrequencyData(this.dataArray);\n const sum = this.dataArray.reduce((a, b) => a + b, 0);\n return sum / this.dataArray.length / 255.0;\n }\n\n /**\n * Init\n */\n private _initThreeJs(): void {\n const size = this.orbSize;\n\n this._scene = new THREE.Scene();\n this._camera = new THREE.PerspectiveCamera(50, 1, 0.1, 1000);\n this._camera.position.z = 6;\n\n this._renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });\n this._renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));\n this._renderer.setSize(size, size);\n\n this._rendererContainer.nativeElement.appendChild(this._renderer.domElement);\n\n const particlesCount = this._config.orb?.particlesCount ?? 30000;\n this._geometry = new THREE.BufferGeometry();\n const posArray = new Float32Array(particlesCount * 3);\n const randomArray = new Float32Array(particlesCount);\n const radius = this._config.orb?.radius ?? 1.8;\n\n for (let i = 0; i < particlesCount; i++) {\n const phi = Math.acos(-1 + (2 * i) / particlesCount);\n const theta = Math.sqrt(particlesCount * Math.PI) * phi;\n\n posArray[i * 3] = radius * Math.cos(theta) * Math.sin(phi);\n posArray[i * 3 + 1] = radius * Math.sin(theta) * Math.sin(phi);\n posArray[i * 3 + 2] = radius * Math.cos(phi);\n randomArray[i] = Math.random();\n }\n\n this._geometry.setAttribute('position', new THREE.BufferAttribute(posArray, 3));\n this._geometry.setAttribute('aRandom', new THREE.BufferAttribute(randomArray, 1));\n\n this._material = new THREE.ShaderMaterial({\n uniforms: {\n uTime: { value: 0 },\n uSpike: { value: 0.05 },\n uNoiseScale: { value: 1.0 },\n uSpeed: { value: 0.2 },\n uTwist: { value: 0.0 },\n uPulse: { value: 0.0 },\n uColorBase: { value: new THREE.Color('#002244') },\n uColorPeak: { value: new THREE.Color('#00ffff') },\n },\n vertexShader: this._getVertexShader(),\n fragmentShader: this._getFragmentShader(),\n transparent: true,\n blending: THREE.AdditiveBlending,\n depthWrite: false,\n });\n\n this._sphere = new THREE.Points(this._geometry, this._material);\n this._scene.add(this._sphere);\n }\n\n /**\n * Animator\n */\n private _animate = (): void => {\n this._animationFrameId = requestAnimationFrame(this._animate);\n this._timer.update();\n const elapsedTime = this._timer.getElapsed();\n\n this._material.uniforms['uTime'].value = elapsedTime;\n\n let dynamicSpike = this.targets.spike;\n let dynamicPulse = this.targets.pulse;\n\n if (this.currentState === 'listening') {\n dynamicSpike += this.micVolume * 1.0;\n } else if (this.currentState === 'speaking') {\n const ttsVolume = this._getTTSVolume();\n dynamicPulse += ttsVolume * 0.5;\n }\n\n const lerpFactor = 0.08;\n this._material.uniforms['uSpike'].value +=\n (dynamicSpike - this._material.uniforms['uSpike'].value) * lerpFactor;\n this._material.uniforms['uPulse'].value +=\n (dynamicPulse - this._material.uniforms['uPulse'].value) * lerpFactor;\n\n this._material.uniforms['uNoiseScale'].value +=\n (this.targets.noiseScale - this._material.uniforms['uNoiseScale'].value) * lerpFactor;\n this._material.uniforms['uSpeed'].value +=\n (this.targets.speed - this._material.uniforms['uSpeed'].value) * lerpFactor;\n this._material.uniforms['uTwist'].value +=\n (this.targets.twist - this._material.uniforms['uTwist'].value) * lerpFactor;\n\n this._material.uniforms['uColorBase'].value.lerp(this.targetColorBase, lerpFactor);\n this._material.uniforms['uColorPeak'].value.lerp(this.targetColorPeak, lerpFactor);\n\n this._sphere.rotation.y = elapsedTime * 0.1;\n this._sphere.rotation.z = elapsedTime * 0.01;\n\n this._renderer.render(this._scene, this._camera);\n };\n\n /**\n * Vertex shader\n */\n private _getVertexShader(): string {\n return `\n uniform float uTime;\n uniform float uSpike; \n uniform float uNoiseScale; \n uniform float uSpeed; \n uniform float uTwist; \n uniform float uPulse; \n \n varying vec3 vColor;\n varying float vDisplacement;\n\n attribute float aRandom;\n\n // Simplex 3D Noise\n vec4 permute(vec4 x){return mod(((x*34.0)+1.0)*x, 289.0);}\n vec4 taylorInvSqrt(vec4 r){return 1.79284291400159 - 0.85373472095314 * r;}\n float snoise(vec3 v){ \n const vec2 C = vec2(1.0/6.0, 1.0/3.0);\n const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);\n vec3 i = floor(v + dot(v, C.yyy) );\n vec3 x0 = v - i + dot(i, C.xxx) ;\n vec3 g = step(x0.yzx, x0.xyz);\n vec3 l = 1.0 - g;\n vec3 i1 = min( g.xyz, l.zxy );\n vec3 i2 = max( g.xyz, l.zxy );\n vec3 x1 = x0 - i1 + 1.0 * C.xxx;\n vec3 x2 = x0 - i2 + 2.0 * C.xxx;\n vec3 x3 = x0 - 1.0 + 3.0 * C.xxx;\n i = mod(i, 289.0 ); \n vec4 p = permute( permute( permute( i.z + vec4(0.0, i1.z, i2.z, 1.0 )) + i.y + vec4(0.0, i1.y, i2.y, 1.0 )) + i.x + vec4(0.0, i1.x, i2.x, 1.0 ));\n float n_ = 1.0/7.0;\n vec3 ns = n_ * D.wyz - D.xzx;\n vec4 j = p - 49.0 * floor(p * ns.z *ns.z);\n vec4 x_ = floor(j * ns.z);\n vec4 y_ = floor(j - 7.0 * x_ );\n vec4 x = x_ *ns.x + ns.yyyy;\n vec4 y = y_ *ns.x + ns.yyyy;\n vec4 h = 1.0 - abs(x) - abs(y);\n vec4 b0 = vec4( x.xy, y.xy );\n vec4 b1 = vec4( x.zw, y.zw );\n vec4 s0 = floor(b0)*2.0 + 1.0;\n vec4 s1 = floor(b1)*2.0 + 1.0;\n vec4 sh = -step(h, vec4(0.0));\n vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ;\n vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ;\n vec3 p0 = vec3(a0.xy,h.x);\n vec3 p1 = vec3(a0.zw,h.y);\n vec3 p2 = vec3(a1.xy,h.z);\n vec3 p3 = vec3(a1.zw,h.w);\n vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));\n p0 *= norm.x; p1 *= norm.y; p2 *= norm.z; p3 *= norm.w;\n vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0);\n m = m * m;\n return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1), dot(p2,x2), dot(p3,x3) ) );\n }\n\n void main() {\n vec3 pos = position;\n float time = uTime * uSpeed;\n \n float angle = pos.y * uTwist;\n mat2 rot = mat2(cos(angle), -sin(angle), sin(angle), cos(angle));\n pos.xz *= rot;\n\n vec3 normal = normalize(pos);\n float noise = snoise(pos * uNoiseScale + time);\n \n float totalDisplacement = (noise * uSpike) + uPulse;\n pos += normal * totalDisplacement;\n \n vDisplacement = totalDisplacement;\n\n vec4 mvPosition = modelViewMatrix * vec4(pos, 1.0);\n \n gl_PointSize = (15.0 + totalDisplacement * 20.0) * (1.0 / -mvPosition.z);\n gl_PointSize *= (1.0 + sin(uTime * 5.0 + aRandom * 50.0) * 0.2);\n\n gl_Position = projectionMatrix * mvPosition;\n }\n `;\n }\n\n /**\n * Fragment shader\n */\n private _getFragmentShader(): string {\n return `\n varying float vDisplacement;\n uniform vec3 uColorBase; \n uniform vec3 uColorPeak;\n\n void main() {\n float dist = distance(gl_PointCoord, vec2(0.5));\n if (dist > 0.5) discard;\n float alpha = 1.0 - pow(dist * 2.0, 2.0);\n \n float mixValue = smoothstep(-0.2, 0.5, vDisplacement);\n vec3 finalColor = mix(uColorBase, uColorPeak, mixValue);\n\n gl_FragColor = vec4(finalColor, alpha * 0.9);\n }\n `;\n }\n}\n","import { Component, EventEmitter, inject, OnDestroy, OnInit, Output } from '@angular/core';\nimport { throttleTime } from 'rxjs';\nimport { SubSink } from 'subsink';\nimport { OrbComponent } from './components/orb-component/orb-component';\nimport { AudioService } from './services/audio/audio-service';\nimport { BridgeService } from './services/bridge/bridge-service';\nimport { ConfigService } from './services/config/config-service';\nimport { EventService } from './services/event/event-service';\nimport {\n RecordingEvent,\n SilenceEvent,\n SpeechEvent,\n WakeWordEvent,\n} from './services/event/event-service.type';\nimport { PlatformService } from './services/platform/platform-service';\n\n@Component({\n selector: 'wakeywakey',\n imports: [OrbComponent],\n template: '<app-orb-component (orbClick)=\"fireWakeWord()\" />',\n providers: [],\n})\nexport class WakeyWakeyComponent implements OnInit, OnDestroy {\n /**\n * Fires when library loaded. Emits bridge service event\n */\n @Output() ready = new EventEmitter<BridgeService>();\n\n /**\n * Fires when there is an error\n */\n @Output() exception = new EventEmitter<Error>();\n\n /**\n * Fires when speech is detected\n */\n @Output() speech = new EventEmitter<SpeechEvent>();\n\n /**\n * Fires when wake word is detected\n */\n @Output() wakeword = new EventEmitter<WakeWordEvent>();\n\n /**\n * Fires when recording starts (after wake word detection)\n */\n @Output() recording = new EventEmitter<RecordingEvent>();\n\n /**\n * Fires silence is detected\n */\n @Output() silence = new EventEmitter<SilenceEvent>();\n\n /**\n * Dependencies\n */\n private readonly _config = inject(ConfigService);\n\n /**\n * Dependencies\n */\n private readonly _platform = inject(PlatformService);\n private readonly _event = inject(EventService);\n private readonly _audio = inject(AudioService);\n private readonly _bridge = inject(BridgeService);\n\n /**\n * Subscriptions\n */\n private readonly _subs = new SubSink();\n\n ngOnInit(): void {\n // Execute pipeline\n this._execute();\n }\n\n /**\n * Fire face wakeword event\n */\n fireWakeWord() {\n this._event.wakeword.next({\n inferenceScore: 1,\n chunk: [],\n vadScore: 1,\n hasVoiceActivity: false,\n sample: new Float32Array(),\n rms: 0,\n db: 0,\n dbNormalized: 0,\n });\n }\n\n ngOnDestroy(): void {\n this._subs.unsubscribe();\n }\n\n /**\n * Execute\n */\n private async _execute() {\n // Check if browser\n if (this._platform.isServer) return;\n\n // Listen events\n this._listenEvents();\n\n // Init audio\n await this._audio.init();\n }\n\n /**\n * Listen events\n */\n private _listenEvents() {\n // Ready event\n this._subs.sink = this._event.ready.subscribe(() => {\n this.ready.emit(this._bridge);\n });\n\n // Exception event\n this._subs.sink = this._event.exception.subscribe((e) => {\n this.exception.emit(e);\n });\n\n // Speech event\n this._subs.sink = this._event.speech.subscribe((e) => {\n this.speech.emit(e);\n });\n\n // Wake word event\n this._subs.sink = this._event.wakeword\n .pipe(throttleTime(this._config.throttleTime))\n .subscribe((e) => {\n this.wakeword.emit(e);\n });\n\n // Recording event\n this._subs.sink = this._event.recording.subscribe((e) => {\n this.recording.emit(e);\n });\n\n // Silence event\n this._subs.sink = this._event.silence.subscribe((e) => {\n this.silence.emit(e);\n });\n }\n}\n","import { inject, provideAppInitializer } from '@angular/core';\nimport { env, InferenceSession } from 'onnxruntime-web';\nimport { OrbComponentService } from './lib/components/orb-component/orb-component-service';\nimport { AudioService } from './lib/services/audio/audio-service';\nimport { MicrophoneService } from './lib/services/audio/microphone-service/microphone-service';\nimport { SpeakerService } from './lib/services/audio/speaker-service/speaker-service';\nimport { SpeechRecognitionService } from './lib/services/audio/speech-recognition/speech-recognition-service';\nimport { VadService } from './lib/services/audio/vad-service/vad-service';\nimport { BridgeService } from './lib/services/bridge/bridge-service';\nimport { ConfigService } from './lib/services/config/config-service';\nimport { CONFIG, Config } from './lib/services/config/config-service.type';\nimport { EventService } from './lib/services/event/event-service';\nimport { ModelService } from './lib/services/model/model-service';\nimport { PipelineService } from './lib/services/pipeline/pipeline-service';\nimport { PlatformService } from './lib/services/platform/platform-service';\n\n/**\n * Provide wakey wakey configuration\n *\n * @param config Wakey Wakey configuration\n * @returns\n */\nexport function provideWakeyWakey(config: Config) {\n return [\n {\n provide: CONFIG,\n useValue: config,\n },\n ConfigService,\n MicrophoneService,\n SpeakerService,\n VadService,\n AudioService,\n PlatformService,\n EventService,\n PipelineService,\n SpeechRecognitionService,\n ModelService,\n BridgeService,\n OrbComponentService,\n provideAppInitializer(async () => {\n const _config = inject(ConfigService);\n const _model = inject(ModelService);\n const _platform = inject(PlatformService);\n const _mic = inject(MicrophoneService);\n\n if (_platform.isServer) return;\n\n // Set wasm path\n env.wasm.wasmPaths = _config.onnx.runtimePath ?? `${_config.basePath}/wasm/`;\n\n const modelPath: string[] = [\n _config.onnx.model.melspectrogram ?? `${_config.basePath}/models/melspectrogram.onnx`,\n _config.onnx.model.embedding_model ?? `${_config.basePath}/models/embedding_model.onnx`,\n _config.onnx.model.silero_vad ?? `${_config.basePath}/models/silero_vad_v4.onnx`,\n _config.onnx.model.wakeword,\n ];\n\n // Create sessions\n const sessions = await Promise.all([\n ...Object.values(modelPath).map((path) =>\n InferenceSession.create(path, { executionProviders: ['wasm'] }),\n ),\n _mic.init(),\n ]);\n\n if (!sessions[4]) throw new Error('Failed to initialize mic!');\n\n // set sessions\n _model.session = {\n melspectrogram: sessions[0] as InferenceSession,\n embedding_model: sessions[1] as InferenceSession,\n silero_vad: sessions[2] as InferenceSession,\n wakeword: sessions[3] as InferenceSession,\n };\n }),\n ];\n}\n","/// <reference path=\"./index.d.ts\" />\n\n/*\n * Public API Surface of wakeywakey\n */\nexport type { AgentState as WakeyWakeyAgentState } from './lib/components/orb-component/orb-component.type';\n\nexport * from './lib/services';\nexport * from './lib/wakeywakey-component';\nexport * from './provider';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/index.d.ts
CHANGED
|
@@ -4,20 +4,6 @@ import { OnDestroy, InjectionToken, OnInit, EventEmitter } from '@angular/core';
|
|
|
4
4
|
import * as _prabhjeet_me_wakeywakey from '@prabhjeet.me/wakeywakey';
|
|
5
5
|
import { InferenceSession } from 'onnxruntime-web';
|
|
6
6
|
|
|
7
|
-
/**
|
|
8
|
-
* Audio utility
|
|
9
|
-
*/
|
|
10
|
-
declare class AudioUtil {
|
|
11
|
-
/**
|
|
12
|
-
* Create wav blob url from audio chunk
|
|
13
|
-
*
|
|
14
|
-
* @param chunks Audio chunk
|
|
15
|
-
* @param sampleRate Sample rate
|
|
16
|
-
* @returns
|
|
17
|
-
*/
|
|
18
|
-
static createWavBlob(chunks: Float32Array[], sampleRate?: number): string | null;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
7
|
interface OrbConfig {
|
|
22
8
|
/**
|
|
23
9
|
* Height and width (px)
|
|
@@ -41,6 +27,20 @@ interface OrbConfig {
|
|
|
41
27
|
}
|
|
42
28
|
type AgentState = 'idle' | 'initialized' | 'listening' | 'thinking' | 'speaking';
|
|
43
29
|
|
|
30
|
+
/**
|
|
31
|
+
* Audio utility
|
|
32
|
+
*/
|
|
33
|
+
declare class AudioUtil {
|
|
34
|
+
/**
|
|
35
|
+
* Create wav blob url from audio chunk
|
|
36
|
+
*
|
|
37
|
+
* @param chunks Audio chunk
|
|
38
|
+
* @param sampleRate Sample rate
|
|
39
|
+
* @returns
|
|
40
|
+
*/
|
|
41
|
+
static createWavBlob(chunks: Float32Array[], sampleRate?: number): string | null;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
44
|
declare class OrbComponentService {
|
|
45
45
|
readonly state: Subject<AgentState>;
|
|
46
46
|
/**
|
|
@@ -870,4 +870,4 @@ declare function provideWakeyWakey(config: Config): (typeof OrbComponentService
|
|
|
870
870
|
})[];
|
|
871
871
|
|
|
872
872
|
export { CONFIG as WAKEYWAKEY_CONFIG, AudioUtil as WakeyWakeyAudioUtil, BridgeService as WakeyWakeyBridgeService, WakeyWakeyComponent, provideWakeyWakey };
|
|
873
|
-
export type { AudioConfig as WakeyWakeyAudioConfig, Config as WakeyWakeyConfig, OnnxConfig as WakeyWakeyOnnxConfig, RecordingEvent as WakeyWakeyRecordingEvent, SilenceEvent as WakeyWakeySilenceEvent, SpeechEvent as WakeyWakeySpeechEvent, WakeWordEvent as WakeyWakeyWordEvent };
|
|
873
|
+
export type { AgentState as WakeyWakeyAgentState, AudioConfig as WakeyWakeyAudioConfig, Config as WakeyWakeyConfig, OnnxConfig as WakeyWakeyOnnxConfig, RecordingEvent as WakeyWakeyRecordingEvent, SilenceEvent as WakeyWakeySilenceEvent, SpeechEvent as WakeyWakeySpeechEvent, WakeWordEvent as WakeyWakeyWordEvent };
|