Rapを学習し自動リリック生成するAIのプログラムでKanye Westを学習させたらこんなリリックできました

Rapを学習し、自動でリリック生成するAIプログラムが海外のテック系記事に掲載されていたので和訳します。

ラップでなくても普通の歌でも詩でも使用できるのですが、ラップは歌に比べると単語単語が独立している傾向があるため(そうではない場合もありますが、、、)時間経過を伴う意味の整合性について、解決がより簡単な可能性があるかもしれません。

今回はKanye Westをデータセットにして使用していました。

データセットにはKanye Westのアルバム
・The College Dropout
・808s & Heartbreak’
・Yeezus
・Late Registration
・Graduation
・My Beautiful Dark Twisted Fantasy
・Watch the Throne
・The Life of Pablo
から各トラックを選択しました。

まずはいきなり結果を
こんなリリックです。

生成1000回目
Am our 200 shought 2 and but
One we -fuckister do fresh smandles
Juco pick with to sont party agmagle
Then I no meant he don’t ganiscimes mad is so cametie want
What
Mama sumin’ find Abortsimes, man

らしいといえばらしいですが意味は不明です笑

生成3000回目
Moss for a kice the mowing?
[Verse 1]
I play this better your pictures at here friends
Ever sip head
High all I wouldn’t really what they made thirise
And clap much

[verse 1]などというものを学習し生成しています。(実際は使用しないでしょうけど、、、)
エラーらしい意味不明な表現は1000回目より減っている様です。

生成25000回目
Through the sky and I did the pain is what what I’m so smart
Call extry lane
Make man flywing yet then you a represent
And paper more day, they just doing with her
This that fast of vision

まだまだ意味不明な部分がかなりありますが向上しているでしょうか?SkyはTouch the Sky?

生成20万回目
Right here, I was mailing for mine, where
Uh, that’s that crank music nigga
That real bad red dues, now you do
Hey, hey, hey, hey
Don’t say you will, if I tried to find your name!
I’m finna talk, we Jine?
Ok, ooh oh!
Bam ba-ah-man, crack music nigga
(We look through to crew and I’m just not taking out
Turned out, this diamondstepragrag crazy
Tell my life war
[Hook]
Breakfies little lights, a South Pac-shirt
Track music nigga
(La la la la la la la lah, la la la la la lah)

意味不明は相変わらず、、、、
しかしらしいといえばらしく学習の成果はある様な、、、
最後は強引にLa La Laでまとめてますが、これで案外納得させられてしまうあたり、La La Laは最強のリリックかもしれません笑
面白い(人はこんなリリック作れないでしょう)と感じる部分も無きにしも非ず、、、なのでこのままリリースして見ても面白いかもしれません。

 

コードは下記の様なものです。
RNN LSTM使用

self.vocabulary = dict(zip(self.chars, range(len(self.chars))))
self.tensor = np.array(list(map(self.vocabulary.get, data)))
self.batches_size = int(self.tensor.size / (self.batch_size * self.sequence_length))
self.tensor = self.tensor[:self.batches_size * self.batch_size * self.sequence_length]
inputs = self.tensor
targets = np.copy(self.tensor)
targets[:-1] = inputs[1:]
targets[-1] = inputs[0]
self.input_batches = np.split(inputs.reshape(self.batch_size, -1), self.batches_size, 1)
self.target_batches = np.split(targets.reshape(self.batch_size, -1), self.batches_size, 1)

def rnn():
data_provider = DataProvider(data_dir, BATCH_SIZE, SEQUENCE_LENGTH)
model = RNNModel(data_provider.vocabulary_size, batch_size=BATCH_SIZE, sequence_length=SEQUENCE_LENGTH, hidden_layer_size=HIDDEN_LAYER_SIZE, cells_size=CELLS_SIZE)

with tf.Session() as sess:

summaries = tf.summary.merge_all()
writer = tf.summary.FileWriter(tensorboard_dir)
writer.add_graph(sess.graph)
sess.run(tf.global_variables_initializer())

epoch = 0
temp_losses = []
smooth_losses = []

while True:
sess.run(tf.assign(model.learning_rate, LEARNING_RATE * (DECAY_RATE ** epoch)))
data_provider.reset_batch_pointer()
state = sess.run(model.initial_state)

for batch in range(data_provider.batches_size):
inputs, targets = data_provider.next_batch()
feed = {model.input_data: inputs, model.targets: targets}
for index, (c, h) in enumerate(model.initial_state):
feed[c] = state[index].c
feed[h] = state[index].h
iteration = epoch * data_provider.batches_size + batch
summary, loss, state, _ = sess.run([summaries, model.cost, model.final_state, model.train_op], feed)

writer.add_summary(summary, iteration)
temp_losses.append(loss)

if iteration % SAMPLING_FREQUENCY == 0:
sample_text(sess, data_provider, iteration)

if iteration % LOGGING_FREQUENCY == 0:
smooth_loss = np.mean(temp_losses)
smooth_losses.append(smooth_loss)
temp_losses = []
plot(smooth_losses, "iterations (thousands)", "loss")
print('{{"metric": "iteration", "value": {}}}'.format(iteration))
print('{{"metric": "epoch", "value": {}}}'.format(epoch))
print('{{"metric": "loss", "value": {}}}'.format(smooth_loss))
epoch += 1

 

どうですか?割とシンプルですね。(他にデータセットを作る作業やら何やらありますが、、、)
データセットを自分で用意すれば他のラッパーや、J-popなどの作詞にも活用できるかと思われます。

AIというと皆さんAIだけで全てを完結、、、と思われる方、期待される方が多い様に思いますが、私は単に自動化やコスト削減を目的としたプログラム以外はいかに人と共存するか、より個々の人間の能力を伸ばす高度な道具として使いこなすか?の方が重要だと考えています。
きっと未来の使用方法、特に音楽などで価値を生み出すものはその方向に進むはずです。
リリック自動生成プログラムも、今後どの様な進化をしていくのでしょうか?
どんな形かはわかりませんが、AIによるリリック生成のラップ作品のリリースは近いかもしれません。