2008-08-21 204 views

答えて

13

オーディオ分析は、複雑な計算(フーリエ変換と考える)が多い難しいことです。あなたが求めなければならない質問は、「何が沈黙であるか」です。編集しようとしているオーディオがアナログソースからキャプチャされている場合は、無音がない可能性があります。ソフトノイズ(ラインハム、周囲の背景ノイズなど)の領域のみになります。

最小限の音量(振幅)のしきい値と持続時間(たとえば、< 10dbAを2秒以上)を決定し、次に波形のボリューム分析を行うだけで、 (おそらく数ミリ秒のスパイクのフィルタを使用して)この基準を満たしています。私はC#でこれを書いたことはありませんが、このCodeProject articleは面白そうです。それは、他の振幅解析を行うのに使用できる同じ種類のコードである波形を描くためのC#コードを記述しています。

+0

リンクが死んでいる。これは、6年後である。 – yazanpro

+0

をそれはそれは、わからない!生きていると蹴っていないのです。これは、8年後です。 – Saleem

1

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

+0

このリンクが壊れている... :( –

7

スライディングウインドウの平均パワーを効率的に計算するには、各サンプルを四角形にしてから、それを合計に加算します。前のN個のサンプルから二乗された値を減算します。次に、次のステップに進みます。これは、最も簡単な形式のCICフィルタです。 Parseval's Theoremは、この電力計算が時間領域と周波数領域の両方に適用可能であることを示しています。

また、電力レベルがしきい値レベルを踊っているときに、&を急速にオフにするのを避けるために、Hysteresisをシステムに追加することもできます。

0

Soxを使用してください。それは、先頭と末尾の無音を削除することができますが、あなたはアプリからexeファイルとして呼び出さなければなりません。

-1

Detecting audio silence in WAV files using 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(); 
} 
+2

上記のコードはAlvas.Audioを使用しています – Aman

+4

上記のコードは正確には安いサードパーティのライブラリ(Alvas Audio)が必要です。 –

0

から、以下を参照してくださいコードに私は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); 
} 

参考文献:

関連する問題