詩のフォーマットを自作してみた

 吉増剛造の『詩とは何か』を読んで、吉増が原稿用紙をそのまま使わずにしわを寄らせたり、インクをたらしたりして色々といじくってから書くということを知りました。

 そこで、私は今まで読書会用の詩をWordで書いてきましたが、書くための場を自分で色々いじりながら作ってみたら面白いのではないかと思い、実践してみました。

 

 まず、私は吉増の文章に繰り返し登場する「歪み」という概念を使って、歪んだレイアウトの詩を作ってみたいと考えました。ある程度どういう風にしたら歪んだレイアウトになるか考えた上で、それをどのように実現するかChatGPTに相談しました。

私は詩人です。今、私は自分が書いた詩を以下のようなフォーマットでプリントしようとしています。これが可能なソフト、あるいはプログラムのライブラリ等を教えてください。

・一行の中で、フォントサイズを端に行くほど小さくしたい

・詩の全体で、中心の行ほど字数を少なくしたい

・詩の全体で、中心の行ほどフォントサイズを小さくしたい

「私は詩人です」というのは違いますが、ChatGPTと対話するうえで自分の立場を明確にしたかったのであえてこういう言葉を使いました。

ChatGPTは詩のフォーマットを作る手段として以下の3つを提示してきました。

  1. Adobe Illustrator
  2. LaTex
  3. プログラミング(Pythonでは、PDFや画像ファイルの生成を扱うライブラリ(例えば reportlabPIL/Pillow)が利用できます。)

そこで私は3のプログラミングを選択し、ChatGPTと対話して必要なライブラリの情報を得てコードを書き始めました。

 

プログラムを効率的に書くために、最近GitHubが提供を始めたCopilotという機能を使うことにしました。Copilotとは、GitHub(プログラムを共有するサイト)に共有されたコードを学習したAIが、人間がプログラムを書いている途中で自動でコードの続きを提案してくれるという機能です。

これが想像以上に優れた機能でした。

私は今回使うライブラリに慣れているわけではないので他の人のブログを参照してサンプルコードを打ち込むことから始めたのですが、打っている途中でもう続きを予想して書いてくれます。サンプルコードの内容は多くの人が同じように書くような内容なのでほとんどCopilotの予測だけで完成しました。

その後私がやりたいことを実現するためにコードを改造する作業に入りましたが、その際もCopilotは威力を発揮しました。まるで私の心を読んでいるかのように私が書きたいコードを先回りして書いてくれます。先回りどころか、「ここはちょっと考えないといけないな」と思っていた箇所も見事に実装してくれました。

 

以下が、完成したコードを使ってフォーマットした詩です。ちなみに詩はChatGPTに書いてもらいました。

自作したフォーマットで書いた詩

当初考えていた3つの条件のうち1つ目はあまりに面倒くさいことが分かったので実装せず、2番目は詩の内容次第なので結局3番目の条件しか達成していません。あと、途中で思いついて中心に行くほどフォントの色を薄くしたりしています。

・一行の中で、フォントサイズを端に行くほど小さくしたい

・詩の全体で、中心の行ほど字数を少なくしたい

・詩の全体で、中心の行ほどフォントサイズを小さくしたい

 

完成したものが面白かったかというとそうでもないですが、AIとの相互作用を通じでものを作った経験はなかなかに刺激的でした。

 

最後に実際に作ったコードを載せておきます。

#Pillowライブラリをインポート
from PIL import Image, ImageDraw, ImageFont
#numpyライブラリをインポート
import numpy as np

#テキストファイルの読み込み
f = open('poem.txt', 'r', encoding='UTF-8')
#テキストファイルの内容を変数に格納
text = f.read()
#テキストファイルの内容を一行ずつリストに格納
textlist = text.splitlines()
#テキストファイルを閉じる
f.close()

#フォントカラー用の変数
fontcolor = 0

#フォントサイズ用の変数
fontsize = 45

#フォントサイズの初期値(定数)
fontsize0 = 40

#フォントサイズの変化率(定数)
fontchange = 10

#テキスト描画位置の変数
textposition = 150
#テキスト描画位置の初期値(定数)
textposition0 = 30

#テキスト描画位置の変化率(定数)
textchange = 100

#白い画像を作成
im = Image.new("RGB", (841, 841), (255, 255, 255))

#中央に10行のテキストを描画
draw = ImageDraw.Draw(im)
for i in range(1, 8):
    fontsize = fontsize0 - int(fontchange * np.log( i))
    textposition = textposition0 + int(textchange * np.log( i))
    line = textlist[i - 1]
    font = ImageFont.truetype("C:\Windows\Fonts\meiryo.ttc", fontsize)
    draw.text*1
    fontcolor += 30

for i in range(1, 8):
    fontsize = fontsize0 - int(fontchange * np.log(9 - i))
    textposition = textposition0 + int(textchange * np.log(9 - i))
    line = textlist[7 + i]
    font = ImageFont.truetype("C:\Windows\Fonts\meiryo.ttc", fontsize)
    draw.text*2
    fontcolor -= 30

#画像を保存
im.save('poem.jpg', quality = 95)

*1:textposition, 10 + 45 * i), line, font=font, fill=(fontcolor, fontcolor, fontcolor

*2:textposition, 330 + 45 * i), line, font=font, fill=(fontcolor, fontcolor, fontcolor