乐趣区

关于python:为-PC-提供-35mm-耳机线控支持

源码:PaperStrike/HeadsetControlsPC

自己是一名新晋大学生,自从有了电脑,电脑开着 B 站手机刷音讯就成为了自己闲时的挚爱。为了不影响舍友 / 家人的学习生存,受制于本人的经济能力,自己始终戴着有线耳机,并在躺着看电影时发现了这样一个 恐怖 的事件:

没有一家笔记本反对 3.5mm 有线耳机线控!

好吧可能还是有的,反正在自己的搜寻中并没有找到。仅仅搜到有几个型号的台式机,反对两头的那个暂停 / 持续键。这有什么用? 不能调音量,不能调下一曲,而且,又不是我的台式机!???? 于是求助于在搜寻关键词中增加万能的程序员专用字眼:github,发现了这篇文章:

Hacking in Android headset button support for Windows | Christian Barth Roligheten

Perfect,同志们!里边具体介绍了帅哥 Christian Barth Roligheten 为本人的 PC 增加 暂停 / 持续 按键反对的过程,联合了具体的 Python 源码并提供了仓库链接(roligheten/AndroidMediaControlsWindows)。自己在 Roligheten 钻研声道图的根底上进一步剖析,在行将放弃心愿之际,偶尔中找到了分辨三个不同按键的办法。

原理

3.5mm TRRS 接口的有线耳机的麦克风与按钮并联,按钮按下时麦克风被短接,安卓设施通过检测电压差能够晓得按下的按钮。

图中各按钮常见的对应性能如下:

按键 介绍
A 暂停 / 持续
B 减少音量
C 缩小音量
D Pixel 上唤起语音助手

少数 PC 设施无奈获知电压差,但短接对麦克风两个声道产生的影响(尽管不晓得为什么,但)有法则可循。这里自己从 sounddevice 的例子库中抉择并轻修了一个 plot_input.py,用于实时输入麦克风 声道一 的波形(橙线 Channel 1)和 两声道差值(蓝线 diffChannel 2Channel 1)的波形,演示。

横轴示意工夫,单位为毫秒(ms),纵轴示意声音的变动。
数据在不同设施上可能有所不同,另外,演示中排除了轻按的状况。

无声音时,两条波均出现为一条直线。而极其 噪声 环境下,Channel 1 触动激烈,diff 保持稳定:

短按 按钮时,处于 宁静环境 (0-1000ms)和处于 噪声环境(1300-4000ms)的两条波出现的变动中,有法则的至多有:

  1. diff 在按下霎时增长至 0.06(±0.05) 并继续 40(±30)ms,在松开霎时降落。
  2. Channel 1 在按下霎时,降落并放弃在 -0.6 以下 100(±30)ms,经 30(±20)ms 增长至 0.45 以上并放弃 230(±60)ms,经 30(±20)ms 降落至 -0.40(±5) 以下。

  1. 在另外的试验中留神到,按钮放弃按下时,两条波简直不受环境声音影响(,应该是短接的起因)。

短按 (0-800ms)和 长按(850-2400ms)时,两条波在上述法则根底上又呈现出了不同变动:

  1. diff 在长按过程中在 -0.17-0.17 范畴内随机稳定,在长按松开霎时再次拉升,后降落,具体见图,不再赘述。
  2. Channel 1 在长按过程中放弃在 -0.30(±5) 以上,在长按松开霎时再次拉升,后降落至 -0.40(±5) 以下,具体见图。

放大到纵轴 0.1 范畴内,察看 diff 的变动。留神到不同按钮的按下霎时 diff 呈的稳定幅度有所不同:

  1. 按钮 A 按下霎时(700-900ms)diff 稳定峰值在 0.075 以上,按钮 B(1700-1900ms)为 0.025-0.075,按钮 C(3000-3200ms)为 0.016-0.025。

有趣味的同志能够本人下载编辑 plot_input.py,试验。

目前,我的项目应用 1 && 2 条件判断按下,5 条件判断松开,6 条件判断不同按钮。

判断条件曾经被自己换了好几次 以扩充适应的设施范畴,但因为 只有一台 笔记本和一条耳机随我调用,不兼容我也没多少方法。你违心当我的工具人吗?

装置,有趣味吗?

以下两种形式都须要联网,会主动装置依赖包 keyboardnumpysounddevice

PyPI

通过 PyPI 装置:

pip install trrsheadset

Clone

或者,从 这里 下载在 GitHub 仓库中的压缩包,解压到一个记得住地位的中央。

这种装置形式目前有一个 bug(PIP doesn’t read setup.cfg in UTF-8, which causes UnicodeDecodeError · Issue #8931 · pypa/pip),装置前须要依据你应用的命令行环境设置环境变量 PYTHONUTF8=1

  • PowerShell: $env:PYTHONUTF8=1
  • Shell: export PYTHONUTF8=1
  • CMD: set PYTHONUTF8=1

定位到解压文件夹中运行:

pip install .

而后,就能够把解压文件夹删掉。

应用

插入耳机后,在命令行中应用 Python 启动 trrsheadset 即可:

python -m trrsheadset [参数]
  • 敞开能够应用两种形式,一种是间接敞开命令行,一种是按下 ctrl+break 快捷键强制退出。
  • 选用 pythonw 启动可在命令行敞开后放弃运行,可在工作管理器中找到 Python 3.x (Windowed) 敞开。

重插耳机须要重新启动。

可选参数

-l or --log 将运行日志保留至文件

--use-hotkey 开启键盘快捷键,见后文介绍

-h or --help 输入此列表后退出

按键

耳机按键映射 & 键盘快捷键响应。基于 Python 库 keyboard。

耳机

按键 短按 长按 双击
A 持续 / 暂停 持续 / 暂停 静音 / 勾销静音
B 音量 + 下一首 /
C 音量 - 上一首 /
D / / /

双击操作处于晚期开发阶段

键盘

需在启动时应用 --use-hotkey 参数。

根底快捷键 ctrl+shift+h,在根底快捷键触发后 1s 内按下以下按键能够触发相应操作:

p 暂停或持续

e 退出

!局部设施在开启上述快捷键后,检测不到右 shift、右 ctrl 的开释动作,此时能够按击键盘右边对应按键复原。

因而,此性能在默认状况下敞开。

留神哦

  • 不要按得太快,招架不住。
  • 有问题欢送评论,也能够在 GitHub 提 issue 或进入讨论区(Discussions)交换。
  • 如果放久后按钮分别老错,可能是太久不放音乐了电压不高(?存疑,探讨欢送)
  • 感激 roligheten/AndroidMediaControlsWindows ????

抓取日志

增加参数 -l--log 启动可将运行时日志保留到 运行时文件夹 debug.log.1debug.log 日志文件中。日志文件对定位 BUG 十分有帮忙。

python run.py -l

我的项目许可

GPL-3.0 License

退出移动版