そあん(soan)

「そあん(soan)」は、古活字データセットの古活字画像を用いて現代日本語テキストを描画するJavaScriptライブラリである。

テキストのうち、古活字データセットに古活字画像が登録されていない漢字については、形態素解析によって読みを推定し、ひらがなの古活字画像を用いて描画する。形態素解析によっても読みが得られない漢字や記号等については、動作環境のフォントを用いて描画することもできる。

形態素解析によって得られた品詞情報、語頭/語中/語尾等の情報は、古活字データセットに登録された字母情報と合わせ、変体仮名の使い分け考慮に利用され、古活字画像が選択される。

また、古活字の特徴である連綿(続け字)活字の選択については、連綿活字の優先度を設定できる。

古活字本には見られなかった記号などを含む現代日本語を表現するにあたり、現代の組版習慣を参考として、禁則処理(行頭禁則・行末禁則・分離禁止)や行の調整処理(空け処理・詰め処理)などを実装している。

目次

動作デモ/活用例

動作環境

本ライブラリは、ブラウザ環境およびNode.js環境で動作する。

  • ECMAScript 2015 (ES6)が動作するブラウザ(Internet Explorer 11を除く)
  • Node.js v16以降
    • node-canvas”パッケージが動作すること。OSやNode.jsのバージョンによっては、node-canvasの導入が困難な場合がある(node-canvasの事前ビルド版が提供されていない環境の場合、利用者側でビルドする必要がある)。後述のDocker環境利用も検討されたい。

利用例

ブラウザ環境

利用例

<script src="soan/soan.bundle.min.js"></script>
<canvas id="canvas01"></canvas>
<script>
    (function() {
        const config = {
            datasets: [{'url': 'http://codh.rois.ac.jp/soan/dataset/001.json'}]
        };
        const soan = Soan(config);
        if (soan) {
            const text = 'サンプル';
            const canvasId = 'canvas01';
            const opt = { canvasId };
            soan.getTextImageFromTextPromise(text, opt);
        }
    })();
</script>

Node.js環境

インストール

npm install http://codh.rois.ac.jp/software/soan/download/soan-1.1.0.tgz

利用例

import Soan from 'soan';
import { createCanvas } from 'canvas';
import { writeSync } from 'fs';

const config = {
    datasets: [{'url': 'http://codh.rois.ac.jp/soan/dataset/001.json'}]
};
const soan = Soan(config);
if (soan) {
    const text = 'サンプル';
    const opt = { canvas: createCanvas(1, 1) };
    soan.getTextImageFromTextPromise(text, opt).then((results) => {
        const canvas = results.opt.canvas;
        return soan.getBufferWithXMPFromCanvasPromise(canvas).then((buffer) => {
            const dataUrl = 'data:image/jpeg;base64,' + buffer.toString('base64');
            writeSync(1, dataUrl);
        });
    }).catch((e) => {
        process.exit(1);
    });
} else {
    process.exit(1);
}

アルゴリズム概要

本ライブラリは、以下のアルゴリズムで入力テキストを画像化する。

入力テキストから古活字画像等情報列への変換

形態素解析

入力テキストに対し、形態素解析を行い、トークンに分割する。

形態素解析は、JavaScriptライブラリ“kuromoji.js” を用いて行う。

古活字画像選択

形態素解析トークンの情報を用いて、入力テキストを古活字画像(古活字データセットの古活字画像に加え、本ライブラリ同梱の画像を含む。以下同じ。)の組み合わせに分割する。

形態素解析トークンの表層形が、古活字画像の組み合わせで構成できない場合であって、形態素解析によって読み情報が得られる場合は、読み情報に基づいてひらがな化した文字列を古活字画像の組み合わせで表現する。

この処理においては、古活字データセットの優先度プレファレンス、連綿活字を優先するか単体活字を優先するかのプレファレンスを考慮する。

また、形態素解析によって得られた品詞情報、語頭/語中/語尾等の情報に基づき、変体仮名の使い分けを考慮して、ひらがなに対応する古活字画像を選択する。

