masalibの日記

システム開発、運用と猫の写真ブログです

EPUBファイルからルビ(ふりがな)を消す

経緯

epub電子書籍データがあるのですが ルビ(ふりなが)があると読み上げソフト(Aquile Reader)でおかしくなる

例えば にくい のデータだと

「にくにくい」と読みます

ちょっとこれだと聞き取りにくいので 憎いにする必要があります

ステップ

EPUBファイルからルビ(ふりがな)を消すには、 EPUBファイルを編集する必要があります。EPUBは基本的にZIPフォーマットで圧縮された一連のHTMLファイルとメタデータから成るため、以下のステップでルビを消すことができます。

ステップ 1: EPUBファイルを解凍する

  1. EPUBファイルの拡張子を .zip に変更します。
  2. そのZIPファイルを解凍して、中のファイルにアクセスします。

ステップ 2: HTMLファイルを編集する

  1. 解凍したフォルダ内のHTMLファイルを探します。
  2. HTMLエディター(またはテキストエディター)を使用して、各HTMLファイルを開きます。
  3. ルビが使われている部分を見つけます。 通常、<ruby>タグや<rt>タグが使われています。例えば: html <ruby>漢字<rt>かんじ</rt></ruby>
  4. rubyタグとrtタグを削除または編集して、ルビを消します。ルビのテキストだけを削除する場合は、 上記の例では <rt>かんじ</rt> 部分を消します。

ステップ 3: EPUBファイルを再圧縮する

  1. 編集が完了したら、全てのファイルを再びZIPフォーマットで圧縮します。
  2. 圧縮したファイルの拡張子を .zip から .epub に変更します。

ツールの使用

EPUBファイルの編集には、Sigilのような専用のEPUBエディタを使用すると便利です。SigilはEPUBファイルを直接開いて、内部のHTMLを編集できる無料のオープンソースソフトウェアです。

これでルビを消す作業が可能ですが、EPUBの構造に慣れていない場合は注意が必要です。 ファイルの構造を変えることで、EPUBが読めなくなる可能性もありますので、 作業前には必ずバックアップを取ります

プログラム

一個一個やるのは無理ゲーなのでpythonで対応します 必要なライブラリをインストールします。 このスクリプトではzipfileとBeautifulSoupを使用します。 BeautifulSoupはHTMLの解析と編集を簡単にするためのライブラリです。

pip install beautifulsoup4

次に、スクリプトです:

import os
import zipfile
from bs4 import BeautifulSoup

def remove_ruby_tags(epub_path, output_path):
    # EPUBファイルを解凍するための一時ディレクトリを作成
    with zipfile.ZipFile(epub_path, 'r') as zip_ref:
        zip_ref.extractall('temp_epub')

    # 解凍したディレクトリ内の全HTMLファイルを探索
    for foldername, subfolders, filenames in os.walk('temp_epub'):
        for filename in filenames:
            if filename.endswith('.html'):
                file_path = os.path.join(foldername, filename)
                with open(file_path, 'r', encoding='utf-8') as file:
                    soup = BeautifulSoup(file, 'html.parser')

                # <ruby>タグ内の<rt>タグを削除し、ベーステキストのみを保持
                for ruby_tag in soup.find_all('ruby'):
                    rt_tags = ruby_tag.find_all('rt')
                    for rt in rt_tags:
                        rt.decompose()  # <rt>タグを削除
                    ruby_tag.unwrap()  # <ruby>タグを削除し、中身だけを残す

                # 変更をファイルに保存
                with open(file_path, 'w', encoding='utf-8') as file:
                    file.write(str(soup))

            if filename.endswith('.xhtml'):
                file_path = os.path.join(foldername, filename)
                with open(file_path, 'r', encoding='utf-8') as file:
                    soup = BeautifulSoup(file, 'html.parser')

                # <ruby>タグ内の<rt>タグを削除し、ベーステキストのみを保持
                for ruby_tag in soup.find_all('ruby'):
                    rt_tags = ruby_tag.find_all('rt')
                    for rt in rt_tags:
                        rt.decompose()  # <rt>タグを削除
                    ruby_tag.unwrap()  # <ruby>タグを削除し、中身だけを残す

                # 変更をファイルに保存
                with open(file_path, 'w', encoding='utf-8') as file:
                    file.write(str(soup))

    # 変更されたファイルを使って新しいEPUBファイルを作成
    with zipfile.ZipFile(output_path, 'w') as zip_ref:
        for foldername, subfolders, filenames in os.walk('temp_epub'):
            for filename in filenames:
                file_path = os.path.join(foldername, filename)
                arcname = os.path.relpath(file_path, 'temp_epub')
                zip_ref.write(file_path, arcname)

    # 一時ディレクトリを削除
    for foldername, subfolders, filenames in os.walk('temp_epub', topdown=False):
        for filename in filenames:
            os.remove(os.path.join(foldername, filename))
        os.rmdir(foldername)

# 使用例
remove_ruby_tags('path_to_your_epub.epub', 'output.epub')

このスクリプトは以下の機能を持っています:

  • 指定されたEPUBファイルを解凍し、HTMLファイルを検索してタグを削除します。
  • 編集したHTMLファイルを用いて新しいEPUBファイルを作成し、元のファイルの構造を保持します。