.mp3 ファイルがあります。C 言語で人間の声を残りの音から分離するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1571062

  •  21-09-2019
  •  | 
  •  

質問

それは可能ですか Cで [一般的には可能であることはわかっていますが、GOMプレイヤー そうですか]?始めさせてください...あなたは何と言いますか?

人間の声を他の音と区別してどのように正確に識別しますか?

役に立ちましたか?

解決

mp3 プレーヤーのフィルターは、通常、ステレオ録音スタジオの音声ソース (演奏者) が中心に配置されているという事実に依存します。したがって、チャネル間の差を計算するだけです。演奏者がそのような位置にいない録音を与えると失敗します。音声は抽出されません。

確実な方法は音声検出器を使用することです。これは非常に複雑な問題であり、厳密な計算と、特定のタスクに合わせたアルゴリズムの徹底的な調整が必要になります。この方法で進む場合は、音声コーディング (ボコーダー) の読み取りから始めます。

他のヒント

まさにこの話題が議論されました ここ. 。それはオーディオコーディング技術の議論として始まりましたが、上のリンク先のページで誰かがこう言いました。

ということは、ステレオ信号から音声を抽出する方法がないということですか?

しかし指摘されたのは、 抽出する 声はそれ以上に難しいものであってはなりません 排除する 声。

さらに読んでもらいますが、抽出が成功するかどうかは、 比較的狭い 楽器と比較した音声のスペクトル分布。

1 つのトラック内に混在する異なるサウンドを完全に分離することは原理的に不可能であることに注意してください。それは、コーヒーにクリームを混ぜるときのようなものです。混ぜた後は、クリームとコーヒーを完全に分離することはできません。

満足のいく結果を得るには、賢い信号処理のトリックがあるかもしれませんが、一般に、音楽から音声を完全に分離することは不可能です。

人間の声を他の音から分離することは並大抵のことではありません。他の音の録音がある場合は、バックグラウンドサウンドをキャンセルして人間の声だけを残すことができます。

背景ノイズが何らかのランダム ノイズである場合は、何らかの形式のスペクトル フィルタリングを使用すると効果が得られます。しかし、それは単純ではなく、良い結果を得るにはかなりの工夫が必要です。Adobe Audition には適応スペクトルフィルターがあると思います...

録音された帯域全体にわたってかなり均等な周波数分布を持つホワイト ノイズがあると仮定します (44Khz の非圧縮録音では、0 ~ 22Khz について話します)。次に、それに音声を追加します。明らかに、音声はノイズと同じ周波数を使用しています。人間の声の範囲は約 300Hz から約 3400Hz です。オーディオをバンドパスすると、明らかに 300 ~ 3400 Hz の音声範囲のみに削減されます。それで?あなたには声があり、そして今はバンドパスされたホワイトノイズもあります。何らかの方法でそのノイズを除去し、音声をそのまま残すことができる必要があります。さまざまなフィルタリング方式がありますが、どれもその過程で音声にダメージを与えます。

幸運を祈ります、それは実際には簡単ではありません!

見上げる 独立成分分析 (ICA)

ここで、 buf には pcm wav 44100 サンプル レート入力データが含まれます

int
voiceremoval (char *buf, int bytes, int bps, int nch)
{
    short int *samples = (short int *) buf;
    int numsamples = 0;
    int x = 0;
    numsamples = bytes / 2;
    x = numsamples;



    if (bps == 16)
      {
          short *a = samples;
          if (nch == 2)
              while (x--)
                {
                    int l, r;
                    l = a[1] - a[0];
                    r = a[0] - a[1];
                if (l < -32768)
                        l = -32768;
                if (l > 32767)
                        l = 32767;
                    if (r  32767)
                        r = 32767;
                    a[0] = -l;
                    a[1] = r;
                    a += 2;
                }
      }
    return 0;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top