xulihang's blog 2021-08-01T05:18:15+00:00 xulihanghai@163.com 旅行 2021-07-31T13:37:50+00:00 xulihang blog.xulihang.me/traveling 这周跟公司去了湖南旅行。这种公司团体旅游我还是第一次体验。

上一句话里我用了旅行和旅游两个词。前者强调位移,而后者强调游玩。旅游都需要旅行,但旅行并不一定包含游。本文里我主要还是用旅行一词吧。

出行前,我看了下维基百科里旅行的词条,我觉得这段维基百科让我了解了旅行的一些意义:

旅行指人徒步或通过交通工具进行的“长距离”位移,也指包含此位移的活动。其可能以商务,通勤或者消遣(见旅游)为目的。一些旅行需要在旅行社的协助下进行。 旅行亦指為觀賞不同景色,以及了解異與自身文化的差別,而到不同城市、國度或到遙遠陌生地區遊覽的文化概念。 你和當地人之間的關係是建立在情感而非利益上,你和當地人一起生活、吃飯、聊天、工作、照顧小孩及玩樂,與他們一起體會〝在地的生活〞,從中學習到知識、智慧、看事情的面向及人生道理。

我希望能在有限的几天里了解下湖南和当地的文化,体验下本地人的生活。

首先来到了长沙。来到一个城市,最直观的印象便是市容和交通。长沙街边都是香樟树和紫薇树,马路宽广,高楼林立整洁,市容这方面给我的感觉还是不错的,而且骑行在路上,它还给我一种在老家海宁的感觉。可能也是我潜意识里想从长沙本地人的视角看这座城市。但第一天在橘子洲大桥附近的堵车让我觉得长沙的交通规划存在不足。

然后讲当地的文化。文化是一个抽象的概念,可以有物质和非物质的分类。物质的比如当地的饮食。我体验了下湘菜,有辣椒炒肉、剁椒鱼块、酸萝卜炒肚丝等。看了百科说辣椒能祛湿,但奇怪的是浙江夏天湿气重,饮食却并不以辣为主。除了传统的湘菜,也有新流行起来的食品,像茶颜悦色,在长沙开了很多的店面。非物质的则比如当地的方言、名人。湖南方言主要是湘语、西南官话,不过现在普通话普及,我一个外地人不太有机会和当地人用方言交流。湖南近现代名人比较多,听导游说,从国家主席到十大元帅、十大将军,很多都是湖南人。长沙马路上的能看到很多墙上都是介绍革命烈士的内容。适逢建党100周年,路灯上也都挂着红色的牌子,能感受到城市的红色底蕴。

除了长沙,我们还去了韶山。在路上可以就看到大片的农田,田里种着水稻。以前学历史,记得关于中国粮食供应中心变迁的几句话:“苏湖熟,天下足”、“湖广熟、天下足”。袁隆平做杂交水稻试验就是在湖南搞的。毛主席故居前也都是一片片的水稻田,应该也是特意保留的。

我这里只写我实际看到的,其实还有很多值得了解的地方。像城市的产业也是城市的重要组成。长沙的传媒行业比较发达。小时候看蓝猫淘气,知道三辰卡通的基地就是在长沙。

来湖南的两天多,行程主要围绕景点展开,去了橘子洲、太平老街、五一广场、毛主席故居、岳麓书院等地,时间短暂,走的时候我感到有点不舍。除了对离开旅行地点的不舍,还有对这次团队出行的不舍。

]]>
我遇到的销售套路 2021-04-10T05:15:50+00:00 xulihang blog.xulihang.me/sales-tricks 来杭州后我遇到了不少销售人员,发现他们用了不少套路,这里记录一下。

  1. 您中奖了。珠宝店店员邀请我参与刮奖,假装惊讶地说我刮到了特等奖,可以免费领取一款珠宝。我还真以为有便宜可以赚,一看说明,要出25%的工本费。这一套路带有欺骗性质,店员演得也比较明显,我能直接看出来。
  2. 首次购买优惠与限期优惠。注册会员后,往往在一定期限内或者首次购买,可以得到优惠。让我有一种过了这个村就没这个店的感觉。但可能市场价本来就是优惠后的价格。
  3. 量大优惠。数量大后,所需支付的绝对值也上去了,虽然有优惠,但还是得花不少钱。
  4. 特定产品买一送一。比如健身卡,办一个月价格很贵,而办一年,平均到每月会低很多,并且还送一年。

