@prabhjeet.me/wakeywakey 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +104 -0
- package/assets/models/alexa_v0.1.onnx +0 -0
- package/assets/models/embedding_model.onnx +0 -0
- package/assets/models/hey_jarvis_v0.1.onnx +0 -0
- package/assets/models/hey_marvin_v0.1.onnx +0 -0
- package/assets/models/hey_mycroft_v0.1.onnx +0 -0
- package/assets/models/melspectrogram.onnx +0 -0
- package/assets/models/silero_vad_v4.onnx +0 -0
- package/assets/sounds/down.mp3 +0 -0
- package/assets/sounds/up.mp3 +0 -0
- package/assets/wasm/ort-wasm-simd-threaded.asyncify.mjs +116 -0
- package/assets/wasm/ort-wasm-simd-threaded.asyncify.wasm +0 -0
- package/assets/wasm/ort-wasm-simd-threaded.jsep.mjs +106 -0
- package/assets/wasm/ort-wasm-simd-threaded.jsep.wasm +0 -0
- package/assets/wasm/ort-wasm-simd-threaded.jspi.mjs +110 -0
- package/assets/wasm/ort-wasm-simd-threaded.jspi.wasm +0 -0
- package/assets/wasm/ort-wasm-simd-threaded.mjs +59 -0
- package/assets/wasm/ort-wasm-simd-threaded.wasm +0 -0
- package/assets/wasm/rnnoise.wasm +0 -0
- package/assets/wasm/rnnoise_simd.wasm +0 -0
- package/assets/worklets/workletProcessor.js +13 -0
- package/fesm2022/prabhjeet.me-wakeywakey.mjs +1411 -0
- package/fesm2022/prabhjeet.me-wakeywakey.mjs.map +1 -0
- package/index.d.ts +675 -0
- package/package.json +28 -0
|
@@ -0,0 +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/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/speaker-service/speaker-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/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 { 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: [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';\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/**\n * Wakey wakey config token\n */\nexport const CONFIG = new InjectionToken<Config>('WAKEYWAKEY_CONFIG');\n","import { inject, Injectable } from '@angular/core';\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;\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","import { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { 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<void>();\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 * 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;\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 * Audio context\n */\n private _audioContext?: AudioContext;\n\n constructor() {\n // Init mic\n this._init();\n }\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 * 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 }\n\n /**\n * Initialize\n *\n * @param deviceId Input device id (from microphone list)\n */\n private async _init(deviceId?: string) {\n try {\n // cleanup\n this.ngOnDestroy();\n\n // request permission\n this._stream = await navigator.mediaDevices.getUserMedia({\n audio: !deviceId\n ? {\n noiseSuppression: false,\n echoCancellation: false,\n }\n : { deviceId: { exact: deviceId } },\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 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 * Save 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 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 const 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 source.connect(rnnoiseNode);\n rnnoiseNode.connect(gainNode);\n } else {\n source.connect(gainNode);\n }\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 { SubSink } from 'subsink';\nimport { ConfigService } from '../../config/config-service';\nimport { EventService } from '../../event/event-service';\nimport { PlatformService } from '../../platform/platform-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\n private readonly _subs = new SubSink();\n\n private _upSound!: HTMLAudioElement;\n private _downSound!: HTMLAudioElement;\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 this._upSound = new Audio(\n this._config.audio.sound?.up ?? `${this._config.basePath}/sounds/up.mp3`,\n );\n this._downSound = new Audio(\n this._config.audio.sound?.down ?? `${this._config.basePath}/sounds/down.mp3`,\n );\n\n this._upSound.preload = this._downSound.preload = 'auto';\n\n this._loadSubscriptions();\n }\n }\n\n ngOnDestroy(): void {\n this._subs.unsubscribe();\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 * Load subscriptions\n */\n private _loadSubscriptions() {\n this._subs.sink = this._event.wakeword.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 });\n }\n}\n","import { inject, Injectable, OnDestroy } from '@angular/core';\nimport { EventService } from '../../event/event-service';\nimport { PlatformService } from '../../platform/platform-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\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 // 3. Handle Results\n this._recognition.onresult = (event) => {\n this._transcript = '';\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 delay,\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 } from './audio-service.const';\nimport { MicrophoneService } from './microphone-service/microphone-service';\nimport { SpeakerService } from './speaker-service/speaker-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 __speaker = inject(SpeakerService); // Initialize\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 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 vadScore: await this._vad.score(data.sample),\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\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 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(\n ({ score }) =>\n 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\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 for 1 second ---\n const continuousVadTrigger$ = this._event.speech.pipe(\n map((s) => s.vadScore > VAD_THRESHOLD),\n filter(() => !this._isRecording && this._isInitialized), // Ignore and prevent background buffering if already recording\n distinctUntilChanged(),\n switchMap((isVoiceActive) => {\n if (!isVoiceActive) return EMPTY; // Cancel if voice stops\n\n this._speechRecognition.reset();\n\n const bufferedChunks: Float32Array[] = [];\n\n // 1. Accumulate audio chunks silently\n const buffer$ = this._event.speech.pipe(\n tap((s) => bufferedChunks.push(s.sample)),\n ignoreElements(), // Prevents this stream from emitting down the pipe\n );\n\n // 2. Timer that emits the accumulated chunks after 1 second\n const timer$ = timer(300).pipe(map(() => bufferedChunks));\n\n // Merge both. If the timer fires, take(1) stops the buffer$ stream.\n // If isVoiceActive turns false before 1s, switchMap cancels both.\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 throttleTime(1000), // Prevent double-firing if wakeword and voice overlap\n );\n\n // --- MAIN RECORDING PIPELINE ---\n this._subs.sink = startRecordingTrigger$\n .pipe(\n tap(() => {\n this._isRecording = true;\n this._speechRecognition.reset();\n this._event.recording.next(); // recording event\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 tap((speech) => commandChunks.push(speech.sample)),\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 // 1. Normal silence timeout logic\n const normalSilenceTimeout$ = silence$.pipe(\n delay(500),\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 // 2. Force complete logic checking the variable\n const forceComplete$ = speech$.pipe(filter(() => this._endCurrentRecording));\n\n // 3. Complete whenever the timer fires OR the flag is set to true\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 = this._config.mode === 'DEFAULT' ? 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') {\n this._isInitialized = false;\n this._endCurrentRecording = false; // reset flag after recording ends\n }\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 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 {\n Component,\n ElementRef,\n HostListener,\n inject,\n OnChanges,\n OnDestroy,\n OnInit,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport { SubSink } from 'subsink';\nimport * as THREE from 'three';\nimport { AudioService } from '../../services/audio/audio-service';\nimport { ConfigService } from '../../services/config/config-service';\nimport { EventService } from '../../services/event/event-service';\nimport { PlatformService } from '../../services/platform/platform-service';\n\n@Component({\n selector: 'app-orb-component',\n standalone: true,\n template: `<div\n #rendererContainer\n tabindex=\"0\"\n role=\"button\"\n class=\"orb-viewport\"\n [style.height]=\"orbSize\"\n [style.width]=\"orbSize\"\n (click)=\"toggleRecording()\"\n (keypress)=\"toggleRecording()\"\n ></div>`,\n styles: [\n `\n .orb-viewport {\n background: transparent;\n cursor: pointer;\n }\n `,\n ],\n})\nexport class OrbComponent implements OnInit, OnChanges, OnDestroy {\n @ViewChild('rendererContainer', { static: true }) rendererContainer!: ElementRef;\n\n private readonly _config = inject(ConfigService);\n private readonly _platform = inject(PlatformService);\n private readonly _audio = inject(AudioService);\n private readonly _event = inject(EventService);\n\n private readonly _subs = new SubSink();\n\n private renderer!: THREE.WebGLRenderer;\n private scene!: THREE.Scene;\n private camera!: THREE.PerspectiveCamera;\n private orb!: THREE.Mesh;\n private originalVertices: Float32Array | null = null;\n private animationId!: number;\n private targetIntensity = 0;\n private currentIntensity = 0;\n private clock = new THREE.Timer();\n private elapsedTime = 0;\n\n /**\n * Should orb be reacting to speech\n */\n private _isActive = false;\n\n get isRecording() {\n return this._audio.isRecording;\n }\n\n get orbSize() {\n return this._config.orb?.size ?? 400;\n }\n\n /**\n * Change color or orb\n *\n * @param color\n * @param emissive\n */\n changeColor(color: THREE.Color, emissive: THREE.Color) {\n const material = this.orb.material as THREE.MeshStandardMaterial;\n\n material.color = color;\n material.emissive = emissive;\n }\n\n /**\n * Toggle recording\n */\n toggleRecording() {\n this._audio.toggleRecording();\n }\n\n ngOnInit() {\n if (this._platform.isServer) return;\n\n this._init();\n this._animate();\n\n this._loadSubscribers();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (this._platform.isServer) return;\n\n if (changes['intensity']) {\n this.targetIntensity = changes['intensity'].currentValue;\n }\n }\n\n ngOnDestroy() {\n if (this._platform.isServer) return;\n\n cancelAnimationFrame(this.animationId);\n this.renderer.dispose();\n this.orb.geometry.dispose();\n (this.orb.material as THREE.Material).dispose();\n\n this._subs.unsubscribe();\n }\n\n @HostListener('window:keydown.Space', ['$event'])\n handleSpacebarPress(event: Event): void {\n event.preventDefault(); // Prevents the default space bar action (e.g., scrolling)\n this.toggleRecording();\n }\n\n /**\n * Initialize\n */\n private _init() {\n this.scene = new THREE.Scene();\n this.camera = new THREE.PerspectiveCamera(45, 1, 0.1, 1000);\n this.camera.position.z = 3;\n\n this.renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });\n this.renderer.setPixelRatio(window.devicePixelRatio);\n this.rendererContainer.nativeElement.appendChild(this.renderer.domElement);\n\n // Initial resize to fit container\n this._resize();\n\n // Orb Geometry (Icosahedron for organic detail)\n const geometry = new THREE.IcosahedronGeometry(1.2, 32);\n this.originalVertices = geometry.attributes['position'].array.slice() as Float32Array;\n\n const material = new THREE.MeshStandardMaterial({\n color: 'red',\n wireframe: true,\n transparent: true,\n opacity: 0.6,\n emissive: 'red',\n emissiveIntensity: 0.5,\n });\n\n this.orb = new THREE.Mesh(geometry, material);\n this.scene.add(this.orb);\n\n const light = new THREE.PointLight(0xffffff, 15, 10);\n light.position.set(2, 2, 2);\n this.scene.add(light);\n this.scene.add(new THREE.AmbientLight(0x404040));\n }\n\n /**\n * Animate\n */\n private _animate = () => {\n this.animationId = requestAnimationFrame(this._animate);\n\n // 1. Get the time passed since the last frame (delta)\n const delta = this.clock.getDelta();\n\n // 2. Smoothly update currentIntensity\n this.currentIntensity += (this.targetIntensity - this.currentIntensity) * 0.05;\n\n // 3. Increment our own elapsedTime ticker.\n // We multiply delta by intensity so the pulse speeds up when busy,\n // but it won't \"run away\" as performance.now() grows.\n const speedFactor = 1 + this.currentIntensity / 20;\n this.elapsedTime += delta * speedFactor;\n\n // 4. Rotation (Constant per frame, scaled by intensity)\n this.orb.rotation.y += 0.005 + this.currentIntensity / 5000;\n this.orb.rotation.z += 0.002;\n\n // 5. Vertex Displacement\n const positionAttribute = this.orb.geometry.getAttribute('position');\n\n for (let i = 0; i < positionAttribute.count; i++) {\n const ix = i * 3;\n const iy = i * 3 + 1;\n const iz = i * 3 + 2;\n\n const x = this.originalVertices![ix];\n const y = this.originalVertices![iy];\n const z = this.originalVertices![iz];\n\n // We use this.elapsedTime instead of performance.now()\n // This creates a stable frequency regardless of how long the app has been open\n const wave =\n Math.sin(x * 2 + this.elapsedTime) *\n Math.cos(y * 2 + this.elapsedTime) *\n (this.currentIntensity / 300);\n\n const currentRadius = Math.sqrt(x * x + y * y + z * z) + wave;\n const finalScale = Math.min(currentRadius, 2.5) / 1.5;\n\n positionAttribute.setXYZ(i, x * finalScale, y * finalScale, z * finalScale);\n }\n\n positionAttribute.needsUpdate = true;\n\n // Optional: Update material feedback based on intensity\n const material = this.orb.material as THREE.MeshStandardMaterial;\n material.emissiveIntensity = 0.2 + this.currentIntensity / 100;\n material.opacity = 0.3 + this.currentIntensity / 200;\n\n this.renderer.render(this.scene, this.camera);\n };\n\n /**\n * Resize container\n */\n private _resize() {\n const width = this.orbSize ?? this.rendererContainer.nativeElement.clientWidth;\n const height = this.orbSize ?? this.rendererContainer.nativeElement.clientHeight;\n this.renderer.setSize(width, height);\n this.camera.aspect = width / height;\n this.camera.updateProjectionMatrix();\n }\n\n /**\n * Subscriptions\n */\n private _loadSubscribers() {\n // Speech event\n this._subs.sink = this._event.speech.subscribe((e) => {\n if (this._isActive) this.targetIntensity = e.dbNormalized * 100;\n else this.targetIntensity = 0;\n });\n\n // Wake word event\n this._subs.sink = this._event.wakeword.subscribe(() => {\n this.changeColor(new THREE.Color(0x00d2ff), new THREE.Color(0x0066ff));\n\n this._isActive = true;\n });\n\n // Silence\n this._subs.sink = this._event.silence.subscribe((ev) => {\n if (!ev.interimResponse) {\n // on silence, set color to red\n this.changeColor(new THREE.Color('red'), new THREE.Color('red'));\n this._isActive = false;\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 { ConfigService } from './services/config/config-service';\nimport { EventService } from './services/event/event-service';\nimport { SilenceEvent, SpeechEvent, WakeWordEvent } from './services/event/event-service.type';\nimport { ModelService } from './services/model/model-service';\nimport { PlatformService } from './services/platform/platform-service';\n\nconst DEFAULT_THROTTLE_TIME = 1000;\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\n */\n @Output() ready = new EventEmitter<void>();\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<void>();\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 _model = inject(ModelService);\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((e) => {\n this.ready.emit(e);\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 ?? DEFAULT_THROTTLE_TIME))\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 { 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 { 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 provideAppInitializer(async () => {\n const _config = inject(ConfigService);\n const _model = inject(ModelService);\n const _platform = inject(PlatformService);\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 );\n\n // set sessions\n _model.session = {\n melspectrogram: sessions[0],\n embedding_model: sessions[1],\n silero_vad: sessions[2],\n wakeword: sessions[3],\n };\n }),\n ];\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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"}
|