29

私は、WAV ファイル内の無音を検出する .NET クライアント アプリを構築する任務を負っています。

これは組み込みの Windows API で可能ですか? または、これを支援する優れたライブラリはありますか?

4

8 に答える 8

14

オーディオ分析は、多くの複雑な数学を必要とする難しいものです(フーリエ変換を考えてください)。あなたが尋ねなければならない質問は「沈黙とは何か」です。編集しようとしているオーディオがアナログソースからキャプチャされている場合、無音がない可能性があります...それらはソフトノイズ(ラインハム、周囲のバックグラウンドノイズなど)の領域のみになります。

とはいえ、機能するアルゴリズムは、最小ボリューム(振幅)しきい値と期間(たとえば、2秒以上で<10dbA)を決定し、この基準を満たす領域を探すために波形のボリューム分析を実行することです。 (おそらくミリ秒スパイク用のいくつかのフィルターを使用)。私はこれをC#で書いたことがありませんが、このCodeProjectの記事は面白そうです。波形を描画するためのC#コードについて説明しています...これは、他の振幅分析を行うために使用できるのと同じ種類のコードです。

于 2008-08-21T05:30:09.740 に答える
10

http://www.codeproject.com/Articles/19590/WAVE-File-Processor-in-C

これには、無音部分を取り除き、ウェーブファイルをミックスするために必要なすべてのコードが含まれています。

楽しみ。

于 2008-08-21T05:01:31.963 に答える
10

スライディングウィンドウ全体の平均パワーを効率的に計算する場合は、各サンプルを2乗し、それを現在の合計に追加します。前のN個のサンプルから2乗値を引きます。次に、次のステップに進みます。これは、CICフィルターの最も単純な形式です。パーセバルの定理は、この検出力の計算が時間領域と周波数領域の両方に適用できることを示しています。

また、電力レベルがしきい値レベルを中心に変動しているときにオンとオフが急速に切り替わらないように、システムにヒステリシスを追加することもできます。

于 2008-08-28T03:21:26.513 に答える
7

私はNAudioを使用しています。オーディオ ファイルの無音を検出して、レポートまたは切り捨てを行うことができるようにしたいと考えていました。

多くの調査の後、私はこの基本的な実装を思い付きました。AudioFileReaderそこで、ファイルの先頭/末尾、または特定の位置から始まる無音時間を返すクラスの拡張メソッドを作成しました。

ここ:

static class AudioFileReaderExt
{
    public enum SilenceLocation { Start, End }

    private static bool IsSilence(float amplitude, sbyte threshold)
    {
        double dB = 20 * Math.Log10(Math.Abs(amplitude));
        return dB < threshold;
    }
    public static TimeSpan GetSilenceDuration(this AudioFileReader reader,
                                              SilenceLocation location,
                                              sbyte silenceThreshold = -40)
    {
        int counter = 0;
        bool volumeFound = false;
        bool eof = false;
        long oldPosition = reader.Position;

        var buffer = new float[reader.WaveFormat.SampleRate * 4];
        while (!volumeFound && !eof)
        {
            int samplesRead = reader.Read(buffer, 0, buffer.Length);
            if (samplesRead == 0)
                eof = true;

            for (int n = 0; n < samplesRead; n++)
            {
                if (IsSilence(buffer[n], silenceThreshold))
                {
                    counter++;
                }
                else
                {
                    if (location == SilenceLocation.Start)
                    {
                        volumeFound = true;
                        break;
                    }
                    else if (location == SilenceLocation.End)
                    {
                        counter = 0;
                    }
                }
            }
        }

        // reset position
        reader.Position = oldPosition;

        double silenceSamples = (double)counter / reader.WaveFormat.Channels;
        double silenceDuration = (silenceSamples / reader.WaveFormat.SampleRate) * 1000;
        return TimeSpan.FromMilliseconds(silenceDuration);
    }
}

これは、 WAV だけでなく、ほぼすべてのオーディオ ファイル形式を受け入れます。

使用法:

using (AudioFileReader reader = new AudioFileReader(filePath))
{
    TimeSpan duration = reader.GetSilenceDuration(AudioFileReaderExt.SilenceLocation.Start);
    Console.WriteLine(duration.TotalMilliseconds);
}

参考文献:

于 2017-09-03T14:23:18.330 に答える
1

沈黙を検出するための組み込みAPIはないと思います。しかし、ラウドネスを見つけるために、いつでも古き良き数学/目立たない信号処理を使用することができます。ここに小さな例があります:http://msdn.microsoft.com/en-us/magazine/cc163341.aspx

于 2008-08-21T05:07:14.337 に答える
1

ソックスを使用。先頭と末尾の無音を削除できますが、アプリから exe として呼び出す必要があります。

于 2009-10-22T12:55:43.470 に答える
-2

C# を使用して WAV ファイル内のオーディオ無音を検出する の以下のコードを参照してください。

private static void SkipSilent(string fileName, short silentLevel)
{
    WaveReader wr = new WaveReader(File.OpenRead(fileName));
    IntPtr format = wr.ReadFormat();
    WaveWriter ww = new WaveWriter(File.Create(fileName + ".wav"), 
        AudioCompressionManager.FormatBytes(format));
    int i = 0;
    while (true)
    {
        byte[] data = wr.ReadData(i, 1);
        if (data.Length == 0)
        {
            break;
        }
        if (!AudioCompressionManager.CheckSilent(format, data, silentLevel))
        {
            ww.WriteData(data);
        }
    }
    ww.Close();
    wr.Close();
}
于 2014-02-01T16:10:11.357 に答える