選択候補となる古活字画像が複数存在する場合は、ランダムに選択する。

古活字画像等情報列の生成

前項の結果、入力テキストを古活字画像の組み合わせで表現できる場合、または古活字画像データセットに含まれない入力を許容するプレファレンス設定の場合、古活字画像の組み合わせ情報等を古活字画像等情報列として出力する。

古活字画像等情報列から古活字組版画像への変換

前段階の出力である古活字画像等情報列を入力として、字詰数、行間などのプレファレンスに基づき、古活字画像を適切に配置した古活字組版画像を生成する。

古活字画像データセットに含まれない入力を許容するプレファレンス設定の場合、古活字画像が得られない文字については、フォントを用いて可能な範囲で描画する。

古活字画像やフォント描画の配置に当たっては、現代の組版習慣を参考として、禁則処理(行頭禁則・行末禁則・分離禁止)や行の調整処理(空け処理・詰め処理)などを行う。

古活字組版画像へのメタデータ埋め込み

生成された古活字組版画像に対し、XMP(Extensible Metadata Platform)メタデータを埋め込む。

埋め込むメタデータは、機械生成された画像であること示す内容等とする。

API

Methods

getTextImageFromTextByCallback(text, optopt) → {void}

入力テキストから古活字組版画像への変換を行う(Callback版)
Parameters:
Name Type Attributes Description
text string 入力テキスト
opt optReplacements & optTypesettings & optCallbacks <optional>
オプション
Returns:
成功時は、canvasIdまたはcanvasに画像設定後、コールバックが設定されていれば呼び出す
Type
void

getTextImageFromTextPromise(text, optopt) → {Promise.<getTextImageSuccessObject>}

入力テキストから古活字組版画像への変換を行う(Promise版)
Parameters:
Name Type Attributes Description
text string 入力テキスト
opt optReplacements & optTypesettings <optional>
オプション
Returns:
成功時は、canvasIdまたはcanvasに画像設定後、getTextImageSuccessObject
Type
Promise.<getTextImageSuccessObject>

getBlobWithXMPFromCanvasPromise(canvas) → {Promise.<Blob>}

XMPメタデータを設定したBlob(JPEG形式)を得る
Parameters:
Name Type Description
canvas object 古活字組版画像出力先としたCanvasオブジェクト
Returns:
成功時は、XMPメタデータを設定したBlob(JPEG形式)
Type
Promise.<Blob>

getBufferWithXMPFromCanvasPromise(canvas) → {Promise.<Buffer>}

XMPメタデータを設定したBuffer(JPEG形式)を得る(Node.js環境のみ)
Parameters:
Name Type Description
canvas object 古活字組版画像出力先としたCanvasオブジェクト
Returns:
成功時は、XMPメタデータを設定したBuffer(JPEG形式)
Type
Promise.<Buffer>

Type Definitions

datasetParam

古活字データセット情報
Type:
  • object
Properties:
Name Type Attributes Default Description
url string 古活字データセットのURL
priority number <optional>
1 古活字データセットの優先度

getTextImageDoneCallback(text, opt, result)

正常完了時のコールバック関数
Parameters:
Name Type Description
text string 入力テキスト
opt object getTextImageFromTextByCallback呼び出し時に指定されたオプション
result Array.<imageToken> 古活字画像等情報列

getTextImageSuccessObject

正常完了時の返り値
Type:
  • object
Properties:
Name Type Description
text string 入力テキスト
opt object getTextImageFromTextPromise呼び出し時に指定されたオプション
result Array.<imageToken> 古活字画像等情報列

imageToken

古活字画像等情報
Type:
  • object

optCallbacks

コールバック系オプション
Type:
  • object
Properties:
Name Type Attributes Description
doneCallback getTextImageDoneCallback <optional>
正常完了時のコールバック関数
failCallback function <optional>
異常終了時のコールバック関数
alwaysCallback function <optional>
正常完了時・異常終了時のコールバック関数

optReplacements

