如何给 Kindle 电子书中的汉字添加拼音注音
最近有小伙伴留言问如何给 Kindle 电子书添加拼音注音,就花了点儿时间研究了一下。给 Kindle 电子书添加拼音标注,需要解决两个问题:一个是如何像一般的纸质书那样上面显示拼音,下面显示汉字;另一个就是如何批量给每个汉字生成拼音,很显然手动录入效率会很低。
好在这两个问题都可以解决。上面显示拼音下面显示汉字可以使用 HTML5 的新标签 <ruby>
实现,还好 Kindle 的 KF8 标准的电子书也支持这个新标签。批量给汉字生成拼音可以使用 GitHub 上的一个用 Ruby 语言写的开源项目 ruby-pinyin 来实现。这两个基本问题实现之后就可以通过几个小软件和一段脚本结合,把电子书(一般应该是给孩子看的)转换成如下图所示的效果。
不过需要注意的是,虽然这种批量处理的方式可以省去大量重复工作,但受限于软件自身的缺陷,还是需要人工对生成的内容校正一下,避免多音字、音标标注之类的错误。这类错误对于成人的阅读或许没有太大障碍,但对于正处于识字阶段的孩子看的东西,仔细校正就显得尤为重要。
下面是具体的实现步骤。虽然可能会涉及到一段代码,但无需担心,按照步骤来即可。
1、安装 Ruby 和 ruby-pinyin
下载 Ruby:https://www.ruby-lang.org/zh_cn/downloads/
下载 ruby-pinyin:https://github.com/janx/ruby-pinyin
首先安装 Ruby(官方文档),然后在“终端”或“命令提示符”上输入命令 ruby -v
确认一下是否已安装。另外,还需要安装 DevKit 才能正常使用 gem 安装 ruby-pinyin。
DevKit 的安装也很简单。在 RubyInstaller 下载页面底部找到和你的系统相匹配的 DevKit 压缩包,下载之后解压缩。使用命令提示符定位到解压缩的目录,先输入 ruby dk.rb init
,然后使用代码编辑器编辑生成的 config.yml 文件,在三个中划线下面添加 Ruby 的安装路径,如 - C:\Ruby23-x64
,最后在命令提示符中输入命令 ruby dk.rb install
完成安装。
安装完 Ruby 之后,运行命令行(或命令提示符)用 Gem 命令安装 ruby-pinyin。
$ gem install ruby-pinyin
2、拆解电子书并添加拼音注音
下载 KindleUnpack:https://bookfere.com/tools#ku(依赖 Python)
下载 KindleGen:https://bookfere.com/tools#KindleGen
准备好需要处理的电子书文件,然后用 KindleUnpack 将其拆解成源文件备用(如果不知道如何使用 KindleUnpack 请点击这里查看教程)。
把下面这段代码复制下来,用代码编辑器(如 Sublime Text、Editplus)保存为 html2pinyin.rb 文件(文件名称随意)。
* 提示:下面的代码只在 macOS 中测试可用,Windows 系统请等待测试后再修改。
#!/usr/bin/ruby
# -*- coding: UTF-8 -*-
# ---------------------------------------
# html2pinyin.rb - 给电子书内容添加拼音注音
# https://bookfere.com/post/444.html
#
# 1. 安装 Ruby
# 2. 安装 ruby-pinyin
# 3. 运行 ruby html2pinyin.rb
# ----------------------------------------
require 'ruby-pinyin'
print '请输入要处理文件或目录的完整路径:'
path = gets.strip
if path == "\n"
puts '|||||请输入文件或目录路径|||||'
elsif File.file?( path )
file_process( path )
elsif File::directory?( path )
if path[-1] != '/'
path = path + '/'
end
dir_process( path )
else
puts '|||||文件或文件夹不存在|||||'
end
BEGIN {
def dir_process ( entry )
files = Dir[ entry + '*' ]
for f in files
ext = File.extname( f )
if ext == '.xhtml' or ext == '.html'
file_process f
end
end
end
def file_process ( entry )
File.open(entry, "r:utf-8") do |file|
File.open(entry + '.tmp', "w") do |f|
while line = file.gets
par = /<(p|h[1-6]|span).*?>(.*?)<\/(p|h[1-6]|span)>/.match(line)
img = /<p.*?><img.*?><\/p>/.match(line)
if ! par.nil? and img.nil?
str = line.split(//)
for i in str
if /[\u4e00-\u9fa5]/ =~ i
pinyin = PinYin.of_string(i, :unicode)
f.print '<ruby>' + i + '<rt>' + pinyin[0] + '</rt></ruby>'
else
f.print i
end
end
else
f.puts line
end
end
end
puts '已完成:' + entry.split(/\//)[-1]
File.delete(entry)
File.rename(entry + '.tmp', entry)
end
end
}
然后打开终端(或命令提示符),定位到 html2pinyin.rb 文件所在的目录下,输入以下命令:
$ ruby html2pinyin.rb
会提示“请输入要处理文件或目录的完整路径”。这里的路径就是电子书源文件中 XHTML 或 HTML 文件所在的目录位置,一般其目录如下所示:
/Users/YOURNAME/Desktop/电子书名称/mobi8/OEBPS/Text
然后稍等片刻,即可处理完成。接下来就是矫正了。对于处理完成的 XHTML 或 HTML 文件,可以一边用浏览器预览,一边用代码编辑器查找并修改。
* 注意,因为 ruby-pinyin 这个项目依赖 Ruby 语言,所以才使用 Ruby 语言写这段脚本。因为之前从没有使用 Ruby,是一边看文档一边摸索出来的,实现得比较笨。首先用正则提取出 p
、h1~h6
以及 span
标签包裹的内容,然后遍历出每一个汉字字符,使用 ruby-pinyin 转换成拼音。因为是处理的是单个字符,所以 ruby-pinyin 的多音字识别就没利用起来。如果你熟悉 Ruby 语言的话,欢迎改进代码。
3、把源文件转换成电子书格式
因为给汉字添加注音后,会导致内容十分拥挤,所以在转换完毕后还需要修改一下样式,优化一下排版。可以直接下面这段代码添加到 CSS 文件中(一般 CSS 文件都在 Style 文件夹中),也可以根据自己的实际需求修改它们,比如字号、字体、字距或行距。
ruby {
font-size: 1.2em;
font-family: sans-serif;
line-height: 2.6em;
padding: 0 0.1em;
letter-spacing: 0;
}
rt {
font-family: Futura;
font-size: 100%;
}
全部处理完毕后,用 KindleGen 通过 content.opf 文件把源文件转换成 mobi 格式即可(如果你还不知道如何使用 KindleGen 可以点击这里查看教程)。现在你就得到了一个添加了拼音注音的电子书了。
如果你在按照本文步骤操作的过程中遇到了什么问题,或者有什么改进意见,请留言。
© 「书伴」原创文章,转载请注明出处及原文链接:https://bookfere.com/post/444.html
延伸阅读
- 为什么在亚马逊云端找不到购买或推送的电子书
- [读书笔记] 如何成为自己的营养师(碳水化合物和糖)
- [每周一书]《呼兰河传》生与死的悲歌
- 读书也跟风:跟着诺贝尔奖读书靠不靠谱?
- PingWest:第二代 Kindle Oasis(2017)评测
- [每周一书] 与生活息息相关的《斯坦福极简经济学》
- [2018.12.21] Kindle Oasis 1 固件升级至 5.10.2
- [每周一书]《公正》我们的良知该去向何方?
- [每周一书]《圆圈正义》关于法律、正义与道德的思考
- 利用 IFTTT 自动推送上传到 Dropbox 的电子书
- [每周一书] 反乌托邦寓言小说《动物农场》
- [2017.04.13] Kindle 阅读器固件升级至 5.8.9
- [每周一书]《六论自发性》自主、尊严及有意义的工作
- [每周一书] 读《黄帝内经》重新发现中医太美
- 公告:收到“关于保护知识产权的沟通函”后的决定
日文书籍的假名注音(振り仮名)是通过这个标签来实现的吗?
lgjp 您好。应该是可以的。
windows版出现问题,无法转拼音
错误提示:
C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/ruby-pinyin-0.5.0/lib/ruby-pinyin/backend/simple.rb:54:in `split’: invalid byte sequence in GBK (ArgumentError)
望月 您好。ruby-pinyin 在 Windows 下好像有问题,在项目上提交了一个 Issue,正在等待回复。
应该是编码问题
给孩子看我还是觉得纸书我比较放心…我可不想这么贵的东西被摔了…
用word做过,好卡。
感觉好复杂呀!今天下订单了,入手KPW一台!
如果给孩子的话更多担心应该是Kindle的性命。
首先是买普及版kindle,其次Kindle其实不算脆弱,质量可以说过硬
非常好,考虑以后为儿子做。