UNPKG

web-asr-core

Version:

WebASR Core - Browser-based speech processing with VAD, WakeWord and Whisper - Unified all-in-one version

193 lines 5.54 kB
/** * WakewordService - Wake Word 服務類別(Event Architecture v2) * * 提供事件驅動的喚醒詞檢測服務 * 支援多個喚醒詞模型的並行檢測 */ import { EventEmitter } from '../core/EventEmitter'; import { AudioRingBuffer } from '../utils/AudioRingBuffer'; import type { WakewordState, WakewordParams, WakewordResult } from '../types'; /** * Wake Word 服務特定選項 */ export interface WakewordServiceOptions { /** 每個喚醒詞的自訂闾值 */ thresholds?: Record<string, number>; /** 檢測到後是否自動重置 */ resetOnDetection?: boolean; } /** * Wake Word 服務事件定義 */ export interface WakewordEvents { ready: { models: string[]; config: { sampleRate: number; chunkSize: number; }; timestamp: number; }; wakewordDetected: { word: string; score: number; timestamp: number; }; process: { word: string; scores: number[]; maxScore: number; timestamp: number; }; statistics: { chunksProcessed: Map<string, number>; averageProcessingTime: Map<string, number>; detectionCounts: Map<string, number>; }; error: { error: Error; context: string; wakeword?: string; timestamp: number; }; } /** * WakewordService - 事件驅動的喚醒詞檢測服務 * * @example * ```typescript * const wakeword = new WakewordService(); * // 或使用自訂選項 * const wakeword = new WakewordService({ * thresholds: { 'hey-jarvis': 0.6 } * }); * * // 訂閱事件 * wakeword.on('wakewordDetected', ({ word, score }) => { * console.log(`Wake word detected: ${word} (score: ${score})`); * }); * * // 初始化多個喚醒詞 * await wakeword.initialize(['hey-jarvis', 'alexa']); * * // 處理音訊 * let state = wakeword.createState(); * const params = wakeword.createParams('hey-jarvis'); * * const result = await wakeword.process(state, audioChunk, params); * state = result.state; * ``` */ export declare class WakewordService extends EventEmitter<WakewordEvents> { private sessions; private chunkers; private config; private options; private customModels; private stats; private cooldownTimers; private cooldownDuration; constructor(options?: WakewordServiceOptions); /** * 初始化喚醒詞服務 * @param models 要載入的喚醒詞模型列表 * @returns Promise<void> */ initialize(models?: string[]): Promise<void>; /** * 處理單個音訊塊 * @param state Wake word 狀態 * @param audio 音訊資料(1280 樣本 @ 16kHz) * @param params Wake word 參數 * @returns Wake word 結果 */ process(state: WakewordState, audio: Float32Array, params: WakewordParams & { wakeword: string; }): Promise<WakewordResult>; /** * 處理連續音訊流(單一喚醒詞) * @param ringBuffer 環形緩衝區 * @param state Wake word 狀態 * @param params Wake word 參數 * @returns 更新後的狀態 */ processStream(ringBuffer: AudioRingBuffer, state: WakewordState, params: WakewordParams & { wakeword: string; }): Promise<WakewordState>; /** * 處理多個喚醒詞的並行檢測 * @param audio 音訊資料 * @param states 各喚醒詞的狀態對映 * @param paramsList 各喚醒詞的參數列表 * @returns 更新後的狀態對映和檢測結果 */ processMultiple(audio: Float32Array, states: Map<string, WakewordState>, paramsList: (WakewordParams & { wakeword: string; })[]): Promise<{ states: Map<string, WakewordState>; detections: Array<{ word: string; score: number; }>; }>; /** * 創建 Wake word 狀態 * @param wakewordName 喚醒詞名稱(可選,用於自訂模型) * @returns 新的 Wake word 狀態 */ createState(wakewordName?: string): WakewordState; /** * 創建 Wake word 參數 * @param wakeword 喚醒詞名稱 * @param overrides 參數覆蓋 * @returns Wake word 參數 */ createParams(wakeword: string, overrides?: Partial<WakewordParams>): WakewordParams & { wakeword: string; }; /** * 創建喚醒詞參數(內部使用) */ private createWakewordParams; /** * 註冊自訂喚醒詞模型 * @param name 自訂模型名稱 * @param modelUrl Blob URL 或模型路徑 * @returns Promise<void> */ registerCustomModel(name: string, modelUrl: string): Promise<void>; /** * 移除自訂喚醒詞模型 * @param name 自訂模型名稱 */ removeCustomModel(name: string): void; /** * 獲取已載入的喚醒詞列表 * @returns 喚醒詞名稱陣列 */ getLoadedModels(): string[]; /** * 設置冷卻期時長 * @param duration 冷卻期時長(毫秒) */ setCooldownDuration(duration: number): void; /** * 重置服務狀態 * @param wakeword 指定要重置的喚醒詞(可選,不指定則重置所有) */ reset(wakeword?: string): void; /** * 更新統計資料 */ private updateStatistics; /** * 重置統計資料 */ private resetStatistics; /** * 清理資源 */ dispose(): void; } export default WakewordService; //# sourceMappingURL=WakewordService.d.ts.map