Question

Je suis chargé de construire une .NET client app pour détecter le silence dans un des fichiers WAV.

Est-ce possible avec le haut-Api Windows?Ou, à l'inverse, toutes les bonnes bibliothèques pour aider avec cela?

Était-ce utile?

La solution

L'analyse Audio est une chose difficile nécessitant beaucoup de mathématiques complexes (pensez à les transformées de Fourier).La question que vous devez vous poser est: "qu'est-ce que le silence".Si le son que vous essayez de modifier, est capturée à partir d'une source analogique, les chances sont qu'il n'y a pas de silence...ils seront seulement des zones de bruit doux (ligne bourdonnement, bruit de fond ambiant, etc).

Tout ce que dit, un algorithme qui devrait serait de déterminer un volume minimum (amplitude) de seuil et de la durée (par exemple, <10dbA pendant plus de 2 secondes) et ensuite il suffit de faire une analyse des volumes de la forme d'onde à la recherche de zones qui répondent à ce critère (avec peut-être quelques filtres pour milliseconde pointes).Je n'ai jamais écrit cela en C#, mais ce CodeProject article semble intéressant;il décrit le code C# pour dessiner une forme d'onde...c'est le même genre de code qui pourrait être utilisé pour faire d'autres amplitude de l'analyse.

Autres conseils

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

Cela a tout le code nécessaire pour éliminer le silence, et mixer des fichiers wave.

Profitez de.

Si vous voulez efficacement calculer la puissance moyenne sur une fenêtre coulissante:carré de chaque échantillon, puis l'ajouter au total.Soustraire le carré de la valeur de N échantillons précédents.Ensuite, passez à l'étape suivante.C'est la forme la plus simple d'un CIC Le filtre. Le Théorème de Parseval nous dit que cette puissance de calcul est applicable à la fois du temps et de la fréquence des domaines.

Aussi, vous voudrez peut-être ajouter Hystérésis le système pour éviter de passer sur&hors rapidement lorsque le niveau de puissance est la danse sur le niveau de seuil.

Je suis à l'aide d' NAudio, et je voulais détecter le silence dans les fichiers audio afin que je puisse soit en rapport ou tronquée.

Après beaucoup de recherches, j'ai trouvé cette mise en œuvre de base.Alors, j'ai écrit une méthode d'extension pour l' AudioFileReader classe qui retourne la durée du silence au début/à la fin du fichier, ou à partir d'une position spécifique.

Ici:

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

Ceci permettra d'accepter presque n'importe quel format de fichier audio pas seulement WAV.

Utilisation:

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

Références:

Je ne pense pas que vous trouverez dans les Api pour la détection de silence.Mais vous pouvez toujours utiliser le bon vieux math/discreete de traitement du signal pour en savoir loudness.Voici un petit exemple: http://msdn.microsoft.com/en-us/magazine/cc163341.aspx

Utilisation Sox.Il peut enlever attaque et de fuite des silences, mais vous devrez l'appeler comme un exe à partir de votre application.

Voir le code ci-dessous à partir de La détection audio le silence de fichiers WAV à l'aide de 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();
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top