安装与帮助
把 iPhone 的声音接收到 Mac。此包是需要通过终端运行的 Python 接收端,不是双击安装的原生 Mac App。它不会改变 macOS 默认音频设备,也不会安装后台服务。
1.0.2 更新
适应约 100–200 ms 的音频突发和设备调度抖动,避免小缓冲截断正常音频。默认最多保留 24 包(约 279 ms 的样本),播放时丢弃超过 240 ms 的过期音频。收到音频即可播放,不要求预先填满缓冲;实际端到端延迟仍取决于网络和设备。
需要准备
- iPhone:AirMic,iOS 15 或更新版本;允许麦克风和局域网权限。
- Mac:Python 3.9–3.12(推荐 3.12),可用的音频输出设备。当前依赖锁定用于这些 Python 版本;不要直接使用 Python 3.13/3.14 安装此包。
- 两台设备连接同一可信局域网。Mac 可以通过以太网连接同一路由器。访客 Wi-Fi 的设备隔离可能阻止连接。
- 首次安装 Python 依赖需要互联网。实时音频传输在局域网内进行。
Python 可从 https://www.python.org/downloads/macos/ 获取;请选择兼容版本。使用 Homebrew 的用户可安装 python@3.12,并在下列步骤中用 python3.12 替代 python3。
安装与第一次试听
解压 ZIP,在终端进入解压后的 AirMic-Mac-Receiver-1.0.2 目录:
python3 --version
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txt
python airmic_receiver.py --list-devices
列表只显示有输出通道的设备。记下要使用的耳机输出编号,然后运行(下面的 2 只是示例,应替换成你的编号):
python airmic_receiver.py --device 2
也可以用列表中的完整名称,例如 --device "Loopback Audio"。建议第一次试听使用耳机,并先把音量调低,避免扬声器声音被 iPhone 再次收音造成啸叫。
1. 在 Mac 的“系统设置 → 网络 → 当前连接 → 详细信息 → TCP/IP”查看 IPv4 地址。不同 macOS 版本菜单略有不同。输入的是 Mac 的地址,不是路由器地址或 iPhone 地址。
2. 在 iPhone AirMic 中输入这个地址,例如 192.168.1.20(仅为示例)。
3. 允许麦克风与局域网访问,点击开始收音。iPhone 与 Mac 的 UDP 端口固定配合使用 50005。出现 macOS 防火墙提示时,允许此接收端在可信网络接收传入连接。
4. 对着 iPhone 说话。在 Mac 耳机中听到声音,同时观察每秒统计的 accepted、last_seq、rendered_samples 增长,peak / rms 随声音变化。
5. iPhone 显示“正在收音并发送”代表发送端已启动,并不代表 Mac 已收到;以 Mac 的统计和实际声音为准。
6. iPhone 点击停止后,Mac 会输出静音。终端按 Control-C 退出接收端。
不要同时运行多个接收端占用同一端口。Address already in use 表示已有接收端或其他程序占用端口;请先确认现有程序,不要随意结束未知进程。
在会议、录音等 Mac App 中作为麦克风
耳机试听不需要 Loopback。要让其他 App 把收到的声音选为麦克风,需要另外安装、配置虚拟音频设备。
本项目的默认输出是 Rogue Amoeba 的 Loopback Audio。Loopback 是独立第三方软件,不包含在 AirMic 中,需要另行获取;其完整版本收费,试用版有限制。下载、系统要求和价格以 https://rogueamoeba.com/loopback/ 为准。AirMic 与 Rogue Amoeba 没有从属关系。
在 Loopback 中建立名为 Loopback Audio 的双声道虚拟设备,保留 Pass-Thru 来源并连接至输出通道。运行:
python airmic_receiver.py
在你实际使用的会议或录音 App 中,手动选择 Loopback Audio 作为输入设备。接收端将单声道复制到左右声道。接收端不自动切换全局默认输入或输出。不需要监听时,不必把虚拟设备再接到扬声器。
状态与排查
- received:收到的数据报数;accepted:通过验证和排序后接受的音频包数。
- last_seq:最近接受的序号;sequence_gaps:序号缺口,可能由丢包或乱序造成。
- duplicates / out_of_order:丢弃的重复包与落后包;不会重复播放。
- queued_ms:待播放样本的时长;queue_dropped / expired:为防止滞后而丢弃的音频包。
- rendered_samples:交给音频输出回调的有效样本数;它是软件计数,不能单独证明耳机或会议 App 已发声。
- underrun_frames:没有新音频时填入的静音帧;停止收音时增长正常。
- audio_status:音频回调状态异常次数;持续增长时检查设备、CPU 负载和其他音频程序。
- peak / rms / peak_dbfs:最近接受包的音量;age_seconds 可判断该读数是否已过时。
- source_ignored:其他发送端被忽略;一个接收端同时接收一台 iPhone,当前发送端静默约 2 秒后其他发送端可以接管。
无包:检查 Mac IPv4、双方网络、iOS 局域网权限、防火墙和路由器设备隔离。网络恢复或系统音频中断后,可在 iPhone 停止并重新开始。
有包无声:检查 --device 选择、输出音量、Loopback Pass-Thru 和目标 App 的输入设备。Mac 正在镜像或占用 iPhone 麦克风时,请退出相关功能再试。
延迟或断续:靠近路由器、避免拥挤网络并检查设备负载。UDP 不保证每包送达;接收端优先播放近期音频,拥堵时可能丢弃旧包。AirMic 不承诺零延迟,也不支持直接 Bluetooth 音频传输到 Mac。
隐私与安全
AirMic 将麦克风 PCM 通过未加密、未认证的 UDP 发往你填写的 IPv4 地址。请核对地址并仅在可信局域网使用,不要把 UDP 50005 暴露到互联网。任何能向该端口发送数据的局域网设备都可能尝试发送音频。当前协议不是安全通话协议。
App 和接收端不主动保存录音,也不向开发者服务器上传音频。接收端只在内存中保留短暂播放缓冲,并在终端输出包数、来源局域网地址、序号、时间间隔及音量等统计,不包含原始语音。终端或你选择的日志工具可能保留这些统计。其他录音/会议 App 如何处理声音由你选择的软件决定。
检查代码
python -m unittest discover -s tests -v
此包不捆绑 Python、NumPy、sounddevice、PortAudio 或 Loopback。依赖由各自项目分发并适用各自许可。
获取帮助
请联系 support@huppy.ai,说明系统版本、错误文字和输出设备,无需发送原始语音。