|
|
393e26e8de
|
fix: 允许服务端为缺失 sessionId 自动生成会话ID
|
2026-03-06 07:02:08 +08:00 |
|
|
|
b309dca688
|
feat: 增强弱网与断线场景下的移动端交互反馈
|
2026-03-06 06:54:51 +08:00 |
|
|
|
5a817e6646
|
refactor: 重构录音启动流程并接入会话序列发送
|
2026-03-06 06:54:36 +08:00 |
|
|
|
f78c022f75
|
refactor: 使用 PartySocket 重构连接韧性并库化音频封包
|
2026-03-06 06:54:20 +08:00 |
|
|
|
7cf48246f2
|
refactor: 重构后端会话状态机并接入 MessagePack 音频解包
|
2026-03-06 06:54:07 +08:00 |
|
|
|
df2cf549c9
|
refactor: 统一实时协议类型并扩展会话状态字段
|
2026-03-06 06:53:50 +08:00 |
|
|
|
669bfac722
|
refactor: 使用 @picovoice/web-voice-processor 替换手写音频采集管线
- 引入 WebVoiceProcessor 处理 getUserMedia、AudioContext 生命周期和 WASM 重采样
- 删除自定义 AudioWorklet (audio-processor.ts) 和线性插值重采样器 (resample.ts)
- 改善音频采集稳定性:自动检测 AudioContext suspended/closed 状态并重建
- 更精确的错误提示:区分权限拒绝、设备未找到、设备异常
|
2026-03-02 07:42:45 +08:00 |
|
|
|
677ef35ff7
|
feat: 集成 React Compiler,自动优化组件 memoization
|
2026-03-02 07:20:27 +08:00 |
|
|
|
fc34989eaa
|
fix: 修复 iOS Safari 上历史记录列表无法滚动的问题
补全 html → body → #root 的高度链,使用 dvh 动态视口单位
适配 iOS Safari 地址栏动态收起/展开,添加 overscroll-contain
防止滚动穿透
|
2026-03-02 07:14:18 +08:00 |
|
|
|
0cb6dd418f
|
feat: 添加 PWA 支持,可添加到手机主屏幕作为独立应用使用
|
2026-03-02 07:04:08 +08:00 |
|
|
|
ab60db0dc5
|
refactor: 使用 sonner、zustand persist、partysocket 替换手写实现
|
2026-03-02 06:57:45 +08:00 |
|
|
|
08e5abe165
|
style: 将 Unicode 转义序列替换为可读的中文字符
|
2026-03-02 06:48:32 +08:00 |
|
|
|
70344bcd98
|
refactor: 迁移前端到 React 19 + Zustand + Tailwind CSS v4
- 将 vanilla TS 单文件 (app.ts 395行) 拆分为 React 组件化架构
- 引入 Zustand 管理全局状态 (连接/录音/预览/历史/toast)
- 自定义 hooks 封装 WebSocket 连接和音频录制管线
- CSS 全面 Tailwind 化,style.css 从 234 行精简到 114 行 (仅保留 tokens + keyframes)
- 新增依赖: react, react-dom, zustand, @vitejs/plugin-react
- Go 后端 embed 路径 web/dist 不变,无需改动
|
2026-03-02 06:36:02 +08:00 |
|
|
|
ea46ad71bf
|
feat: 集成 Tailwind CSS v4,替换手写样式为 utility classes
|
2026-03-02 06:18:20 +08:00 |
|
|
|
aaea414d5a
|
fix: 修复 Chrome 上录音按钮被 pointerleave 过早中断的问题
- 在 pointerdown 时调用 setPointerCapture 锁定指针事件
- 在 pointerup 时释放 pointer capture
- 防止 async startRecording 期间 pointerleave 意外触发 stopRecording
- mic-wrapper 添加 touch-action: none 防止浏览器拦截触摸
|
2026-03-02 05:43:23 +08:00 |
|
|
|
6c1b8e95c8
|
feat: 历史列表添加交错滑入动画
- renderHistory 改为索引循环,设置 CSS 变量 --i 实现交错延迟
- 最大交错层级限制为 10(400ms),避免过长等待
|
2026-03-02 05:23:47 +08:00 |
|
|
|
2c322f5ab1
|
style: 重新设计前端 UI 主题与视觉效果
- 色彩系统从冷黑灰调整为带靛蓝底色的暖深色主题
- 强调色从 #3b82f6 蓝色替换为 #6366f1 Indigo
- 麦克风按钮增大至 96px,添加渐变背景与录音波纹环动画
- 状态指示器改为 pill 胶囊形,连接态带发光效果
- 预览区录音时显示 indigo 边框光晕与顶部渐变
- Toast 添加毛玻璃背景与弹出位移动画
- 历史卡片添加 slide-up 滑入动效支持
- 新增 theme-color meta 匹配深色主题
|
2026-03-02 05:23:39 +08:00 |
|
|
|
48c8444b3f
|
refactor: 重构配置结构,解耦热词、统一认证、移除 TLS 开关
- 新增 ASRConfig,热词从 doubao 提升为 provider 无关配置
- 移除 SecurityConfig,token 移入 ServerConfig
- 移除 tls_auto 配置项,TLS 始终启用(getUserMedia 要求 HTTPS)
- validate() 改为基于 provider 白名单验证,增加 resource_id 校验
- 简化 main.go:移除 scheme 变量和 HTTP 降级分支
- 更新 config.example.yaml 为新结构并修正环境变量前缀
|
2026-03-02 04:36:22 +08:00 |
|
|
|
0720505ef6
|
refactor: 使用 Viper 重构配置管理并实现生产级热重载
- 引入 Viper 库替代手动 YAML 解析
- 实现基于 fsnotify 的配置文件热重载
- 使用 atomic.Value 保证并发安全的配置读写
- 添加配置验证(必填字段检查)
- 深拷贝 Hotwords 切片防止数据竞争
- 使用绝对路径匹配提升跨平台可靠性
- 支持启动失败后重试(不锁死状态)
- 提供 stop 函数正确清理 watcher 资源
- 通过 Oracle 多轮审计确认生产就绪
|
2026-03-02 02:57:47 +08:00 |
|
|
|
dd55be6f5b
|
refactor: 使用 Viper 替换手动配置管理,支持原生热重载
|
2026-03-02 01:56:08 +08:00 |
|
|
|
1e4670cd26
|
docs: 更新 AGENTS.md 添加热词功能说明
- 添加热词功能配置示例
- 说明实现原理和 API 细节
- 更新项目结构,添加 asr/hotwords.go
|
2026-03-02 01:41:36 +08:00 |
|
|
|
b786d9f90b
|
feat: 实现本地热词管理,移除平台绑定
- 使用 corpus.context 参数直接传递热词列表(豆包文档支持)
- 移除 boosting_table_id 配置,避免绑定火山引擎控制台
- 实现 BuildHotwordsContext 函数,将本地热词转换为 JSON 格式
- 热词配置完全本地化,便于迁移到其他 ASR 平台
配置示例:
hotwords:
- 张三
- 李四
- VoicePaste
程序自动转换为豆包 API 要求的格式:
{"hotwords":[{"word":"张三"},{"word":"李四"},{"word":"VoicePaste"}]}
|
2026-03-02 01:36:14 +08:00 |
|
|
|
4120d6451e
|
refactor: 简化热词配置为豆包控制台 ID
- 移除本地热词列表配置,改为直接使用豆包控制台的热词表 ID
- 删除 internal/asr/hotwords.go(不再需要本地解析)
- 简化 client.go 逻辑,直接传递 boosting_table_id
- 移除 protocol.go 中的 boosting_table_name 字段
- 更新配置示例,添加控制台链接说明
使用方法:
1. 在豆包控制台创建热词表:https://console.volcengine.com/speech/hotword
2. 复制热词表 ID 到 config.yaml 的 boosting_table_id 字段
|
2026-03-02 01:16:34 +08:00 |
|
|
|
96d685fdf2
|
feat: 添加豆包 ASR 热词功能支持
- 在 config.yaml 中添加 hotwords 配置项,支持本地管理热词列表
- 实现热词解析、格式化和表名生成工具(internal/asr/hotwords.go)
- 在 ASR 连接建立时自动将热词发送给豆包(boosting_table_name 参数)
- 支持热词权重配置(1-10,默认 4),格式:"词|权重" 或 "词"
- 支持配置热重载,修改热词后新连接自动生效
- 为未来动态热词功能预留扩展接口
热词格式示例:
hotwords:
- 张三|8
- VoicePaste|10
- 人工智能|6
|
2026-03-02 00:55:37 +08:00 |
|
|
|
b87fead2fd
|
refactor: 优化代码质量,遵循 KISS 原则
- 移除自签证书回退逻辑,简化为仅使用 AnyIP 证书
- 删除 internal/tls/generate.go(不再需要)
- 重构 main.go:提取初始化逻辑,main() 从 156 行降至 13 行
- 重构 internal/ws/handler.go:提取消息处理,handleConn() 从 131 行降至 25 行
- 重构 internal/config/load.go:使用 map 驱动消除重复代码
- 优化前端 startRecording():使用标准 AbortController API
- 优化前端 showToast():预定义 DOM 元素,代码减少 50%
代码行数减少 90 行,复杂度显著降低,所有构建通过
|
2026-03-02 00:25:14 +08:00 |
|
|
|
8c7b9b45fd
|
feat: 启用豆包二遍识别模式以提升实时性和准确率
- 切换到 bigmodel_async endpoint 并启用 enable_nonstream
- 第一遍流式识别提供实时文字预览
- VAD 分句后自动触发第二遍非流式识别提升准确率
- 修改文本处理逻辑从累加改为替换(适配 full 模式)
- 统一配置字段命名:app_key → app_id, access_key → access_token
|
2026-03-01 21:34:54 +08:00 |
|
|
|
e4b5841c93
|
fix: 修复历史记录不保存的问题(final 消息类型被错误覆盖为 partial)
|
2026-03-01 06:43:59 +08:00 |
|
|
|
cead3e42b8
|
docs: 添加 AGENTS.md 项目规范文档
|
2026-03-01 06:35:05 +08:00 |
|
|
|
bfaa792760
|
fix: 修复语音停顿导致提前粘贴的问题(累积文本,松开按钮才粘贴)
|
2026-03-01 06:34:55 +08:00 |
|
|
|
350e405fac
|
feat: ASR 从双向流式切换为流式输入模式(bigmodel_nostream)
- endpoint 从 bigmodel_async 改为 bigmodel_nostream
- 二进制协议去掉 sequence 字段,初始请求和音频帧均不带序号
- 最后一帧使用 FlagLastNoSeq 标志
- RequestMeta 新增 result_type=single、end_window_size=400
- ShowUtterances 关闭(nostream 模式不需要)
- readLoop 简化:nostream 模式下直接返回 final 结果
|
2026-03-01 06:12:58 +08:00 |
|
|
|
ce1ff2d04d
|
fix: 用 Pointer Events 替代 touch+mouse 事件,修复移动端双触发导致按钮卡死
- pointerdown/pointerup/pointerleave/pointercancel 统一处理所有输入
- 移除分离的 touchstart/touchend/mousedown/mouseup 事件绑定
- WS 断连时清理 pendingStart 状态,防止按钮永久卡死
- 添加 contextmenu 阻止长按弹出菜单
|
2026-03-01 05:49:07 +08:00 |
|
|
|
30e3271146
|
chore: 优化 package.json scripts 命名(check → lint/lint:fix)
|
2026-03-01 05:43:49 +08:00 |
|
|
|
d0be096165
|
feat: 前端迁移至 TypeScript,集成 Biome 格式化与代码检查
- app.js → app.ts:添加完整类型标注、接口定义
- audio-processor.js → audio-processor.ts:AudioWorklet 类型化
- vite.config.js → vite.config.ts
- 添加 tsconfig.json、vite-env.d.ts
- 集成 Biome 默认配置(lint + format),通过全部检查
- package.json 添加 check/typecheck 脚本
- index.html 修复无障碍问题(button type、SVG title)
|
2026-03-01 05:40:26 +08:00 |
|
|
|
b22b27db75
|
fix: 修复录音按钮快速按放导致按钮卡死的异步竞态问题
|
2026-03-01 05:30:47 +08:00 |
|
|
|
0ae2533421
|
chore: gitignore 添加 .task/ 目录
|
2026-03-01 05:20:53 +08:00 |
|
|
|
11fa2152c2
|
refactor: 前端 ignore 规则移至 web/.gitignore,减少根目录重复
|
2026-03-01 05:19:56 +08:00 |
|
|
|
7a3b37d9e7
|
refactor: Go 二进制输出到 dist/ 目录,避免污染项目根目录
|
2026-03-01 05:18:27 +08:00 |
|
|
|
32f58b681e
|
fix: Taskfile 输出文件名自动适配平台后缀(Windows .exe)
|
2026-03-01 05:16:16 +08:00 |
|
|
|
4b5903b6a1
|
feat: 引入 Vite 前端工程化,解决浏览器缓存问题;AudioWorklet 独立打包带 hash
|
2026-03-01 05:13:19 +08:00 |
|
|
|
c4ea49b0a3
|
fix: 修复多 IP 时 AnyIP 域名全部相同的问题,每个 IP 生成各自的域名
|
2026-03-01 04:53:53 +08:00 |
|
|
|
2dbc916652
|
refactor: 移除二维码和交叉编译,改为列出所有 LAN IP 地址;清理依赖
|
2026-03-01 04:45:27 +08:00 |
|
|
|
5d17e2e9ac
|
fix: 修复安卓 Chrome 无音频问题,移除强制 16kHz 采样率,添加 AudioContext resume
|
2026-03-01 04:35:06 +08:00 |
|
|
|
193f208d80
|
fix: 修复 Windows 上 Ctrl+V 粘贴失效,改用 KeyDown/KeyUp 手动控制修饰键
|
2026-03-01 04:27:15 +08:00 |
|
|
|
75abe72bf6
|
fix: 修复停止录音后未等待豆包返回最终结果,导致历史记录和自动粘贴失效
|
2026-03-01 04:21:57 +08:00 |
|
|
|
e1c1b2d9b2
|
fix: 修复 AudioWorklet 未收到 start 指令导致无音频数据发送
|
2026-03-01 04:13:10 +08:00 |
|
|
|
9420d43392
|
fix: token 改为配置文件读取,不再自动生成;UI 全部汉化
|
2026-03-01 04:09:55 +08:00 |
|
|
|
2ce0323ba5
|
fix: 修复豆包 ASR 音频格式字段,format 应为 pcm,codec 应为 raw
|
2026-03-01 04:01:46 +08:00 |
|
|
|
8b9070aac8
|
feat: add AnyIP certificate download with cache and fallback chain
|
2026-03-01 03:20:31 +08:00 |
|
|
|
35032c1777
|
feat: add Doubao ASR client and paste module
|
2026-03-01 03:03:46 +08:00 |
|
|
|
39e56e5acc
|
feat: add WebSocket handler with token auth and session management
|
2026-03-01 03:03:34 +08:00 |
|