web-dev-qa-db-ja.com

音楽分析と視覚化

Pythonで音楽ビジュアライザーをプログラミングすることに興味があります。

最初の問題は、音楽から情報を取得する方法です。音量、周波数、rpmなどのように。そしてどこから?サウンドカードまたは実際の音楽ファイルから?

私の推測はサウンドカードからですが、サウンドカードと必要な情報にアクセスするにはどうすればよいですか?できればプラットフォームに依存しない方法で(Linuxは必須です)。フーリエ変換についてはもう少し読みましたが、それが最善の方法かどうかはわかりません。

視覚化にOpenGLを使用することを考えましたが、まだ提案を受け付けています。

私はすでにそれらのウィキページを見ましたが、まだ答えが見つかりませんでした: http://wiki.python.org/moin/Audio/
http://wiki.python.org/moin/PythonInMusic

17
naeg

クロスプラットフォームのオーディオライブラリをお探しの場合は、 [〜#〜] fmod [〜#〜] を使用することを強くお勧めします。 python利用可能(私はこれを使用したことはありませんが)で使用するための ラッパー もあります。
スペクトルをすぐに使用できるようにするなどの機能を提供します。
オーディオファイルを分析したい場合、私のalgorithme de choixビートスペクトル です。音楽の各短いサンプルを他のすべてのサンプルと比較することにより、類似性マトリックスを計算します。類似性マトリックスが計算されると、各時間間隔Tのすべてのサンプルペア{S(T); S(T + 1)}間の平均類似性を取得できます。これはビートスペクトルです。
オーディオシーケンスのBPMを取得できますが、音楽のさまざまな部分を識別したり、類似したサンプル間のトランジションを見つけたりするのと同じように行うことができます。 「オーディオの視覚化」の正確な意味はわかりませんが、このアルゴリズムは、画像とオーディオの同期を開始するのに十分な情報を提供するはずだと思います(それが必要な場合)。

15
jeremy-george

このための別のツールは librosa です。デフォルトの操作に加えて、 ビートトラッキング を提供してbpmを取得します。チュートリアルによると、ビートトラッキングの場合:

import librosa
audio_path = librosa.util.example_audio_file()
# or uncomment the line below and point it at your favorite song:
# audio_path = '/path/to/your/favorite/song.mp3'
y, sr = librosa.load(audio_path)
y_percussive = librosa.effects.hpss(y)
tempo, beats = librosa.beat.beat_track(y=y_percussive, sr=sr)

@ dionyzizも言った のように、

ビートはフレームになります。を使用して実際の時間に変換できます

librosa.frames_to_time(beats)

私はこれを試していません。

6
serv-inc

Echo Nest APIが利用できなくなったため、適切な回答ではなくなりました歴史的な理由でのみ去る

Echo Nest APIを検討してください。これはPythonで完全に機能し、1分あたりの拍数(おそらくRPMの代わりに必要なもの)、平均振幅、さらには「ダンシビリティ」に関する情報を返します。 "すべてのオーディオファイル用。APIキーが必要ですが、それ以外は無料でうまく機能します。

また、Echo NestRemixパッケージを介して音楽を操作するためのコードもあります。サンプルコードは次のとおりです。

"""Reverse a song by playing its beats 
   forward starting from the end of the song"""
import echonest.audio as audio   

# Easy around wrapper mp3 decoding and Echo Nest analysis
audio_file = audio.LocalAudioFile("NeverGonnaTellIt.mp3")

# You can manipulate the beats in a song as a native python list
beats = audio_file.analysis.beats
beats.reverse()


# And render the list as a new audio file!
audio.getpieces(audio_file, beats).encode("NeverGonnaTellItBackwardsByBeat.mp3")