fix(voice): PTT 改为主交互——按住说话松开发送(修 PTT 形同虚设的 bug)
VAD 自动断句在真实环境不够稳(环境音/停顿都会误触发),改回按住说话。 修掉 PTT 之前根本不生效的三处: - keydown 里 `if (!c) return`——用户没先点过麦克风按钮时 clientRef 为 null, 按空格什么都不发生。改为懒建客户端(keydown 本身就是用户手势,可启 AudioContext) - 被 `!inConversation()` 挡着:一旦点过麦进了连续对话,PTT 永久失效。改为 PTT 优先, 必要时先退出对话模式 - 缺 e.repeat 守卫:按住不放会连发 keydown 交互统一为一套 PTT 语义: - 按住空格 / 按住麦克风按钮(pointer 事件,覆盖鼠标触控) → 说话,松开发送 - 朗读中按按钮 = 打断 - 指针滑出/取消/窗口失焦都算松开,不会卡在录音态 - 录音中按钮变红缩小 + 电平条 + 呼吸环,一眼可见"正在听" 顺带:松开后标签改为"已停止收音"(准确说法——麦克风硬件仍开着以便快速重按, 只是不再上传音频,门控在 shouldSendMic);删掉已无人使用的 micTapAction 及其单测。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -34,15 +34,6 @@ export function nextAfterDrain(conversation: boolean): VoiceState {
|
||||
return conversation ? "listening" : "ready";
|
||||
}
|
||||
|
||||
// micTapAction:点按麦克风的语义(对话开关)。
|
||||
// 聆听中点 → 退出对话;朗读中点(在对话里)→ 打断但留在对话;其余 → 开始对话。
|
||||
export type MicTapAction = "start" | "stop" | "interrupt";
|
||||
export function micTapAction(state: VoiceState, inConversation: boolean): MicTapAction {
|
||||
if (state === "listening") return "stop";
|
||||
if (state === "speaking" && inConversation) return "interrupt";
|
||||
return "start";
|
||||
}
|
||||
|
||||
// 健壮性定时器时长(仅对话模式生效)
|
||||
const IDLE_EXIT_MS = 30_000; // 聆听空转:30s 无任何转写 → 自动退出对话(防 ASR 长连接白烧计费)
|
||||
const THINK_WATCHDOG_MS = 90_000; // 思考看门狗:final 后 90s 没等到朗读 → 回聆听继续对话
|
||||
|
||||
Reference in New Issue
Block a user