質問

私は将ビル。NET clientのアプリを検出す静寂、WAVファイルです。

こんなことが可能なので、内蔵のWindows Api?或いは、良い図書館がある。

役に立ちましたか?

解決

オーディオ分析が難しいものを必要に多くの複雑な数学(フーリエ変換).の質問ください"どのような)場合は、オーディオが主張しようとしているの編集が捕獲したアナログからソースをチャンスはありません静寂---もみのソフトノイズ(ラインハム周囲の背景ノイズです。

すべてとはいえ、アルゴリズムが働きを決める最低量(振幅の閾値との間に(例えば、 <10dbA2秒以上)、そのように量分析の波形を探る本基準の(おそらくいくつかのフィルタミリ秒のスパイク).そん書きにこのスレッドセーフで、C#、この CodeProject第 面白;で記述したC#コードで波形を描く...それが、同じようなコードされる可能性のある他の振幅の解析。

他のヒント

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

このことがすべてのコードに必要なグレーのクラムシェル型クランプ無音、ミックスwaveファイルです。

楽しめます。

したい場合に効率的に計算し、平均力のスライドウィンドウスクエアでは、各サンプルを追加しランニングます。減算、乗値からNのサンプルしていけるようになっています。そして先週末、例のギフトショップへ。これは、最も単純な形 CIC フィルター Parsevalの定理 が出てくるというこの電力計算用の両方の時間周波数領域.

もたらすために追加 ヒステリシス のを回避するための切り替えオ急時の電力レベルは、閾値レベル。

を使用してい 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);
}

参考文献:

とは思わないだせ築Apiを検出のための沈黙を強いられるものでした。ものを利用できることがgood ol'数学/discreete信号処理エラウドネス.こちらは小例: http://msdn.microsoft.com/en-us/magazine/cc163341.aspx

使用 Sox.を除去できることの先頭と最後の換ができない電話としてexeからのアプリです。

参照コードは下記から 検出オーディオの静寂のWAVファイルを使用C#

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();
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top