前段时间用Python写了个终端版本的谷歌翻译爬虫:https://github.com/poemdistance/google-translate
觉得不太满足,刚好可以在这基础上弄个屏幕取词翻译就好了,要解决的问题有几个:
- 鼠标动作监测
- 屏幕字符提取
- 字符串翻译
- 界面显示
- 音频播放
一:鼠标动作监测
对于鼠标动作的监测,可以直接操作鼠标设备文件/dev/input/mice来完成,了解一下鼠标接口的相关协议http://www.isdaman.com/alsos/hardware/mouse/ps2interface.htm,可以从mice中读取出几个需要用到的按键信息存储到一个数组中,通过对数组信息的分析推算鼠标动作。
二:屏幕字符提取
关于屏幕字符提取,想到几种方法,
一是截图识别,不过准确率不够,实施起来也不算简单;
二是看能否从帧缓冲设备着手直接提取选中的字符,不过,太过底层,涉及的东西又多还都是知识盲区暂时不考虑;
三是用简单粗暴的办法,模拟按键发送Ctrl-C或者Ctrl-Shift-C来完成文本的复制。这个时候需要解决的问题有:
- 如何获取剪贴板内容
- 如何获取当前窗口的应用名称
- 如何模拟按键发送复制操作
因为电脑是Arch+Gnome,底层提供窗口等的服务用的是Xlib,可以从这里入手,另外模拟键盘操作也可以向键盘设备文件写入一定格式的一定数据来完成。
获取窗口应用名称可以打开一个管道执行现有命令,并读取其输出即可。至于为何要获取应用名,是因为对于终端来说,复制操作是ctrl-shift-c而不是ctrl-c,既要区别对待,必然需要先识别出当前窗口属于哪个应用。
屏幕字符提取的具体实现可以看这个项目:https://github.com/poemdistance/Screen-Word-Extraction
二更:
最后发现,X服务已经将屏幕中高亮的文本自动提取放置在了Primary Selection里,目前程序已直接从此剪贴板获取选中文本,省略了模拟复制。
三:字符串翻译
直接用exec函数调用写好的谷歌翻译爬虫即可,项目地址:
https://github.com/poemdistance/google-translate
之后又增加了个百度翻译的爬虫:
https://github.com/poemdistance/baidu-translate
四:界面显示
可以采用Gtk完成界面编程,一方检测到有取词动作后进行翻译入口图标的弹出,按下入口图标后跳转到翻译窗口,监听窗口相关事件,完成相应动作,根据翻译结果动态调整显示界面的大小,放置谷歌百度翻译结果的切换按钮,随着窗口尺寸的拖拽,重绘相关控件以及背景图片,以适应新窗口。
另外尽量减少窗口的变化,提高用户体验,当切换到另一个翻译结果界面时,对比最佳界面大小,如果上一次的界面大小已经足够容纳当前窗口,不再重设尺寸。
如果界面弹出后翻译结果没被获取成功,如何在下一次的切换途中重新加载出来。
另中文字符的切割可以先弄懂UTF8编码格式,按照格式特点编写相应代码即可,详情见项目adjustStr.c文件
五. 音频播放
音频播放采用GStreamer库来完成,对传入的url进行直接播放,不用再写下载程序,播放逻辑为:播放按钮按下后,调用播放单词读音的回调函数,设置标志变量,切换英音和美音的播放。
代码架构:
代码整体架构:主函数开启多个线程,分别用于鼠标动作检测、入口图标绘制,翻译界面呈现。
其中检测到取词动作后,调用封装好的函数获取剪贴板内容,送入Python翻译输入端,Python获取的结果按一定格式写入共享内存,约定写入完成标志位用于判断写入完成情况。
C语言段检测到翻译结果获取完成,弹出入口图标,超时或用户区域外单击则销毁图标,点击图标则弹出翻译结果,最后调整字符串,插入到界面,呈现翻译结果。
整个Linux屏幕取词翻译项目见:https://github.com/poemdistance/ScreenTranslation
更新:
目前程序已添加快速搜索功能(Quick Search),由快捷键调出搜索框,输入后按回车符弹出翻译结果,实现思路:
1. 先是完成了Linux全局键盘监听和快捷键调出搜索框的功能,之后解决了Gtk绑定新的快捷键进行信号触发,进行搜索框的呼出和关闭,注册相关信号回调函数,捕获搜索框对应信号完成文本提取。
2.融合代码到原来工程项目,具体是在原来的项目中新开一个进程运行Quick Search,开辟新的共享内存,使原来的项目能够与Quick Search通信,交换必要信息,告知原项目当前正在运行Quick Search,请求数据写入Python翻译端,并调出翻译界面。
3.Quick Search端检查共享内存相关标志位,在翻译界面打开的状态下,忽略调出搜索框的快捷键操作
当然,这里省略了很多内部代码逻辑,有兴趣的话,可以看一下源码:
Linux屏幕取词翻译(适用于如Gnome等基于X server的桌面发行版) — 含界面
Quick Search 功能演示:
正在找类似的东西, 感谢楼主