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
TypeScript
/**
* 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