开源项目 Keytap(kbd-audio)

本文包括Keytap项目的简单介绍以及kbd-audio的使用

关于Keytap

据项目开发人讲,此项目受关注的起因是某个著名开发者注意到了他在Hacker News上的一个回复

Github kbd-audio

以下个人理解来自 Keytap 官方项目说明 Keytap: description and some random thoughts

kbd-audio工具是Keytap项目的实现,可以通过麦克风捕捉键盘(一个键)敲击时产生的声音,并且根据这个声音推测此次敲击的键,可以理解为机器听觉。

它实现的流程是这样的:

  1. 首先需要一个(kbd-audio中后缀为.kbd)的学习数据(training data)。
    • 在真正进行键位预测前,需要一些 已知输入键的声音样本,来让程序了解什么声音对应什么键。
    • 学习数据的生成并不是简单的映射【键位】和【录音】,开发者做了一些复杂的处理。
  2. 生成一个预测模型。
  3. 键盘按键检测。
  4. 对检测到的击键进行键位预测。

学习数据的生成

现阶段两个击键间的声音会被去除,只保留每个击键前后75-100毫秒的声音样本。因为硬件或软件的原因,键盘被按下 到 程序触发击键事件中间会有随机的延迟,这个延迟是不固定的。

作者以他的键盘的G键为例,展示了其波形图:

从图中可以看出,在放开键的时刻同样会生成波峰,而Keytap会直接放弃松开键时的波峰。也许在这个部分也可以提取到一些有用的信息,但是为了简化,Keytab忽略了这部分数据。最后,生成的学习数据长这样:

75毫秒的区间会对输入速度有很大的限制,如果输入速度过快,不同键的学习数据会混在一起。

一个键可以重复输入,输入次数越多预测效果越好,程序会结合多次输入来减轻噪音干扰。

生成预测模型

Keytap使用了简化的方法,对每个击键学习数据执行三个步骤:

  1. 对齐(Align)波形的波峰。
    • 这一步会避免预测击键事件前的随机延迟。
  2. 根据相似性度量(similarity metric),进一步对齐(Finer alignment)波形。
    • 有时候波峰并不是最好的指示标准,所以使用了这个更精确的方法。
    • Keytap使用互相关(Cross Correlation (CC))来进行相似性度量的计算:Ai和Bi是要比较的两个波形样本,CC值越高代表两个波形越相似。
  3. 对对齐的波峰进行加权平均。
    • 权值由相似性度量来决定。

因为相似性度量会需要CPU进行大量的计算,所以没有直接使用步骤二——步骤一会有效的缩小对齐区间,减少计算量。

两个按键间的时间信息会潜在的被集成到预测模型中。作者目前已经避免使用一些方法,使时间信息难以植入其中。

按键检测

Keytap 使用了相对简单的阈值技术来在纯音频中检测击键事件。

这个阈值是相对的——它相对于前几百毫秒的平均样本强度。

作者对目前的方案并不满意,但不希望使用可自由设置的阈值,原文:

The approach is definitely not perfect and I wish I knew how to make a more robust approach for detecting the press events. I also don’t like the free parameter associated with the current thresholding techinique.

由检测到的击键推测键

一旦检测到可能的击键,程序确定波峰的位置并计算那部分的相似性度量,然后拿这部分相似性度量与学习数据中的相似性度量进行比较。程序可以取一个波峰两边的小校准区间。比对后,相似度最高的相似性度量代表被按下的键。

 

kbd-audio的使用

解释了这么多,kbd-audio的实际使用如下。

环境

  • Ubuntu 18.04
  • cmake 3.10.2
  • gcc/g++ 7.3.0

步骤

  1. 准备环境
    • clone kbd-audio
      git clone https://github.com/ggerganov/kbd-audio
      cd kbd-audio
      git submodule update --init
      mkdir build && cd build
    • 安装cmake
      sudo apt install cmake
    • 安装kbd-audio依赖——SDL2 和 FFTW3
      # 安装fftw3
      sudo apt-get install fftw3 fftw3-dev pkg-config
      # 安装SDL2
      sudo apt-get install libsdl2-2.0
      sudo apt-get install libsdl2-dev

      实际操作验证:安装fftw3并不需要下载源码自行编译(很多教程都这么写,结果编译到一半都会报错,为此更换过gcc/g++版本,还从16.04升到18.04,均无果),直接apt安装即可正常使用。

  2. 编译kbd-audio
    cd kbd-audio
    git submodule update --init
    mkdir build && cd build
    cmake ..
    make
  3. 进入build目录就可以按照Github的使用指南操作了
    # 以写入二进制的方式录音
    ./record-full [your filename].kbd
    # 播放二进制录音
    ./play-full [your filename].kbd
    # 只在敲击键盘时录音,用来生成学习数据
    ./record [your filename].kbd
    # 播放使用./record录取的音频
    ./play [your filename].kbd
    # 通过麦克风实时捕捉键盘敲击声音,使用由./record生成的学习数据
    ./keytap-gui [your training data filename].kbd [result file1.kbd] [result file2.kbd]
    # 展示由 ./record-full 录制的音频数据
    ./view-full-gui [your filename].kbd
    # 展示由 ./record 录制的音频数据
    ./view-gui [your filename].kbd

    首先使用record指令,然后按下几个键,ctrl+c结束。然后使用key-tap-gui指令,测试刚才输入过的键。

效果展示

  • 生成学习数据
  • 实时推测按键

一些问题

  • 你需要一个好麦克风 : )(并且系统中调整好阈值)。
  • 在使用kbd-audio过程中,发现一个频繁发生的情况:推测结果往往是实际按键的相邻键。作者也发现了这个问题,他推测可能有两种原因:
    1. 相邻键会发出相似的声音。
    2. 根据现阶段使用的方法,按键相对于麦克风的距离对预测结果有着决定性的作用。
  • 作者认为第二种可能性更大。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据