はじめに

チベット語写本のデジタル化は、デジタル人文学における重要な課題の一つです。貴重な仏教経典や歴史文書が世界中の図書館に保管されていますが、その多くはまだテキストデータ化されていません。手作業での文字起こしには膨大な時間とコストがかかり、専門知識を持つ研究者も限られています。

本記事では、BDRC Tibetan OCR を紹介します。このツールは、Buddhist Digital Resource Center (BDRC) によって開発されたオープンソースのチベット語OCRシステムです。

また、チベット語写本カンギュール114点 をデジタル化するプロジェクトでの実装事例も紹介します。

BDRC Tibetan OCRとは

BDRC Tibetan OCR は、チベット語の画像からテキストを自動抽出する無料のオープンソースツールです。

主要な特徴

1. デスクトップアプリケーション

Windows、macOS(Intel/M1,M2)で動作するGUIアプリケーションです。

インストール方法:

  • リリースページから各OS用のZIPファイルをダウンロード
  • 解凍して実行ファイルを起動するだけ

2. 複数の出力形式

  • プレーンテキスト : 抽出されたUnicodeチベット文字
  • PageXML : 座標情報付きXML(Transkribusと互換)
  • Wylie : ローマ字転写形式

3. 画像補正機能

  • 歪み補正(Dewarping) : ページの湾曲を補正
  • 回転補正 : 自動的にページの傾きを検出・補正
  • 行検出 : 行分割機能

4. バッチ処理対応

  • 複数の画像ファイルを一括処理
  • PDFファイルからの直接OCR
  • IIIF(International Image Interoperability Framework)マニフェストからの自動取得・処理

4つの専門OCRモデル

BDRC Tibetan OCRの特徴の一つは、書体や資料の種類に応じて最適化された4つの専門モデル を提供している点です。

1. ウチェン(Uchen)モデル - 現代印刷用

用途: 印刷された経典、現代の出版物
データセット: 440万サンプルの統一ウチェンモデル
特徴: チベット語で最も標準的な書体
適用例: コンピューターフォントで印刷されたテキスト、木版印刷

ウチェンは「正書体」を意味し、チベット語で最も標準的な書体です。現代の印刷物やデジタルフォントで使用されます。

2. ウメ(Ume)モデル - 手書き写本用

用途: 手書き写本、草書体の文書
データセット: Ume-Druma(ドゥルマ体)とUme-Petsuk(ペツク体)の2種類
特徴: ウチェンより丸みを帯びた流麗な書体
適用例: 伝統的な手書き経典、装飾写本

ウメは「頭無し文字」を意味し、仏教写本で広く使用された書体です。

3. 木版印刷(Woodblock)モデル - 古典版画用

用途: 伝統的な木版印刷テキスト
データセット: 第8カルマパの雑著から約3万行のレビュー済みサンプル
特徴: 古い版画特有の不規則さや劣化に対応
適用例: チベット仏教の伝統的な版木印刷物、古い木版印刷の欠け・かすれ・インクの滲みなど

4. その他の専門モデル

  • キエンツェ・ワンポデータセット : 現代活字版から約1万3000行のサンプルで訓練
  • 敦煌写本モデル : 8世紀まで遡る古文書用の特殊モデル

モデルの学習データ

これらのモデルは、以下のソースから収集されたデータセットで訓練されています:

学習済みモデルとデータセットの一部は、HuggingFaceのBDRCアカウントOpenPechaでオープンアクセスとして公開されています。

実装事例:チベット語写本カンギュールのデジタル化プロジェクト

チベット語写本カンギュール114点 をデジタル化するプロジェクトでの実装例を紹介します。

プロジェクト概要

  • 対象資料 : チベット語写本カンギュール 114点
  • 処理方式 : IIIF Image APIからの自動画像取得 + バッチOCR処理
  • 出力形式 : TEI/XML形式(Text Encoding Initiative P5準拠)
  • 公開 : Webビューアで画像とテキストを並列表示

技術構成

1. IIIF連携による効率的な画像取得

