2018.12.13

AIに本気の作詞をさせてみた

初めまして! トライフォート AI事業開発部の関根です。

私たちAI事業開発部は通常業務の他に、社内への啓蒙と、社外への情報発信を主な目的として「AIを使ってとにかく面白そうな事をやってみる」という活動を本気で実施しています。今回は私が言語処理の知見を得るために行っていた「AIに本気の作詞をさせてみた」というチャレンジの内容をお届けしたいと思います。

なぜAIに作詞をさせるのか

突然ですが皆様はこちらの歌詞をご存知でしょうか?

ドブネズミみたいに 美しくなりたい

そうです! ご存知 THE BLUE HEARTSのリンダ リンダという曲の冒頭のフレーズですね。この一文、個人的には邦楽史上最も芸術性の高いフレーズの一つだと思っています。

だって、普通に考えたらドブネズミって美しくないじゃないですか。もちろん感性は人それぞれですから「そんなことない!」って人もいると思いますし、美しくないと断定できるほどドブネズミを詳しく観察した経験のある人なんてほとんどいないかもしれません。しかしあくまで一般論として、「ドブネズミ」というワードは美しくない物の象徴として使われる場合がほとんどです。

そこへ来てこの「ドブネズミみたいに美しくなりたい」というフレーズは、そんなドブネズミは自分が憧れを抱く程に美しい存在なのだという事を、この上なくストレートに明言しているわけです。次の一言で「写真には写らない美しさがあるから」と歌われていますが、ではその写真には写らない本当の美しさとは一体何なのか、この歌を聞いた私たちは哲学せざるを得なくなるのです。「美しい」って何なんでしょうか?もしかすると、この一行の歌詞に出会った事で、自分がそれまで抱いていた美しさの定義が変わってしまうかもしれない、そんな力を持った言葉だと私は思うのです。

現代社会に生き、すでに一般常識を持っている私たちにとって、これほどのパワーを持つ言葉を生み出すのは生半可な事ではありません。それこそこの曲の生みの親である甲本ヒロト氏並みのセンスと感性が必要になるでしょう。

でも、想像してみてください。
もしも作り手がAIならどうでしょうか?AIはドブネズミという言葉が持つ一般的なイメージを知りません。空の青さも知らなければ、木々の緑も知りません。つまりAIにとって「花は美しい」と「ドブネズミは美しい」は同じくらい普通の言葉なのです。もしそんなAIが作詞をしたら、まるで息をするようにこんな尖った表現を量産できるのではないでしょうか?

そのように、私たち人間が容易に考え付かないような表現の飛躍を生み出し得るという点に、私はAI×アートの可能性を感じているのです。

それでは、長い前置きはこの辺にしておいて、さっそくAIに作詞させてみましょう。

ステップ1: 一行単位のフレーズを生成する

RNNで文章を生成してみる

文の生成と言えば、近年最も研究が盛んなのはリカレントニューラルネットワーク(RNN)関連の技術です。RNNは、下図のように循環構造を持ったニューラルネットワークで、簡単に言うと「物事の順番を学習できるAI」です。

RNNイメージ

この構造のニューラルネットワークに既存の歌詞を大量に読み込ませる事で、単語(または文字)の並び順を学習させて、「この流れだったら次に来る単語はこれじゃないかな~」という予測を繰り返していくわけです。まずはこれでやってみましょう。

結果はこちら。

  • 知る負けてものの穴をないいくきたし
  • せめて命のしたする僕が僕がような 心
  • 今くれた僕の 歌う消えて泣く父の 楽に眼が美しい

 

全く意味がわからない。
ある意味最高に常識を逸脱してくれてはいるのですが、さすがに日本語として最低限の意味が通っていないと感動できないという事がわかります。
まぁ、今回はRNNを使うやり方で最も単純な方法だったので、多少精度が出なくても仕方ないでしょう。文章生成関連の技術はこのRNNをベースとして日々進化を続けており、もっと最新の高度な手法を使えば、ある程度感動的な歌詞を生み出す事も可能かもしれません。しかし現状として、RNNで完璧に正しい文法の日本語を生成するのはまだまだ難しいようです。

