Pregunta

Estoy encargado de la construcción de una .Cliente de RED de la aplicación para detectar el silencio en un WAV.

Es esto posible con la función de Api de Windows?O, alternativamente, cualquiera de buenas bibliotecas fuera allí para ayudar con esto?

¿Fue útil?

Solución

Análisis de Audio es una tarea difícil que requiere una gran cantidad de complejos de matemáticas (creo que Fourier Transforma).La pregunta que tenemos que hacernos es "¿qué es el silencio".Si el audio que usted está tratando de editar es capturado desde una fuente analógica, las posibilidades son que no hay ningún silencio...sólo será áreas de suave ruido (línea de zumbido, ruido de fondo ambiental, etc).

Todo lo que dijo, un algoritmo que se debe trabajar sería determinar un mínimo de volumen (amplitud) de umbral y la duración (es decir, <10dbA durante más de 2 segundos) y, a continuación, simplemente hacer un análisis de volumen de la forma de onda en busca de zonas que cumplen estos criterios (tal vez con algunos filtros para milisegundo picos).Yo nunca he escrito esto en C#, pero este CodeProject artículo se ve interesante;se describe el código de C# para dibujar una forma de onda...ese es el mismo tipo de código que podría ser utilizado para hacer otros análisis de amplitud.

Otros consejos

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

Esto tiene todo el código necesario para la franja de silencio, y mezclar archivos de forma de onda.

Disfrutar.

Si desea calcular eficientemente la potencia media a través de una ventana deslizante:plaza de cada muestra, a continuación, añadir a un total de ejecución.Resta el cuadrado del valor de N muestras anteriores.A continuación, pasar al siguiente paso.Esta es la forma más simple de un CIC El filtro. Teorema de Parseval nos dice que este poder de cálculo es aplicable tanto a los dominios de tiempo y frecuencia.

También puede que desee agregar Histéresis para el sistema para evitar el encendido y se apaga rápidamente cuando el nivel de potencia está bailando sobre el nivel de umbral.

Estoy usando NAudio, y yo quería para detectar el silencio en archivos de audio para que yo pueda enviar o trunca.

Después de un gran trabajo de investigación, me encontré con esta implementación básica.Así, escribí un método de extensión para el AudioFileReader la clase que devuelve la duración de silencio al inicio/final del archivo, o a partir de una posición específica.

Aquí:

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

Esto va a aceptar casi cualquier formato de archivo de audio no sólo WAV.

Uso:

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

Referencias:

No creo que usted encontrará en cualquier APIs integrados para la detección de silencio.Pero siempre puedes usar el buen ol' matemáticas/discreete procesamiento de la señal para encontrar el volumen.Aquí un pequeño ejemplo: http://msdn.microsoft.com/en-us/magazine/cc163341.aspx

Uso Sox.Se puede quitar iniciales y finales silencios, pero vas a tener que llamar como un archivo exe de la aplicación.

Véase el código de abajo de La detección de silencio de audio en archivos WAV usando 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();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top