動画に合わせたElevenLabsのBGMがめっちゃいい
Claudeで執筆しました
自分は個人で、縦型のショート動画を作って出すプロジェクトを回しています。 一人でやってます。 台本を書いて、画面のアニメーションをコードで組んで、ナレーションを合成音声で乗せて、効果音を焼き込む。
その動画には、音楽がありませんでした。 無音ではないんです。 喋ってるし、ピコピコ鳴ってはいる。 ただ、いわゆるBGMが無い。
で、これ、うっかり忘れてたわけじゃないんです。 1ヶ月前に「BGMは使わない」と、ちゃんと決めて、ちゃんと文書に残してました。
今日その決定を、自分で殺しました。 その話をします。
「BGMを使わない」には、それなりの理由があったんです
当時の理由は3つでした。
ひとつ目。経路が無い。 動画にあとから音楽を乗せる機能って、そのプラットフォームだとスマホアプリ側にしかないんです。 自分はもうスマホを使わない運用に切り替えていたので、その入り口が物理的に消えてました。
ふたつ目。工数が乗る。 じゃあ動画に最初から焼き込むかというと、今度は曲を選ぶ、ライセンスを確認する、毎本ミックスを耳で決める、が発生します。 一人でやってるので、1本あたり10分の作業が増えると、それはそのまま毎日10分です。
みっつ目。旨みが薄い。 ナレーションが主役の解説動画で、曲がどれだけ効くのか自信が無かった。
わりと真面目に検討して、「無しでいく」と結論を出しました。 文書にも「この決定が覆る条件」まで書きました。 「BGM無しのせいで数字が明確に負けたら再検討する」と。
自分で決めて、自分で書いて、1ヶ月後に自分で破りました。 条件も満たしてないのに破りました。 これは後で効いてくるので覚えておいてください。
きっかけは「そういえばこれ、音楽も作れるらしいですね」
ナレーションの合成にElevenLabsを使っています。 台本を投げると喋ってくれるやつです。 そこに音楽生成の機能があると知りました。
同じサービスです。 同じAPIキーです。 同じ月額プランのクレジット枠です。
つまり、新しい契約も、新しい依存も、要らない。 これに気づいた時点で、上の「理由ひとつ目」が消えました。
とりあえず試すことにしました。
まず10秒だけ作って、値段を測りました
いきなり本番の尺で作ると、失敗したときに丸損です。 なので最初にやったのは、10秒の曲を1本だけ生成して、その前後でクレジット残高を見ることでした。
結果、10秒で125クレジット。 1秒あたり12.5クレジットです。
これが分かると一気に見通しが立ちます。 30秒の動画なら375クレジット。 100秒の長い動画でも1275クレジット。 月に使えるのが6万クレジットちょっとなので、毎月20本作っても枠の3割いかない。
正直、拍子抜けしました。 「毎回作ると高くつくから使い回そう」という発想が、この時点で意味を失いました。 音楽を使い回して節約する理由が、金銭的に無い。
ここで「理由ふたつ目」の半分が消えました。
「こういう感じの曲」をAIにどう伝えたらいいんですか
ここが今回いちばん面白かったところです。
方向性を決めるために、最初にClaudeへ3つの方向で10秒ずつ作らせました。 淡いやつ、暗いやつ、ほぼ環境音のやつ。 全部ボツにしました。
そこでClaudeに「イメージしている曲はあるんですが、どうやって伝えたらいいですか」と聞きました。
これ、地味に難しい問題です。 理由が2つあります。
ひとつは、Claudeが音を聴けないこと。 曲のURLを渡しても、Claudeが取れるのは文字情報だけです。
もうひとつは入力の形の問題で、曲名やアーティスト名は、そのまま音楽生成のAPIに渡せないんです。 著作権の保護が働いて、無視されるか弾かれる。 このAPIが受け取るのは「どの曲か」ではなく「どんな音か」だけ、ということです。
なので工程がひとつ要ります。 頭の中の参考曲を、欲しい音の説明に置き直す工程です。
自分が挙げたのは、ハッカーが主人公のドラマと映画の曲でした。 Claudeがその2曲を知っていたので、音の要素に分解してくれました。
- 冷たいアナログシンセ、執拗に回る短調のアルペジオ、深い低音、テープの飽和感、パラノイア
- ベルリン系のエレクトロ、歪んだアシッドベース、強い四つ打ち、サイレンみたいなシンセの刺し込み、攻撃的
並べてみると、どちらも特定の曲ではなく音の質感の話です。 自分が本当に欲しかったのはこれで、曲名はその近道のつもりだっただけでした。
音の説明で頼んでから上がってきた3本は、全部そのまま通しました。 ボツ5本、採用3本。 欲しい音を自分の言葉で言えた瞬間に打率が変わったので、ここは省けない工程だと思ってます。
余談ですが、もし手元に音源ファイルがあるなら別の手もあります。 スペクトログラム(音を周波数の絵にしたもの)にしてしまえば、Claudeはそれを「見る」ことができる。 低音の重さ、打楽器の粒立ち、構成の切り替わりが視覚的に読めます。 今回は音源が無かったので使いませんでしたが、伝達手段として一応あります。
本題はここからで、曲に動画の構成を教えられます
ここが今回の山です。
この音楽APIには、プロンプトを一文投げる以外に、構成表を渡すモードがあります。 セクションを並べて、それぞれに「何秒」「どんな雰囲気」を指定できる。
そして自分のプロジェクトには、動画ごとの「場面の切り替わり秒数」が、もうデータとして存在していました。 効果音を鳴らすタイミングを管理するために、前から持っていた数字です。
つまり、その秒数をそのまま構成表のセクション区切りに流し込めばいい。
やってみました。 102秒の動画で、場面の切り替わりが10個ある回でした。 攻撃者の視点で事件の流れを追う内容で、物語はこう動きます。
閉じ込められた環境から始まって、そこを脱出して、権限を登って、標的を定めて、侵入して、広がって、暴走して、防御側に封じ込められて、教訓で終わる。
これを、そのまま曲の指示にしました。
- 最初は音を止めて、不穏なだけにする
- 閉じ込められている間はフィルターを閉じて、こもった音にする
- 脱出した瞬間にフィルターを開けて、四つ打ちを落とす
- 暴走のところで音を最大にする
- 封じ込められた瞬間に、キックとベースを切る
- 最後は静かなパルスだけにしてフェードアウト
返ってきた曲は、その通りに動きました。
聴いた瞬間に、これはもう投稿できると思いました。 5本ボツにした身としては、我ながら現金な手のひら返しです。
大事なのは、これが「尺の合った曲」ではないということです。 尺が合っているだけの曲は、ただ鳴っているだけになります。 盛り上がりが動画と無関係な場所で来るので、むしろ邪魔になる。
構成が合っている曲は、動画と一緒に息をします。 やったことは音楽を足すことじゃなくて、曲に動画の構成を教えることでした。
同じやり方で作った回が出ているので、貼っておきます。 音を出して聴いてみてください。
https://www.instagram.com/reel/DcUZpC_jTGd/
上に書いた102秒の回とは別ですが、場面の切り替わり秒数を構成表に渡すところは同じです。
賢い仕組みを作ってから捨てた話もしておきます
声の下に音楽を敷くと、当然ぶつかります。 喋ってる最中に曲が主張すると聞き取れない。
なので定石の仕組みを入れました。 サイドチェインのダッキング、と呼ばれるやつです。 声が鳴っている間だけ自動的に音楽の音量を下げて、声が止んだら戻す。 放送でもよく使われる手法です。
ちゃんと動きました。 声も聴きやすくなりました。
で、聴いてみて、Claudeにこう言いました。
「音楽が上がったり下がったりしてますね。それ、一旦なしにしてください」
入れたばかりの仕組みを、その場で止めました。
自分で言っておいてなんですが、これは正しかったです。 今回の曲はフィルターの開閉とかブレイクダウンとか、音量の起伏そのものが表現になっている。 そこに自動音量調整をかけると、曲が自分で作った起伏を、機械が上書きしてしまう。 賢い仕組みが、曲の一番いいところを削っていました。
代わりに採用したのは、身も蓋もない方法です。 音楽を、最初から十分に小さい音量で、一定のまま敷く。
数字で言うと、音楽を-28 LUFS(音の大きさの単位です)に固定しました。 結果、動画全体の音量は-18.9から-18.6に変わっただけ。 0.3デシベルです。 人間にはまず分かりません。
声はまったく影響を受けず、音楽は聴こえる。 自動制御より、固定値のほうが良かった。
ついでに、これで「毎本ミックスを耳で決める」という工数もゼロになりました。 値が固定なので、判断が発生しないんです。 理由ふたつ目が完全に消えました。
ダッキングの実装自体は残してあります。 消してはいません。 将来どうしても声が負ける回が来たら使えばいい。 ただ既定では切りました。
罠を2つ踏んだので書いておきます
同じことをやる人が踏みそうなやつです。
ひとつ目。 このAPIには「絶対に歌を入れない」というオプションがあるんですが、構成表モードと同時には使えません。 一緒に投げるとエラーで弾かれます。 なので構成表側では、各セクションの歌詞欄を空にして、除外したい要素に「ボーカル」と書いて抑え込みます。
ふたつ目。 モデルにv1とv2があります。 v2のほうが良かったので乗り換えたんですが、v2は構成表の形式そのものがv1と違いました。 v1の形で投げると弾かれます。 v1は「全体の雰囲気+セクション」という構造なのに、v2は全体指定が無くて、各チャンクが雰囲気を全部自分で持つ形になっていました。
これ、ドキュメントを読むより、構成表を生成するエンドポイントを叩いて実物を見るのが早かったです。 形が分からないなら、作らせて見ればいい。
で、1ヶ月前の決定を破った件です
最初に戻ります。
自分は「BGM無しのせいで数字が明確に負けたら再検討する」と書いていました。 今日、その条件は満たしていません。 数字は何も出ていない。
でも覆しました。 理由は、当時の棄却理由3つのうち、2つが消えていたからです。
経路が無い、は消えた。同じサービスに機能があった。 工数が乗る、は消えた。ライセンスは契約に含まれていて、ミックスは固定値になった。 残ったのは「旨みが薄い」だけで、これは実際に聴いたら反証されました。
ここで気づいたことがあります。 決定を見直すときに見るべきなのは、「効果が出たか」より先に、棄却した理由がまだ生きているかなんじゃないかと。
効果を待つ判断は、コストが高いときには正しいんです。 やってみるのが高くつくから、証拠を待つ。
でも今回、コストはほぼゼロになっていました。 コストがゼロなら、証拠を待つ理由もゼロです。 先に入れて、後から測ればいい。
「この決定が覆る条件」を書いておくのは良い習慣だと思ってます。 ただ、書いた条件は、その時点のコストを前提にしています。 前提が変わったら、条件のほうが古くなる。 条件を守ることが目的になると、そこで詰みます。
決定を殺した記録も、ちゃんと残しました
最後に、これは自分の趣味の話です。
決定を覆したとき、元の文書は書き換えませんでした。 「この部分だけ、新しい決定に置き換わった」という一行を追記して、新しい文書を別に立てました。
理由は簡単で、過去の自分が何を考えて間違えたのかは、消したら二度と手に入らないからです。
1ヶ月前の自分は、真面目に検討して、真面目に間違えました。 その判断そのものは悪くなかった。 前提が変わっただけです。
その履歴が残っていたから、今日「棄却理由のうち2つが消えている」と確認できました。 「なんとなく前は無しにしてた気がする」だと、この確認はできません。
決定を上書きせずに積む。 自分の間違いを、あとで検算できる形で残しておく。 今日それが役に立ったので、書いておきます。