2008-08-21 33 views

Trả lời

13

Phân tích âm thanh là một điều khó đòi hỏi phải có nhiều phép toán phức tạp (nghĩ rằng Biến đổi Fourier). Câu hỏi bạn phải hỏi là "im lặng là gì". Nếu âm thanh mà bạn đang cố gắng chỉnh sửa được ghi lại từ nguồn tương tự, cơ hội là không có bất kỳ im lặng nào ... chúng sẽ chỉ là các vùng nhiễu mềm (đường kẻ, tạp âm xung quanh, vv). Tất cả những gì đã nói, một thuật toán sẽ hoạt động là xác định ngưỡng và biên độ (biên độ) tối thiểu (giả sử, < 10dbA trong hơn 2 giây) và sau đó chỉ cần phân tích khối lượng của dạng sóng tìm kiếm các khu vực đáp ứng tiêu chí này (có lẽ một số bộ lọc cho mili giây tăng đột biến). Tôi đã không bao giờ viết điều này trong C#, nhưng điều này CodeProject article trông thú vị; nó mô tả mã C# để vẽ một dạng sóng ... đó là cùng một loại mã có thể được sử dụng để thực hiện phân tích biên độ khác.

+0

Liên kết đã chết .Đây là 6 năm sau đó – yazanpro

+0

Nó không phải, nó còn sống và đá! Không chắc chắn liệu dự án có hoạt động tốt hay không. – Saleem

1

Tôi không nghĩ bạn sẽ tìm thấy bất kỳ API tích hợp nào để phát hiện sự im lặng. Nhưng bạn luôn có thể sử dụng chế độ xử lý tín hiệu toán học/kín đáo tốt để tìm ra độ ồn. Dưới đây là một ví dụ nhỏ: http://msdn.microsoft.com/en-us/magazine/cc163341.aspx

+0

liên kết này bị hỏng ... :( –

7

Nếu bạn muốn tính toán hiệu quả công suất trung bình trên cửa sổ trượt: mỗi ô vuông, sau đó thêm nó vào tổng số đang chạy. Trừ giá trị bình phương từ N mẫu trước đó. Sau đó chuyển sang bước tiếp theo. Đây là hình thức đơn giản nhất của Bộ lọc CIC. Parseval's Theorem cho chúng tôi biết rằng tính toán công suất này có thể áp dụng cho cả miền thời gian và tần suất.

Ngoài ra, bạn có thể muốn thêm Hysteresis vào hệ thống để tránh chuyển đổi trên & tắt nhanh khi mức công suất nhảy về ngưỡng ngưỡng.

0

Sử dụng Sox. Nó có thể loại bỏ các khoảng lặng đầu và cuối, nhưng bạn sẽ phải gọi nó là một exe từ ứng dụng của bạn.

-1

Xem mã dưới đây từ 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

Đoạn mã trên sử dụng Alvas.Audio – Aman

+4

Đoạn mã trên yêu cầu thư viện của bên thứ ba (Alvas Audio) không chính xác giá rẻ. –

0

Tôi đang sử dụng NAudio, và tôi muốn để phát hiện sự im lặng trong tập tin âm thanh để tôi có thể một trong hai báo cáo hoặc cắt ngắn.

Sau nhiều nghiên cứu, tôi đã đưa ra triển khai cơ bản này. Vì vậy, tôi đã viết một phương pháp mở rộng cho lớp AudioFileReader trả về khoảng thời gian im lặng ở đầu/cuối của tệp hoặc bắt đầu từ một vị trí cụ thể.

đây:

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

này sẽ chấp nhận hầu như bất kỳ định dạng tập tin âm thanh không chỉ WAV.

Cách sử dụng:

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

Tài liệu tham khảo:

Các vấn đề liên quan