Сведения о вопросе

Gentleman

11:25, 3rd August, 2020

Теги

c#   .net   audio    

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

Просмотров: 530   Ответов: 7

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

Возможно ли это с помощью встроенного Windows APIs? Или, с другой стороны, есть ли хорошие библиотеки, чтобы помочь с этим?



  Сведения об ответе

PAGE

09:05, 23rd August, 2020

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

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


  Сведения об ответе

KOMP

08:36, 27th August, 2020

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

Здесь есть весь код, необходимый для того, чтобы раздеть silence и смешать wave-файлы.

Наслаждаться.


  Сведения об ответе

SSESION

09:56, 14th August, 2020

Если вы хотите эффективно рассчитать среднюю мощность по скользящему окну: квадратите каждый образец, а затем добавьте его к текущему итогу. Вычтите квадратное значение из N предыдущих выборок. Затем переходите к следующему шагу. Это самая простая форма CIC -фильтра. Теорема парсеваля говорит нам, что этот расчет мощности применим как к временной, так и к частотной области.

Кроме того, вы можете добавить гистерезис в систему, чтобы избежать быстрого переключения on&off, когда уровень мощности танцует около порогового уровня.


  Сведения об ответе

LAST

21:06, 1st October, 2020

Я использую 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);
}

Рекомендации:


  Сведения об ответе

SKY

01:16, 2nd August, 2020

Использовать Сокс . Он может удалить ведущие и trailing молчания, но вам придется вызвать его как exe из вашего приложения.


  Сведения об ответе

padenie

04:49, 1st August, 2020

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


  Сведения об ответе

lourence

08:05, 17th August, 2020

См. код ниже от обнаружения звуковой тишины в файлах 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();
}


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться