[分享] ToMic - 把你的手机变成电脑的高质量麦克风 (Win/Mac, 0 App 安装, 低延迟) - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
爱意满满的作品展示区。
nocmt

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

  •  
  •   nocmt Jan 28 2398 views
    This topic created in 91 days ago, the information mentioned may be changed or developed.

    背景与痛点

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


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

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

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

    手机这边有没有允许麦克风输入?要给浏览器权限和这个页面麦克风权限。看你手机截图貌似没有开启麦克风
    korvin
        17
    korvin  
       Feb 1
    @nocmt #16
    那你软件里使用说明写错了,我还反复确认了后几次,最后就输入输出全选了。
    手机浏览器麦克风权限给了
    系统设备的 麦克风音量没有变化
    nocmt
        18
    nocmt  
    OP
       Feb 2
    @korvin #17 你要有时间的话,可以给你开腾讯会议远程调试一下。联系我 bm9jbXRvbmVAZ21haWwuY29t
    About     Help     Advertise     Blog     API     FAQ     Solana     3028 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 58ms UTC 10:49 PVG 18:49 LAX 03:49 JFK 06:49
    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