编译了 wasm 版本的 OpenCC,在浏览器上可以直接进行简繁体转换了 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
oyyd
V2EX    分享创造

编译了 wasm 版本的 OpenCC,在浏览器上可以直接进行简繁体转换了

  •  1
     
  •   oyyd
    oyyd 2018-09-17 07:58:26 +08:00 3181 次点击
    这是一个创建于 2592 天前的主题,其中的信息可能已经有所发展或是发生改变。

    gif

    wasm-opencc 开放中文转换OpenCC的 wasm 版本

    这个项目对 OpenCC 进行了添加修改修改,并利用Emscripten进行编译,在 OpenCC 进行中文简繁体转换的能力上具有以下特性:

    • 可在浏览器环境中直接运行。
    • 在 node,eletron 中运行不需要再进行 addon 编译,避免复杂的 addon 部署工作。理论上应该也可以在 React Native 和 Web Worker 中运行(未经测试)。
    • 分离了字典数据的加载和文本转换功能,在浏览器中只加载必要的字典数据,并允许自定义数据加载方式,方便从 CDN 上加载数据。

    开发后的一些想法

    OpenCC 很好,但遗憾的是我们必须开个服务才能使用,而我先前一直想在浏览器上直接运行,对页面的文本直接进行转换。而后发现tesseract.js是使用 Emscripten 编译而成,对 wasm 相关技术的成熟度感到意外,于是便有了这个项目。

    在之前,我对 wasm 最关注的一点是 现在 Emscripten/WebAssembly 是否足够成熟了呢? 如果你期望的是开箱即用,文档社区支持齐全(文档其实比较齐全,只是在碰到问题搜索对应文档时容易遇到困难),不会碰到太多问题的工具的话,我的想法是“没有”。你当然需要了解 c/cpp 和构建工具,并且我碰到了很多问题,特别是内存操作的问题,Emscripten 会抛出一个错误数字,没有其他任何错误信息,定位非常困难。或许有类似 gdb、lldb 的工具帮助解决这些问题,只是我目前不知道。

    但如果你理解 WebAssembly 本身要解决的问题并不容易,并且愿意投入时间去面对这些问题的话,我想你在开发完一个项目以后会觉得 Emscripten 比你在使用前所想象的更加成熟一些。我开发完这个项目后,目前没有测试出内存相关的问题(当然本身是 js 运行环境,这点或许不值得一提);在把碰到的几个问题解决或避开以后,其他大部分代码都没有出现问题,剩下的就只是纯粹 js 领域的封装调用了。

    另外,一开始我没有打算提供 node 版本的代码,因为 @byvoid 自己早就做了 addon 的版本。但后来想到自己在开发 addon 上经历过的问题,深知 addon 在维护和部署上的困难,就一并生成了一份在 node 运行的版本。所以我觉得在 node 环境上,即便已经有了 addon 这套调用 c/cpp 的机制,wasm 也依旧具有优势。因为你可以用更短的时间,开发出不需要编译、能运行在浏览器上的版本,同时还不用理解 v8.h、node.h、Nan,只需要学习相对简单的多得多的 Embind 就可以了。

    回头来看,WebAssembly 最大的优势诚如其文档所言,你可以直接将生成 llvm 的项目运行在 js 环境下,这点和 node addon 同理。如果单纯是从应用的性能问题考虑使用相关技术工具的话,还是要慎重抉择。

    11 条回复    2018-09-17 18:01:17 +08:00
    yksoft1
        1
    yksoft1  
       2018-09-17 08:04:32 +08:00   1
    并且我碰到了很多问题,特别是内存操作的问题,Emscripten 会抛出一个错误数字,没有其他任何错误信息,定位非常困难。或许有类似 gdb、lldb 的工具帮助解决这些问题,只是我目前不知道。
    我只知道打开--profiling-funcs 不去掉函数名之后可以在 Firefox 中看到 call stack
    pango
        2
    pango  
       2018-09-17 08:49:12 +08:00
    这个可以说很实用了,完全可以商用的,感谢楼主开源。
    qdwang
        3
    qdwang  
       2018-09-17 08:49:18 +08:00 via iPhone
    我是写 rust 编译到 wasm,用 wasmbindgen 交互,感觉非常方便。
    mytry
        4
    mytry  
       2018-09-17 11:14:10 +08:00
    不复杂的项目还是编译成 asm.js 比较好,兼容性更好,代码也可以直接在控制台里看。而且最新的浏览器内部会自动把 asm.js 转成 WebAssembly 运行。
    mytry
        5
    myty  
       2018-09-17 11:24:24 +08:00   2
    等等,这玩意没有分词功能吗。。。
    ![]( )
    oyyd
        6
    oyyd  
    OP
       2018-09-17 16:03:59 +08:00
    @mytry 分词要看每个配置对应使用的分词词典,词典可以自己编辑。
    oyyd
        7
    oyyd  
    OP
       2018-09-17 16:05:32 +08:00
    @qdwang 哈哈,Rust 社区在这方面做了很多事情,早有耳闻。
    oyyd
        8
    oyyd  
    OP
       2018-09-17 16:08:07 +08:00
    @pango 感谢支持。更应该感谢 OpenCC 原项目,只是做了些微小的工作。
    oyyd
        9
    oyyd  
    OP
       2018-09-17 16:09:47 +08:00
    @yksoft1 看到你 3 天前的帖子了
    sarices
        10
    sarices  
       2018-09-17 16:38:34 +08:00
    鼠标在港澳台都是滑鼠,你只在台湾繁体做了处理,港澳没有
    oyyd
        11
    oyyd  
    OP
       2018-09-17 18:01:17 +08:00
    @sarices 感谢提出。关于字典本身的问题,恐怕最好的方法是维护一套自己的字典。这也是我把字典数据的加载分离出来的原因。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4188 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 00:13 PVG 08:13 LAX 17:13 JFK 20:13
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86