销售虽然有很多套路,不过他们也会用心地去发现我们的需求,推荐合适的产品。我还是希望少点套路,多关注产品和服务本身。

]]>
设计一个日语漫画辅助阅读器 2020-12-30T11:33:50+00:00 xulihang blog.xulihang.me/design-a-good-raw-Japanese-manga-reader 我稍微懂点日语,但直接看原版漫画还是比较吃力。于是我针对性地完善了ImageTrans以更好地用于阅读日语漫画,可以准确识别文字并提供机器翻译结果便于了解大概意思。

软件功能:

  1. 自动定位文字区域

    定位文字区域的方法有很多,比如使用轮廓检测或者连通区域标记法提取气泡、使用文字连通区域法直接检测文字、深度学习目标检测方法、自然场景文字检测方法等等。我将这些方法都整合进了ImageTrans供用户选择。

  2. 聚合多种OCR引擎,哪个好使用哪个,并提供竖排文字图片转横排功能

    整合了百度、微软、有道、腾讯、搜狗等在线OCR引擎和Tessearct离线引擎。

    但测试只有tesseract、微软和有道支持竖排的文本,所以我又做了一个将竖直排列的文字横向排列的功能。

    原图:

    百度识别结果:证山,K领山源十诲!心长想:2や十

    转换后:

    百度识别结果:今日からみんなと勉強する事になった灰原哀さんです!

    但这要求文字区域的背景是白色的,如果比较复杂就不能重新排列了。

    更新:其实百度有提供精确版OCR,是支持竖排识别的,只是每天有500次的使用限制。而且有时候识别结果不如转换为横排后识别得到的结果好。

  3. 提供去除振假名的功能

    用于注音的振假名会影响OCR结果,需要进行去除。

    去除前:

    tesseract识别结果:いきなり東大を_目指しだして以来

    去除后:

    tesseract识别结果:思えば高-のとき三者面談でいきなり東大を目指しだして以来

  4. 整合多种机器翻译引擎

    整合了谷歌、百度和腾讯等机器翻译服务。但测试下来,很难把原文意思翻译出来。日语比较特别,有很多语气词,内容还依赖于语境。不过切换不同的机器翻译再加上图片内容,大致意思就能理解了。

  5. 将译文替换回图片

  6. 使用Chrome插件翻译网页中的图片

    现在一般在线看漫画,用Chrome扩展获取网页中图片链接并把翻译好的图片替换回去,体验会好很多。

视频演示

手动分步翻译:

一键自动翻译:

视频中的自动翻译使用搜狗深智OCR定位文字并识别文字,处理速度和准确度都比较高,让我觉得我在研究文字定位和OCR图像预处理方面浪费了太多力气。

最新研究

日本的几位博士针对日语漫画设计了一整套翻译系统并发表了一篇论文:《Towards Fully Automated Manga Translation》(链接

他们针对漫画设计了考虑上下文与多模态的机器翻译,训练了能识别振假名的OCR、漫画分镜和文字目标检测器,采用EdgeConnect图像修复法去除文字,根据文字区域面积自动调整排版译文,并制作了可用于评价检测和翻译的数据集以及一个在线翻译系统。

他们成立的公司叫做mantra,但目前还没有公开可用的系统。

不过实际使用的话,除了机器翻译考虑上下文与漫画中的图像信息,各方面和ImageTrans没有太大差距。因为ImageTrans目前整合的功能已经有较好的效果了,要再提升的话主要是并发处理和提高翻译质量以及软件的可用性这些方面。

]]>
训练一个图像分类器并在OpenCV中调用 2020-12-04T13:39:50+00:00 xulihang blog.xulihang.me/train-an-image-classfier-and-use-it-in-opencv 单纯的记录。