そこで代替案として、「マルコフ連鎖」という、RNNに比べると少々古典的とも言える方法を試してみましょう。

マルコフ連鎖で文章を生成してみる

例えば以下の二つの文があるとします。
・私の好物は蟹です。
・私の職業は会社員です。

そして、これら単語の並びに以下の条件が成立すると仮定します。

ある現在の単語からその次の単語を決定するための確率分布は、現在の単語のみによって決定され、それより過去の単語には一切影響を受けない。

このような確率過程を「マルコフ過程」と呼びますが、そうすると単語の流れは以下のように表す事ができます。

マルコフ連鎖イメージ

つまり、この二つの文のみで考えるなら、現在の単語が「私」であれば次に来る単語は100%「の」であり、現在の単語が「は」であれば次の単語はそれぞれ50%の確率で「蟹」か「会社員」であるという事です。とてもシンプルですね。

もし過去の単語を考慮するのであれば、その流れも全て確率に反映しなければならないのでこんなに単純にはいきません。過去の事象は一切考慮しないという前提があるからこそ、この考え方が成立します。

これらの確率に従って単語を選んでいけば、「私の職業は蟹です。」「私の好物は会社員です。」といった全く新しいセンセーショナルな文を生成する事ができるのではなかろうか、という寸法です。

「次の単語を予測する」という点だけ見るとRNNと似ているような気もしますが、RNNは過去の単語も考慮し、さらにその並び順を特徴として捉えて結果を出しているのに対して、マルコフ連鎖は過去を考慮せず、あくまで機械的に確率を算出しているだけという点が大きく違います。

それではさっそくこの方法で文章をつくってみましょう。
Pythonの「markovify」というライブラリの力を借りてマルコフモデルを作成し、そこにWebからスクレイピングしてきた大量の歌詞データを読み込ませて文章を生成してみました。

結果はこちら。

  • 星が綺麗な事 本当はもっと知っている 僕はきっと生きている
  • ランチの合間も止まらない速度で世界は明日へとTAKE OFF
  • あんなにも愛してた日々に別れ告げて君は、喜んでくれた
  • 祈るように眠るあなたを見てる 言葉はいつも空回りして 道の上を歩く小さ過ぎる僕達

 

歌詞っぽい! ものすごく歌詞っぽい!
あまりにもそれっぽくて思わず興奮してしまいますが、それ以前にちゃんと日本語として読める文章が生成できているという時点でだいぶ凄いですね。

生成というか、元の文章をバラバラにして再構築しているだけなので、どこかで見た表現だらけの全編オマージュ作品になってしまうという点がなんともデンジャラスではありますが、文全体で見れば一応独自の表現と言えなくもないような気がします。

RNNみたいに画像から文章を生成するだとか、自動翻訳や会話などの高度なタスクは行えないものの、大量の文章をブレンドして新しい文に組み立てなおすというまさに今回のようなタスクであれば、今のところマルコフ連鎖が最もお手軽かつ自然なのかもしれません。

ステップ2: フレーズを組み立てて歌詞本文を作成する

マルコフ連鎖をAIと呼んでいいのかと言われると正直かなり疑問ですが、一応は当初の目的を果たすことができました。このまま勢いにのってさらに上を目指していきましょう。せっかくフレーズを生成できるようになったので、それらを組み合わせて歌詞の本文を構築してみます。

この問題、形だけ作ろうと思えば単純に上から並べていけば良いだけの話なのですが、それでは芸がありません。曲の展開を考慮してAメロ→Bメロ→サビにかけてだんだん気分が盛り上がってくるように適切なエモみ配分でフレーズを配置しましょう。

fastTextでエモみを推定してみる

fastTextは、Facebookが公開しているテキスト解析ツールです。
単語の意味をベクトル化して、『王様 – 男 + 女 = 女王』というような言葉の演算を可能にしたり、それによってテキストを分類するという事ができます。