# batch_ocr_from_iiif.py の主要機能

# IIIFマニフェストから画像URLを自動抽出
def extract_image_urls(manifest: dict) -> List[Tuple[str, str, int, int, str]]:
    """Extract image URLs from IIIF manifest
    Returns: List of (label, image_url, width, height, iiif_service_url)
    """
    images = []
    sequences = manifest.get('sequences', [])

    for sequence in sequences:
        canvases = sequence.get('canvases', [])
        for canvas in canvases:
            # 画像URLとメタデータを抽出
            label = canvas.get('label', 'unknown')
            width = canvas.get('width', 0)
            height = canvas.get('height', 0)
            # ...

    return images

IIIF(International Image Interoperability Framework)規格に準拠した画像サーバーから、メタデータと高解像度画像を自動的に取得します。

2. バッチOCR処理

# OCRパイプラインの初期化
pipeline = OCRPipeline(platform, ocr_config, line_config)

# 各画像に対してOCR実行
status, result = pipeline.run_ocr(
    image=image,
    k_factor=2.5,           # 行抽出の調整パラメータ
    bbox_tolerance=4.0,     # バウンディングボックスの許容範囲
    merge_lines=True,       # 行チャンクのマージ
    use_tps=False,          # TPS歪み補正の有無
    target_encoding=Encoding.Unicode
)

主要なパラメータ:

  • k_factor: 行検出の感度調整(木版印刷では2.5を使用)
  • bbox_tolerance: 文字のバウンディングボックス許容値(デフォルト: 4.0)
  • merge_lines: 分割された行を自動的にマージ
  • use_tps: TPS(Thin Plate Spline)変換による歪み補正

3. TEI/XML出力

# TEI/XML形式での出力
def create_tei_xml(manifest_label: str, page_results: List[dict],
                   output_path: str, identifier: str = None):
    """Create a TEI XML file for all pages with IIIF information"""

    # TEIヘッダー(メタデータ)
    title = etree.SubElement(title_stmt, f"{{{TEI_NS}}}title")
    title.text = manifest_label

    # テキスト本体
    for page_data in page_results:
        # ページブレーク(IIIF画像URLを含む)
        pb = etree.SubElement(p, f"{{{TEI_NS}}}pb")
        pb.attrib["n"] = str(page_num)
        pb.attrib["facs"] = page_data['iiif_service_url']

        # 行データ(座標情報へのリンク)
        for line_idx, line_text in enumerate(page_data['line_texts'], 1):
            lb = etree.SubElement(p, f"{{{TEI_NS}}}lb")
            lb.attrib["corresp"] = f"#z{page_num}_l{line_idx}"
            lb.attrib["n"] = str(line_idx)
            lb.tail = line_text

    # Facsimile(画像と座標データ)
    for page_data in page_results:
        # 各行の座標をzone要素として保存
        for line_idx, line_coords in enumerate(page_data['line_coords'], 1):
            zone = etree.SubElement(surface, f"{{{TEI_NS}}}zone")
            zone.attrib[f"{{{XML_NS}}}id"] = f"z{page_num}_l{line_idx}"
            zone.attrib["ulx"] = str(min(x_coords))
            zone.attrib["uly"] = str(min(y_coords))
            zone.attrib["lrx"] = str(max(x_coords))
            zone.attrib["lry"] = str(max(y_coords))

TEI/XMLの構造:

TEI xmlns="http://www.tei-c.org/ns/1.0">
  teiHeader>
    titleStmt>title>Trisaṁvara-nirdeśatitle>titleStmt>
    publicationStmt>
      idno type="UUID">845065fa-1f31-11ec-9621-0242ac130002idno>
    publicationStmt>
  teiHeader>
  text>
    body>
      p>
        pb n="1" facs="https://img.toyobunko-lab.jp/iiif/..."/>
        lb corresp="#z1_l1" n="1" type="line"/>ཨ་ཀ།
      p>
    body>
  text>
  facsimile>
    surface xml:id="page-0" n="1" ulx="0" uly="0" lrx="7360" lry="4912">
      graphic url="https://img.toyobunko-lab.jp/iiif/..."/>
      zone xml:id="z1_l1" ulx="2720" uly="678" lrx="3942" lry="774"/>
    surface>
  facsimile>
