【物語制作】試論:世界観などの設定から物語冒頭の展開を自動生成する

※当サイトは、アフィリエイト広告を利用しています

展開に困る冒頭部分をどう書けばいいのか

AIが小説を書いてくれる時代になったと聞いた。
うーん、AIの進歩はすさまじい。

AIのべりすと (AI Novelist)
文庫本174万冊分! にほんご文章・小説生成AI

ただし、AIは「続きを書かせる」ものであって、最初の一文が書けないことにはどうしようもない。

とうわけで、ここでは、世界観やキャラクター設計がある程度できている場合に、
なんとかして冒頭の展開をひねり出す方法を考えてみた。

設定ファイルからランダムでシーンの概説を創造する

物語は基本的に時系列で流れている以上、以前の展開の縛りを受ける。
だが、その因果の縛りから唯一逃れているのが物語の冒頭部分である。
むしろ、冒頭は「そうはならんやろ」という展開の方が読者の心をつかみやすいと思われる。

意外性を出すにはランダム化が有効

インパクトのあるシーンには意外性・異質さがあることが重要で、それゆえ、シーンをランダムな要素によって構成する方法が昔から考えられてきた。

駄作小説からの脱出する(?)ツールを作ってみたよ/インパクトのあるシーンの基本法則 – デマこい! (hateblo.jp)

ここでは5W1H(いつ、どこで、誰が、何を、どのように、どうした)のそれぞれの要素を複数用意して、それをランダムに組み合わせることで意外な展開を作り出している。

Pythonでランダム5W1H生成器を作ってみた

で、上記のようなものExcelではなくPythonで作ってみた。
というのも設定ファイルは全部Markdown形式のテキストファイルに保存しているので、わざわざExcelやスプレッドシートに組みなおすのは面倒だからだ。

情報はファイルとして一元管理することにした (別題:Evernoteが開かなくなった)
ある日Evernoteが開かなくなった読書メモ、勉強ノート、日記といった情報を一元化しようということは今やあらゆる本に書いてある。メリットとしては以下の通りか。一度収集した情報を再度収集したり探し回ったりする時間をなくせるすべての情報が同じ...

前準備: ディレクトリ構成

ディレクトリ構成は以下のようになっているものとする。
たとえばWhoフォルダ内のファイルには、おなじみのキャラクター設定なんかが書いてあるのを想像していただいていい。

TEST
│ 5W1H.py
│ 
├─Do
│ 争う.md
│ 失う.md
│ 得る.md
│ 発見する.md
│ 語る.md
│ 
├─How
│ 洗濯.md
│ 柴刈り.md
│ 食事.md
│ 
├─What
│ きびだんご.md
│ 友情.md
│ 宝.md
│ 桃.md
│ 
├─When
│ ある日.md
│ 
├─Where
│ あるところ.md
│ 山.md
│ 川.md
│ 道中.md
│ 鬼ヶ島.md
│ 
└─Who
│ おじいさん.md
│ おばあさん.md
│ 桃太郎.md
│ 犬.md
│ 猿.md
│ 雉.md
│ 鬼.md

5W1H.pyの中身はこう。とりあえず結果が表示されるよう適当に書いた。

import random
import pathlib
import re

def rand_filename(path, ext="md", num=1):
    # フォルダ内から特定の拡張子を持つファイルをランダムに選出する
    files_file = path.glob('*.' + ext)
    l = []
    for f in files_file:        l.append(f.stem)
   
    return str(random.choices(l, k=num))
if __name__ == "__main__":    # 同じディレクトリを参照
    p_dir = pathlib.Path(__file__).parent
   
    result = ""
    result += str(rand_filename(p_dir / 'When') + "、")
    result += str(rand_filename(p_dir / 'Where') + "で")
    result += str(rand_filename(p_dir / 'Who') + "が")
    result += str(rand_filename(p_dir / 'Who',"md", 3) + "と")
    result += str(rand_filename(p_dir / 'How') + "によって")
    result += str(rand_filename(p_dir / 'What') + "を")
    result += str(rand_filename(p_dir / 'Do') + "")
    # 記号を除外
    result = re.sub(r'\'','',result)
    result = re.sub(r'\[','',result)
    result = re.sub(r'\]','',result)

    print(result)

5W1H.pyを実行してランダムに組み合わせる

5W1H.pyを何回か実行すると例えば以下のような文章が生成される。[2]
一部重複も発生しているがまぁよしとしよう……

