Hi there 👋

Welcome to my blog, my name is Ray. I am a software developer and this is my personal blog where I share my thoughts, experiences, and projects. Feel free to explore and connect with me!

豆包输入法你能不能只负责语音

最近豆包输入法的语音输入很火。 我是在开放后下载下来用了一下,确实很好用,对比之前用的 type less 对我而言有点修饰过头,微信输入法整体效果还行但是略逊于豆包。我设置的快捷键是 Command + Option ,按住说话,松开就上屏,体验很顺。 但是我现在主力打字输入法还是微信输入法。 原因也很简单,它有多端剪切板同步。 虽然这个同步率我感觉也就 90% 左右吧,不是每次都稳,但是有总比没有强。用久了之后就有点回不去了。手机上复制点什么,电脑这边能接着用,虽然偶尔抽风,但是整体还是方便的。 所以问题就来了。 我不想把主力输入法换成豆包输入法,但是我又想用豆包的语音输入。我想偷个懒。 我想到我的流程是,平时打字继续用微信输入法,需要语音的时候,按住 Command + Option 临时切到豆包语音,松开之后再回微信输入法。 那么理论可以全自动做这件事情。我把这个需求丢给了 macbook 上跑着的 Hermes,我坚信它以及它背后的 GPT-5.5 能做到。 最终思路 最后 Hermes 先搓了一个后台 agent,后来又把它收成了一个顶栏 mini app: 1 doubao-voice-wetype-agent 它干的事情不是破解豆包,也不是改输入法,而是在中间当一个代理。 更准确地说,它现在像一个很小的插件,常驻在 macOS 顶栏,没有 Dock 图标。平时显示 豆 OK,权限或者监听有问题的时候显示 豆 !,按住语音的时候会变成 豆 REC。 这个小状态栏后来证明很重要。 因为这种系统级快捷键代理如果没有可视状态,真的太黑盒了。你不知道是权限没拿到,还是 event tap 被系统关了,还是输入法切过去了但豆包没接住。现在点开顶栏菜单,至少能看到权限、当前输入法、最近一次事件和监听状态。 大概流程是这样: [text] 显示已折叠代码(33 行) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 当前输入法是微信输入法 | | 按下 Command + Option v agent 捕获到这个组合键 | v 检查当前输入法不是豆包 | v 切换到豆包输入法 | v 重新发送一组干净的 Command + Option keyDown | v 豆包开始语音输入 | | 我继续按住,说话 v 松开 Command + Option | v agent 捕获释放事件 | v 重新发送 Command + Option keyUp | v 豆包结束语音输入 | v 切回微信输入法 一句话就是: ...

May 27, 2026 · 5 min · 953 words · Ray

顶级临阵磨枪(软考高级系统架构-1)

计算机操作系统 常见指令集有 CISC 和 RISC。 CISC 指令复杂、数量多,比如 x86 架构; RISC 指令简单、执行快,像 ARM、MIPS、RISC-V。 CPU 类型按指令集分, 有 x86 系列,常用于 PC 和服务器; ARM 系列,多用在手机、嵌入式设备;还有 RISC-V 这种开源指令集的 CPU 除了 CPU,常见的处理器还有 GPU,擅长并行计算,主要用于图形渲染和 AI 训练;DSP,专为数字信号处理设计,像音频、图像处理设备常用;FPGA,可编程逻辑器件,可根据需求定制硬件逻辑,适合实时性高的场景;还有 TPU,是谷歌专为深度学习优化的处理器 嵌入式操作系统 嵌入式操作系统特点是微型化、可定制、可靠性和一植移植性,常采用硬件抽象层Hardware Abstraction Layer,HAL和板级支撑包BSP 嵌入式操作系统应具备实时性、可裁剪性和安全性等特征。 基本开发工具是交叉编译器、交叉链接器和源代码调试器 计算机网络 局域网有总线型、星型、树型、环型、网状五种拓扑结构 WLAN拓扑结构有点对点型、Hub型和完全分布型。 完全分布型则处于理论探讨阶段无具体应用 广域网由通信子网与资源子网组成。广域网可以分为公共传输网络、专用传输网、络和无线传输网络3类。 主要有同步光纤网络(SONET)、同步数字体系(SDH)、数字数据网(DDN)、帧中继(FR)和异步传输技术(ATM) 。 以太网规定最小帧长为64字节,最大帧长为1518字节。设置最小帧长是为了避免冲突,最小帧长是根据网络中检测冲突的最长时间来定的。 信息系统基础 信息系统的功能有:输入、存储、处理、输出和控制 信息系统的生命周期分为产生、开发、运行和消亡4个阶段。 企业的所有资源包括三大流:物流、资金流和信息流。 信息安全技术基础 信息安全的基本要素有机密性、完整性、可用性、可控性与可审查性。 范围包括设备安全、数据安全、内容安全和行为安全。 DES 56位密钥长度,三重DES 112位是因为他用了两个密钥 K1加密 K2解密 K1加密 系统工程基础知识 MIPS=指令条数/(执行时间×10^-6) 软件工程基础知识 碎碎念 看到这里已经困的不行了,明天早上七点起来路上复习后去考试 案例分析第一题连考四次质量属性,所以押他还考,这里需要特别准备,然后准备一个主流技术,如果是微服务 / 云原生、缓存 / 数据库、新兴技术,新兴技术大概率是AI,其实都在我的打击范围,只是深度都不够,明天早上起来接着看案例 历年论文四题范围 我直接押题今年会有大模型应用,直接撞在我这两年最熟悉的领域,所以我将把复习重点放在案例分析可能会出现的概念上,好好准备一下 ...

