昨天我在所里讲课,用 gamma html 的方式演示 ppt,发现了一个问题:
因为我讲的是 AI,需要兼顾电脑上操作演示软件,一手拿着话筒,一手又拿翻页器,控制 PPT 翻页确实不太方便。而且讲的时候,出现了好几次因为操作电脑 html 演示不顺畅、导致停顿的局面。
讲完课复盘,想到这个问题时,直接冒出一个想法:咦,为啥我不直接做个语音控制 ppt 翻页的程序,把这事解决了?
和我的 AI agent 聊了几句,把技术点了解清楚、简单地 plan 了个架构,就让它开动了。
具体 github 地址,欢迎大家 star:
github.com/rainbow1111-lalala/voice-slide-control
安装及使用方法
打开浏览器,输入上面的网址,点绿色的「Code」键,再点「Download ZIP」即可。
下载之后双击一个叫 start.command(苹果系统)/ start.bat(Windows 系统)的文件,首次启动会自动配置环境(约 1–2 分钟),随后会自动通过网页弹出控制面板。
这个项目可以离线运行,点一下「下载离线模型 Vosk」即可。如果想要更精准,就设置 api,首推快速、免费的 Groq,注册拿个 key 填进去就行。
当然,更省事的方法是,把这个网址直接丢给你的 AI Agent(国内的 workbuddy、coze、kimi、manus 都行),告诉它:「帮我安装这个项目:github.com/rainbow1111-lalala/voice-slide-control」。运行不了就继续问它怎么解决。
具体功能
功能非常简单。
第一步,你用中文说几个关键词「下一页」「下页」,英文「next」「next slide」,还可以自己加上惯用的口令,比如「接下来」。
第二步,每次你讲到这些词,程序里的语音识别引擎就会识别到,然后按下方向键「👉」,无论是 html 版的 ppt,还是 PowerPoint,都能直接翻页。
关键是接入了云端的语音识别大模型,识别精准度高很多。
此外还可以调节麦克风灵敏度(rms)、句末停顿(silence_ms,控制说完后程序等多久判定这句结束)。一个管「多大声算你在说话」,一个管「停多久算你说完了」。
数据流(也算它的工作流)
其实就是它的工作流。
技术栈
底座:语言整个项目都是 Python;运行环境用 venv + pip 虚拟环境,用户双击 start command 后自动帮你装好。界面:Flask: 就是一个 app.py,干三件事:① 把网页发给浏览器;② 提供 JSON 接口(每次你点测试连接、保存配置、开始监听、下载模型就触发);③ 把后台监听进程的日志实时推给网页。前端是原生 HTML/CSS/JS,骨架+样式+行为。audioop.rms 是音量表,算多大声、何时开始录;VAD 语音活动检测判断说完没;pre-roll 是新加的功能,程序会先录最近半秒的声音,避免开头声音太小被切掉;pynput 相当于手,模拟按一下键盘方向键。requests 负责把录音发给云端、再拿回文字(离线 Vosk 识别就不需要了),相当于快递员;OpenAI 兼容接口可以接各家语音识别 API,包括 Groq、OpenAI 等;Whisper 是 OpenAI 的语音识别模型;Vosk 是能本地跑的离线识别模型;pypinyin 把中文转拼音,专治同音字误识别。在做之前其实也不认识 Vosk、Groq 这两个东西,每次都是实践出新知,做了语音识别才知道。做这种工具最有意思的就是这点,边做边把一个领域摸清了。
上图显示了目前开源比较好用的语音转文字大模型:
Whisper(OpenAI)、Nvidia Parakeet;
中文的有 FunASR · Paraformer / SenseVoice(阿里达摩院)。
云端 api 最强的还是 OpenAI gpt-4o-transcribe,欧洲跑出的黑马 ElevenLabs(Scribe),还有这个工具用的免费又快的 Groq。
中文比较好的有讯飞、阿里、火山引擎等。又学习了!
怎么做出来的
其实就是有个想法。
第一步,一边和 ai 聊有哪些技术难点,梳理出工具的工作流;
第二步,让它 plan 出架构后开始做 demo;
第三步,demo 实测有什么问题就想办法解决,比如识别成同音字「下一夜」就不翻页,那就让它把中文转拼音,只要识别到「xiayiye」都算成功;又比如人开口第一个字通常比较轻、程序没收到,办法就是让它提前半秒录音;
第四步,加上调节灵敏度和反应速度的小功能。
结语
虽然这是个很小的工具,功能也有待完善,但因为之前已经陆陆续续做了十几个工具,现在流程日渐成熟。接下来会把我做的小工具陆续开源放出来,期待和大家一起聊聊 build something 的心得。