# VadText 用于实现语音识别(ASR)功能的复合控件,结合了麦克风音频采集、端点检测(VAD)、音频播放和文本显示功能。用户点击按钮开始录音,当检测到语音结束时自动发送音频至后端进行识别,并将识别结果实时追加显示在文本区域中。 **类型:** 普通控件(继承自 `bricks.VBox`) --- ## 主要方法 - `start()` 启动语音识别流程,初始化 MicVAD 实例并开始监听麦克风输入。 - `_start()` *(async)* 异步内部方法,创建 `MicVAD` 实例并设置 `onSpeechEnd` 回调,在检测到语音结束后触发 `audio_ready` 事件。 - `stop()` 停止当前的语音识别过程,暂停 VAD 并清理状态。 - `_stop()` *(async)* 异步停止逻辑,调用 VAD 的 `pause()` 方法,清除引用,并在有文本内容时派发 `changed` 事件。 - `toggle_status()` 切换录音状态:若正在录音则停止,否则启动录音。 - `handle_audio(audio)` *(async)* 处理 VAD 捕获的音频数据: - 将 `Float32Array` 格式的音频转换为 WAV ArrayBuffer - 编码为 Base64 数据 URL 并在内嵌播放器中播放 - 发送 Base64 音频到指定 URL 进行 ASR 识别 - 更新识别文本并触发界面刷新 - `arrayBufferToBase64(buffer)` 将 ArrayBuffer 转换为 Base64 字符串,用于构建 `data:` URL。 - `getValue()` 获取当前控件的输出值,返回一个对象,键为 `this.name`,值为累计识别文本。 --- ## 主要事件 - `audio_ready` 当 VAD 检测到一段语音结束并捕获音频数据后触发,携带原始音频数据(`Float32Array`),用于后续处理。 - `changed` 当一次录音完成且识别出文本内容不为空时触发,携带当前完整识别结果(通过 `getValue()` 获取)。通常用于表单提交或数据同步。 --- ## 源码例子 ```json { "id": "vad_text_widget", "widgettype": "VadText", "options": { "url": "/api/asr/recognize", // ASR服务接口地址 "model": "whisper-small", // 可选模型参数 "name": "user_speech" // 表单字段名,getValue时使用 }, "binds": [ { "actiontype": "event", "wid": "vad_text_widget", "event": "changed", "target": "form_container", "dispatch_event": "field_changed", "params": { "source": "vad_text_widget" }, "rtdata": { "component": "asr_input" } }, { "actiontype": "bricks", "wid": "vad_text_widget", "event": "audio_ready", "target": "status_label", "mode": "replace", "options": { "widgettype": "Label", "options": { "text": "正在识别..." } } } ] } ``` > **注释说明:** > - `widgettype: "VadText"` 是注册过的自定义控件。 > - `options.url` 是必须项,指向后端提供 ASR 功能的 API 接口。 > - `binds` 中第一个绑定监听 `changed` 事件,向父容器派发 `field_changed` 自定义事件,可用于通知表单更新。 > - 第二个绑定在 `audio_ready` 触发时替换某个标签控件的内容,提示“正在识别”,增强用户体验。 > - 此控件适合嵌入表单、语音助手、语音输入等场景。