さだまさし

さだまさし風の歌詞を自動生成する「さだロボ」

More than 3 years have passed since last update.

寄り道をしつつ「ディアゴスティーニ」(サダゴスティーニとは節度のある大人なので言わない)的に週一頻度で記事を書いてきましたが、一応「さだロボ」が形になったのでそれをメインテーマに記事書きます。

一応念の為にお断りしておくと、さだまさしに限らず歌手の世界を完全に再現し、詞として完成されたものを自動生成する、というのはとても難しいテーマで、週末の空き時間を使って数日で作れるものでもありません...。

なので、今回出来上がったのはユーザー操作を前提とした作詞補助ツール(?)という位置づけになります。


デモサイト

https://sadatech.herokuapp.com/sadabot

ページを開くと、candidate phrase 欄に一行、さだまさしっぽい歌詞のフレーズが表示されます。

このフレーズを使いたい場合は add ボタンを押すとこのフレーズを採用した上で、関連のあるフレーズを新たに表示します。採用した歌詞は generated result に表示されるようになります。

気に入らない場合は retry を押すと別のフレーズを生成します。

作られたものが気に入らない場合は clear を押すと全消去して最初から作り直します。

みたいな事を繰り返していくことで、さだまさし風の歌詞っぽいものが作成されていく、というものになっています。

なお、作成した歌詞を絵文字混じりの文字に変換したい方々(?)のために、絵文字変換ボタン (to emoji) も下の方に用意してある親切設計です。


動作イメージ

sadabot.gif

sadabot2.gif


実装について

文章の自動生成にはいくつかの選択肢があると思いますが、オンラインでデモを動かすという意味だとあまり計算に時間を使えないので、デモサイト上ではシンプルなマルコフ連鎖を用いています。

Wikipedia - マルコフ連鎖

ただし、単純にマルコフ連鎖のロジックを使うだけだとなかなか歌詞として自然な文章にならないので、出力に強い制約をかけることでデモは実現しています。


入力

出力の前に情報ソースの話ですが、先週作成した N-gram コーパス ( http://qiita.com/moaikids/items/1d8811320098e70ca98e ) を使います。

今回は、3-gram ~ 7-gram のデータを元に学習をさせてます。また出現頻度に応じて学習スコアを少し変えています。


出力

歌詞らしい文章を出力するために、以下の制約を加えています。


  • フレーズの最初の単語の品詞は「名詞」「動詞」「形容詞」など(非自立語除く)

  • フレーズの最後の単語の品詞は「助詞」「助動詞」など

  • 長過ぎたり、短すぎる文章は除外する

  • すでに作成されたフレーズと、自然なつながりになる文章を採用する


    • 今回は、作成済みのフレーズの末端の数単語と、新たに作成したフレーズの最初の数単語の組み合わせが N-gram コーパスの中に存在するかどうかでチェックをする



ローカル環境では、すでに作成されたフレーズ中に含まれている単語群と、新たに作成した単語群の Word2Vec による類似度を判定したりしていたのですが、 heroku 上で動かすには制約が多かったので外しています。


このデモを作る上で参考にしたサイト

シンプルなRNN/LSTMだけでまともな文章はできない

このアドベントカレンダーではマルコフ連鎖を使ったものを紹介していますが( RNN/LSTM を用いた例は明日書きます)、このブログ記事に書かれていた以下に引用する、コンピュータの文章生成精度を挙げるためのアプローチが参考になりました。


1.前の文字列のみを素性とするのではなく文法素性や言語資源をふんだんにぶち込む

2.大量に生成した文をからまともなものだけをピックアップする

3.生成した文を人手でチェックして修正する

4.出力に人手で作った厳しい制約を課す

5.学習させる文の種類を極端に狭める


今回のデモでは


  • 3. : ユーザーインタラクションを前提とした UI にして、人による選択、修正が行えるようにしている

  • 4. : 歌詞のフォーマットに沿いやすいように強い制約を与えている

  • 5. : 「歌の歌詞」「さだまさし」という狭いコンテキストに限定している

という感じです。

こういうアプローチにすることで、今回みたいなかなりナイーブなアプローチでも、そこそこな精度が保てているように思えます(主観)。


個人的に気に入っているフレーズ

以下は、いろいろためす中で遭遇した、個人的にお気に入りのフレーズです。


  • 作詩:さだロボ

  • 補作詩(ボタンをポチポチ押す人):moaikids

といった趣きです。


sample1

一度だけの手紙を書いた

誰かに刻んだ
恋はいつでも
僕の胸に熱が上る
振り返り消えそうな
笑顔を思い出して


sample2

人を愛してくれた

君はその時に
あなたに届くように
手を離さずに生きて
いたんだね

君の肩を抱きしめられた
時は過ぎて
恋は必ず消えて

夢を見ていた
誰かの誰かの
ために君は何処か
心に届くように
あなたの夢だった


さだまさしっぽいとも言えるし、そうでないとも言える気もしますが、、いずれにせよさだまさし氏の今までの素晴らしい曲の数々を教師データとして学習した「さだロボ」により創りだされた産物です。


いずれにせよ

じゃあ「さだロボ」はともかくとしてコンピュータアルゴリズムがさだまさし本人を超えられるかというと短期的には想像が難しく、余人には到達できない前人未到の領域に達しているさだまさし氏に、人はおろか、機械もおいそれとたどり着くことは難しいことを、あらためて実感しました。

そして、いろいろとさだまさしの詞を解析していくなかで、改めてさだまさしの作品について理解し、その偉大さを感じる、個人的にはそんなアドベントカレンダーでした。


まとめにかえて

なんとか最低限の水準では「さだロボ」を作り上げる事ができました。

残りの枠で、RNN で文章作成することを試してみたり、出来上がった詩にメロディ(コード進行)をつけて曲にしてみたり、なんてことが出来ればと思います。

(時間があれば、ですが。)