TEI>

処理フロー

1. IIIFマニフェストから画像URLとメタデータを取得
2. 高解像度画像をダウンロード(または既存のものを使用)
3. BDRC Tibetan OCR(Woodblockモデル)で各ページを処理
4. OCR結果を以下の形式で出力:
   - 個別ページのテキストファイル (page_0001.txt)
   - PageXML形式(座標情報付き)
   - TEI/XML形式(座標情報とIIIF URLを含む)
5. Webビューアで公開
   - 画像(OpenSeadragon)とテキストを並列表示
   - DTS Collections APIでメタデータを提供

使用方法

単一画像のOCR処理

python run_ocr.py \
  --image /path/to/tibetan_page.jpg \
  --model Woodblock \
  --format all \
  --encoding unicode

IIIFマニフェストからのバッチ処理

python batch_ocr_from_iiif.py \
  --manifest "https://app.toyobunko-lab.jp/iiif/2/UUID/manifest" \
  --output-dir iiif_ocr_output \
  --model Woodblock \
  --format both \
  --identifier UUID

主要なオプション:

  • --model: 使用するOCRモデル(Modern, Ume_Druma, Ume_Petsuk, Woodblock, Woodblock-Stacks)
  • --format: 出力形式(text, xml, json, all)
  • --encoding: 文字エンコーディング(unicode, wylie)
  • --dewarp: 歪み補正を適用
  • --bbox-tolerance: バウンディングボックスの許容値(デフォルト: 4.0)

プロジェクトの成果

  • 処理済み文書数 : 33件(進行中)
  • TEI/XML出力 : 各写本に対して座標情報付きXMLを生成
  • IIIF連携 : 画像とテキストを統合したWebビューアを実現
  • DTS Collections API : 標準化されたメタデータAPIを提供

技術的な詳細

アーキテクチャ

BDRC Tibetan OCRは、2つの主要なニューラルネットワークで構成されています:

  1. 行検出モデル(PhotiLines)

    • セマンティックセグメンテーションによる行領域の検出
    • パッチサイズ: 512×512
    • ONNX形式で提供
  2. OCRモデル(Easter2アーキテクチャ)

    • CRNN(Convolutional Recurrent Neural Network)ベース
    • 入力: 可変幅×固定高さの画像
    • 出力: Unicode文字列またはWylie転写
    • ONNX Runtime で高速推論

プログラムでの利用

Pythonでの基本的な使い方

import sys
import cv2
sys.path.insert(0, '/path/to/tibetan-ocr-app')

from BDRC.Utils import get_platform
from BDRC.Data import Encoding, LineDetectionConfig, OCRModelConfig
from BDRC.Inference import OCRPipeline
from BDRC.Data import CharsetEncoder, OCRArchitecture

# モデル設定の読み込み
ocr_config = OCRModelConfig(
    model_file="/path/to/OCRModels/Woodblock/OCRModel.onnx",
    architecture=OCRArchitecture.Easter2,
    input_height=96,
    input_width=1024,
    charset="charset.json",
    encoder=CharsetEncoder.Stack
)

line_config = LineDetectionConfig(
    model_file="/path/to/Models/Lines/PhotiLines.onnx",
    patch_size=512
)

# パイプラインの初期化
platform = get_platform()
pipeline = OCRPipeline(platform, ocr_config, line_config)

# 画像の読み込みとOCR実行
image = cv2.imread("tibetan_page.jpg")
status, result = pipeline.run_ocr(
    image=image,
    target_encoding=Encoding.Unicode
)

if status.name == "SUCCESS":
    rot_mask, lines, ocr_lines, angle = result
    for line in ocr_lines:
        print(line.text)

出力形式の詳細

1. プレーンテキスト (.txt)

