[分享] ToMic - 把你的手机变成电脑的高质量麦克风 (Win/Mac, 0 App 安装, 低延迟) - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
nocmt
V2EX    分享创造

[分享] ToMic - 把你的手机变成电脑的高质量麦克风 (Win/Mac, 0 App 安装, 低延迟)

  •  
  •   nocmt 1 月 28 日 1392 次点击

    背景与痛点

    最近语音输入软件出了好几款,可惜我的电脑没有麦克风,被逼无奈,Vibe Coding 一个用手机浏览器采集音频,通过局域网传给电脑作为麦克风的网页程序。


    ToMic 是什么?

    ToMic 是一个基于 Web 技术的局域网虚拟麦克风工具。 它允许你使用手机浏览器作为电脑的麦克风输入源,通过 Wi-Fi 传输音频,并利用虚拟声卡( BlackHole 或 VB-CABLE )将其注入到系统音频输入中。

    核心特性:

    • 0 App 安装:手机端无需下载任何 APP ,扫码/输入 IP 即开即用( Chrome/Safari )。
    • 跨平台支持:完美支持 macOSWindows
    • 低延迟传输:基于 WebSocket + Opus 编码,配合 FFmpeg/SoX 管道处理,延迟极低。
    • 原生级体验
      • macOS: 内置 Swift 监听器,自动管理状态。
      • Windows: 通过注册表监听麦克风占用状态,当你打开 Zoom/Teams 时,手机端自动开始传输,挂断即停(无需手动开关)。
    • HTTPS 安全:局域网自动生成自签名 SSL 证书,解决浏览器录音权限问题。

    技术原理 (The Geeky Part)

    ToMic 的工作流非常直接,就像一条 Unix 管道:

    1. 采集 (Phone): 手机浏览器调用 MediaRecorder API ,采集 audio/webm;codecs=opus 音频流(支持回声消除/降噪)。
    2. 传输 (Network): 通过 Socket.io 将 Blob 数据块实时发送到电脑端的 Node.js 服务。
    3. 处理 (PC): Node.js 收到数据后,通过 Stream Pipe 喂给 FFmpeg 解码,再管道传输给 SoX
    4. 注入 (Driver): SoX 将 PCM 音频流实时写入到虚拟声卡设备( macOS 下是 BlackHole ,Win 下是 VB-CABLE )。
    5. 应用 (App): Zoom / Discord / Teams 等软件选择虚拟声卡作为输入源,听到声音。

    特别是在 Windows 上,为了实现“无感体验”,我写了一个 Python 脚本轮询注册表 CapabilityAccessManager\ConsentStore\microphone,以此来判断是否有应用正在使用麦克风,从而反向控制手机端的推流状态。

    快速开始

    下载程序:https://github.com/nocmt/toMic/releases

    2. 准备虚拟声卡

    • macOS: 压缩包内置了 BlackHole 安装包,运行即提示安装。
    • Windows: 压缩包内置了 VB-CABLE 安装包,运行即提示安装。

    3. 启动

    ./toMic 

    启动后终端会显示一个 HTTPS 地址(如 https://192.168.1.5:23336)。

    4. 连接

    手机连接同一 Wi-Fi ,浏览器访问该地址( https 哈),点击“授权”即可。 (由于是自签名证书,浏览器会提示不安全,点击“高级 -> 继续访问”即可)


    项目地址

    GitHub: https://github.com/nocmt/tomic

    目前只是初期版本,欢迎大家试用、Star 或提 PR !如果有任何问题,也可以在这里反馈。

    18 条回复    2026-02-02 10:03:33 +08:00
    xing7673
        1
    xing7673  
       1 月 28 日
    有意思
    Exp
        2
    Exp  
       1 月 28 日
    大佬一言不合自己造神器,我等渣渣只能想到破财买个 DJI mic mini
    aresyang
        3
    aresyang  
       1 月 29 日
    传语音不如传文字过去, 比如我的工具 MateBot https://github.com/aresbit/MateBot
    paopjian
        4
    paopjian  
       1 月 29 日
    比较好奇这种功能消耗了多少 token, 相当于多少刀? 从零开始一个项目得花不少 token 吧
    nocmt
        5
    nocmt  
    OP
       1 月 29 日
    @aresyang 最近好多 AI 语音输入法,所以才有这个想法,另外主要是这些输入法可以解析音频修改后输出。
    nocmt
        6
    nocmt  
    OP
       1 月 29 日
    @paopjian 也不多,主要是指令要明确(起码看得懂代码),然后就搞定了。
    konchu
        7
    konchu  
       1 月 29 日
    试了一下,win10 运行不起来
    https://imgur.com/a/9nOCP0b
    micookie
        9
    micookie  
       1 月 29 日


    启动报错
    nocmt
        11
    nocmt  
    OP
       1 月 30 日
    nocmt
        12
    nocmt  
    OP
       1 月 30 日
    doublebu
        13
    doublebu  
       1 月 30 日 via Android
    如果传文字的话,可以尝试一下 kde connect 里面有个输入,配合豆包输入法或其他语音输入法就可以了。

    只是经常要拿起手机比较麻烦
    konchu
        14
    konchu  
       1 月 30 日
    @konchu #7 更新好快!新版本可以了。VBCABLE_Driver_Pack45.zip 我这边是要手动解压缩,然后运行 VBCABLE_Setup.exe 安装之后驱动,就能用了。
    korvin
        15
    korvin  
       1 月 31 日
    用不起来,ffmpeg sox 都装了,程序启动显示一切正常,但就是没效果

    Screenshot_2026-01-31-20-27-07-31_40deb401b9ffe8e1df2f1cc5ba480b12.jpg
    系统设置里输入输出都是 BlackHole 2ch ,使用软件时音频输入也改成了 BlackHole 2ch
    nocmt
        16
    nocmt  
    OP
       1 天前
    @korvin 输出不用选 BlackHole 2ch (输入选这个)
    ,另外查看系统设备的 麦克风音量显示那边有没有变化

    手机这边有没有允许麦克风输入?要给浏览器权限和这个页面麦克风权限。看你手机截图貌似没有开启麦克风
    korvin
        17
    korvin  
       1 天前
    @nocmt #16
    那你软件里使用说明写错了,我还反复确认了后几次,最后就输入输出全选了。
    手机浏览器麦克风权限给了
    系统设备的 麦克风音量没有变化
    nocmt
        18
    nocmt  
    OP
       18 小时 28 分钟前
    @korvin #17 你要有时间的话,可以给你开腾讯会议远程调试一下。联系我 bm9jbXRvbmVAZ21haWwuY29t
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     939 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 20:31 PVG 04:31 LAX 12:31 JFK 15:31
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86