クイックノート

ちょっとした発見・アイデアから知識の発掘を

自炊オーディオブックを作って聴く

イラスト素材

紙の本からオーディオブックを作成する手順

オーディオブックは運転中や家事中など、他の作業をしながらでも読書ができる便利なツールです。

聴き放題のサブスクリプションサービスもありますが、対象となる本が限定されているのが難点です。

しかし、Kindle版があればスマートフォンの読み上げ機能を使ってオーディオブック風にすることができます(詳細は過去の記事を参照してください)。

clean-copy-of-onenote.hatenablog.com

では、Kindle版がなく、紙の本しかない場合にはどうすればよいのでしょうか?

この記事では、紙の本からオーディオブックを作成する一連の手順を紹介します。

流れ

  1. 紙の本をスキャンして電子化する

  2. 電子化された本を音声合成で読み上げて音声ファイルを作る

  3. 音声ファイルを自宅サーバーに配置して再生する

紙の本の電子化

紙の本を電子化する、いわゆる「自炊」は、本の裁断と裁断した本のスキャンの手順で行います。

本の裁断

本は背表紙に貼り付いて複数の紙が重なっている構造ですので、そのままスキャンすることはできません。

この背表紙を切り離して、本をバラバラの紙の束にするのが本の裁断です。

本の裁断には裁断機があると便利です。

本全てをまとめて裁断できることは稀なので、紙の厚さにもよりますが50~100ページ分毎に本を分割して、背表紙の部分を裁断していきます。

スキャンする際も一冊全てをまとめてスキャンできないので、この裁断する単位がほぼそのままスキャンする単位になります。

本のスキャン

裁断によってバラバラの紙の束になった本を1枚1枚スキャンしてPDF化するのがこの工程です。

スキャナーは両面読み取りができたり、自動で複数枚を順にスキャンできたり、スキャンが高速にできるなどの自炊への適性が高いScanSnap iX1600がおすすめです。

特にScanSnapではスキャン時に文字認識を行い、検索可能なPDFを作れることも重要です。

検索可能なPDFではPDFに本文が埋め込まれているので、そのテキスト情報を読み上げの原稿として利用することができます。

電子書籍の読み上げ

本をスキャンした後は、PDFからテキストを抽出して、テキストを読み上げた音声ファイルを生成します。

テキストの抽出には、LLMを使って、認識しきれなかった文章を自然な文章になるように補正をかけました。

PDFからのテキスト抽出

検索可能なPDFとして、テキストがスキャン画像から認識されているものとします。

テキストの抽出にはPyMuPDFを使いました。

縦書きでも正しく抽出してくれます。

pip install --upgrade pymupdf
import fitz    
def extract_text_from_pdf(pdf_path):
    text = ""    
    with fitz.open(pdf_path) as pdf:    
        for page in pdf:    
            text += page.get_text() 
    return text

テキストの修正

OCRでの文字認識の際にどうしても誤認識が含まれてしまいます。

手作業で修正するのは面倒なので、テキストの修正はLLMに投げてしまっています。

ChatGPTなどを使ってもいいでしょうが、自分の場合は、ローカルでLlama-3-ELYZA-JP-8Bを動かしています。

本の中身を全てLLMに入力するとコンテキスト長が持たないので、本をチャンクに分割します。

def chunking_text(text:str, max_chunk_size:int=1000):
    # 句点(.)および全角句点(。)で文字列を分割
    sentences = re.split(r'(?<=[。..])', text)
    chunks = []
    current_chunk = ""
    for sentence in sentences:
        while len(sentence) > max_chunk_size:
            # 文が最大チャンクサイズを超える場合、分割する           
            chunks.append(sentence[:max_chunk_size])            
            sentence = sentence[max_chunk_size:]            
        if len(current_chunk) + len(sentence) > max_chunk_size:
            # 現在のチャンクをリストに追加し、新しいチャンクを開始
            chunks.append(current_chunk)
            current_chunk = sentence
        else:
            # 現在のチャンクに文を追加
            current_chunk += sentence
    # 最後のチャンクをリストに追加
    if current_chunk: 
        chunks.append(current_chunk)
    return chunks

チャンク毎にLLMに修正をお願いします。

# 目的
あなたには、OCRで読み取った本の一部の修正を行ってもらいます。
日本語として自然な文章に修正してください。

# 制約
- 出力は修正後の文章のみとしてください
- アルファベットはカタカナに変換してください

# 以下のOCRで読み取った文章を修正
{chunk}

音声合成の際に英語がうまく扱えないことがあるのでカタカナに変換するようにお願いしています。

音声合成

音声合成にはVOICEVOXを使います。

LLMを貫通してきた英語に対応するために、alkanaを使ったカタカナ変換も行っています。

自宅サーバ

出来上がった音声ファイルをスマホタブレットなどの端末から再生するために、audiobookshelf自宅サーバーでホストして、音声ファイルを配置します。

audiobookshelfを利用することで、アプリから検索・再生ができるほか、再生を中断した時にその続きから再生できる、複数の端末間でどこまで再生したかが共有されるので端末を変えても続きから再生できる、など有料のオーディオブックと遜色ない利用が可能になります。

プライバシーポリシー