トラックの並べ方を純粋にサウンドで判断しようとしていると思います。つまり、あなたが持っている唯一の情報は音声情報です。Python はわかりませんが、デジタル オーディオは知っています。使用できるアルゴリズムは次のとおりです。基本的に、各トラックの開始点と他の各トラックの終了点を比較するには、差分メトリックが必要です。可能なメトリックには、テンポ、振幅、および音色が含まれます。私が提案する方法は、基本的に波形を一致させようとします。
どの方法でも、トラック間に無音がないこと、およびトラックがギャップなく次から次へと流れていることを前提とする必要があります。残念ながら、これはほとんどのアルバムには当てはまりません。曲と曲の間に沈黙がある場合は、 discogs.comなどにアクセスする以外に方法はありません。そのような解決策はおそらく手間がかからず、合理的な時間で作成できるどのスクリプトよりも確実に信頼性が高いと思います。
それにもかかわらず、ここに私の提案があります:
- 各ファイルについて、最初と最後のサンプル値、およびその時点での導関数/勾配を取得します
- パート 1 で収集した情報を使用して、前/次のサンプルが何であるかを予測します。
- 各開始/終了ペアの予測を比較して、それらがどの程度一致しているかを確認します。(予測値と真の値を比較するだけでは不十分な場合があります。おそらく導関数も比較する必要があります。)
- ベスト マッチをペアにします (リストが完成するまで、ベストからワーストの順に)
上記を行うには、おそらく wave に変換する必要があります。その場合、変換時間と RAM の使用量を最小限に抑えるために、非常に低いサンプル/ビット レートで問題を解決できる可能性があります。Python 用のツールがあるかどうかはわかりませんが、これらのファイルの最初と最後だけを変換できれば、パフォーマンスは確実に向上します。確かに、変換後に各端から数分の 1 秒を保存するだけで済みます。
「良い一致」の定量化: サンプルを比較するには、予測と真実の差の 2 乗を使用して、ペアの両端の差を追加します。導関数の比較を追加するということは、サンプルの差と比較して導関数の差を重み付けする方法を理解する必要があることを意味します。
潜在的な問題
このアルゴリズムは、CD 品質のオーディオ ファイルを扱う場合に適しています。変換で何かが発生し、トラックの最後で情報が失われた可能性があります。ほんの一瞬のオーディオの損失は、このアプローチを完全に台無しにしてしまいます!!
もう 1 つの潜在的な問題点は、傾斜が非常に高い場合、見ているサウンドにノイズが多い可能性があることです。その場合、私が提案する比較はエラーが発生しやすくなります。自己相関などを実行して、オーディオにノイズがあるかどうか (ノイズを示す短い時間スケールの ACF が低い) を確認してから、真実/予測の違いを重み付けして、傾きを優先したり、単にノイズ性を高めたりすることができます。
一般に、予測するジャンプの大きさに基づいて、真実と予測の違いに重みを付けることができます。大きなジャンプを予測する場合は、ジャンプのサイズに関して予測値からの偏差を考慮する必要があります。これにより、予測されたジャンプが小さい場合、大きな偏差がより重要になります。
その問題の影響を受けにくい別のアプローチは、距離メトリックが各周波数ビンの振幅の差になるように、FFT でスペクトル分析を行うことです。これは、トランジェント (ドラム ヒット、ギターのストラムなど) に敏感です。非常に小さな分析ウィンドウを使用すると、この問題が軽減される場合があります。上記の手順に加えて、これを使用できると想像できますが、肯定的な基準としてのみ使用する場合を除きます。開始/終了のペアがスペクトルに適切に一致している場合、それはおそらく真のペアを示していますが、スペクトルがトランジェントによってデータが破損する可能性があるため、データは一致しません。または、長いウィンドウを使用して、比較の両端に存在する可能性のあるトランジェントを確実に含めることができます。
最終的に、使用するテクニックは、作業している音楽の種類によって異なります。ハード ロック アルバムを持っている場合、どこのスペクトルもシンバルと歪んだギターでいっぱいになる可能性が高く、それらは基本的にどこでも同じように見えます。一方、トラックの最初に突然のトランジションが発生する場合は、何も機能しません。
私が言うように、これを「手動で」行うことは、非常に大きな mp3 セットに対してこれを行う場合を除き、(開発時間を考慮すると) 最も信頼性が高く、最速のソリューションである可能性があります。