༄༅། །འཕགས་པ་གསང་བ་གསུམ་པ་བསྟན་པ་ཞེས་བྱ་བ་ཐེག་པ་ཆེན་པོའི་མདོ།
ན་མོ་བུདྡྷཱ་ཡ། ན་མོ་དྷརྨཱ་ཡ། ན་མོ་སངྒྷཱ་ཡ།
...

2. PageXML (.xml)

PcGts xmlns="http://schema.primaresearch.org/PAGE/gts/pagecontent/2013-07-15">
  Page imageFilename="page_0001.jpg" imageWidth="7360" imageHeight="4912">
    TextRegion id="page_1_region">
      TextLine id="page_1_line_0">
        Coords points="2720,678 3942,678 3942,774 2720,774"/>
        TextEquiv>Unicode>༄༅། །འཕགས་པ་གསང་བ་གསུམ་པ་བསྟན་པ་Unicode>TextEquiv>
      TextLine>
    TextRegion>
  Page>
PcGts>

3. JSONL (.jsonl)

{"line": 0, "text": "༄༅། །འཕགས་པ་གསང་བ་གསུམ་པ་བསྟན་པ་", "coords": [[2720, 678], [3942, 678], [3942, 774], [2720, 774]]}
{"line": 1, "text": "ན་མོ་བུདྡྷཱ་ཡ། ན་མོ་དྷརྨཱ་ཡ། ན་མོ་སངྒྷཱ་ཡ།", "coords": [[2650, 820], [4012, 820], [4012, 916], [2650, 916]]}

パフォーマンス

木版印刷(Woodblock)モデルでの実測値(MacBook Pro M1):

  • 処理速度 : 約1ページ/15-20秒(7360×4912ピクセルの高解像度画像)
  • 行検出精度 : 95%以上
  • 文字認識精度 : 90-95%(資料の保存状態により変動)
  • メモリ使用量 : 約2GB

関連ツールとの比較

Tesseract OCR

Googleが開発するオープンソースOCRエンジン。

  • サポート言語 : 100以上の言語に対応(チベット語を含む)
  • 精度 : チベット語の認識精度は低め(特に古典写本)
  • 用途 : 一般的な文書のOCRに適している

Transkribus

READ-COOPが開発する手書き文書認識プラットフォーム。

  • 特徴 : HTR(Handwritten Text Recognition)に特化
  • 精度 : カスタムモデルの訓練が可能
  • 互換性 : BDRC Tibetan OCRはPageXML形式でTranskribusと互換
  • 制限 : 無料版は月間500クレジットまで

BDRC Tibetan OCRの特徴

  • チベット語に特化した4つの専門モデルを提供
  • 完全無料・オープンソース
  • 木版印刷や古典写本に対応
  • IIIF連携によるワークフロー対応
  • ローカル環境で動作

まとめ

主な特徴

  1. 専門モデル : 書体・資料別に最適化された4つのモデルを提供
  2. 完全無料 : オープンソースで制限なく利用可能
  3. アプリケーション : GUIアプリとCLIツールの両方を提供
  4. 標準規格準拠 : IIIF、TEI/XML、PageXMLなど国際標準に対応
  5. ローカル処理 : ローカル環境で処理が完結

適用可能なプロジェクト

  • デジタル図書館の構築
  • 仏教経典のテキスト化
  • 研究用コーパスの作成
  • 歴史文書のアーカイブ化
  • 教育用デジタル教材の開発

今後の可能性

このようなプロジェクトでは、以下のような機能拡張が考えられます:

  • 自動校正機能 : OCR結果の後処理による精度向上
  • 並行テキスト表示 : 複数版の比較表示
  • 全文検索機能 : OCRテキストを対象とした検索
  • アノテーション機能 : 研究者によるコメント・注釈の付与

リソース

公式リンク

参考文献


謝辞

BDRC Tibetan OCRは、Buddhist Digital Resource Center (BDRC) によって開発されたオープンソースツールです。ツールの開発者であるEric Werner氏に感謝いたします。

公開日 : 2025-11-13