目标:训练一个判断图片内是否包含文字的分类器,并让ImageTrans能通过OpenCV进行调用

步骤:

  1. 使用TensorFlow训练图片分类模型

    使用ImageTrans导出包含文字的图像和不包含文字的图像用于训练。使用TensorFlow提供的make_image_classifier脚本进行训练,会生成tflite和savedmodel格式的模型文件。

  2. 转换savedmodel格式的模型为frozen graph

     import tensorflow as tf
    
     from tensorflow.python.framework.convert_to_constants import convert_variables_to_constants_v2
    
     loaded = tf.saved_model.load('my_model')
     infer = loaded.signatures['serving_default']
    
     f = tf.function(infer).get_concrete_function(input_1=tf.TensorSpec(shape=[None, 224, 224, 3], dtype=tf.float32))
     f2 = convert_variables_to_constants_v2(f)
     graph_def = f2.graph.as_graph_def()
    
     # Export frozen graph
     with tf.io.gfile.GFile('frozen_graph.pb', 'wb') as f:
        f.write(graph_def.SerializeToString())
    

    代码来自:Import SavedModel from TensorFlow

  3. 使用OpenCV的DNN模块进行调用

     import numpy as np
     import cv2
    
     net = cv2.dnn.readNet('frozen_graph.pb')
     image = cv2.imread(filename)
     img_tensor =  cv2.dnn.blobFromImage(image, 1 / 255.0, (224, 224), swapRB=True, crop=False) 
     net.setInput(img_tensor)
     out = net.forward()
     print(out[0][1])
     print(out.shape)
    
]]>
不求甚解与咬文嚼字 2020-11-18T08:26:50+00:00 xulihang blog.xulihang.me/do-not-pursue-deep-understanding-and-ponder-on-every-word-and-character 不求甚解和咬文嚼字是一对反义词。

不求甚解出自陶渊明的《五柳先生传》,讲的是读书主要了解大意,不求彻底了解。咬文嚼字则出自元代无名氏的《杀狗劝夫》,我记得看过的一本杂志便叫这个名字,所以印象深刻。

今天中午的时候,我和翻译公司的HR互发邮件。因为是外企,所以是用英文写的。但我发现HR信里的句子多是语法问题,主要是空格、介词和冠词的问题。这些问题放到Grammarly里检查一下就可以检查出来。我想作为一个翻译公司,这点错误还是不应该犯的,虽然内容还是能够理解。

而在我下午发的一条微博里,我自己却也用错了一个词。今天的最高气温有28度,比往年热得多。我说同样是11月下旬,14年的时候我好像都穿羽绒服了。不过我很快发现,旬表示10,一个月分为三旬,18号属于中旬。

而前几天,我看《老友记》时,听到Charlie跟Joey说,songs结尾的s要发z。我才知道还有这么一个规则。

我意识到我之前学习的时候不求甚解,使得很多基础知识没有学好。为了语言表达的精准,咬文嚼字还是有必要的。同样不求甚解的还有学古诗,小学时老师布置一个背诵排行榜,我为了排在前列,背了很多诗,但并没有好好地是赏析诗。

那不求甚解就是不好的吗?我觉得在水平没有达到一定程度的时候,我们对事物的认识是有限的,没有办法彻底了解,这个时候不求甚解地广泛进行阅读,认识水平加深后,咬文嚼字才会开始有味道起来。

]]>
翻译的动机 2020-10-20T10:08:50+00:00 xulihang blog.xulihang.me/translation-motivation 我开发了一系列的翻译软件,旨在提高译员的翻译效率。用自己开发的软件做翻译是很有意思的一件事情,我用BasicCAT翻译了BasicCAT的文档、ImageTrans的文档和界面,此外也完成了很多来自翻译公司的翻译任务。

