
簡易分析ソフトの制作方法について
注意: 現在流れている音源は解析対象ではありません。 Error: 意味は、ありません。 Error: 解析は、必要ありません。 さて、皆さんはSUNOで生成した楽曲の感想を聞くと同時に うーん…狙い通りに作れてるのかなぁ…?という 楽曲についての【答え合わせ】目的でChatGPTを使ったりされますか? 特に無料ユーザー環境にて、ChatGPTでの分析を【確実】に行えないか そこを狙い作成してみました。 ■音楽解析支援ツール Google colab上で動く「Narrative Audio Analyzer Lite」 (以下、NAA Lite) というものを、ここにソースコード貼れるくらい超圧縮して作ってみました。 スマホ一つで完結するので簡単です。 (コードを書ける場所なら何処でも可能です) NAA Liteは、音楽ファイルから音響情報を抽出し、 数値データ(JSON)と画像(PNG)として出力するChatGPTに投げる前提の簡易解析ツールです。 解析できる主な項目: ・BPM(テンポ) ・音量変化(RMS / ダイナミクス) ・周波数特性(音色の明るさ) ・ハーモニー成分 ・ステレオ空間 ・音の密度 ■ NAA Liteの特徴 音楽ファイルには、 波形 倍音 定位 時間変化 周波数分布 など、非常に大量の情報が含まれています。 そのまま、SUNOで生成された音源などをアップロードして ChatGPTなどのAIに音楽を分析させる場合 AI側で「何を基準に見るべきか」が曖昧になりやすく、 膨大な情報の中から特徴を探す必要があるようです。 そこでNAA Liteでは、 音楽をより、AIが読み取りやすい形でデータ化させます。 例: { "BPM":133.9, "RMS":0.155, "Centroid":3556, "Stereo_Width":0.28, "HP_Ratio":2.68 } このように、楽曲を構成する重要な特徴だけを抽出(JSONファイル化)します。 JSON化されたデータは、AI側から見ると 「分析する対象」が明確になります。 生の音源ファイルが巨大な海だとすると、 JSONは、その中から分析に必要な情報だけを釣り上げた観察用データです。 ■ NAA Liteの価値 ・AIが扱いやすい形へ音楽情報を整理できる ・感覚的な印象だけではなく、数値を基準に楽曲を比較できる ・大量生成されたAI楽曲の特徴を効率的に整理できる ・ChatGPTなどのAIによる詳細な楽曲分析の補助になる ・人間が聴いた印象と、音響データの関係を確認できる 特にAI作曲では、短時間で大量の楽曲生成が可能になりました。 その中で、 「なぜこの曲は良く聞こえるのか」 「狙った雰囲気になっているのか」 を客観的に確認するための補助ツールとして利用できます。 ChatGPT上で、Pythonにて都度分析するよりも 解析処理を事前にNAA Liteのようなツールで行い、 その結果をJSON化しておくことで、環境依存のエラーやサーバー処理負荷を減らし、 安定したAI分析へ利用することが可能となることから なんか…簡易的にツールを作成出来んかね…?と思い制作に至りました。 ■ツールの使い方と作成方法について 1. Google colab(←コードが書ければ何処でもよい)にて新規ファイル作成 2. 下記コードをセルへ貼り付け 3. 上から順番に実行 4. 音楽ファイルをアップロード 5. カップ麺が出来るくらいの時間を待つ(mp3の場合) 6. JSONファイルをダウンロード 上記の流れとなります。 解析結果(JSON)をChatGPTなどのAIへ渡すことで、 主に ・楽曲特徴分析 ・制作意図の整理 ・複数楽曲の比較 などに安定利用できます。 コピペ用コード _____________________ 【セル1】には以下のコード !pip -q install librosa soundfile matplotlib import librosa,numpy as np,json,matplotlib.pyplot as plt import librosa.display from google.colab import files f=list(files.upload().keys())[0] y,sr=librosa.load(f,sr=None,mono=True) r={} r["basic"]={ "file":f, "sec":round(librosa.get_duration(y=y,sr=sr),2), "sr":sr } rms=librosa.feature.rms(y=y)[0] r["dynamic"]={ "rms":float(np.mean(rms)), "rms_var":float(np.std(rms)), "crest":float( 20*np.log10( np.max(abs(y))/(np.mean(rms)+1e-9) )) } tempo,beat=librosa.beat.beat_track( y=y,sr=sr ) on=librosa.onset.onset_detect( onset_envelope=librosa.onset.onset_strength(y=y,sr=sr), sr=sr ) r["rhythm"]={ "bpm":float(np.squeeze(tempo)), "beats":len(beat), "onsets":len(on) } c=librosa.feature.spectral_centroid( y=y,sr=sr )[0] b=librosa.feature.spectral_bandwidth( y=y,sr=sr )[0] ro=librosa.feature.spectral_rolloff( y=y,sr=sr )[0] r["frequency"]={ "centroid":float(np.mean(c)), "bandwidth":float(np.mean(b)), "rolloff":float(np.mean(ro)) } h=librosa.effects.harmonic(y) ch=librosa.feature.chroma_stft( y=h,sr=sr ) r["harmony"]={ "mean":float(np.mean(ch)), "std":float(np.std(ch)) } # stereo z,_=librosa.load( f, sr=None, mono=False ) if z.ndim==1: left=z right=z else: left=z[0] right=z[1] mid=(left+right)/2 side=(left-right)/2 w=np.mean(abs(side))/(np.mean(abs(mid))+1e-9) r["stereo"]={ "width":float(w), "corr":float(np.corrcoef(left,right)[0,1]) } # HPSS ha,pe=librosa.effects.hpss(y) r["hpss"]={ "harmonic":float(np.mean(abs(ha))), "percussive":float(np.mean(abs(pe))), "ratio":float( np.mean(abs(ha))/(np.mean(abs(pe))+1e-9) ) } # JSON out="NAA_Lite_Result.json" with open(out,"w",encoding="utf-8") as x: json.dump( r, x, indent=2, ensure_ascii=False ) # Dashboard plt.figure(figsize=(12,6)) plt.subplot(2,1,1) librosa.display.waveshow( y, sr=sr ) plt.title("Waveform") plt.subplot(2,1,2) e=librosa.feature.rms(y=y)[0] plt.plot( librosa.times_like(e,sr=sr), e ) plt.title("Energy") plt.tight_layout() img="NAA_Lite_Dashboard.png" plt.savefig(img) plt.show() print("Complete") print(out) print(img) 【セル2】以下のコード from google.colab import files files.download("NAA_Lite_Result.json") ____________________ 以上です。 ※セル1 最後に音声データをアップロードするボックスが出てくるので 任意のmp3、wavファイルなどを選択します。 全自動で音声の詳細データと波形データが JSON形式ファイルとpngファイルで出力されます。 ※セル2 実行するとJSONファイルのダウンロードが出来ます。