古活字画像への置き換え系オプション
Type:
  • object
Properties:
Name Type Attributes Default Description
datasets Array.<datasetParam> <optional>
[] 利用する古活字データセット情報の配列
allowUnavailableChar boolean <optional>
false true: 古活字画像が登録されていない文字も許容する
renmenPriority number <optional>
1 連綿活字の優先度(0: 非連綿優先~1: 連綿優先)

optTypesettings

組版系オプション
Type:
  • object
Properties:
Name Type Attributes Default Description
canvasId string 古活字組版画像出力先となる<canvas>のID(Node.js環境での実行時は、canvasIdの代わりにcanvasの指定でも可)
canvas object <optional>
古活字組版画像出力先となるCanvasオブジェクト(Node.js環境での実行時のみ有効)
charsPerLine number <optional>
20 字詰数(0は自動的に行を折り返さない)
lineGap number <optional>
0.5 行間
margin number <optional>
100 周囲の余白(px)(天地左右の余白の個別指定と同時に設定された場合、個別指定のない箇所に適用される)
marginTop number <optional>
100 天の余白(px)
marginBottom number <optional>
100 地の余白(px)
marginLeft number <optional>
100 左の余白(px)
marginRight number <optional>
100 右の余白(px)
height string <optional>
'auto' 'auto':字詰数に応じた縦幅とする、'fit':行の折り返しが発生しなかったときは、成り行きの行長を縦幅とする
fontFamily string <optional>
'serif' 古活字画像が登録されていない文字も許容する場合に利用されるフォントファミリー名(Node.js環境での実行時は無効)
fontColor string <optional>
'#000000' 古活字画像が登録されていない文字も許容する場合に利用されるフォント色
scale number <optional>
1 画像作成サイズ倍率
paperTexture string <optional>
'' 用紙テクスチャファイル名
white string <optional>
'#ffffff' 古活字データセット画像の白にマッピングする描画色
black string <optional>
'#000000' 古活字データセット画像の黒にマッピングする描画色

soan-cli

Node.js環境でSoanライブラリを利用する動作サンプルコードとして、コマンドラインツールsoan-cliを用意している。

また、node-canvasの導入が困難な環境のため、soan-cliが利用可能な環境を構築するDockerfileを用意している。

Dockerを利用しない導入

node-canvasの導入に困難のない環境(例えば、Ubuntu 20.04+Node.js v16など)では、Dockerを利用することなくsoan-cliを導入することも容易である。以下のようにインストールする。

curl -L http://codh.rois.ac.jp/software/soan/download/soan-cli.tgz | tar xvzf -
cd soan-cli
npm install

Dockerを利用した導入

node-canvasの導入が困難な環境(例えば、CentOS 7など)では、Dockerを利用したsoan-cliの導入を推奨する。

Dockerのインストール

https://docs.docker.com/engine/install/ に従い、Dockerをインストールする。

Dockerfileの取得

soan-cliが利用可能な環境を構築するDockerfileを以下より取得する。

Dockerイメージのビルド

Dockerfileを置いたディレクトリで以下を実行し、soan-cliイメージを作成する。

docker build -t soan-cli .

Dockerコンテナの起動とログイン

以下を実行し、soan-cliイメージからDockerコンテナを作成、起動し、コンテナにログインする。

docker run -it soan-cli /bin/bash

soan-cliの利用

soan-cliディレクトリ(Docker非利用時においてはsoan-cliのtarballを展開したディレクトリ、Dockerコンテナ内においては/soan-cli/ディレクトリをいう。以下同じ。)において、以下のようにテキストと出力先を指定して、古活字組版画像を生成できる。

node soan-cli.js --text "サンプル" --output "sample.jpg"

soan-cliのオプション情報を得るには、以下を実行する。

node soan-cli.js --help

次のような使い方の説明が得られる。

Usage: soan-cli [options]

A command line interface of Soan (Library for rendering modern Japanese using old movable type)