但最近因为要找全职工作,我就不再做兼职翻译了,而我自己的软件文档也都已经翻译好了。没什么翻译任务了,我不由思考还有什么东西是值得我去翻译的,我做翻译是出于什么动机或者说目的。

在学校的时候做的翻译基本是出于学习的目的,要想彻底了解原文,翻译通常是最好的一个方法,可以提高语言能力。在不同语言间转换也充满了乐趣。

做商业翻译的主要目的则是为了了解市场、积累经验以及最终的结果:赚钱。因为翻译的稿费是根据翻译的字数确定的,做这类翻译常常会追求翻译的速度。不过在甲方公司做翻译,如果没有时间规定,工资也不是按翻译结算,那还是可以慢慢翻的。

个人选择翻译任务,除了像我这样完成自己软件的文档翻译,还有很多类型,比如看到一部不错的漫画作品还没有人翻译介绍进来,很想自己做第一个翻译的人。这是国内的很多汉化组在做的事情。如果作品能够被出版或者发布在国内的正版平台上则还能够获得收入。

许均在《翻译动机、翻译观念与翻译活动》一文中列出了很多例子,例如梁启超是为了维新变法、改变社会,萧乾和文洁若夫妇认为乔伊斯的《尤利西斯》有多方面的价值,亦对我国小说创作有可借鉴的地方。

萧乾认为翻译的作品应该是译者所喜爱的,这样才有动力去翻译并翻好。这或许也是用爱发电的汉化组汉化作品比官方翻译质量更高的原因。

]]>
竖直文字排版 2020-10-15T09:19:50+00:00 xulihang blog.xulihang.me/vertical-text-engine 中文、日文和韩文都能够竖直排版,现代日语的书籍还沿用了过去从右往左阅读的竖直排版模式。

翻译日语漫画为中文或者中文翻译为日文时,汉字通常需要竖直排版。

将汉字竖直排列,有一种简单的字符串处理方法,需要规定好每行有几个字,然后将汉字重新进行排列。

B4X示例代码(来源):

Sub MakeItVerticalForCJK(s As String, NumberOfLettersPerColumn As Int) As String
	Dim sb As StringBuilder
	sb.Initialize
	Dim NumberOfColumns As Int = Ceil(s.Length / NumberOfLettersPerColumn)
	For y = 0 To NumberOfLettersPerColumn - 1
		For x = 0 To NumberOfColumns - 1
			Dim Index As Int = (NumberOfColumns - 1 - x) * NumberOfLettersPerColumn + y
			If Index < s.Length Then
				sb.Append(s.CharAt(Index))
			Else
				sb.Append(" ")
			End If
		Next
		sb.Append(CRLF)
	Next
	Return sb.ToString
End Sub

输出示例:

原文:
今天开始和大家一起学习的同学!

输出:
习大今
的家天
同一开
学起始
!学和

汉字和全角标点的宽度高度基本是一致的,所以效果还可以。但如果混入半角标点符号和拉丁字母以及空格,效果就不行了。此外,不能控制每行要显示哪几个字。

我想到可以把文字先转换为图片,然后对图片进行调整,从而实现一个文字竖排引擎,可以供ImageTrans使用。

效果展示:

原文:

今日から
みんなと勉強
する事になった、
灰原哀さん
です!

输出图像:

竖排时需要遵循日语汉字的排版规则,例如:

  1. 感叹号、冒号居中,顿号、逗号和句号靠右排列
  2. 日语的延长音需要进行旋转,类似的还有竖排引号『』。后者可以直接改用﹃﹄
  3. 英文单词向右旋转90度排列
  4. 位数较小的数字横向排列在一起

一个完善的文字引擎还需要考虑斜体加粗等富文本格式、字间距、行距、对齐等内容,较为复杂,目前我还没有实现。

相关文章:

]]>
日语OCR的图像预处理 2020-09-29T07:04:50+00:00 xulihang blog.xulihang.me/Japanese-ocr-image-preprocessing ImageTrans集成了百度、有道和微软等厂商的OCR服务,英文和中文的识别效果都还不错,但日语的识别准确率一直不是很高。

