因为微信网页协议最近老是出现问题(半夜三更强制退出),导致付费文章判断不到。考虑通过图片文字识别来解决,可以不需要微信在PC上登陆,改为占用一台物理手机。准备用一台淘汰手机来完成此工作。
这里的方案是离开OCR,使用Tesseract。感觉上识别率可用。
安装
sudo apt install tesseract-ocr
sudo apt install libtesseract-dev
sudo apt install tesseract-ocr-chi-sim
//可以查看包含的语言包
tesseract --list-langs
go get github.com/otiai10/gosseract
go代码
package main
import (
"fmt"
"github.com/otiai10/gosseract"
)
func main() {
client := gosseract.NewClient()
defer client.Close()
client.SetImage("/mnt/h/2.jpg")
client.SetLanguage("chi_sim")
text, _ := client.Text()
fmt.Println(text)
}
https://github.com/jaytaylor/tesseract-web 此库换了个思路,将其作为一个OCR服务,可以供其它来调用,解决不方便安装程序的场景。
在树莓派上安装出错,需要另外添加一个: sudo apt install libleptonica-dev
经测试,在PC笔记本上识别率较高(150Kb的png2秒左右),使用完全没问题。降低画面质量也达到较高识别。
在树莓派3上的识别速度较慢(150Kb左右的png半分钟左右),png原图识别率可用。
所以,如果在树莓派上使用,更合理的是使用在线OCR。
在线OCR可以考虑一下 https://github.com/shiguanghuxian/txai ,基于腾讯,看起来还比较全,可以识别其它。
https://github.com/deloz/baiduocr 和 https://github.com/A1311981684/BaiduOCR 是基于百度在线OCR,时间有点久了,但方法差不多。
那么思路就是这样了: 手机保持常亮,获取某个区域图片进行识别。当识别到付费时,发送已付费标识给服务端,引导开放全文可读。
可能存在的问题: 刷新速度与多人付费时的问题。
https://github.com/deloz/baiduocr 出现错误,使用https://github.com/A1311981684/BaiduOCR也是出错,不过小修改即可使用了。
package main
import (
"flag"
"log"
"github.com/A1311981684/BaiduOCR/ocr"
)
/* Set you API key and secret Key in token/token.go */
func main() {
var file string
flag.StringVar(&file, "f", "screen.jpg", "识别的图片")
flag.Parse()
res, err := ocr.OCR(file)
if err != nil {
panic(err)
}
for _, v := range res {
for k1, v1 := range v {
if k1 == "words" {
log.Printf("%s"+"\r\n", v1)
}
}
}
}
在树莓派3上,压缩的jpg和png等都能较好的识别,速度也较快(从运行,上传到回传,耗时2秒左右),识别率也是很高的。
余下的问题就是如何快速的截图,并上传到服务器进行识别。
这里本地需要完成一个较为粗糙的“改变”比较,减少上传量。再说百度的调用量也是有限制的(QPS=2,通用文字识别(高精度版)500次/天免费,通用文字识别(标准版) 50000次/天免费。这个库使用了高精度版)
还是节约一点,试过了修改为普通精度也是完全没问题的(至少手机的截图还是比较好识别的,即使我压缩为jpg)
在库中的ocr/ocr.go修改
//百度高精度OCR接口URL
//Baidu high accuracy OCR API url
//const ocrURL = "https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic?access_token="
//百度普通精度OCR接口URL
const ocrURL = "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token="