May 22, 2026 · 1 min · 69 words · Updated: May 23, 2026 · Ray

GitHub Actions 编译 + Cloudflare Pages 部署踩坑全记录

我的主域名空着很久了,很久以前有一个非常简易的 home page,但是有了 AI 之后看来看去,太繁杂的又不喜欢,让我自己写又嫌烦,昨天终于狠下心让 codex 开始干活,然后部署流程记录一下。 这是个 Vite + React 的静态主页,本地跑没问题,想丢到线上去。之前一直用 Cloudflare Pages 直接连 GitHub 仓库自动部署,但这次想换个方式——用 GitHub Actions 编译,然后通过 Wrangler 做 Direct Upload 部署到 Cloudflare Pages。 思路比较简单,但是觉得可以记录一下。 整体链路 先说清楚整个链路长什么样: 1 2 3 4 5 6 7 8 本地代码 -> git push 到 GitHub main 分支 -> GitHub Actions 触发 CI + Deploy workflow -> npm ci -> npm run build -> 生成 dist -> wrangler pages deploy dist -> 发布到 Cloudflare Pages 跟 Cloudflare 自动连接 GitHub 仓库那种方式不一样,这里是 GitHub Actions 主动用 Wrangler 把构建产物推上去,算是个 Direct Upload 的方案。 ...

May 22, 2026 · 4 min · 656 words · Ray

顶级临阵磨枪(软考高级系统架构-0)

前趋图(Precedence Graph) 前趋图(Precedence Graph)是一种用于描述任务、事件或进程之间先后依赖关系的有向无环图(Directed Acyclic Graph,DAG)。 通常记作: G = (P, E) 其中: P:顶点集合(Vertex Set),表示进程、任务或事件 E:边集合(Edge Set),表示前驱约束关系 边一般表示为: E = {(p_i, p_j)} 表示进程 p_i 必须先执行完成,进程 p_j 才能开始执行,即: p_i ➡️ p_j 由于前趋图只描述“先后依赖关系”,因此图中不能出现环路,所以它属于有向无环图(DAG)。 在实际分析中,本质上就是按照“节点大小关系 + 箭头方向”记录每一条边的依赖关系。 PV 操作(Semaphore Operations) PV 操作是操作系统中用于实现进程同步与互斥的一种经典机制,其核心是信号量(Semaphore)。 信号量通常记作: S_i 其中: S:Semaphore(信号量) 下标 i:表示第 i 个信号量 PV 操作包括两种基本原语: P 操作(Proberen) P 操作来源于荷兰语 “Proberen”,含义为“测试”或“申请资源”。 执行逻辑: 对信号量 S 减 1 若结果小于 0,则当前进程阻塞等待 若结果大于等于 0,则继续执行 因此: 执行前需要进行 P 操作 表示“申请资源”或“进入临界区” 常写作: P(S_i) V 操作(Verhogen) V 操作来源于荷兰语 “Verhogen”,含义为“增加”或“释放资源”。 ...

May 20, 2026 · 8 min · 1657 words · Updated: May 21, 2026 · Ray

用 OBS + MediaMTX 搭一个本地视频流给视觉程序用

开发目标检测、姿态识别这类视觉程序的时候,有个很烦的问题:你需要一个可控的、可重复的视频输入源。 对着真实的摄像头调试?光线一会变一个样,人走来走去的,画面完全不可控。用视频文件做输入吧,有些程序又只认摄像头设备或者RTSP地址,不认本地文件路径。 所以我需要一个东西,既能把视频文件"伪装"成一个实时的视频流,让下游程序当摄像头一样去读。又能快速接入各种我想要做出的画面或者 usb 摄像头来测试视频效果。 当然如果有更好的方案欢迎大家留言(鬼知道有没有人看得到我的文章) 其实 OBS 自带的 Virtual Camera 也能解决一部分问题,但我没怎么用过。 这次搭的链路长这样: 1 视频文件 → OBS 推流 → MediaMTX → RTSP → ffplay / OpenCV / 目标检测程序 MediaMTX 是什么 之前没见过 MediaMTX,一开始还以为是某种虚拟摄像头设备。不是。 MediaMTX 是一个本地流媒体中转服务器,用 Go 写的,一个二进制文件就能跑。它能把推过来的流转成 RTSP、RTMP、HLS、WebRTC、SRT 等各种协议的输出。也就是说你往里面塞一路流,下游不管你用什么协议来读,它都能接。 GitHub 地址:bluenviron/mediamtx,macOS arm64 直接下载解压就能用。 启动 MediaMTX 1 2 cd /Volumes/extStorage/rayEx/Downloads/mediamtx_v1.18.2_darwin_arm64 ./mediamtx gemini 最早叫我下载完之后直接刷机打开,启动的时候会报一条 warning:是因为双击启动的目录对不上,他找不到 yml,进入路径执行就没问题了 1 WAR configuration file not found (looked in .../rtsp-simple-server.yml, .../mediamtx.yml), using an empty configuration 默认配置已经把常用端口都打开了: 1 2 3 4 5 RTSP :8554 RTMP :1935 HLS :8888 WebRTC :8889 SRT :8890 本地调试足够用了,不用改 yml。后面需要鉴权、固定路径、改端口的时候再配。 ...

May 19, 2026 · 3 min · 455 words · Ray