日々精進

aikoと旅行とプログラミング

そろそろaikoさんの新曲が聞きたいのでマルコフ連鎖で歌詞を生成してみた

はじめに

aikoとは,日本の女性シンガーソングライターである.代表的な曲に

  • 甘い匂いに誘われる「カブトムシ」
  • テトラポットに登る「ボーイフレンド」
  • 夏の星座にぶら下がる「花火」
  • シルバーリングが黒くなる「キラキラ」
  • 君にいいことがあるように赤いストローをさす「ストロー」

と挙げていったらキリがないのだが,とにかく数多くの名曲を世に送り出しているアーティストである.あとかわいい.

aikoがリリースした最新のシングルは,2019年3月18日に配信された「愛した日」である 1.このシングルは配信限定となっており,シングルカット(ここでは物理的なディスクで販売されたものを指す)されたシングルとしては2018年5月2日の「ストロー」以来新曲は発表されていない.

そこで今回は,これまでaikoが発表したシングル曲の歌詞とマルコフ連鎖を用いて「aikoっぽい歌詞を生成する」ことを試みる.そろそろaikoの新曲が聞きたいので,無いのなら生成してみればいいのである.

方法

文章を生成する方法として,LSTMなどを用いたもの2について積極的に研究されているようだが,今回はもっと単純にマルコフ連鎖を用いた文章生成を行う.

マルコフ連鎖とは,


P(X_{t+1} | X_{t}, X_{t-1},\cdots, X_1) = P(X_{t+1} | X_{t})

となるような確率変数{X_t}の一連の列を言います3'4.式を見れば分かる通り,t+1番目に遷移する確率は,t番目の確率変数にのみ依存することになります.

実装方法

以下のツールを用いて歌詞の生成を試みる

各種ソフトのインストール

$ brew install mecab mecab-ipadic swig
$ pip install mecab-python3
$ pip install markovify

今回はpipenvを使用した.使いやすくて最高.あとは予め保存した歌詞を

text_model = markovify.NewlineText(parsed_text)
for i in range(0, 5):
    print(text_model.make_sentence().replace(" ", ""))

という感じでmarkovifyに投げれば文ができている.最高

結果

生成例1

涙が止まらないでいた
嘘はつかない
ばっとあなたの背中
痛いくらい抱きしめてくれますよに
そして必ず一緒に焼き付けたい
虚しい夜は陰の心が
ここにあなたとあたしは
あなたの声
耳を置いて時々開けるの
あなたの指と腕があるように
何でも話せる友達だよ
ドアを開けて
背伸びで口元奪った
「うん。幸せかも...」
あなたにいくつ言えるかな

開始から涙が止まらないでいたaikoさんになってしまった.痛いぐらい抱きしめてくれますよにとか一緒に焼き付けたいというなんとなく言っていそうな単語が出てきて面白い.

「うん。幸せかも...」

言いそう

生成例2

ずっと痛くて苦しくて
悲しい夜になってる
気が付いた少し気になってる事は
今何を思っていたいの
今日は強いから
そんな言い訳でいいと
思えたりする事も
きっと今頃前見てるの

今日は強いからと強がるaiko.歌詞によく出てくる"あなた"との関係がたまらなく辛くなって苦しいけど,あなたには伝えられない系の歌詞になっていそう.

生成例3

今朝は向かいの家に映る
二人を繋ぐために
今日の自由スイッチを
少しだけ見える日々はある程良い
あなたも持って帰ってこない
優しかったり
何も知らなかった

排水溝に吐き出して
その大きな道を行こうと
お願いだから
時々不安になる口の中で
見かけたよ虚しい夜は
いつか終わる
悲しい傷も必ず癒える
強いだけの瞬間
1人で開けてみよう
奥の潜む意味に気がした事
儚くて愛しくて
1秒過去には戻れない

始まりに変わる
出会えた事はこんなにも
胸が苦しいほど痛むよ
100通りあるゴメンナサイの言葉が
うわっと飛んでく砂
一人歩いた知りたいひたすらに進む
だから遠回しすぎるよ
あなたの笑った顔だけ

うーん,あまりうまく行かなかった例.

虚しい夜はいつか終わる悲しい傷も必ず癒える

これ,やけにうまく出来てるなあと思ったらカケラを残すの歌詞そのまんまになっている.これ形態素解析失敗してるのかなァ…

でも,

だから遠回しすぎるよ あなたの笑った顔だけ

とかちょっとすき.あと

100通りあるゴメンナサイの言葉が うわっと飛んでく砂

って歌詞は大変おもしろい.100通りもゴメンナサイの言葉があるのに砂と一緒にうわっと飛んでってるやんけ.

生成例4

あなたがあたしの
意志を超えて揺れる 
何度も何度も
上げられない様に
切ない溜息

aikoといえば「あなた」ということで,「あなた」を起点に生成してみた.ちなみにスタートの 単語を指定したい場合は,

text_model = markovify.NewlineText(parsed_text)
for i in range(0, 5):
    print(text_model.make_sentence_with_start(beginning='あなた').replace(" ", ""))

みたいな感じにするとよさそう.

今回はついに「あなた」が「あたし」の意思を超えて揺れてしまったらしい.

「あなた」に一体何があったんだ………なんで揺れちゃったんだ……しかも最後ため息出ちゃってますよ.

その他の例

あなたのかかと気になっている季節は秋桜

かかと気になっちゃったかー

あなたとあたしは前を向きひたすらに進むだから早く受け止めてね

マルコフ連鎖で生成するとaiko前向きがち

あなたがあたしの
内の秘めたる気持ち
あの子と一緒にいようと思っては
風を迎えてくれる
あなたはいつも
最後の日に決められない様に
瞬きが出来やしないや

瞬きはしてほしい

あなたのうぶ毛も閉じなくて困った
幸せは怖いものだから
もっと一緒に捨ててやりました
あなたにも触れて知るの
あなたに言われた気持ちを
氷で閉じてがんばれ歌姫

歌姫へのエール.あなたの産毛の処理に困ってたのかな?

まとめ

  • 今回はaikoの歌詞とマルコフ連鎖を用いて,aikoっぽい歌詞を生成することを試みた
  • それっぽくはなるものの,とても歌詞とは程遠い何かができた
  • 一方で,単語単位で抜き出せば良さげな表現もあった
  • aikoさん誕生日おめでとうございます
  • 新曲もお待ちしています

muttan1203.hatenablog.com

参考文献