OCR一般需要先对文字进行拆分。像中文日文和韩文中存在的汉字都是可以较为容易地切分的,因为汉字都是比较标准的方块,用水平投影和垂直投影就可以得到文字行和单个文字。其实做OCR并不是特别复杂。

日语文字识别的难点在于文字有时候是竖直排版的,而且在文字边上还会有用于注音的振假名(Furigana),对结果存在干扰。

我在测试百度OCR的日语识别效果时,发现它能较精确地识别日语,但不能根据竖直排版调整文字顺序,它提供的API的结果里也没有给出单个汉字的位置信息。

于是我决定预先将文字竖直排版的日语图像转换为水平横向排版图像,并去除振假名等干扰信息,之后再使用现有的OCR软件进行识别。

这一方法存在一些难点:

  1. 竖直排列的标点符号需要进行旋转
  2. 正确区分振假名和汉字列
  3. 要避免上下结构的汉字被切分的问题
  4. 文字的排列需要合乎规则,比如遵循中心线、固定的行高、拗音的假名等等

有道OCR在这方面做得较好,能识别竖排日文,而且对标点符号的还原也很好。

下面是我实现的效果。

例1

原图:

纯文字:

转换后的图像:

例2

原图:

纯文字:

转换后的图像:

其实我已经把文字都拆分了,完全可以自己做OCR,等有空了再研究下吧。

]]>
内容切分 2020-07-25T13:11:50+00:00 xulihang blog.xulihang.me/content-split 在领英上看到Translated的CEO发了一个视频,我费了半天劲从Youtube上下下来,发现内容是长达50分钟的一段独白,还是英文无字幕的,瞬间就没了兴趣。

这样的视频其实和播客也很像,很多播客长达1个小时,播主觉得里面讲了很多有价值的东西,但听众要仔细听完这么长一段才能保证不错过有价值的点。

这时候我觉得要是能够标识出关键节点就好了。这一功能我最早在优酷上看到过,可以在进度条上显示有关节点和节点的文字描述。这一功能的相关英文有video highlight、video skimming,可以高亮重点内容,便于用户跳转进度。

也有人直接把高潮片段做了剪辑,比如bilibli上的很多up主传的集锦视频。这些视频一般不超过5分钟,类似于现在的短视频。

其实除了视频的切分,其它很多东西都是需要切分的。比如一个苹果要切成容易吃的小块,马拉松要分成数段,一部小说要分成许多章节。技术文档写作常常强调把内容分为小点,以列表的形式呈现。

不过有的内容并不适合进行切分,比如句子关联性非常强的一段文字,环环相扣,难以进行分点叙述。我在论文写作中就碰到过这样的问题。

]]>
漫画翻译心得 2020-07-25T07:11:50+00:00 xulihang blog.xulihang.me/translating-comics 我的硕士毕业论文是《一个漫画翻译辅助工具的设计与实现》(researchgate),主要成果是ImageTrans这一辅助翻译工具,从图像处理和文字翻译两个方面进行辅助。完成论文后,我又继续做了xkcd和腾讯动漫上的一些中文漫画的翻译,这里我把我的心得做一个总结。

图像处理

  1. 翻译软件应能正确生成文字区域

    漫画翻译需要以文字区域为单位进行。文字区域应该以语义片段为单位,一般就是一个段落。不同气泡中的文字区域不应该被合并。

    漫画文字通常存在于气泡中,但也有许多文字不在气泡里。传统的基于气泡检测的方法没有办法检测气泡外的文字,比较实用的是合并连通区域并对这些候选区域进行分类以获得正确的文字区域的方法,但它不适用于背景颜色比文字颜色深的情况。

    此外也可以用深度学习目标检测方法和自然场景文字检测方法。目标检测也需要生成候选区域,其使用的方法用于漫画文字不够精确。而目前最先进的自然场景文字检测方法,比如CRAFT,效果则很好,缺点就是单机部署处理的速度比较慢。

    ImageTrans使用基于连通区域的文字区域检测方法,可以设置相关参数,并能够通过检测文字外的轮廓判断不同区域是不是需要合并。

  2. 翻译软件应集成图像浏览与翻译功能

    漫画翻译是一种符际翻译,译者翻译时需要参考图像,所以应该提供便利的图像浏览和片段切换方式。

    很多翻译公司是将图像文字转录为表格,然后给译员翻译。这样如果显示设备空间不够,会存在来回切换窗口的问题,也会存在文字和图像对应出错的问题,比如不知道转录的文字对应漫画中的哪句话。

    ImageTrans支持用户点击图片上的文字框来进行翻译,并能够实时预览翻译效果。

