## ADDED Requirements ### Requirement: Audio recording lifecycle 录音 composable SHALL 管理完整的录音生命周期:请求权限 → 开始录音 → 录音中 → 停止录音 → 返回音频 Blob。 #### Scenario: Successful recording - **WHEN** 用户点击录音按钮且浏览器麦克风权限已授予 - **THEN** MediaRecorder 开始采集音频,`isRecording` 状态变为 `true`,录音计时器开始计时 #### Scenario: Stop recording - **WHEN** 用户点击停止录音按钮 - **THEN** MediaRecorder 停止采集,收集到的 audio chunks 合并为 Blob,通过回调或返回值提供给调用方 ### Requirement: Microphone permission handling 系统 SHALL 在首次录音时请求麦克风权限,并优雅处理权限拒绝场景。 #### Scenario: Permission granted - **WHEN** 用户首次点击录音按钮且浏览器弹出权限请求 - **THEN** 用户授权后开始录音,`permissionState` 变为 `granted` #### Scenario: Permission denied - **WHEN** 用户拒绝麦克风权限 - **THEN** `permissionState` 变为 `denied`,UI 显示引导提示(如何在浏览器设置中开启权限),录音按钮保持可点击但点击后显示提示 #### Scenario: Permission previously granted - **WHEN** 用户之前已授权且再次进入页面 - **THEN** 直接开始录音,无权限弹窗 ### Requirement: Audio format compatibility 录音 composable SHALL 自动选择浏览器支持的最佳音频格式。 #### Scenario: Browser supports webm - **WHEN** `MediaRecorder.isTypeSupported('audio/webm;codecs=opus')` 返回 true - **THEN** 使用 `audio/webm` 格式录制 #### Scenario: Browser does not support webm (Safari) - **WHEN** webm 不被支持 - **THEN** fallback 到 `audio/mp4` 或 `audio/wav` ### Requirement: Silence detection 录音过程中系统 SHALL 检测长时间沉默并给出提示。 #### Scenario: Silence detected - **WHEN** 录音开始后连续 5 秒未检测到有效语音输入 - **THEN** 显示沉默提示浮层,包含鼓励性的句子提示 #### Scenario: User resumes speaking - **WHEN** 沉默提示显示后用户开始说话 - **THEN** 沉默提示自动消失 ### Requirement: Recording timer 录音过程中 SHALL 显示实时录音时长。 #### Scenario: Timer counting - **WHEN** 录音正在进行 - **THEN** 状态栏显示已录音秒数,每秒更新一次 #### Scenario: Timer reset - **WHEN** 录音停止 - **THEN** 录音计时器归零 ### Requirement: Resource cleanup 录音相关的资源 SHALL 在组件卸载时完全释放。 #### Scenario: Component unmount during recording - **WHEN** 用户在录音过程中离开页面(组件 unmount) - **THEN** 系统自动停止 MediaRecorder、释放 MediaStream tracks、清除定时器