ある日、鬼ヶ島でおばあさんが猿, 鬼, 桃太郎と食事によって桃を発見する
ある日、川で鬼が雉, おばあさん, おじいさんと洗濯によってきびだんごを争う
ある日、山で猿が猿, おばあさん, 鬼と洗濯によって友情を語る
ある日、川で桃太郎が犬, おじいさん, おじいさんと食事によってきびだんごを失う
ある日、鬼ヶ島で雉が鬼, おばあさん, 鬼と柴刈りによって宝を失う

面白い展開を選ぶ

この中で最も意外性があって面白い展開を選ぶ。

「食事によってきびだんごを失う」は当たり前すぎるが、
「洗濯によってきびだんごを争う」はなかなか面白そうだ。これにしよう。

ある日、川で鬼が雉, おばあさん, おじいさんと洗濯によってきびだんごを争う

展開を補充する

もちろん、その展開から始められるならそうしてもいいが、前提条件の補足が必要なら、ピクサーの22の法則の第4から逆算して、「昔々あるところに」などを補充していく。

「昔むかしあるところに」「毎日」「ある日」「こういうことがあったから」「そしてついに」という風に起承転結をつけて物語を展開させていく。
引用元:ピクサーの作品に秘められた物語を書くための22の法則 – GIGAZINE

「昔むかしあるところに」=日常は、「ある日」によってバランスを崩されるため、できるだけ逆の状態がいい。

【読書録】納得感のすごい脚本論。『ストーリー ロバート・マッキーが教える物語の基本と原則』
腹落ちする脚本論ってあんまりなくない?昔からプロットというものが書けない。雰囲気で小説を書いてきた。 しかし流石に昔のような体力もないのでプロットの支えがないとつらい。プロット論で良書と言われているものは一通り読んだ。が、どうにも腑に落ちな...

こんな感じになるだろうか[3]

昔々あるところに、おじいさんと、洗濯名人のおばあさんが住んでいました。
ある日、おばあさんが川へ洗濯に行くと、鬼が「この着物を最も綺麗に洗ったものが勝者だ」と言って勝負をしかけてきました。
おばあさん、おじいさん、そして見知らぬ雉も参加して一生懸命洗濯をしましたが、鬼のパワフルな濯ぎにはかないません。
負けてしまったおばあさんは持っていたきびだんごを取り上げられてしまいました。
おばあさんが悲しんで泣いていると、川の上流から大きな桃が流れてきたのでした……

う~ん、洗濯王子★桃太郎が爆誕して、鬼にリベンジする話になりそう。
雉は鬼ヶ島前に試練を課してきて、「この私以上のしみ抜きができれば問題ありませんね。さあ、一緒に行きましょう」とか言って仲間になる役回りでしょう?

……というように、キャラクター設定(桃太郎は桃から生まれる、雉は最後に仲間になる)さえちゃんとしていれば、冒頭部が書ければなんとなく展開は繋がっていくものである(多分)。

もっとこうしたい

Do: シーンの価値基準の制御

最初はDoフォルダに「食事」とか「柴刈り」も入れていたが、やめた。シーンが進んでいるかどうか分かりにくかったからだ。
主語になっている人間が、何を得て何を失ったか、というのがシーンを動かすためには重要だ。

「得る」「失う」はもちろん、「発見する」「語る」「争う」は、その結果次第で物質以上の価値を得たり失ったりするから入れている。

ここらへんの制御ができればもっとシナリオ作りやすくなりそうな気がする。

What: メタファーをどう拾ってくるか

より意外性を出すため、Whatを適当な辞書の一般名詞から拾ってくる考えもあった。
が、ちょっと保留している。

「桃太郎」における「桃」は一見突飛なアイテムに見えるが、桃は昔は仙人の食べ物とかなんとか言われていて、「不思議パワー」のメタファーとも解釈できる。

「解釈できる」と書いたが、シーンの5W1Hを構成するようなWhatをみれば、それを何らかのメタファーとして(意識的にせよ無意識的にせよ)読者は解釈してしまう、という方が正確かもしれない。

一作者としては、そんなものをテキトーに置いて読者に誤読されるのは避けたい。
というわけでWhatの内容は自分で考えた方がよさそうである(連想力が試される)。

また、「きびだんご」という物理的なアイテムは、「友情」のメタファーになりうる[4]わけだが、
冒頭を書いている段階では、作者自身何が何のメタファーなのか分かっていないケースの方が多いと思われるので、あえて区別をせず同じフォルダに置いている。

