Linux屏幕取词翻译 – 思路及实现

前段时间用Python写了个终端版本的谷歌翻译爬虫: 

二:屏幕字符提取

关于屏幕字符提取,想到几种方法,

一是截图识别,不过准确率不够,实施起来也不算简单;

二是看能否从帧缓冲设备着手直接提取选中的字符,不过,太过底层,涉及的东西又多还都是知识盲区暂时不考虑;

三是用简单粗暴的办法,模拟按键发送Ctrl-C或者Ctrl-Shift-C来完成文本的复制。这个时候需要解决的问题有:

  1. 如何获取剪贴板内容
  2. 如何获取当前窗口的应用名称
  3. 如何模拟按键发送复制操作

因为电脑是Arch+Gnome,底层提供窗口等的服务用的是Xlib,可以从这里入手,另外模拟键盘操作也可以向键盘设备文件写入一定格式的一定数据来完成。

获取窗口应用名称可以打开一个管道执行现有命令,并读取其输出即可。至于为何要获取应用名,是因为对于终端来说,复制操作是ctrl-shift-c而不是ctrl-c,既要区别对待,必然需要先识别出当前窗口属于哪个应用。

屏幕字符提取的具体实现可以看这个项目:之后又增加了个百度翻译的爬虫:

 

五. 音频播放

音频播放采用GStreamer库来完成,对传入的url进行直接播放,不用再写下载程序,播放逻辑为:播放按钮按下后,调用播放单词读音的回调函数,设置标志变量,切换英音和美音的播放。

 

 

代码架构:

代码整体架构:主函数开启多个线程,分别用于鼠标动作检测、入口图标绘制,翻译界面呈现。

其中检测到取词动作后,调用封装好的函数获取剪贴板内容,送入Python翻译输入端,Python获取的结果按一定格式写入共享内存,约定写入完成标志位用于判断写入完成情况。

C语言段检测到翻译结果获取完成,弹出入口图标,超时或用户区域外单击则销毁图标,点击图标则弹出翻译结果,最后调整字符串,插入到界面,呈现翻译结果。

整个Linux屏幕取词翻译项目见:https://github.com/poemdistance/ScreenTranslation

 

 

更新:

目前程序已添加快速搜索功能(Quick Search),由快捷键调出搜索框,输入后按回车符弹出翻译结果,实现思路:

1. 先是完成了Linux全局键盘监听和快捷键调出搜索框的功能,之后解决了Linux屏幕取词翻译(适用于如Gnome等基于X server的桌面发行版) — 含界面

 

Quick Search 功能演示: