J-POPをワンコーラスだけ聴くローカル音楽アプリを作る

ドライブ中に多くのJ-POPを楽しむため、最初のサビ(ワンコーラス)までを自動再生するローカル音楽アプリを作る。要件定義と、サビ検出に試す3つの解析方式を整理する。

ドライブ中に、もっとたくさんのJ-POPを聴きたいと思った。

気に入った曲をフルで聴く時間ももちろん楽しい。ただ、大量の曲を流したいときに1曲ずつ最後まで再生していると、限られた移動時間では聴ける曲数がどうしても少なくなる。途中で次の曲へ送ればよいものの、運転中に操作するのは避けたい。

そこで、曲の頭から最初のサビが終わるところまで、いわゆる「ワンコーラス」だけを自動で再生し、次の曲へ進めるローカル音楽アプリを作ることにした。この記事では、最初に決めた要件と、サビを検出するために試す方式を整理する。

目指す体験

使う人がしたいことはシンプルだ。MP3を選ぶと、ワンコーラスだけ再生され、自動で次の曲へ進む。

「最初のサビまで聴ければ、曲の雰囲気や思い出を十分に味わえる」という前提で、フル再生よりも多くの曲に触れられるようにする。再生終了位置が少し違うと感じたときは、ユーザー自身で直せることも重視する。

要件定義

このアプリがすること

  • MP3を入力として受け取り、曲の構成を解析する
  • イントロ、Aメロ、Bメロ、サビなどの区間情報から、最初の完全なサビを探す
  • 見つけたサビの終了時刻を、ワンコーラス再生の終了位置として使う
  • 曲の先頭からその終了位置までを再生する
  • 解析結果を曲ごとのJSONファイルとして保存し、次回は再解析せずに利用できるようにする

MP3本体は変更しない。解析結果だけを別に保存するため、元の音楽ファイルを壊したり書き換えたりしない設計にする。

入力と補助情報

対象はまずローカルにあるMP3ファイルとする。歌詞がID3タグに入っている場合は、サビを見つけるための補助情報として読む。歌詞が入っていない曲でも、音声だけで解析できることを必須条件にする。

ストリーミングサービスの楽曲を直接扱ったり、歌詞を外部サービスから取得したりする機能は、今回の範囲には含めない。まずは手元の音楽ライブラリを安全に扱えるPC版に絞る。

判定を自動化しすぎない

J-POPの曲構成は一様ではない。イントロが長い曲、サビから始まる曲、サビを繰り返す曲もあるため、自動判定が常に正しいとは限らない。

そのため、アプリは検出したサビの開始・終了位置を表示し、ユーザーが確認できるようにする。判定に自信がない結果は「要確認」と分かるようにし、終了位置は手動で修正できるようにする。自動解析で操作を減らしつつ、外れたときに簡単に戻せることを優先する。

最初の画面で必要な操作

最初のPC版では、次の操作ができればよい。

  1. MP3を選択する
  2. 解析方式を選択する
  3. 解析を開始する
  4. 検出されたサビの開始・終了位置を確認する
  5. 必要なら再生終了位置を手動で修正する
  6. 曲頭からワンコーラスを再生する

複数曲の一括解析やAndroid版への移植は、その後の検証で精度と使い勝手を確認してから取り組む。まずは1曲を確実に解析・確認・再生できることを目標にする。

サビをどう見つけるか

このアプリで一番難しいのは、音声から「最初の完全なサビの終わり」を求める部分だ。軽さを優先する方法だけでは曲によって外れるかもしれない。一方で、高精度なモデルは処理時間や導入の手間が大きくなる可能性がある。

そのため、速度・導入のしやすさ・精度を比べられるよう、次の3つを用意する。

  • 簡易解析:依存関係を少なくし、数秒で結果を返す方式。動作確認や、ほかの方式が使えないときのフォールバックにもする。
  • SongFormer:音楽構造解析向けのTransformerモデル。曲の区間をより深く捉えられるかを検証する。
  • All-In-One:音源分離と音楽構造解析を組み合わせたモデル。ボーカルなどの情報を活用した判定を試す。
方式特徴処理時間の目安向いている用途
簡易解析依存関係が少ない軽量な解析数秒まず結果を確認したいとき、フォールバック
SongFormerTransformerによる音楽構造解析十数秒程度を想定構成の捉え方を比較したいとき
All-In-One音源分離と構造解析を組み合わせる数十秒程度を想定ボーカル情報も活用して判定を試したいとき

※ 処理時間はPCの性能、曲の長さ、初回のモデル取得・キャッシュ生成の有無によって変わる。

GUIから方式を切り替え、同じ曲に対する結果と処理時間を比べられるようにする。Gitリポジトリはまだ非公開だが、検証が進んだ段階で公開する予定だ。まずは、この3つの方式を試す。

この記事をシェアする

X (Twitter) Bluesky
Hugo で構築されています。
テーマ StackJimmy によって設計されています。