このテキストの分類というのは色々な場面に応用が利きます。例えば「感情」をキーにTwitterの投稿を学習させれば、どのツイートがポジティブな発言で、どのツイートがネガティブな発言なのかAIが自動的に識別できるようになります。すると、特定の検索キーワードに対して世間がどのような印象を抱いているかを、時系列を追いながら分析するといった事が可能になるのです。それで自社や競合他社の製品の評判を確認して戦略を打てばビジネスの改善に繋がるかもしれません。なんだかちょっと未来の話みたいですよね。でもそんな分析も結構簡単にできちゃうんです。そう、fastTextならね。

ということでこのツールを使って上記で生成したフレーズを「エモい」「エモくない」に分類してみましょう。

まずは教師データを作ります。手っ取り早く実際の歌詞を「エモい」、経済新聞の記事を「エモくない」として一気にやってしまうなんて事も考えたのですが、それではハードルが低すぎて生成した文が全てエモくなってしまう恐れがあるため適切な方法とは言えないでしょう。やはりここは手作業でいくしかありません。地獄のエモ仕分けマラソンの始まりです。

分類ツール

こういうWebツールを作成し、フレーズを生成してはそれを「エモい」「エモくない」にポチポチ仕分けるという作業を延々繰り返します。こういう曖昧な基準で分類する場合、本来は嗜好の偏りを避けるために複数人で仕分けを行うべきなのですが、こんな事のために他のメンバーの手を煩わせるわけにはいかないので何とか私一人でやるしかありません。というわけで仕事の合間にコツコツと仕分けること数時間、1000フレーズほどの仕分けが完了しました。(教師データとしてはかなり少ないですが一人でやったので許してください。)

内訳はこうです。
・エモい: 498件
・エモくない: 554件

途中から自分の中でエモさがゲシュタルト崩壊を起こし、そもそもエモいって一体なんなんだろうという自問自答を繰り返した結果、最終的に日本語として意味さえ通っていれば何でもエモく解釈できるという、エモのハイパーインフレーションに突入してしまい、そのせいで思ったより「エモい」の件数が多くなってしまったのですが、結果的にだいたい半々になったのでとりあえず良しとしましょう。

分類した結果をfastTextに読み込ませる形に成形します。

__label__1, 優しく 優しく 愛せる か な 君 が いる なら 問題 は ない けど
__label__1, 星 降る 街 で 君 と 出会え た
__label__0, ビデオテープ を 生きがい に し て ない と ね

カンマで区切りってラベルと文を並べます。今回、「__label__1」はエモい、「__label__0」はエモくないとしました。また、本文はMeCabを使用して分かち書き(単語ごとに分割)しています。
これを約1000件のデータで作成して学習を実行します。今回程度のデータ量なら本当に一瞬で完了します。その結果、未知の文に対しても、どちらのラベルに属する確率が何%か判定できるようになるのです。

それでは、「エモい」のカテゴリに属する確率をエモみと読み替えて、さっそく生成したフレーズのエモみ推定を行ってみましょう。

生成したフレーズ エモみ
同じ時間を生きているこの世界に 100.0%
僕のお腹に君の顔がほころぶ 0.05%
あぁちょっと待ってと言われんなら 0.0%
地図にもないここにないこの世のどこにお前はいる? 70.65%
君の心の中の遠くから 82.8%
鮮やかな色に塗れてはひとり 58.96%
腐るなここで終わりにしよう 60.9%
君がいるから鼓動を刻み あなたがいるならそれだけで心は軽くなる 99.78%
フロリダを旅してんの? 0.00%

 

意外とちゃんとできている……!
正直言ってこんなに曖昧な基準で分類などできるのかかなり半信半疑だったのですが、なかなかちゃんと分類できている気がします。今回教師データを私一人の感性で作成したため、推定したエモみが私の感覚と合っているかどうかだけで性能を判断させて頂きますが、完璧とは言えないまでも想像以上に合致していたと言わざるを得ません。fastTextのポテンシャルの高さがうかがわれます。
もっとちゃんとした基準で、十分なデータを用意すれば、ほとんど人間の感覚値に近い判断で分類を行えそうですね。

