Обнаружение звуковой тишины в WAV-файлах с использованием C#


24

Мне поручено создать клиентское приложение .NET для обнаружения тишины в WAV-файлах.

Возможно ли это со встроенными API-интерфейсами Windows? Или поочередно, какие-нибудь хорошие библиотеки там, чтобы помочь с этим?

13

Анализ звука - сложная задача, требующая много сложной математики (думаю, преобразования Фурье). Вопрос, который вы должны задать, - «что такое молчание». Если звук, который вы пытаетесь отредактировать, записывается из аналогового источника, есть вероятность, что нет никакой тишины ... они будут только областями с мягким шумом (линейный шум, окружающий фоновый шум и т. Д.).

Все, что сказано, алгоритм, который должен работать, заключается в определении порога и продолжительности минимального объема (амплитуды) (например, < 10 дБА в течение более 2 секунд), а затем просто выполните объемный анализ формы волны в поисках областей которые соответствуют этим критериям (возможно, некоторые фильтры для миллисекундных всплесков). Я никогда не писал это на C#, но этот CodeProject article выглядит интересным; он описывает код C# для рисования формы волны ... это тот же самый код, который можно использовать для проведения другого анализа амплитуды.

  0

Link мертв. Это 6 лет спустя. 02 сен. 142014-09-02 14:33:56

  0

Это не так, он жив и здоров! Не уверен, если проект работает хорошо, хотя. Это 8 лет спустя. 13 июн. 162016-06-13 11:57:23


9

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

Это весь код, необходимый для раздеть молчания, и смешивать звуковые файлы.

Наслаждайтесь.


1

Я не думаю, что вы найдете встроенные API для обнаружения тишины. Но вы всегда можете использовать хорошую обработку сигнала «math/discreete», чтобы узнать громкость. Вот небольшой пример: http://msdn.microsoft.com/en-us/magazine/cc163341.aspx

  0

эта ссылка сломана ... :( 06 янв. 182018-01-06 17:42:34


7

Если вы хотите эффективно рассчитать среднюю мощность над скользящим окном: соберите каждый образец, а затем добавьте его в общую сумму. Вычтите квадрат из предыдущих выборок. Затем перейдите к следующему шагу. Это простейшая форма фильтра 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 04 фев. 142014-02-04 15:45:28

+4

Для этого кода необходима сторонняя библиотека (Alvas Audio), которая не совсем дешевая. 28 фев. 142014-02-28 18:52:48


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); 
} 

Ссылки: