「そあん(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}
Parameters:
Name | Type | Attributes | Description |
---|---|---|---|
text |
string | 入力テキスト | |
opt |
optReplacements & optTypesettings & optCallbacks | <optional> |
オプション |
Returns:
- Type
- void
getTextImageFromTextPromise(text, optopt) → {Promise.<getTextImageSuccessObject>}
Parameters:
Name | Type | Attributes | Description |
---|---|---|---|
text |
string | 入力テキスト | |
opt |
optReplacements & optTypesettings | <optional> |
オプション |
Returns:
- Type
- Promise.<getTextImageSuccessObject>
getBlobWithXMPFromCanvasPromise(canvas) → {Promise.<Blob>}
Parameters:
Name | Type | Description |
---|---|---|
canvas |
object | 古活字組版画像出力先としたCanvasオブジェクト |
Returns:
- Type
- Promise.<Blob>
getBufferWithXMPFromCanvasPromise(canvas) → {Promise.<Buffer>}
Parameters:
Name | Type | Description |
---|---|---|
canvas |
object | 古活字組版画像出力先としたCanvasオブジェクト |
Returns:
- 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.0 (2023-08-07)
- そあん(soan)を公開