终端环境中实现端到端加密(E2EE)对讲机功能,是一个兼顾简洁与可靠的工程挑战。Terminal Phone 项目就是一个典型示例:一个单一 Bash 脚本,通过 Tor 洋葱服务实现匿名 PTT(Push-To-Talk)语音和文本通信,无需服务器或账户。不同于实时 WebRTC 流式传输,该项目采用离散音频片段(clip)方式:按键录音、Opus 压缩、AES 加密后打包发送。这种设计适合终端会话的噪声环境和带宽限制,但工程化时需优化音频 I/O 复用、编码参数和信令鲁棒性,以实现近似流式的 “噪声 resilient” 体验。
终端音频 I/O 多路复用:PTT 核心机制
终端音频输入输出需多路复用,以支持 PTT 模式:按住键录音、释放发送,同时处理播放和噪声。核心工具是 sox 或 ffmpeg 结合 arecord/aplay(Linux)/Termux:API(Android)。
可落地参数清单:
- 录音设备与采样:
arecord -D hw:0,0 -f S16_LE -r 16000 -c 1(单声道 16kHz,Opus 推荐)。阈值:VAD(Voice Activity Detection)启动录音,silence 阈值 - 30dB,持续 > 0.5s 触发。 - PTT 复用:Bash 脚本用
read -t 0.1 -n 1轮询键(如'space')。录音线程:timeout 30 arecord ... | sox -t raw -r 16000 -e signed -b 16 -c 1 - -t opus clip.opus silence 1 0.1 -30dB。播放线程:play incoming.opus &,用pkill -f play清理。 - 终端回放优化:ALSA/plughw 插件降噪,
sox input.wav output.wav highpass 100 lowpass 7000滤人声频段(300-3400Hz),SNR>20dB 目标。 - 监控点:缓冲区溢出阈值 < 100ms,丢帧率 < 1%(用 ffprobe 统计)。
回滚策略:若 sox 失败,回退纯文本模式。Termux 下,Termux:API 权限检查:termux-microphone-record。
Opus 编码:低延迟压缩参数
Opus 是 IETF 标准,终端对讲首选:6-510kbps,20ms 帧,自适应带宽。Terminal Phone 管道:PCM→Opus→AES→base64→Tor。
工程参数:
- 比特率:语音 12-32kbps(
opusenc --bitrate 24 input.wav output.opus),窄带(8kHz)降至 8kbps 节省 Tor 流量。 - 复杂度:0-10,默认 10(慢速最佳质量),终端设 4 平衡 CPU(<5% 负载)。
- 帧大小:20ms(最低延迟),DTE 模式
--dtx静默抑制。 - 噪声抑制:集成 RNNoise 前处理:
rnnnoise-demo input.wav output.wav,阈值 - 20dB,抑制 > 15dB 噪声。 - 阈值与清单:packet loss<5% FEC 冗余 10%;VBR on,预期带宽 20KB/clip(5s 语音)。
测试:sox 生成噪声文件,Opusenc+abx 比较 PESQ>3.5 MOS。
信令与传输:Tor vs WebRTC
Terminal Phone 用 Tor v3 onion 服务:对等.onion 地址 OOB 交换(QR/verbal),SOCKS 代理 localhost:9050。
Tor 工程化:
- 配置:torrc HiddenServiceDir /tmp/hs,端口 9051。ExcludeNodes {us,uk,ca,au,nz} 避五眼(StrictNodes 1)。
- 延迟:20KB clip 2-5s RTT(Tor 路径~3 跳),非流式 ok。Snowflake/pluggable transports 绕审查。
- 参数:CircuitTimeout 10s,重连 5 次;文件随机名防枚举。
WebRTC 替代(扩展):若需实时流,STUN/ICE 信令。libjuice/webrtc-native,TURN 中继(coturn)。参数:iceServers stun.l.google.com:19302,timeout 5s。mux DTLS-SRTP+Opus RTP。
噪声 resilient 流式:WebRTC Opus FEC+PLC(packet loss concealment),终端 WebAudio API 降噪 WebRTC-VAD。
引用:“Terminal Phone 使用 Tor onion 服务作为身份与 NAT 穿越,无需 STUN/TURN。”(HN 讨论)。
E2EE 与密钥管理
对称 AES-256-CBC:OOB 共享密钥(QR/verbal)。管道:openssl enc -aes-256-cbc -in clip.opus -out enc.bin。
参数:PBKDF2 迭代 10k 盐,IV 随机。Tor 层额外保护。
部署与监控
清单:
- 依赖:Tor, sox, opus-tools, openssl。
- 启动:
./TerminalPhone.sh,生成.onion。 - 监控:Prometheus exporter Tor 电路延迟 > 10s 警报;音频 MOS<3.0 回滚比特率。
风险:Tor 审查(Snowflake 阈值 > 80% 成功);终端噪声(RNNoise 阈值调优)。
资料来源:Hacker News Show HN(https://news.ycombinator.com/item?id=47164270);Terminal Phone GitLab(https://gitlab.com/here_forawhile);Reddit/TOR 讨论。
这种 CLI 对讲机证明终端可承载复杂实时通信,参数调优下延迟 < 5s,适用于应急 / 匿名场景。扩展 WebRTC 可达亚秒流式,结合 RNNoise 实现噪声环境 robustness。(1024 字)