音声のみの録音で歌が始まる場所を特定する


14

ユーザーが4行の歌を歌う小さなカラオケスタイルのアプリがあり、各行の間に1秒のギャップがあります。バッキングミュージックはないので、音声のみで、問題を解決しやすくすることを願っています。

私は、録音のどこでユーザーが1行目の歌唱を開始および終了し、2行目の歌唱を開始および終了するかを正確に検出する最も堅牢な方法を探しています。

私は、録音中にバックグラウンドノイズがほとんどない場合(それが発生する場合など)に機能する単純なアルゴリズムを組み合わせましたが、最小のノイズが存在する場合はバラバラになります。

誰かが私をもっと堅牢なものに向けることができますか?


私の答えはあなたを助けるかもしれない- dsp.stackexchange.com/a/1543/440
Dipanメータ

一部の録音では、両方のチャンネルで同じ振幅で再生される楽器は音声だけです。この情報を使用して、ステレオ録音から音声を抽出できます。
Jaderディアス

回答:


4

バックグラウンドノイズが白っぽい場合は、スペクトルの平坦性を測定し、振幅がしきい値を超え、スペクトルの平坦性がしきい値を下回っているときに音声とみなすことができます。

基本的には、信号のチャンクのFFTを取得し、スペクトルの大きさの幾何平均を算術平均で除算するだけです。

バンドパスフィルターを使用して、人間の声が通常座っている周波数領域のみを強調することもできます(スペクトルの平坦度を測定する前にFFTの不要な領域を0に設定するだけ)


Endolithは、あなたの経験では、スペクトルの平坦性を測定する前に振幅の2乗とVSの強度を比較すると、大きな違いが生じますか?
スペイシー

@Mohammad:経験はありません。:) 仕様が理解できなかったので、前の質問をしましたが、どちらの方法が正しいのかまだわかりません。しかし、二乗は実用的な違いを生むとは思いません。しきい値を超えたときにトリガーする場合は、2乗したかどうかに関係なく同じように反応する必要があるため(しきい値を調整して一致すると仮定)、絶対値のみの方が計算的に安価です。
エンドリス

@Endolith、これは少し長いショットです:matlabでこのアプローチを実装する方法を知っていますか?ここで言及されているすべてのアプローチをmatlab(実際にはオクターブ)でテストして、どちらが最適かを確認したいですか?
マイクホーガン

@MikeHogan:いいえ、長い間matlabを使用していません。:/また、実際の作業が必要になります。:)事前に書かれたものはありません。信号を小さなチャンクに分割し、それぞれのFFTを実行し、FFTごとに、大きさの幾何平均を大きさの算術平均で除算します。高い数値はノイズが多く、低い数値は音色です。
エンドリス

3

私は過去にスペクトルフラックスを使用しましたが、うまく機能しているようです。基本的な考え方は、関心のある帯域全体で信号のスペクトログラムを作成することです。私たちはあなたの頻度はy軸上にあり、あなたの時間は、x軸上にあると仮定しようそうのように

これは、スペクトログラムがマトリックスであることを意味します。各列は、信号の時間における1つのスナップショットのFFTの絶対値を表し、各行は、1つの帯域からのエネルギーが時間とともにどのように変化するかを表します。

ここで、列の違いを取得します。つまり、列を取得し、その前の列をそれ自体から減算し、すべての列に対して実行します。(明らかに開始列のみを残します)。次に、すべてのバンドを合計します。つまり、すべての行を合計するだけです。

あなたは信号が成文化1-D信号となってしまいますオンセット。これにより、声がどこから始まるかがわかります。

編集:

発症を検出したので、反対を検出したい場合(つまり、信号がアクティビティを持たない状態になった場合)、スペクトルフラックスは実際にその情報を提供します。あなたが発症するところはどこでも、あなたは正のピークを持ち、あなたが「より良い言葉がない」ために「相殺」をするところはどこでも、あなたは負のピークを持ちます。

最初の正のピークと最後の負のピークを取得して、信号の合計開始時間と停止時間をマークします。


モハンマド、「行」とはどういう意味ですか?
マイクホーガン

@MikeHogan編集を見てください、答えを書き直しました。
スペイシー

しかし、これは何かの始まりを見つけませんか?ドラムヒットやその他の衝撃的なノイズも検出されます。音色の音とノイズの多い音を区別しません。
エンドリス

@endolithあなたは良い点を挙げます-しかし、私はそれがまだうまくいくと信じています。私の推論では、このシナリオでは、音声と音楽の状態、または単に音楽の状態になっています。そのため、スペクトルフラックスを計算する場合、実際には音声と音楽と音楽の差分を計算するだけです。(もちろん、もっと分析する必要がありますが、今はそれをどう思うか):
スペイシー

1
@endolith私はただ読み直しただけで、OPは音声だけがあると言っています(明らかにそのシンプルなアプリです)。
スペイシー

2

私の経験から、Mel-Frequency-Cepstrum-Coefficients(MFCC)を調べてみました。MFCCは、FFTが利用可能であり、音声処理で非常に一般的に使用されている場合、実装が非常に簡単です。

MFCCを使用すると、実際の音声データとノイズを区別できるはずです。


@endolith、そのリンクは完全に私を超えています!私が見ることができるオープンソースの実装を知っていますか、それがどのように機能するかについてのステップバイステップのレシピを知っていますか?
マイクホーガン

2

スペクトルフラックス」(「スペクトル差」とも呼ばれる)は、「発症検出」の一般的な方法です。基本的に、信号の連続FFTを取得し、1つのサンプルから次のサンプルへのFFTバケットの差の大きさを合計します。「開始」は通常、この値の実質的な「ジャンプ」によって表されます。

他のアイデアについては、Googleの「発症検出」。


2

スペクトルフラックスのみを使用すると、特定のノイズに対して偽陽性が発生し、歌声が検出される場合があります。

歌うことは通常、ピッチを含む信号内容を意味するため、ピッチ検出器または推定器(ケプストラムなど)を使用できます。ピッチとして検出されたエネルギーの割合と総信号エネルギーの正しさを確認し、推定ピッチが人間の音声範囲内にあることを確認できます。これにより、ピッチのないノイズと、通常のボーカル範囲外の音楽音の偽陽性率が低下します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.