如何给 Kindle 电子书中的汉字添加拼音注音

最近有小伙伴留言问如何给 Kindle 电子书添加拼音注音,就花了点儿时间研究了一下。给 Kindle 电子书添加拼音标注,需要解决两个问题:一个是如何像一般的纸质书那样上面显示拼音,下面显示汉字;另一个就是如何批量给每个汉字生成拼音,很显然手动录入效率会很低。

好在这两个问题都可以解决。上面显示拼音下面显示汉字可以使用 HTML5 的新标签 <ruby> 实现,还好 Kindle 的 KF8 标准的电子书也支持这个新标签。批量给汉字生成拼音可以使用 GitHub 上的一个用 Ruby 语言写的开源项目 ruby-pinyin 来实现。这两个基本问题实现之后就可以通过几个小软件和一段脚本结合,把电子书(一般应该是给孩子看的)转换成如下图所示的效果。

kindle-pinyin_1 kindle-pinyin_2

不过需要注意的是,虽然这种批量处理的方式可以省去大量重复工作,但受限于软件自身的缺陷,还是需要人工对生成的内容校正一下,避免多音字、音标标注之类的错误。这类错误对于成人的阅读或许没有太大障碍,但对于正处于识字阶段的孩子看的东西,仔细校正就显得尤为重要。

下面是具体的实现步骤。虽然可能会涉及到一段代码,但无需担心,按照步骤来即可。

1、安装 Ruby 和 ruby-pinyin

下载 Ruby:https://www.ruby-lang.org/zh_cn/downloads/
下载 ruby-pinyin:https://github.com/janx/ruby-pinyin

首先安装 Ruby。对于 macOS 和 Linux 用户来说可以点击这里查看安装步骤。一般 macOS 系统已经自带了 Ruby,可以在终端输入命令 ruby -v 确认一下是否已安装。

对于 Windows 用户来说可以使用 RubyInstaller 安装包安装,点击这里查看安装步骤。需要注意的是,除了安装 Ruby 外还需要安装 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://kindlefere.com/tools#ku(依赖 Python
下载 KindleGen:https://kindlefere.com/tools#KindleGen

准备好需要处理的电子书文件,然后用 KindleUnpack 将其拆解成源文件备用(如果不知道如何使用 KindleUnpack 请点击这里查看教程)。

把下面这段代码复制下来,用代码编辑器(如 Sublime Text、Editplus)保存为 html2pinyin.rb 文件(文件名称随意)。

* 提示:下面的代码只在 macOS 中测试可用,Windows 系统请等待测试后再修改。

#!/usr/bin/ruby
# -*- coding: UTF-8 -*-

# ---------------------------------------
# html2pinyin.rb - 给电子书内容添加拼音注音
# https://kindlefere.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,是一边看文档一边摸索出来的,实现得比较笨。首先用正则提取出 ph1~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 可以点击这里查看教程)。现在你就得到了一个添加了拼音注音的电子书了。

如果你在按照本文步骤操作的过程中遇到了什么问题,或者有什么改进意见,请留言。

有帮助,[ 捐助本站 ] 或分享给小伙伴:

发表评论

标注为 * 的是必填项。您填写的 Email 将会被保密。如果是在本站首次留言,审核后才能显示。

小伙伴们发表了 11 条评论

  1. 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)