59 lines
1.7 KiB
TypeScript
59 lines
1.7 KiB
TypeScript
|
|
// ============================================================
|
|||
|
|
// EdgeProcessor — 边缘预处理(VAD + 关键帧检测)
|
|||
|
|
// 职责:浏览器端语音活动检测、关键帧筛选
|
|||
|
|
// 技术:@ricky0123/vad-web(VAD)、ONNX Runtime Web(关键帧检测)
|
|||
|
|
// ============================================================
|
|||
|
|
|
|||
|
|
import { useCallback, useState } from "react";
|
|||
|
|
|
|||
|
|
export interface VADOptions {
|
|||
|
|
/** 语音结束回调,携带录音 Float32Array */
|
|||
|
|
onSpeechEnd?: (audio: Float32Array) => void;
|
|||
|
|
/** 语音开始回调 */
|
|||
|
|
onSpeechStart?: () => void;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export function useVAD(_options?: VADOptions) {
|
|||
|
|
const [isSpeaking] = useState(false);
|
|||
|
|
// TODO: 初始化 @ricky0123/vad-web,加载后设为 true
|
|||
|
|
const isReady = false;
|
|||
|
|
|
|||
|
|
// TODO: 实现 VAD 初始化
|
|||
|
|
// 1. 加载 @ricky0123/vad-web
|
|||
|
|
// 2. 配置 VAD 参数(阈值、最小语音时长等)
|
|||
|
|
// 3. 连接麦克风 stream
|
|||
|
|
// 4. 在 onSpeechEnd 时收集音频并回调 _options.onSpeechEnd
|
|||
|
|
|
|||
|
|
const start = useCallback(() => {
|
|||
|
|
// TODO: 启动 VAD 监听
|
|||
|
|
}, []);
|
|||
|
|
|
|||
|
|
const stop = useCallback(() => {
|
|||
|
|
// TODO: 停止 VAD 监听
|
|||
|
|
}, []);
|
|||
|
|
|
|||
|
|
return { isSpeaking, isReady, start, stop };
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ---- 关键帧检测(ONNX Runtime Web)----
|
|||
|
|
|
|||
|
|
export function useKeyframeDetection() {
|
|||
|
|
// TODO: 加载 ONNX 模型后设为 true
|
|||
|
|
const isReady = false;
|
|||
|
|
|
|||
|
|
// TODO: 实现关键帧检测
|
|||
|
|
// 1. 加载 ONNX 模型
|
|||
|
|
// 2. 对比当前帧与上一帧的像素差异
|
|||
|
|
// 3. 超过阈值则判定为关键帧
|
|||
|
|
|
|||
|
|
const isKeyframe = useCallback(
|
|||
|
|
(_currentFrame: ImageData, _previousFrame: ImageData): boolean => {
|
|||
|
|
// TODO: 实现像素差异对比
|
|||
|
|
return true; // 暂时所有帧都视为关键帧
|
|||
|
|
},
|
|||
|
|
[],
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
return { isReady, isKeyframe };
|
|||
|
|
}
|