このモデルを活用して、以下のようなエモみ配分になるようにフレーズを組み立てます。(ちなみに私は自分で作詞をしたことが無いのでこの配分は勢いで決めています。)

エモさ配分

これで曲の盛り上がりを表現できそうです!
(結果は最後に掲載します)

ステップ3: 曲にタイトルをつける

最後に、生成した歌詞本文にタイトルをつけましょう。
これも簡単にやろうと思えばいくらでも簡単にできるのですが、やはりそれでは芸がありません。歌詞の本文と見比べてちゃんと納得感のある適切なタイトルを付けてあげたい所です。文にタイトルを付けるというタスクをどうすれば解決できるでしょうか?

今回は、独自に打ち立てた以下の仮説を検証してみたいと思います。

タイトルとは、本文を極限まで要約したものである。

歌詞に限らず、メールの件名やブログのタイトルなど、優れた表題はその一文を読んだだけで中に書かれているものの内容を大まかに把握できるものです。それって要するにものすごく圧縮率の高い要約なんじゃないかと考えたわけです。

AIによる文章の要約タスクは盛んに研究されている分野でもあるので、その中のモデルに「歌詞本文」と「タイトル」を紐づけて学習させれば、タイトル推定モデルができあがるのではないでしょうか。

また、今回の方法では、歌詞全体を通して本来あるべき「一貫したテーマ性」というものを作れません。なので、「先に歌詞を生成し、後からテーマ性を見出す」という逆転のアプローチを仕掛ける意味も込めたいと思います。

Pointer-Generator Networksで歌詞にタイトルを付けてみる

Pointer-Generator Networks

Pointer-Generator Networks[論文]は、seq2seqというテキスト生成技術の進化系です。

seq2seqとは、「不定長シーケンスから不定長シーケンスを生み出す」技術で、つまり文章から文章を生成する事ができます。会話の受け答えを学習させればある程度の会話もできるようになるし、かのGoogle翻訳もこのseq2seqをベースとした技術で「ある言語の文章」から「別の言語の文章」を生成しています。

Pointer-Generator Networksはその中でも、「ある文章の本文」から「その文章の要約」を生成する事に焦点を置いたモデルで、従来のテキスト生成モデルが抱えていた問題を鮮やかにクリアしています。

最初にやったRNNやマルコフ連鎖もそうでしたが、普通テキスト生成モデルというものは、学習したデータに含まれていた単語しか扱う事ができません。つまり「知っている単語しか使えない」のですが、このPointer-Generator Networksはその限りではありません。簡単に言うと、自分が知っている単語で要約を述べる事もできるし、知らない単語を本文から抜粋して要約に組み込む事もできる仕組みになっているのです。

それをこんな用途で使った人はいないかもしれませんが、このモデルならなんとなく「歌詞の本文」から「タイトル」を導けるような気がしませんか?

というわけで、公式のコードをお借りしてやってみました。
以下、3500曲分のJ-POPの歌詞を収集し、歌詞本文を「article(本文)」、タイトルを「abstract(要約)」として学習したPointer-Generator Networksに、学習していない楽曲の歌詞本文からタイトルを予測させてみた結果です。