文字翻译

  1. 尽量使用简短、地道的表达

    因为漫画文字的空间受到限制,尽量使用较短的表达。另外漫画中的文本多为人物对话,一般需要使用比较地道的口语表达.

    我们可以通过检索语料查找相关表达。影视字幕文件是一个好的语料来源。

    比如这么一句话:

    那个女人也抛弃了他和他的对手好上了

    百度翻译结果:

    That woman also abandoned him and his opponent

    腾讯翻译结果:

    The woman also abandoned him and fell in love with his opponent.

    检索老友记的平行语料,可以找到相关条目。

    首先检索“抛弃”,发现可以选择较短的dump表示抛弃的意思:

     8
     note: Friends.S03E22.chs&eng.sohu.ass 0:07:04.48,0:07:07.32
     en: I dump him for telling people the short version.
     zh: 我会因为他光说简单的 抛弃了他
    
     10
     note: Friends.S05E08.chs&eng.sohu.ass 0:02:54.93,0:02:56.63
     en: and abandoned its entire family.
     zh: 抛妻弃子的话
    
     15
     note: Friends.S06E02.chs&eng.sohu.ass 0:21:29.93,0:21:32.99
     en: But then we ditch those two and we get married.
     zh: 接着我们就抛弃他们结婚
    

    然后检索“好上”,可以找到hook up这个表达:

     9
     note: Friends.S10E03.chs&eng.sohu.ass 0:20:55.13,0:20:57.40
     en: When you and Monica first hooked up...
     zh: 你和莫妮卡刚好上的时候
    

    整句可以翻译为:The woman dumped him and hooked up with his opponent.

    但有些表达在语料库里可能检索不到,最好还是平时多看剧,有条件就出国,熟悉英文的表达。

  2. 灵活翻译拟声词

    我遇到一个漫画用“唰”表示把衣服脱在床上以及用修眉刀修眉毛的声音。想不出对应的英文拟声词,可以把动作翻译出来,分别翻译为fell和shave。

  3. 摆脱原文束缚

    翻译并不一定要完全按照原文一字一字翻译,漫画翻译一般用流畅的文本把原文的意思表述出来就行了,而且更加容易理解。

    比如xkcd 第2336篇中的这么一段话:

    Astronomers define the Campfire Habitable Zone as the region where you're far enough not to be burned but close enough to roast marshmallows.

    百度翻译:

    天文学家将篝火可居住区定义为:你离这里足够远,不会被烧焦,但距离足够近,可以烤棉花糖。

    DeepL:

    天文学家将 "篝火宜居区 "定义为:在这个区域里,你离得足够远,不会被烧伤,但又足够近,可以烤棉花糖。

    我校对的翻译:

    天文学家对篝火宜居带的定义:离篝火足够远,不至于被烫伤,又足够近,能烤棉花糖的区域

  4. 注意俚语、习语等表达

    比如我最近帮忙校对的xkcd的这篇漫画(https://weibo.com/7321032418/JcNQ13tgM):

    里面那句这招永远玩不腻的英文是That never gets old,最初的翻译是这帮人永远长不大。这是该漫画最主要的梗,居然也翻错了。get old是一个习语,表示不会厌倦的意思。翻译漫画时应该具有辨别习语和俚语这类表达的意识。

]]>