Options:
  --allowUnavailableChar    古活字画像が登録されていない文字も許容する Default: false
  --black <value>           古活字データセット画像の黒にマッピングする描画色 Default: "#000000"
  --charsPerLine <value>    字詰数(0:自動的に行を折り返さない) Default: "20"
  --datasets <value>        利用する古活字データセット情報の配列 Default: ["{\"url\": \"http://codh.rois.ac.jp/soan/dataset/001.json\"}"]
  --fontColor <value>       古活字画像が登録されていない文字も許容する場合に利用されるフォント色 Default: "#000000"
  --force                   出力先に同名ファイルがあるときも上書きする Default: false
  -h,--help                 display help for command
  --height <value>          出力画像の縦幅 (choices: "auto", "fit") Default: "auto"
  --lineGap <value>         行間 Default: "0.5"
  --marginBottom <value>    地の余白(px) Default: "100"
  --marginLeft <value>      左の余白(px) Default: "100"
  --marginRight <value>     右の余白(px) Default: "100"
  --marginTop <value>       天の余白(px) Default: "100"
  -o,--output <value>       出力先ファイル名(未指定時はstdout)
  --paperTexture <value>    用紙テクスチャファイル名 Default: ""
  --renmenPriority <value>  連綿活字の優先度(0:非連綿優先~1:連綿優先) Default: "1"
  --scale <value>           画像作成サイズ倍率 Default: "1"
  -t,--text <value>         (必須)古活字組版画像化する文字列
  --white <value>           古活字データセット画像の白にマッピングする描画色 Default: "#ffffff"

古活字データセットのダウンロード(任意)

古活字データセットをローカルファイルシステムにダウンロードすることにより、古活字組版画像生成動作を高速化できる。

古活字データセットをダウンロードして利用するには、soan-cliディレクトリで以下を実行する。

mkdir node_modules/soan/dataset/
curl -L http://codh.rois.ac.jp/soan/dataset/001.zip -o 001.zip \
    && unzip 001.zip && rm 001.zip && mv 001 node_modules/soan/dataset/
curl -L http://codh.rois.ac.jp/soan/dataset/001.json \
    | sed 's#http://codh.rois.ac.jp/soan/##g' > node_modules/soan/dataset/001.json
sed -i 's#http://codh.rois.ac.jp/soan/dataset/001.json#dataset/001.json#' soan-cli.js

古活字データセットに更新があった場合、soan-cliディレクトリで以下を実行することによって、古活字データセットを再ダウンロードし、soan-cliの動作に反映できる。

rm -rf node_modules/soan/dataset/1/
curl -L http://codh.rois.ac.jp/soan/dataset/001.zip -o 001.zip \
    && unzip 001.zip && rm 001.zip && mv 001 node_modules/soan/dataset/
curl -L http://codh.rois.ac.jp/soan/dataset/001.json \
    | sed 's#http://codh.rois.ac.jp/soan/##g' > node_modules/soan/dataset/001.json

Soanライブラリのアップデート方法

soan-cliディレクトリにおいて、以下を実行する。

npm update --prefer-online

ライセンス

Soan: Library for rendering modern Japanese using old movable type
http://codh.rois.ac.jp/software/soan/

Copyright 2023 Center for Open Data in the Humanities, Research Organization of Information and Systems
Released under the MIT license

Core contributor: Jun HOMMA (@2SC1815J)

開発履歴

バージョン1.1 (2023-12-06)

以下の機能を追加、改良しました。

  1. 料紙選択機能の追加
    • くずし字画像から裏写りを除去
  2. 連綿活字の選択ロジックの改善
    • 文節を跨いだ連綿を抑制するロジックの追加
  3. 変体仮名の使い分けロジックの改善
    • 字母を同じくする変体仮名の単体活字が連続することを回避するロジックを追加
    • 踊り字化を試行する機能を追加
    • その他、形態素解析によって得られた品詞情報、語頭/語中/語尾等の情報に基づく変体仮名の使い分けロジックの改善

バージョン1.0 (2023-08-07)

  1. そあん(soan)を公開