本来のタイトル 予測したタイトル
燃えろ!仮面ライダー ジャンプ空
バビル2世 少年
斗え! ゴライオン ギブアップせい
わが友わが命 夏の青春
空跳ぶマジンガーZ 広い空
ジュニアライダー隊の歌 ユー・アンド・ミーのうた
団欒!ロボット家族 自由のともだち
仮面ライダーストロンガーのうた 平和の心!
父をもとめて 男のために
マジンガーZ/INFINITYバージョン マジンガー!
たたかえ! ガ・キーン ミラクル
傷だらけの栄光 愛の意味
時空戦士スピルバン 結晶
レーサーブルース 男のゴール
見上げてごらん夜の星を 見上げてごらん
サバンナを越えて 走れサバンナの越えて
正義の超能力少年 平和の少年
合体!ドンレンジャーロボ ドンレンジャーロボ死闘
およげたいやきくん うみ
君にささげる僕の歌 僕の歌
学校坂道 坂道口笛
北の狼 南の虎 悲しみの青春
ジパングの風 昇り龍たち
ガッチャマン ’94 飛べ飛べガッチャマン
ぼくらのマジンガーZ 平和とマシーン
はるかなる愛にかけて 愛の仮面
ヒーローは Never ねば Give Up! ヒーロー

 

なかなかタイトルっぽいワードが生成できていますね。

しかも「ガッチャマン」や「ドンレンジャーロボ」など、どう考えても学習データに含まれていないであろう単語もちゃんと抽出できています。
また、必ずしも実際のタイトルと合致させるのが目的ではないにしろ、当たらずとも遠からずな結果がいくつか見受けられるのは結構すごいんじゃないでしょうか。

これを使えば、生成した歌詞にテーマ性を見出しつつタイトルを付けられそうですね!

生成した歌詞

というわけで、長かった道のりを越えて、AIで歌詞及びそのタイトルを生成できるようになりました。それでは実際に生成した歌詞の中から私が気に入ったものをご紹介しましょう。(※全て1コーラスのみとなっています。)

草原のthere

まったく意味はわからないけどやけに爽やかなタイトルが印象的なナンバー。疾走感のある歌詞にかき鳴らすギターサウンドが聞こえてくるようです。

草原のthere

ただ一つlong

「冬の中 手をつないでいた日々を誇れ」「不完全な世界を動かせるただ一つの証明」など、何かを訴えかけてくるような歌詞がふんだんに詰め込まれたメッセージソング。Aメロ2の英語で書かれている一行から「ただ一つのlongなもの=自分の人生」だという事が推察できるので、おそらくは「人生」をテーマにした楽曲なのでしょう。

ただ一つlong

時代

「君の背中に火を灯す」というヤバすぎる歌いだしから始まる問題作。若者の鬱屈した感情をとても熱く表現しています。特にラストのサビの歌詞は、思春期特有の肥大化した自意識を解き放ち、ありのままの自分を受け入れていく様子が見事に伝わってきます。

時代

どれも素晴らしい歌詞ですね。
背景画像はこちらからお借りしました。
(※歌詞カードを作る作業は人間がやっています。)

最後に

いかがでしたでしょうか。

思った以上に良い歌詞ができるのでやっていて驚いてしまったのですが、マルコフ連鎖の元にさせて頂いた歌詞がそもそも素晴らしいので良い歌詞になるのは当たり前かもしれませんね。しかし、ところどころ見たことある表現が出現してはいるものの、一文一文Googleで検索してみると、学習元と丸々同じフレーズというのは意外とあんまり出ていないことがわかります。今回の方法で本当に曲として成立する歌詞を作るのは難しいかもしれませんが、ここからインスピレーションを得て実際の作詞に役立てるくらいの使い道はあるんじゃないでしょうか。

また、今回のチャレンジの副産物として、「文のエモさを私基準で判定するAI」「任意の文章にJ-POP式のタイトルを付けるAI」が生まれたので、使う機会があればどこかで活かしていきたいと思います。

昨今のAIというと画像処理関係の話題に目が行きがちですが、言語処理も遊んでみたらこんなにも面白いという事が伝われば幸いです。

これからも色々な実験結果をこちらのブログで発表していきたいと思っていますので、是非ご注目下さい。

それでは、最後までお読みいただきありがとうございました。

トライフォートで働きませんか?

トライフォートで働きませんか?
弊社ではエンジニア、デザイナー、ディレクター、プランナーを随時募集しています。
ゲームやサービスが好きで、新しいことにチャレンジしたい、世界に強いインパクトを残したい、という人を探しています!
我こそは、という人は是非ご応募ください!