あと、人物も何かのメタファーと考えられるので、Whoの内容をWhatの候補に追加するのはよさそうだ。

Whereの拡張

Whoの家」とか、「Whereから(別の)Whereへの中継地点」とか、場所には様々なバリエーションがあるので、煩雑にならない程度にどうにかしたい。

検証した結果: ランダム化は「ツカミ」となる事件をを作るのによさそう

というわけで、ランダムに5W1Hを組み合わせてシーンを生成するのは、少なくとも「ツカミ」を作るのによさそう、ということが分かった。
ストーリー全体をテーマに沿ってうまいこと設計できればいいなぁと思っているので、引き続き検証する。

関連本紹介

脚注

  1. 展開に困る冒頭部分をどう書けばいいのか

    AIが小説を書いてくれる時代になったと聞いた。
    うーん、AIの進歩はすさまじい。

    AIのべりすと (AI Novelist)
    文庫本174万冊分! にほんご文章・小説生成AI

    ただし、AIは「続きを書かせる」ものであって、最初の一文が書けないことにはどうしようもない。

    とうわけで、ここでは、世界観やキャラクター設計がある程度できている場合に、
    なんとかして冒頭の展開をひねり出す方法を考えてみた。

    設定ファイルからランダムでシーンの概説を創造する

    物語は基本的に時系列で流れている以上、以前の展開の縛りを受ける。
    だが、その因果の縛りから唯一逃れているのが物語の冒頭部分である。
    むしろ、冒頭は「そうはならんやろ」という展開の方が読者の心をつかみやすいと思われる。

    意外性を出すにはランダム化が有効

    インパクトのあるシーンには意外性・異質さがあることが重要で、それゆえ、シーンをランダムな要素によって構成する方法が昔から考えられてきた。

    駄作小説からの脱出する(?)ツールを作ってみたよ/インパクトのあるシーンの基本法則 – デマこい! (hateblo.jp)

    ここでは5W1H(いつ、どこで、誰が、何を、どのように、どうした)のそれぞれの要素を複数用意して、それをランダムに組み合わせることで意外な展開を作り出している。

    Pythonでランダム5W1H生成器を作ってみた

    で、上記のようなものExcelではなくPythonで作ってみた。
    というのも設定ファイルは全部Markdown形式のテキストファイルに保存しているので、わざわざExcelやスプレッドシートに組みなおすのは面倒だからだ。

    情報はファイルとして一元管理することにした (別題:Evernoteが開かなくなった)
    ある日Evernoteが開かなくなった読書メモ、勉強ノート、日記といった情報を一元化しようということは今やあらゆる本に書いてある。メリットとしては以下の通りか。一度収集した情報を再度収集したり探し回ったりする時間をなくせるすべての情報が同じ...

    前準備: ディレクトリ構成

    ディレクトリ構成は以下のようになっているものとする。
    たとえばWhoフォルダ内のファイルには、おなじみのキャラクター設定なんかが書いてあるのを想像していただいていい。

    TEST
    │ 5W1H.py
    │ 
    ├─Do
    │ 争う.md
    │ 失う.md
    │ 得る.md
    │ 発見する.md
    │ 語る.md
    │ 
    ├─How
    │ 洗濯.md
    │ 柴刈り.md
    │ 食事.md
    │ 
    ├─What
    │ きびだんご.md
    │ 友情.md
    │ 宝.md
    │ 桃.md
    │ 
    ├─When
    │ ある日.md
    │ 
    ├─Where
    │ あるところ.md
    │ 山.md
    │ 川.md
    │ 道中.md
    │ 鬼ヶ島.md
    │ 
    └─Who
    │ おじいさん.md
    │ おばあさん.md
    │ 桃太郎.md
    │ 犬.md
    │ 猿.md
    │ 雉.md
    │ 鬼.md

    5W1H.pyの中身はこう。とりあえず結果が表示されるよう適当に書いた。

    import randomimport pathlibimport redef rand_filename(path, ext="md", num=1):# フォルダ内から特定の拡張子を持つファイルをランダムに選出する files_file = path.glob('*.' + ext) l = []for f in files_file: l.append(f.stem)return str(random.choices(l, k=num[]
  2. 「戦闘」をHowに入れていないのでかなり平和な話になっている[]
  3. 冒頭にしては人物が多すぎるので、「~と」は少々数を減らすべきかもしれない[]
  4. 桃太郎と犬猿雉を対等関係と捉えた場合。主従と捉えるなら「恩義」のメタファーであろう[]
タイトルとURLをコピーしました