الكشف عن صمت الصوت في ملفات WAV باستخدام C#

StackOverflow https://stackoverflow.com/questions/19353

  •  09-06-2019
  •  | 
  •  

سؤال

لقد تم تكليفي بإنشاء تطبيق عميل .NET لاكتشاف الصمت في ملفات WAV.

هل هذا ممكن مع واجهات برمجة تطبيقات Windows المضمنة؟أو بالتناوب، هل توجد مكتبات جيدة للمساعدة في هذا؟

هل كانت مفيدة؟

المحلول

يعد التحليل الصوتي أمرًا صعبًا ويتطلب الكثير من الرياضيات المعقدة (فكر في تحويلات فورييه).السؤال الذي عليك أن تطرحه هو "ما هو الصمت".إذا تم التقاط الصوت الذي تحاول تحريره من مصدر تمثيلي، فمن المحتمل عدم وجود أي صمت...ستكون فقط مناطق ذات ضوضاء ناعمة (همهمة الخط، ضوضاء الخلفية المحيطة، إلخ).

بعد كل ما قيل، فإن الخوارزمية التي يجب أن تعمل هي تحديد الحد الأدنى لعتبة الحجم (السعة) والمدة (على سبيل المثال، <10 ديسيبل لأكثر من ثانيتين) ثم القيام ببساطة بتحليل حجم شكل الموجة بحثًا عن المناطق التي تلبي هذه المعايير (ربما مع بعض المرشحات لارتفاعات المللي ثانية).لم أكتب هذا أبدًا بلغة C#، لكن هذا مقالة مشروع الكود يبدوا مثيرا للأهتمام؛فهو يصف كود C# لرسم شكل موجة...هذا هو نفس نوع الكود الذي يمكن استخدامه لإجراء تحليلات أخرى للسعة.

نصائح أخرى

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

يحتوي هذا على كل التعليمات البرمجية اللازمة لتجريد الصمت وخلط ملفات الموجة.

يتمتع.

إذا كنت تريد حساب متوسط ​​الطاقة بكفاءة عبر نافذة منزلقة:مربع كل عينة، ثم إضافتها إلى المجموع الجاري.طرح القيمة التربيعية من عينات N السابقة.ثم انتقل إلى الخطوة التالية.هذا هو أبسط شكل من أشكال أ CIC منقي. نظرية بارسيفال يخبرنا أن حساب الطاقة هذا ينطبق على مجالات الوقت والتردد.

كما قد ترغب في إضافة التباطؤ إلى النظام لتجنب التشغيل والإيقاف بسرعة عندما يتحرك مستوى الطاقة حول مستوى العتبة.

أنا استخدم ناوديو, وأردت اكتشاف الصمت في الملفات الصوتية حتى أتمكن من الإبلاغ عنها أو اقتطاعها.

وبعد الكثير من البحث، توصلت إلى هذا التنفيذ الأساسي.لذا، كتبت طريقة تمديد لـ 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);
}

مراجع:

لا أعتقد أنك ستجد أي واجهات برمجة تطبيقات مضمنة للكشف عن الصمت.ولكن يمكنك دائمًا استخدام الرياضيات الجيدة/معالجة الإشارات المنفصلة لاكتشاف جهارة الصوت.إليك مثال صغير: http://msdn.microsoft.com/en-us/magazine/cc163341.aspx

يستخدم سوكس.يمكنه إزالة حالات الصمت البادئة واللاحقة، ولكن سيتعين عليك تسميتها كملف exe من تطبيقك.

انظر الكود أدناه من الكشف عن صمت الصوت في ملفات 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();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top