インドのIIT-Bombayでこの技術フェスティバルが開催され、「Artbots」と呼ばれるイベントが開催され、芸術的な能力を持つアートボットをデザインすることになっています。歌を入力として受け取り、歌の中の音符を検出してピアノで再生する音楽ロボットについてのアイデアがありました。曲の音符のピッチを計算するのに役立つ方法が必要です。それをどうやって進めるかについてのアイデア/提案はありますか?
10 に答える
これは、昨年のプロジェクトとして私がここで行っていることとまったく同じです:)私のプロジェクトが人間の歌声のピッチを追跡することであるということを除いて(そして私は曲を演奏するロボットを持っていません)
私が考えることができる最も速い方法は、BASSライブラリを利用することです。デフォルトの記録装置からFFTデータを提供できるすぐに使える機能が含まれています。BASSに付属している「livespec」コード例を見てください。
ちなみに、生のFFTデータは基本周波数を決定するのに十分ではありません。F0を取得するには、HarmonicProductSpectrumなどのアルゴリズムが必要です。
もう1つの考慮事項は、オーディオソースです。FFTを実行し、それにHarmonicProductSpectrumを適用する場合。入力にオーディオソースが1つしかないことを確認する必要があります。現代の曲のように複数のソースが含まれている場合は、考慮すべき多くの周波数があります。
調和生成物スペクトル理論
入力信号が音符の場合、そのスペクトルは、基本周波数の整数倍の倍音成分を持つ基本周波数に対応する一連のピークで構成されている必要があります。したがって、スペクトルを何度も圧縮して(ダウンサンプリング)、元のスペクトルと比較すると、最も強い高調波ピークが並んでいることがわかります。元のスペクトルの最初のピークは、2倍に圧縮されたスペクトルの2番目のピークと一致します。これは、3倍に圧縮されたスペクトルの3番目のピークと一致します。したがって、さまざまなスペクトルを乗算すると、結果は基本周波数で明確なピークを形成します。
方法
まず、ウィンドウサイズとホップサイズが入力として与えられるハニングウィンドウを適用することにより、入力信号をセグメントに分割します。ウィンドウごとに、短時間フーリエ変換を利用して、入力信号を時間領域から周波数領域に変換します。入力が周波数領域に入ると、各ウィンドウに高調波生成スペクトル手法を適用します。
HPSには、ダウンサンプリングと乗算の2つのステップが含まれます。ダウンサンプリングするために、リサンプリングによって各ウィンドウでスペクトルを2回圧縮しました。1回目は元のスペクトルを2回圧縮し、2回目は3回圧縮します。これが完了したら、3つのスペクトルを乗算し、ピークに対応する周波数(最大値)を見つけます。この特定の周波数は、その特定のウィンドウの基本周波数を表します。
HPSメソッドの制限
この方法の優れた機能には、次のようなものがあります。計算コストが低く、加法性および乗法性ノイズに対して適度に耐性があり、さまざまな種類の入力に調整可能です。たとえば、使用する圧縮スペクトルの数を変更したり、スペクトル乗算をスペクトル加算に置き換えたりすることができます。ただし、人間のピッチ知覚は基本的に対数であるため、これは、低ピッチが高ピッチよりも正確に追跡されない可能性があることを意味します。
HPS法のもう1つの重大な欠点は、その分解能がスペクトルの計算に使用されるFFTの長さと同じくらい良いことです。短く高速なFFTを実行する場合、考慮できる離散周波数の数には制限があります。出力でより高い解像度を得るには(したがって、ピッチ出力の粒状性が少なくなります)、より長いFFTを実行する必要があり、これにはより多くの時間がかかります。
差出人:http ://cnx.org/content/m11714/latest/
コメント:基本倍音は (ハーモニック) サウンドから欠落している可能性がありますが、これは知覚されるピッチを変更しません。限定的なケースとして、方形波 (C# ノートなど) を使用して最初の高調波を完全に抑制した場合、知覚されるノートは同じオクターブのC# のままです。ある意味では、私たちの脳は、音を推測するときに、最初のハーモニクスであっても、いくつかのハーモニクスの欠如を補うことができます。したがって、周波数領域の手法でピッチを検出するには、すべての高調波 (フーリエ変換の大きさの極大値)を考慮し、それらの周波数のある種の「最大公約数」を抽出する必要があります。ピッチ検出は些細な問題ではありません...
DAFXには、例と Matlab コードを含む、ピッチ検出専用の約 30 ページがあります。
自己相関 - http://en.wikipedia.org/wiki/Autocorrelation
ゼロクロッシング - http://en.wikipedia.org/wiki/Zero_crossing (この方法は安価なギター チューナーで使用されます)
時間領域と周波数領域の両方で基本周波数を検出するYAAPT ピッチ トラッキングを試してください。リンクから Matlab のソース コードをダウンロードし、スペクトル処理部分を使用して FFT 出力のピークを探すことができます。
Python パッケージhttp://bjbschmitt.github.io/AMFM_decompy/pYAAPT.html#
ポリフォニック音楽からメロディーの基本周波数を抽出するには、MELODIA プラグインを試すことができます: http://mtg.upf.edu/technologies/melodia
曲内のすべての楽器の F0 を抽出する (マルチ F0 トラッキング) か、それらを音符に転記するのは、さらに困難な作業です。メロディーの抽出と音楽のトランスクリプションは、どちらもまだ未解決の研究課題であるため、使用するアルゴリズムやツールに関係なく、いずれについても完璧な結果が得られるとは期待できません。
ポリフォニック録音 (同時に複数の音符) の音符を検出しようとしている場合は、頑張ってください。これは非常に難しい問題です。たとえば、弦楽四重奏の録音を聞いて、アルゴリズムで 4 つの声を分離する方法を知りません。(ウェーブレットかな?) 一度に 1 つの音符だけの場合は、いくつかのピッチ トラッキング アルゴリズムがあり、それらの多くは他のコメントで言及されています。
使用するアルゴリズムは、聴いている音楽の種類によって異なります。歌っている人の声を拾いたい場合は、音声専用に設計された優れたアルゴリズムがたくさんあります。(ほとんどの研究はそこにあります。) 特定の楽器を取り上げようとしている場合は、もう少し創造的になる必要があります。人間の歌声の範囲は一般に約 100 ~ 2000 Hz に制限されているため、音声アルゴリズムは単純です。(話す範囲はかなり狭いです)。ただし、ピアノの基本周波数は約 27 Hz から始まります。から 4200 Hz まで、音声ピッチ検出アルゴリズムでは通常無視されるより広い範囲を扱っています。
ほとんどの楽器の波形はかなり複雑で、多くの高調波が含まれているため、ゼロを数えたり、自己相関を取ったりするような単純なアプローチは機能しません。探している周波数範囲を大まかに知っている場合は、ローパス フィルターをかけてからカウントをゼロにすることができます。別のユーザーが言及したHarmonic Product Spectrum、またはYAAPT(「Yet Another Algorithm for Pitch Tracking」)、または同様のものなど、より複雑なアルゴリズムを使用したほうがよいと思います。
最後にもう 1 つ問題があります。一部の楽器、特にピアノには、基音の欠落や不協和音の問題があります。欠落している基音は、ピッチ トラッキング アルゴリズムによって処理できます...実際、基音は電子伝送でカットされることが多いため、そうする必要があります...ただし、それでもオクターブ エラーが発生する可能性があります。しかし、誰かがピアノの最低オクターブで音を弾くと、不協和音が問題になります。通常のピッチ トラッキング アルゴリズムは、不協和音に対処するようには設計されていません。人間の声はそれほど不協和音ではないからです。
ウィキペディアのピッチ検出に関する記事を試しましたか? あなたにとって興味深い参考文献がいくつか含まれています。
さらに、DSP アプリケーションとライブラリのリストを以下に示します。リストには Linux ソフトウェア パッケージしか記載されていませんが、それらの多くはクロスプラットフォームであり、参照できるソース コードがたくさんあります。
参考までに、モノフォニック録音でノートのピッチを検出することは、ほとんどの DSP に精通した人々の手の届くところにあります。コードなどを含むすべての音符のピッチを検出することは、はるかに困難です。
ちょっと考えただけですが、デジタル オーディオ ストリームを入力として処理する必要はありますか?
そうでない場合は、音楽の記号表現 (MIDI など) の使用を検討してください。音符のピッチは明示的に記述され、ピッチ、リズム、およびその他の多くの音楽パラメータに対応するサウンド (および動き) を非常に簡単に合成できます。
デジタル オーディオ ストリーム (mp3、wav、ライブ入力など) を分析する必要がある場合は、単純なモノフォニック サウンドのピッチ検出は非常に高度ですが、ポリフォニック ピッチ検出は未解決の問題であることに注意してください。この場合、この質問に対する私の回答が役立つ場合があります。
基本的にスペクトラムアナライザーが必要です。アナログ入力の録音で FFT を実行できる場合がありますが、録音の解像度に大きく依存します。
すぐに頭に浮かぶのは:
- 非常に低い周波数 (ドラム、ベースライン) を除外し、
- 高周波(高調波)を除去します
- FFT、
- メロディーのFFT出力でピークを探します
それが非常にポリフォニックなサウンドで機能するかどうかはわかりません-おそらく「FFT、分析、メロディーなど」でグーグル検索してください。考えられる問題に関する詳細情報を返します。
よろしく